Код: Выделить всё
cartОшибки/Альтернативы: Зарезервированный → истек → Decficle (запасы возвращались); PAITED_IN_PROGRESS → неудачный → отменен (выпустить акцию или сохранить для ручного просмотра); Оплаченный < /code> → Возврат < /code> (Сохранить события возврата). < /p>
Сделать разрешенные переходы, явные в коде, чтобы предотвратить недопустимые изменения состояния. полностью. SETS). Реализация каждого соответствующего модуля < /p>
реализация модуля-модуля (алгоритмы + точные ссылки на чтение) < /h1>
a-Backend Core (Express + DB) < /h2>
prosted Кодирование: < /strong> Express Ridey (routing & midledware). />1) Project skeleton & middleware
Algorithm (no code):
- Create Express app and structured router directories: /routes, /controllers, /models, /services, /utils.
< /li>
Добавить анализатор тела json, cors (ограничение происхождения в Prod), шлем для заголовков, ограничитель скорости для чувствительных конечных точек, промежуточное программное обеспечение < /p>
< /li>
Paypal_secret, webhook_id). < /P>
Где читать: < /p>
< /li>
< /ol>- Экспресс -документы для промежуточного программного обеспечения и обработки ошибок. /> Алгоритм: < /p>
Подключиться к mongodb-убедитесь, что это набор реплики < /em> для включения транзакций (атлас или реплика с одним узлом). Если невозможно, вернитесь к атомной FindoneAndupdate + компенсирующий откат. Если создание сеанса /транзакции не удается (автономный), используйте атомные обновления в течение всего элемента с компенсационным алгоритмом отката и жестким ведением ведения. (Mongodb) < /h3>
Конструктивный список (Fields): < /p>
: _id, имя, описание, категория, цена, валюта, запасы, imageurl, censureat, updatedatКод: Выделить всё
products
Создать text index [/b] на имя + Описание для поиска. - Дополнительные индексы: Category , код>, код>, код>, код. запросы). < /li>
< /ul>
< /li>: _id, ordernumber, элементы [{procusId, Qty, PRICEatPurchase}], TotalAmount, валюта, клиент {}, статус, PayPal: {OrderId, CaptuctionId, RAW}, создан, истекает, openseVents []Код: Выделить всё
orders - или используйте генератор последовательностей для OrderNumber .
Код: Выделить всё
counters
- Индексы Mongodb, текстовый индекс. /> Алгоритм: < /p>
:Код: Выделить всё
GET /products
parse q , фильтры категории, диапазон цен, сортировка, страница, лимит. - Использовать $ text Поиск, если q sure; Оценка проекта . Применить фильтры; Отправить мета -мета. (Если вам нужен лучший поиск позже, используйте поиск Atlas.) < /Li>
< /ol>
< /li>за элемент. (Это предотвращает манипулирование ценом.)Код: Выделить всё
GET /products/:id< /code>: проверка идентификатора, вернуть информацию о продукте. < /li> < /ul> Читать: < /p> Mongodb Text Search /Основы агрегирования. /> Это важно - точно следите. Не доверяйте итогов клиента. Хранить Priceatpurchase - Запустите сеанс транзакции (если набор реплики доступен). Внутренняя транзакция:
Для каждого элемента. Запустите атомное условное обновление: findoneandupdate ({_ id: productId, stock> = qty}, {$ inc: {stock: -qty}}) < /code>. Если какое -либо обновление не удается (недостаточно акций), прервать транзакцию и вернуть, какие элементы находятся в запасе. Сохранить ordernumber (Get Next от Counters через Atomic $ Inc).
- Экспресс -документы для промежуточного программного обеспечения и обработки ошибок. /> Алгоритм: < /p>
- Транзакция совершения; return orderId + истекает .
- Если транзакции недоступны:
- Для каждого элемента findoneandupdate с запасом> = qty . Отслеживать успешные обновления. Если вы не пройдете, выполните компенсацию для ранее сокращенных продуктов (осторожно для регистрации сбоев и повторения). Создайте порядок только после того, как все сокращения преуспевают. (Это менее безопасно, чем транзакции, но работоспособные.) < /P>
Почему этот корректированный подход: < /p>
< /li>
< /ul>
< /li>
< /ol>
Совместный запасы при повреждении по порядку. Это требует атомности для нескольких обновлений продукта-следовательно, рекомендуется транзакции.
Algorithm: - Для каждого элемента findoneandupdate с запасом> = qty . Отслеживать успешные обновления. Если вы не пройдете, выполните компенсацию для ранее сокращенных продуктов (осторожно для регистрации сбоев и повторения). Создайте порядок только после того, как все сокращения преуспевают. (Это менее безопасно, чем транзакции, но работоспособные.) < /P>
- warder worderd. Сервер повторно выбирает заказ и перекачивает/проверяет суммы.
- Вызовы API API server> Для создания заказа PayPal с авторитетной суммой и элементами строки. Сохранить возвращаемый paypal.orderid в orders.paypal.ordorid и обновление состояния порядка = "платеж_in_progress" . Return paypal.ordorid клиенту. (Не позволяйте клиенту создавать порядок PayPal со счетами на стороне клиента.) < /Li>
< /ol>
7). /PayPal/Capture с OrderId (внутренний) и PayPalOrderId . - Серверные вызовы PayPal Orders Capture конечная точка server side , проверяет:
- captude sumber equald affals ordals.totalAlamount and vase oreads ordals.totalAlAmount and vasuretaUntount and codency
Captuded Equide. Соответствует, < /li>
Статус плательщика действителен. (Электронная почта, обновление аналитики).
- captude sumber equald affals ordals.totalAlamount and vase oreads ordals.totalAlAmount and vasuretaUntount and codency
- Если захват не удастся из -за сети/тайм -аутов: Mark payment_in_progress и re -retry; Не отмечайте оплату , если не подтверждено.
- Реализовать post/webhooks/paypal , чтобы принять события Paypal (например, wather.capture.completed ) и vertify verrize
< /ul>
Читать: < /p>
PayPal заказы API + Capture Docs и JS Sdk. /> Алгоритм: < /p>- aept Event; Проверьте с PayPal, используя Verify-Webhook-Signature или эквивалентный; Отклонить, если проверка не стерла. Переверните суммы, если это необходимо, через вызов сервера в PayPal.
- Обновление Orders.status Соответственно (например, платный ), хранить необработанное событие и ack.
- Запустить фоновое задание каждые n минут (например, каждые 1–5 минут). Заказы запросов where status = "Зарезервировано" и истекает
Логические срезы: < /p>
- Результаты поиска, сведения о продукте, загрузка/ошибки.Код: Выделить всё
productsSlice - - Элементы тележки, вычисленные итоги, сохраняются в локальном storage (регидрат при загрузке).
Код: Выделить всё
cartSlice - - Создать заказ (резервирование), отслеживание OrderId , истекать , ordation status.
Код: Выделить всё
orderSlice - .
Код: Выделить всё
uiSlice< /code> - Глобальные тосты /погрузчики. < /li> < /ul> Алгоритм для проверки поток пользовательского интерфейса: < /p> Пользователь нажимает Checkout → Open Checkut Form. Проверьте с помощью формы реагирования или простой проверки. Если сервер возвращает ошибку запаса, обновите корзину и отображение конкретных сообщений. При утверждении, вызов сервера Post /paypal/capture - Показать заказ/: ordernumber страница статуса с опросом или толканием сервера, чтобы показать платный webhook. Createorder/Onprove Flow.
- Покажите резервное исходное отсчет для пользователя (от Exciresat ), так что пользователь знает время. Продолжить. < /li>
Упорная корзина в локальной стороне < /code> и разрешить слияние с серверной корзиной, если пользователи входят в систему (необязательно). < /li>
< /ul>
d - аналитика и агрегация (mongodb) < /h2>
algorithm (mongodb) < /h2>
algorithm (mongodb) < /h2>
algorithm (mongodb) < /h2>
algoritkm (mongodB) />
Для продаж по категории:
Match Orders.status = "PALE" < /code>, фильтр диапазона дат. < /li>элементы, $ group by items.category (или продукт ref) Суммирование qty и доход = qty * priceatpurchase .Код: Выделить всё
$unwind - по доходам/Qty, $ Limit . Используйте $ project , чтобы сформировать результаты. (Это стандартное использование конвейера агрегации.) < /Li>
Код: Выделить всё
$sort
< /ul>
< /li>
< /ol>
Читать: < /p>
Обзор конвейера агрегации и этапа. Infra < /h2>
Контрольный список безопасности (чтение и реализация) < /h3>
Проверить + дезинфицировать все тела запроса (JOI /AJV или ручное). < /li>
Используйте шлем, установите безопасные корре. Вход). < /li>
Используйте HTTPS в производстве; хранить секреты в Env. < /li>
Проверьте подписи PayPal Webhooks; Хранить обработанные идентификаторы события, чтобы избежать дубликатов.
- Использовать mongodb atlas (поддерживает транзакции) или настройка набора отдельных реплик для локального тестирования. Стабильный URL для PayPal Webhooks. Добавить проверки здоровья и журнала. /> Интеграционные тесты < /strong>: Multi-Eitem Order Create с одновременными запросами на последнюю единицу-убедитесь, что только один резерв. (Симуляция параллелизма.)
- end-to-end : используйте песочницу PayPal для создания и захвата; Также имитируйте вызовы Webhook от Sandbox PayPal или через почтальон. Проверка сервера получает и проверяет WebHook и Marks Order Pay .
- Испытания на сбое : сбои сети во время захвата (логика сервера), дубликат Webhook Duplicate, Образец для срочных работников. РЕЗУЛЬТАТЫ. /> Pipeline (Analytics).
- Текстовый индекс и лучшие методы поиска (поиск продукта).
- PayPal Заказы API (Create/Capture) - Интеграция сервера. /> Лучшие практики PayPal Webhooks & Verification. Список литературы (выше).
- Бэкэнд -скелет (Express, промежуточное программное обеспечение, DB Подключите к набору реплик или атлас).
- Реализовать продукты конечные точки + Seed DB + Индекс текста. Transactional Algorithm (или Safe Sharkback).
- Реализуйте Post/PayPal/Create-Order (сервер), интегрируйте API за заказы PayPal. Idempatency. < /li>
Реализуя резервировать работника срока действия и сверки. Исправить условия гонки. < /li>
Демо -видео -видео после более раннего контрольного списка. />, install: express , mongoose , cors , dotenv , express-validator , paypal-rest-sdk (или официальный SDK PayPal).Код: Выделить всё
npm init -y - Setup Structure: >
- Setup STURTURD:
- Setup STURMER:
- .
Код: Выделить всё
/backend /models /routes /controllers /config
- Использовать mongose.connect (process.env.mongo_uri) . Имя/Описание.
- Модель продукта: name, цена, категория, Stock, imageurl, описание. Статус, идентификатор транзакции PayPal. < /li>
< /ul>
< /li>
Core API < /strong> < /p>
→ список, фильтр, поиск (с помощью Regex или $ text index).Код: Выделить всё
/api/products - → одиночный продукт.
Код: Выделить всё
/api/products/:id - → создать заказ (проверки).
Код: Выделить всё
/api/orders - → получить сведения о заказе.
Код: Выделить всё
/api/orders/:id - → инициировать заказ PayPal.
Код: Выделить всё
/api/paypal/create-order - → Подтвердить платеж + Статус заказа обновления.
Код: Выделить всё
/api/paypal/capture-order - → агрегация MongoDB (продажи по категории, топ -продавцы, низкие запасы).
Код: Выделить всё
/api/analytics
- Ошибка.
Код: Выделить всё
express-validator< /code>). < /li> < /ul> < /li> < /ol> [b] Фаза 2: установка фронта < /strong> < /h2> react app setup < /strong> reacnpx create-react-app frontend - Установка: React-router-dom , @roduxjs/toolkit , React-redx , axios .
Код: Выделить всё
/frontend/src
/store
store.js
productSlice.js
cartSlice.js
orderSlice.js
< /code>
< /li>
среза: < /strong> < /p>
[list]
productSlice[*]
Код: Выделить всё
cartSlice[*]
Код: Выделить всё
orderSlice< /code> → создать заказ, состояние трека. < /li>
< /ul>
< /li>
< /ul>
< /li>
Components < /strong>
Header[*]
Код: Выделить всё
ProductList[*]
Код: Выделить всё
ProductCard[*]
Код: Выделить всё
Cart[*]
Код: Выделить всё
Checkout[*]
Код: Выделить всё
PayPalButton[*]
Код: Выделить всё
OrderConfirmation< /code> → отображение после оплаты. < /li>
< /ul>
< /li>
< /ol>
Фаза 3: Поток данных и интеграция < /plorn> < /h2>
Правильный Поток: < /press> < /p>
(от /api/productsКод: Выделить всё
/api/orders[/list]
[*] App → Call/api/paypal/create-order → Popal Popup Opens. /> Бэкэнд → Статус заказа обновлений → Ответ успеха вернуть. Заказы, PayPal Flow, Analytics). < /li>
тестирование на фронта: < /strong> убедитесь, что корзина устойчиво после обновления, ошибки обработаны. Демо -препарат [/b]
Поток прохождения:
- Поиск/фильтр. /> < /ul>
< /li>
Redux Devtools: < /strong> Показать обновление корзины и срезов. Модуль)
mongodb & агрегация: mongodb docs - Модели монги: mongoose docs nod nod nod nod nod nodk docs docs nod nodk nodk docs nodk nodk nodk nod nodk nodk nodk nodk nodk nod nodk nodk />Redux Toolkit: Redux Toolkit Docs
- React Router: React Router Docs
[*]Always create order in DB before Платеж PayPal → обеспечивает откат, если оплата не удастся.
cart должна сохраняться в LocalStorage → предотвратить потерю предметов на Relesh. проверить в Backend < /strong> с помощью PayPal SDK. < /li>
< /ul>
Компания API -точки API создание продуктов с помощью поиска и операций CRUD. MongoDB агрегационные трубопроводы
Настройка приложения React с помощью Redux Toolkit и маршрутизации
Реализация Redux для корзины, продуктов и заказов
Построение, поиск и фильтрование компонентов
Компоненты корзины для покупок с интеграцией Redux
Процесс сборочной проверки с интеграцией PayPal
Full-Stack Integration и Cond-out-out-to>
Подробнее здесь: https://stackoverflow.com/questions/797 ... orrect-way
Мобильная версия