Создание приложения для заказа еды Jamstack с помощью Strapi, Gridsome и Snipcart 5/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 - Развертывание приложений

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

Реализация корзины и оформления заказа с помощью Snipcart

Как я уже упоминал в начале этой серии, Snipcart - это простое решение для электронной коммерции, которое позволяет разработчикам добавлять полностью настраиваемые возможности оформления заказа на любой веб-сайт.

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

Прим. Snipcart это в Канаде, а в России подобным функционалом занимается Easynetshop.

Установить Snipcart

Далее установим Snipcart. Создайте файл index.html в папке src и обновите его фрагментом кода ниже:

<!-- src/index.html -->
<!DOCTYPE html>
<html ${htmlAttrs}>
  <head>
    ${head}
    <link rel="preconnect" href="https://app.snipcart.com" />
    <link rel="preconnect" href="https://cdn.snipcart.com" />
    <link
      rel="stylesheet"
      href="https://cdn.snipcart.com/themes/v3.0.23/default/snipcart.css"
    />
  </head>
  <body ${bodyAttrs}>
    ${app} ${scripts}
    <div
      id="snipcart"
      data-api-key="MDg5MmMwOWQtOTIxZi00ZTE4LWE3MmUtNDlkZjcyZmQ2OThjNjM3Mzg2NDU1MDUyODI0NjM2"
      hidden
    ></div>
    <script
      async
      src="https://cdn.snipcart.com/themes/v3.0.23/default/snipcart.js"
    ></script>
  </body>
</html>

Что мы здесь сделали, так это добавили необходимые Snipcart ресурсы JavaScript и CSS в наше приложение Gridsome. Их добавление автоматически установит и сделает Snipcart доступным в проекте.

  • Обратите внимание, однако, что вам нужно будет перезапустить приложение Gridsome, чтобы получить Snipcart начал функционировать.

Добавить Snipcart глобально

Затем нам нужно сделать Snipcart глобально доступным в нашем приложении. Для этого команда Snipcart рекомендует использовать скрытый элемент в центральном месте, чтобы, когда мы определяем Snipcart там, он был глобально доступен на всех страницах нашего веб-сайта. Это место в этом проекте - Default.vue файл. Поскольку этот макет охватывает все части нашего приложения, просто откройте файл и добавьте в него этот элемент div :

<!-- src/layouts/Defualt.vue -->
<div
  hidden
  id="snipcart"
  data-api-key="YOUR_SNIPCART_API_KEY_HERE"
></div>

Вы можете получить свой ключ API Snipcart на своей панели управления. Теперь, когда у нас установлен Snipcart, давайте продолжим и модифицируем наше приложение, чтобы внести в него нужные нам изменения поведения.

Реализовать добавить в корзину

Во-первых, при нажатии кнопки «Добавить в корзину» мы хотим немедленно добавить этот конкретный продукт в корзину и в равной степени отобразить корзину, чтобы пользователь мог оформить заказ, если захочет. Для этого нам нужно обновить кнопку в нашем src/components/Products.vue файле:

<!-- src/components/products.vue -->
<v-card-actions>
  <v-btn
    rounded
    outlined
    color="orange"
    text
    class="snipcart-add-item"
    :data-item-id="edge.node.id"
    :data-item-description="edge.node.description"
    :data-item-image="`http://localhost:1337${edge.node.image}`"
    :data-item-price="edge.node.price"
    :data-item-name="edge.node.title"
  >
    Add to cart
  </v-btn>
</v-card-actions>

Все, что мы здесь сделали, это добавили класс snipcart-add-item к кнопке и также передали ему атрибуты data-. Добавление класса snipcart-add-item к любому элементу HTML сообщает Snipcart определенным образом реагировать на щелчок по этому элементу. В этом случае добавьте содержимое данных этого элемента в корзину. Мы предоставляем значения атрибутов данных непосредственно из нашего слоя данных.

Поскольку эта кнопка доступна на страницах отдельных продуктов, нам необходимо внести те же обновления в шаблон продукта:

<!-- src/templates/product.vue -->
<v-card-actions>
  <v-btn
    rounded
    outlined
    color="orange"
    text
    class="snipcart-add-item"
    :data-item-id="this.$page.product.id"
    :data-item-description="this.$page.product.description"
    :data-item-image="
      `http://localhost:1337${this.$page.product.image}`
    "
    :data-item-price="this.$page.product.price"
    :data-item-name="this.$page.product.title"
  >
    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>

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

Показать корзину и цены

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

Внутри Default.vue file обновите фрагмент, чтобы учесть логотип корзины и поле цены. Следовательно, добавьте этот фрагмент сразу после поля поиска:

<!-- src/layout/Default.vue -->
<v-btn class=" snipcart-checkout" icon>
  <v-icon>mdi-cart</v-icon>
  <span class="snipcart-total-items"></span>
  <span class="snipcart-total-price"></span>
</v-btn>

Здесь мы обернули значок корзины в элемент кнопки с классом snipcart-checkout. Это просто личное предпочтение, чтобы пользователи могли щелкнуть значок корзины, чтобы открыть корзину. После значка корзины мы подготовили еще два поля для отображения количества товаров в корзине и общей стоимости товаров в корзине соответственно. Это всего лишь классы шаблонов, давайте перейдем к разделу скриптов файла и добавим в него логику:

<!-- src/layout/Default.vue -->

<script>
export default {
  data() {
    return {
      totalPrice: 0,
    };
  },
  methods: {
    getTotalPrice() {
      return Snipcart.store.getState().cart.total;
    },
  },
  mounted() {
    this.totalPrice = this.getTotalPrice();
  },
};
</script>

Приведенный выше фрагмент кода просто вычисляет общую цену всех товаров в корзине и отображает ее в поле с классом snipcart-total-price. Вы можете повторить тот же процесс, чтобы рассчитать общее количество товаров в корзине, но мы продолжим и сохраним эти изменения. Если вы снова посмотрите в браузере на наличие последних изменений, вы заметите, что и значок корзины, и цена отображаются так, как ожидалось:

Вывод

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

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

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

comments powered by Disqus