Giter VIP home page Giter VIP logo

kirill-zhirnov / boundless-nextjs-ecommerce-template Goto Github PK

View Code? Open in Web Editor NEW
112.0 7.0 46.0 2.31 MB

Next.js E-Commerce template. Strong TypeScript, Ready to use, For high-performance e-commerce websites.

Home Page: https://boundless-commerce.com

License: MIT License

TypeScript 81.46% JavaScript 0.53% SCSS 18.01%
boundless-commerce theme ecommerce nextjs react checkout example nextjs-example nextjs-starter nextjs-template react-example react-shopping-cart template cart react-cart e-commerce nextjs-tutorial shopping-cart

boundless-nextjs-ecommerce-template's Issues

Виджет Корзины в правом верхнем углу

  • При загрузке сайта, на стороне клиента, проверяем, есть ли cookie boundless_cart_id, если нет - создаем новую корзину: /orders/cart/retrieve. ID сохраняем в cookie. Если cookie есть, то получаем состояние корзины: /orders/cart/{cart_id}/total.

Total данные нужно сохранить в redux (а также добавить redux-thunk) и отрендерить компонент с total в шапке сайта:

Снимок экрана 2021-12-24 в 14 17 36

Если корзина не пуста, отображаем также сумму в корзине:

Снимок экрана 2021-12-26 в 14 16 41

404 ошибка в категории

После этого поправить условия наподобие category?.parents, ведь сейчас категории не может не быть.

Стилевые правки страницы товара

  • border и HR оформить одинаково, расстояние между блоками должно быть одинаковым (как внешнее так и внутреннее):

Снимок экрана 2022-01-19 в 19 57 47

Образец: https://i4421.my-sellios.ru/product/samsung-clear-cover

  • Характеристики оформить также как на странице: https://i4421.my-sellios.ru/product/samsung-clear-cover Разметку сделать по БЭМ методологии.
  • В характеристики добавить производителя, вес и габариты (если есть)
  • Shipping - hardcoded блок, оформить также как:

Снимок экрана 2022-01-19 в 20 01 26

https://i4421.my-sellios.ru/product/samsung-clear-cover

3 иконки добавить из fontawersome (уже подключен)

  • Под In/out stock выводим SKU. Если у товара есть варианты, выводим SKU варианта и только тогда, когда он выбран

Цены

Сейчас не совсем правильно: product.price.value есть только в том случае, когда у товара цена одна (те нет вариантов), когда у товара есть варианты, то у него приходит product.price.min, тогда цену нужно отображать как "From ".

Тоже самое и с old ценами. Посмотри, как это сделано сейчас на babylon или у нас в админке и сделай отдельный компонент PropductPrice, который будет резолвить цену. В babylon на фронтенде это вроде бы сделано.

api.orders переименовать в api.cart

Тк там фактически только работа с корзиной. Если все методы заказа поменстить в один файл - он будет слишком большим.

Страница корзины

  • Добавить страницу корзины: /cart

  • На стороне клиента фетчим Items: /orders/cart/{cart_id}/items. Строим корзину, как в funlook. Разметку можно улучшить, вместо таблицы сделать на flex?

Фетчить нужно по ID из redux, если ID в redux нет, то нужно отображать Loading. Как только ID корзины появился в redux - запускаем фетч.

  • Удаление/смена кол-ва: /orders/cart/set-qty, /orders/cart/rm-items

Добавление товара в корзину

Добавление товара в корзину: /orders/cart/add

  • Блочим кнопку, запускаем лодер
  • Ждем пока в redux появится cart_id
  • Отправляем запрос.

Результат может быть либо true с новым total, либо actionRequired - в этом случае нужно открыть модальное окно со списком вариантов и дать выбрать вариант.

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

Для теста добавления - добавляй товары без вариантов.

После открытия нужно показать CallToOrder виджет. Это отдельный компонент:

Снимок экрана 2021-12-26 в 14 31 00

Добавление в корзину может происходить из разных мест: список товаров, страница товара и тд - поэтому логику добавления можно вынести в отдельный файл. Также нужно предусмотреть, чтобы была возможность не открывать callToOrder при добавлении - например, если мы добавляем со страницы корзины (теоретически).

Горизонтальное меню

Разработать компонент HorizontalMenu. Компонент принимает массив - такой же как и Вертикальное меню: #36

Меню берется из Redux.

Образец: https://fun-look.ru/
Разметка с использованием http://schema.org/ItemList
При написании классов, использовать БЭМ.
Для оформления ввести переменные (посмотреть как было сделано на babylon).
Для расчета выпадающего пункта использовать popper.js
Добавить какую-то анимацию на раскрытие/закрытие.

Подключать предлагаю в MainLayout, если передан параметр horizontalMenu - выводим. Передавать параметр на странице категории и странице товара.

Filters on mobile

На странице категории есть фильтры:
Снимок экрана 2022-02-04 в 14 03 42

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

Нужно добавить логику для колонки с категориями и фильтрами, такую же как тут: https://fun-look.ru/category/vzroslye-kigurumi
Колонка скрывается, вместо нее появляется кнопка "Filters", которая показывает левую колонку в модальном окне.

Есть два варианта реализации:

  • дублирование кода и показ колонки в bootstrap-modal
  • Самостоятельно реализовать "модальное окно", как это сделано на fun-look.ru

Реализацию нужно обсудить перед началом работы.

cart row - minor fixes

Снимок экрана 2022-01-17 в 18 46 37

  • Вместо div.no-image нужно использовать <NoImage />
  • Независимо от того, есть изображение нет - ссылка с изображения или его mock всегда должна быть.

Filters

  • Переделать Checkboxes на кнопки, как на Fun-look.

Если кол-во опций больше 6 - скрываем остальные. Перед скрытием нужно пересортировывать список, если товаров по опции нет - она уходит в конец, после этого также сортируем по sort (как и сейчас)

  • Для цены добавить слайдер, образец: Fun-look.

CallToOrder

CallToOrder - это generic (общий) компонент, который используется в разных темах для информирования об успешном добавлении в корзину. Нужно разработать не решение, которые бы работало в данном конкретном demo-магазине, а общий компонент, который можно переиспользовать в разных темах. Мы можем внедрять доп. настройки к компоненты, которые будут определятся в конкретных темах.

  • Добавить Sticky позиционирование. Нужно чтобы блок был прикреплен под меню (хидером), а при скролинге - к верхнему углу. пример https://fun-look.ru

Снимок экрана 2022-01-11 в 17 36 29

Снимок экрана 2022-01-11 в 17 36 35

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

https://i3703.my-sellios.ru/
https://i562.my-sellios.ru/
https://i860.my-sellios.ru/

Если нельзя решить средствами CSS, то можно использовать JS - отслеживать прокрутку.

  • Добавить анимацию на исчезание - такую же как и в сайтах выше или слайд вправо.
  • Для мобильных (X-Small) ширина должна быть 90% от ширины экрана.

Добавить в мета

og:title, img, etc.

Для страницы товара должны быть свои картинки, для категории также, если картинка задана.

Выбор варианта

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

В целях тестирования, добавь товар, у которого вариант строится в 2-3м свойствам, например размер и цвет.

Пример выбора варианта можно посмотреть в проекте Babylon: https://github.com/kirill-zhirnov/babylon/blob/master/htdocs/app/packages/catalog/vue/web/product/ChooseVariant.vue

Логигу/разметку возьми с демо-сайта или Катиного магазина.

Call to Order

  • должен появляться по правой границе container
  • должен появляться с анимацией (см fun-look.ru).
  • No-img картинка в случае твоара без изображения

BreadCrumbs - переделать в универсальный компонент

Нужно, чтобы компонент принимал массив {title: string, isActive?: boolean, url?: stirng}[] и по нему строил хлебный крошки. Сейчас, BreadCrumbs привязан к категориям, нужно, чтобы это был универсальный компонент (те мы можем в будущем его вызывать не только со страницы категории или товара).

Aside menu

Доработать Aside Menu:

  • Меню берется из Redux, выводим mainMenu

  • Добавить закрытие по свайпу вправо. Взять @use-gesture/react, useDrag - при открытии ловим свайп вправо и закрываем.

  • Вывести в Aside:

Снимок экрана 2022-01-21 в 18 41 48

  1. В правом верхнем углу добавляем кнопку с крестиком, при клике - закрываем
  2. Корзина. Можно взять из шапки блок.
  3. Main menu: Schema.org разметка, если есть подменю - раскрытие как на https://fun-look.ru, CSS разметка бэм

Стили сделать такими как на Fun-look, ввести переменные при необходимости.

  • При переходе на другую страницу (те если начинает открываться страница) - закрываем AsideMenu.

Блок - Full-screen Обложка

Пример блока:
https://fun-look.ru/page/some-test-landing

Настройки блока (создай магазтин на sellios, чтобы поиграть с настройками и понять как они устроены):

Снимок экрана 2022-02-28 в 14 49 49

Снимок экрана 2022-02-28 в 14 49 54

Те у тебя получится интерфейс что-то вроде:

<CoverTextInCenter img={путь до картинки} .../>

Также нужно, чтобы на мобильной версии (xs и sm) - использовалась другая картинка. Сейчас на fun-look это не сделано, но надо чтобы на мобильных экранах блок был растянут на всю высоту viewport: 100vh (при этом картинка бы менялась).

Поиграй сперва с настройками на Sellios, продумай интерфейс, посмотри стили на babylon: htdocs/app/views/less/common/components/blocks/covers/textInCenter.less и сделай компонент, который бы принимал все эти настройки в качестве св-в.

На странице товара используется Swiper. Блок, которые подключает свайпер подгружать динамически, без SSR

  • АНалогично AsideMenu: dynamic(() => import('../components/AsideMenu'), {ssr: false})
  • В _app.tsx подгружаются стили свайпер - их тоже нужно вынести в этот динамически подключаемый компонент
  • Может имеет смысл обернуть свайпер в какой-нить враппер. Свайпер будет использоаться для карусели товаров и для галлереи на странице товара.

Filter fixes

При субмите фильтра, присходит 3 запроса к filters-range.

Нужно в FilterForm в useEffect, проверять - изменились ли фильтры от queryParams и только если изменились - фетчить.

Возможно также, нужно разделить логику - фетч при создании компонента и фетч при изменении параметров (хотя это не точно).

Simple products slider

<ProductsSlider product={products}/> - отображает слайдер по массиву из товаров

<ProductsSliderByQuery query={query} /> - отображает слайдер по запросу - компонент сам запрашивает по API и выводит слайдер через ProductsSlider. Пока идет загрузка отображается SVG прелодер. Важно, чтобы высота прелодера и слайдера совпадали (чтобы контент не прыгал при загрузке)

Слайдер с вкладками

Нужно разработать слайдер с вкладками. Пример слайдера: https://i4421.my-sellios.ru ,

Снимок экрана 2022-02-05 в 12 49 05

Снимок экрана 2022-02-05 в 12 49 52

Вы можете создать магазин на https://sellios.ru и поиграть с настройками слайдера.

Предлагаю, следующий интерфейс к компоненту:

<TabbedProductSlider>
	<SliderCollectionTab 
		title={'Tab title'}
		productsQuery={params: IGetProductsParams}
		rows={1}
		swiperProps={{loop: boolean...}}
	/>
</TabbedProductSlider>

Каждая вкладка фетчит список товаров по API: api.catalog.getProducts(productsQuery). Пока все вкладки не загрузятся нужно показывать react-content-loader в виде списка товаров с одинковой со списком высотой (на первом шаге можно пропистить и просто показывать слово Loading...).

В качестве библиотеки для карусели используем Swiper (https://swiperjs.com). Swiper должен подгружаться динамически. Блок нет необходимости рендерить на сервере.

Пока сделаем вкладки со списком товаров, потом добавим вкладки с произвольным контентом (см пример).

Footer

Generic компонент, футер делаем по образцу: https://i3703.my-sellios.ru/

Компонент принимает меню (интерфейс такой же как в #36), подключается в MainLayout. Страницы передают footerMenu в MainLayout.

Футер на весь экран, контейнер по центру, в контейнере 4 колонки:

  • логотип + короткий текст
  • меню (берется из Redux)
  • конткаты
  • иконки соц сетей со ссылками

В css ввести переменные front-footer-bg, front-footer-text-color, front-footer-link-color, возможно еще что-то - посмотреть как сделан футер в babylon, тема neptune.

Разметка БЭМ.

Для меню в футере разметка Schema.org/List.

Переделать интерфейс BoundlessThumb

Для упрощения использования, предлагаю в конструктор передавать объект с параметрами:

constructor(params: {imgLocalPath?, maxSize? и так все параметры}) 

тоже самое для makeThumb

Вертикальное меню на главной странице

Нужно сделать отдельный компонент VerticalMenu, который на входе бы принимал массив IMenuItem[]:

Меню берется из Redux.

Это нужно, чтобы можно было в меню добавить обычные ссылки на страницы помимо категорий.
Разметка с использованием http://schema.org/ItemList (пример на странице категории, в меню категории: http://localhost:3001/category/chekhly-na-iphone)

Оформить, примерно вот так:

Снимок экрана 2022-01-20 в 17 56 35

https://i563.my-sellios.ru/

При написании классов, использовать БЭМ.

Для оформления ввести переменные: front-v-menu-bg, front-v-menu-color, front-v-menu-active

Тег компонента nav.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.