Интернет-магазин тканей: каталог с расчётом по метражу, оплата переводом с проверкой чека, отзывы только от подтверждённых покупателей.
Магазин тканей в Самарканде: шифон, маркиза, кружево, атлас. Возят из Дубая, режут от метра, отправляют по Узбекистану.
Главная особенность — товар продаётся не штуками, а длиной. Метраж выбирается на карточке, цена считается за метр, в корзине хранятся сантиметры. Смешивать метры и сантиметры в подсчёте денег опасно, поэтому единица одна на весь код — сантиметр, а перевод в метры делается только при показе.
Корзина живёт в браузере, а не в базе: чтобы отложить отрез, регистрироваться не нужно, вход требуется только на оформлении. Но цены оттуда — только для показа: при оформлении сервер заново читает каждый товар из базы и считает сумму по ней. Иначе достаточно было бы поправить хранилище браузера, чтобы купить шёлк за сто сумов.
Оплата — переводом на карту с загрузкой чека, владелец сверяет и подтверждает. Отзыв может оставить только тот, чей заказ подтверждён.
Сделан на том же основании, что и сайт студии: Next.js 15, Prisma, Auth.js, — но с собственным оформлением в тёплом золоте.
Фрагмент из настоящего кода проекта — чтобы было видно, что внутри.
/** * Сколько сантиметров в метре. Вынесено в константу не ради * значения, а ради читаемости формул: total * CM_IN_METER * понятнее, чем * 100 посреди подсчёта денег, где сотни легко * спутать с копейками. */export const CM_IN_METER = 100;/** * ВАЖНО. Цены и названия в корзине — снимок для показа, не * источник истины. При оформлении сервер заново читает каждый * товар из базы и считает сумму по ней (см. createOrder). * Иначе достаточно было бы поправить localStorage, чтобы купить * шёлк за сто сумов. */const subtotal = lines.reduce( (sum, line) => sum + lineTotal(line.pricePerMeter, line.quantityCm), 0,);const totalMeters = lines.reduce((sum, line) => sum + line.quantityCm, 0) / CM_IN_METER;Заявка на проект
Заполните форму — обсудим детали и сроки.
Integral — электронный журнал
