skr shop это группа низкоуровневых кодеров.Из-за маразма пыток над проектом на работе,и из-за гордыни программиста:системы разработанные другими-это все говно,а мой дизайн самый офигенный в Вселенная, поэтому я решил сделать это: создать руководство по дизайну для электронной коммерции, в котором только дизайн без кодирования.
адрес проекта:GitHub.com/payee-shop/лошадь…
Для бизнеса электронной коммерции корзина является самым важным шагом во всем процессе покупки. Потому что развитие электронной коммерции до сегодняшней корзины для покупок предназначено не только для выполнения функции упаковки и размещения заказов, но также является важным окном отображения для сбора, сравнения, рекламных напоминаний и соответствующих рекомендаций. Как с таким количеством возможностей мы можем спроектировать, чтобы обеспечить высокую производительность корзины покупок и хорошую масштабируемость для будущих разработок?
Начиная с сегодняшнего дня, мы будем использовать гипотетический сценарий для вывода дизайна корзины покупок: определенная платформа электронной коммерции является мультитенантной моделью (многие из наших предыдущих разработок являются мультитенантными моделями), пользователи могут добавлять товары в корзину, и Отображать и сортировать по широте продавца. Конечно, корзина также поддерживает различные обычные операции: выбор, удаление, опустошение, аннулирование товара и т. д. И есть соответствующие акции, чтобы напомнить пользователям. При этом для мониторинга и работы необходимо поддерживать возможность синхронизации данных корзины с мониторингом и хранилищами данных.
В этой статье объясняются возможности системы с точки зрения пользователя и с точки зрения сервера. Наша основная цель в этой статье — прояснить возможности корзины и немного логики. В следующей статье мы рассмотрим дизайн модели корзины покупок и определение интерфейса.
Перспектива пользователя
Давайте сначала определим, каковы функции пользователя, работающего с корзиной на стороне пользователя?
Основные возможности корзины в основном показаны на картинке выше, и мы будем разбирать ее по порядку.
действовать
С точки зрения пользователя, корзина может использоваться пользователями для добавления товаров в корзину (добавление в корзину и немедленная покупка — оба способа добавления); после добавления в корзину, если вы этого не сделаете хотите, вы можете удалить продукт (удалить один, удалить несколько, очистить); если вы хотите купить больше, вы можете изменить количество покупки, если вы обнаружите, что денег недостаточно, вы можете уменьшить количество покупки; или если вы обнаружите, что красный красивее белого, вы можете легко изменить характеристики в корзине; для некоторых дорогих товаров вы можете добавить в корзину некоторые услуги безопасности (фактически связанные виртуальные товары) ; при переходе к кассе также будет предоставлена возможность выбрать, какие товары вы действительно хотите купить в этот раз.
Из вышеприведенного описания видно, что этот процесс неразрывно связан. Давайте поговорим о выбранной функции. В отрасли существует два подхода, каждый со своими преимуществами и недостатками. Давайте посмотрим. Статус выбора продукта Taobao сохраняется на стороне клиента, и он не выбран по умолчанию.Обновление и повторное открытие статуса приложения исчезнет; JD.com и Suning сохраняются на стороне сервера, а статус выбора пользователя будет записан . Есть плюсы и минусы для обоих случаев.
Клиент:
- Производительность, логика проверки/снятия отметки выполняется непосредственно локально, что снижает количество сетевых запросов
- Опыт, мультиконец не может быть синхронизирован, но корзина больше похожа на любимую, каждый раз, когда пользователь выбирает, это понятно
- Расчет, при расчете цены необходимо загрузить локально выбранный продукт (его также можно рассчитать локально)
- Реализация, в основном клиентом, не имеет ничего общего с сервером, развязка НИОКР
Сервер:
- Производительность, каждый раз при выборе операции нужно вызывать сервер, и операция может быть очень частой.Помимо потери сети, серверу также необходимо учитывать, как быстро найти модифицированный продукт
- Опыт, статус синхронизации с несколькими терминалами, исторический статус записи
- Расчет, сервер может получить данные, и нет необходимости выгружать дополнительные данные при запросе
- Реализация, сервер и клиент должны договориться о том, как взаимодействовать и возвращать данные (каждый выбор приведет к изменению цены) в сочетании друг с другом.
Лично я считаю, что ни один из этих двух методов не имеет очевидных преимуществ, и это выбор, основанный на бизнес-модели и ситуации в команде. Наш последующий дизайн здесь будет основан на сохранении выбранного состояния продукта на сервере.
Во всей логике работы есть еще два важных места, которые нужно объяснить отдельно: метод покупки и изменение атрибутов покупки в корзине.
Способы покупки
Существует три основных способа покупки: купить сейчас, добавить в корзину и групповая покупка.
Прежде всего, нечего сказать о обычном добавлении в корзину. Сосредоточьтесь на покупке сейчас и сгруппируйтесь.
В операции «Купить сейчас» нужно сразу перейти на страницу подтверждения заказа после выбора товара, без шага расчета в корзине. Но его реализация может опираться на логику корзины.Давайте посмотрим на разницу между использованием корзины и неиспользованием корзины для реализации этой логики?
Если используется корзина для покупок, то есть когда пользователь нажимает кнопку «Купить сейчас», продукт по существу добавляется в корзину для покупок, но эта корзина для покупок отличается от корзины для покупок-прототипов, поскольку в корзину для покупок можно добавить только один продукт, и каждый раз операции перезаписываются. С точки зрения эффекта перспективы, он также переходит прямо со страницы сведений о продукте на страницу подтверждения заказа. Давайте посмотрим на преимущества этого подхода
- Логика подтверждения заказа и размещения заказа согласуется с корзиной, а данные можно получить непосредственно через внутреннюю корзину.
- Требуется отдельная корзина, предназначенная для покупок в один клик, и потребляется память.
В другой реализации используется новая структура данных, потому что, вообще говоря, покупка в один клик проще, и ей нужна только информация о продукте и информация о цене. Каждое взаимодействие можно получить по sku_id.
- Логика подтверждения и оформления заказа должна быть преобразована, а согласованные параметры должны передаваться между каждым запросом
- Экономьте память, а взаимодействие вверх и вниз гарантируется sku_id
Мы будем использовать покупку в один клик на сервере, чтобы реализовать ее в виде самостоятельной корзины. Модель данных корзины непротиворечива, что обеспечивает согласованность последующего потока обработки.
Для группового боя он фактически разделен на две части, первая — это действие открытия группы, когда группа создана. Мы можем добавить сгруппированные продукты в обычную корзину, и в то же время мы можем купить другие продукты. Вы также можете добавить сгруппированные продукты в корзину покупок в один клик, чтобы гарантировать, что можно будет приобрести только один сгруппированный продукт. Групповой режим больше похож на предварительное условие для добавления в корзину. По сути, это не влияет на дизайн корзины.
Изменить атрибуты покупки в корзине
В основном это относится к удобной работе некоторых вещей, которые необходимо оперировать на широте spu в корзине, таких как: изменение спецификаций (то есть замена артикула) и выбор услуг, привязанных к широте spu (страхование, расширенная гарантия и др.).
Давайте сосредоточимся на выборе связанного сервиса. Например, когда мы покупаем мобильный телефон, производитель предоставляет расширенную гарантию и различные другие дополнительные услуги, в общем, эти услуги являются виртуальными товарами. Но есть особый случай. Во-первых, эти гарантийные услуги нельзя приобрести отдельно, а во-вторых, они тесно связаны с количеством основного товара. Например, если вы покупаете два мобильных телефона, если вы решите приобрести дополнительные услуги, то количество этих услуг должно быть 2, что будет отношением связи.
Эти гарантийные услуги нельзя приобрести по отдельности, они должны быть включены в определенные продукты.
При сохранении этой части данных сервер должен учитывать, как сохранить эту иерархическую взаимосвязь.Вы увидите эту часть, когда мы разработаем модель позже.
напоминать
Напоминание о рекламной акции очень простое, возвращая данные корзины покупок, каждый элемент должен содержать текущую информацию о рекламной акции. Эта часть посвящена тому, как получить рекламную информацию, которая будет видна на сервере.
Затем произнесите напоминание о количестве корзин, которое должно отображать количество товаров в текущей корзине. Вообще говоря, при входе в приложение будет вызываться интерфейс для получения количества непрочитанных сообщений пользователя, количества товаров в корзине и т. д. Здесь нужна очень высокая скорость чтения. Так как же удовлетворить это требование?
Вариант первый:Мы можем разработать структуру для сохранения объема информации о напоминаниях, связанной с пользователем, и каждый раз напрямую считывать эти данные. Нет необходимости иметь дело с сервисами обмена сообщениями, сервисами корзины покупок, чтобы получить эти данные.
Вариант 2:В модели сообщения и корзины поле предназначено для хранения общего количества, а в интерфейсе чтения данных эти сервисы вызываются одновременно для получения данных и их агрегации, так что скорость зависит только от самого медленного сервиса. .
Здесь наш дизайн будет использоватьВариант 2, потому что таким образом можно в определенной степени гарантировать эффективность и легче гарантировать согласованность структурных данных всей системы. Конечно, здесь есть одна деталь, которую необходимо отметить: параллельное чтение должно быть рассчитано на тайм-аут, чтобы производительность всего интерфейса не падала из-за проблемы с чтением определенного сервиса.
Далее давайте взглянем на продвижение, В дополнение к напоминанию, эта часть также должна предоставить соответствующую запись, чтобы пользователь мог завершить операцию продвижения. Например, если есть купон на определенный товар, можно напрямую указать вход для его получения, можно сделать заказ, а есть вход для входа в список сбора заказов и выбора товара. Проблема, которую необходимо решить в этой части, заключается в том, как сервер может вовремя получать эти рекламные акции от широты продукта.
Прочитав его с точки зрения пользователя, давайте встанем с точки зрения НИОКР и посмотрим, что должен делать сервер.
Перспектива НИОКР
Давайте сначала взглянем на сводную диаграмму требований:
место хранения
Что касается хранения, то на первом месте однозначно память, а хранить ее или нет, думаю, не нужно. Вот моя причина:
- Данные в корзине меняются очень часто, а стоимость удаления хранилища относительно высока.Если данные удаляются асинхронно, трудно обеспечить согласованность.
- В крайних случаях происходит сбой кеша, и пользователю нужно только повторно добавить в корзину, и мы можем обеспечить восстановление данных через механизм сохранения кеша.
Так что для корзины мы просто будем хранить данные полностью в памяти.
Изменения в типе продаваемого товара
Теперь давайте обсудимИзменения в типе продаваемого товараЭта проблема. Что это означает? Подумайте об этом: например, я добавил товар А в корзину, но он не был оплачен. В это время в операции говорилось, что нужно провести операцию по товару А и продать 10 акций со скидкой 50%. Итак, вопрос в том, как быть с пользователями, у которых товар уже был в корзине?Здесь решается основная проблема: пользователь, у которого есть товар в корзине, не может напрямую купить его со скидкой 50%.. Давайте рассмотрим несколько вариантов:
Вариант первый:После настройки акции все пользователи, у которых есть товар в корзине, будут признаны недействительными или удалены.Это решение будет принято первым, стоимость операции слишком высока, а пользовательский опыт оставляет желать лучшего.
Вариант 2:В корзине необходимо отличать один и тот же артикул от разных типов продаж. То есть в нашу корзину товары добавляются не по широте SKU, а поАртикул + тип продажидля создания уникального идентификатора.
можно увидетьВариант 2Решена проблема, что одни и те же артикулы сосуществовали в корзине и не влияли друг на друга до инвентаризации. Но вот еще вопрос? Тип продажи продукта (или этот знак), как и где его установить? Кажется, что можно разработать товарную систему, а также настроить систему продвижения. Наша логика будет настроена в системе продвижения. Поскольку товар относится к базовой логике, его изменение повлияет на глобальный инвентарь. Трудно автоматически нормально продавать после события. Следовательно, этот тег должен быть установлен в действии (при задании действия через систему продвижения будет получено, являются ли предыдущие действия продукта взаимоисключающими, чтобы гарантировать, что настроенные действия не будут противоречить друг другу).
зависимая система
Система корзины покупок зависит от множества других систем.
- товарная система
- система инвентаризации
- Система продвижения
- система расчетов
Некоторые из этих зависимых систем предназначены для передачи данных, а некоторые — для сбора данных. Давайте посмотрим на эти две широты.
Рекламные оповещения и расчеты
Сервер должен решить проблему напоминания об акции и расчета цены.
Теперь о расчете, лучше всего по этой части вызвать расчет цены расчетного центра. Давайте посмотрим на разницу между расчетом цены в корзине и расчетом цены при оплате заказа.
Во-первых, при расчете цены в корзине адрес пользователя неизвестен, что повлияет на расчет стоимости доставки; Так что на самом деле, если эти две проблемы решены, мы можем сделать так, чтобы расчет цены исходил из одной и той же логики, только некоторые входные параметры разные. Поэтому, когда мы рассчитываем здесь, мы можем рассчитать в соответствии с самой высокой стоимостью доставки, а купоны не используются в корзине по умолчанию. Что касается рекламных вопросов, вы можете подтвердить, какие цены доступны для выбранных продуктов через систему продвижения. Поэтому цена продвижения должна быть принята во внимание.
Далее поговорим о том, как эффективно предоставлять рекламную информацию пользователям. Давайте начнем с нашей точки зрения конфигурации.
Когда мы настраиваем акцию или выдаем купон, мы объединяем несколько продуктов в одну акцию или купон. Относительно эффективно приобретать товары в зависимости от широты действий и купонов.
Но есть изменение в сцене корзины. Нам нужно получить всю информацию о деятельности (полная деятельность платформы, деятельность магазина) продукта из широты продукта; Итак, что я должен сделать, чтобы отобразить эту информацию в корзине? Очень распространенная практика (и действительно многие компании таковы): удалить всю информацию о деятельности и просмотреть всю информацию, связанную с продуктом. Этот подход неэффективен и не подходит для сценариев крупномасштабных приложений, таких как период Double Eleven.
Следовательно, чтобы удовлетворить этот спрос, система продвижения должна обеспечивать возможность получения соответствующих акций (действий, купонов) в соответствии с продуктами. Поэтому, вообще говоря, действия, настроенные системой продвижения, не могут храниться только в соответствии с широтой действий, но также должны генерировать рекламную информацию широты товаров.
Анализ данных корзины покупок
Что касается данных корзины покупок, внешний интерфейс будет записывать добавление данных корзины покупок через скрытую точку, но скрытая точка внешнего интерфейса обычно записывается для запуска операции внешнего интерфейса, но неизвестно, будет ли операция успешно или нет. И невозможно быть в курсе текущей общей ситуации с данными корзины покупок.
Чтобы операционная группа имела более полное представление о текущей ситуации с корзиной, мы записываем локальные журналы через серверную часть, а затем синхронизируем журналы с данными, мониторингом и другими службами посредством сбора журналов.
Инвалидация и сортировка
Есть еще две небольшие части, которые не были упомянуты.Во-первых, как аннулировать товары, например: товар отсутствует на складе и отсутствует на полке;другой заключается в том, что товары в корзине находятся в нескольких магазинах, что это стратегия сортировки?
Поскольку в этой статье мы обсуждаем только требования и не затрагиваем конкретный дизайн модели, мы представляем только схему. Во-первых, продукт недействителен, что очень похоже на операцию обратимого удаления.После установки продукт, видимый пользователем, не сможет быть урегулирован, и может быть выполнена только операция удаления.
Схема, которую мы будем использовать для сортировки, следующая: в зависимости от того, когда магазин в последний раз работал в корзине, последняя операция должна быть вверху.
конец
Благодаря вышеизложенному мы в основном выясняем, что мы должны делать в дизайне корзины покупок и какие возможности должна предоставлять зависимая система. Следующая часть начинается с проектирования модели данных, внешнего и внутреннего интерфейса.
Если у вас есть какие-либо дополнения к потребностям в корзине, пожалуйста, оставьте сообщение. Давайте совершенствоваться вместе.
адрес проекта:GitHub.com/payee-shop/лошадь…