К содержимому
Hub
Zarifa Material — ткани из Дубая

Zarifa Material — ткани из Дубая

Веб2026Next.js 15TypeScriptPrismaAuth.jsМагазин

Интернет-магазин тканей: каталог с расчётом по метражу, оплата переводом с проверкой чека, отзывы только от подтверждённых покупателей.

Магазин тканей в Самарканде: шифон, маркиза, кружево, атлас. Возят из Дубая, режут от метра, отправляют по Узбекистану.

Главная особенность — товар продаётся не штуками, а длиной. Метраж выбирается на карточке, цена считается за метр, в корзине хранятся сантиметры. Смешивать метры и сантиметры в подсчёте денег опасно, поэтому единица одна на весь код — сантиметр, а перевод в метры делается только при показе.

Корзина живёт в браузере, а не в базе: чтобы отложить отрез, регистрироваться не нужно, вход требуется только на оформлении. Но цены оттуда — только для показа: при оформлении сервер заново читает каждый товар из базы и считает сумму по ней. Иначе достаточно было бы поправить хранилище браузера, чтобы купить шёлк за сто сумов.

Оплата — переводом на карту с загрузкой чека, владелец сверяет и подтверждает. Отзыв может оставить только тот, чей заказ подтверждён.

Сделан на том же основании, что и сайт студии: Next.js 15, Prisma, Auth.js, — но с собственным оформлением в тёплом золоте.

Как это устроено

Фрагмент из настоящего кода проекта — чтобы было видно, что внутри.

TypeScript
/** * Сколько сантиметров в метре. Вынесено в константу не ради * значения, а ради читаемости формул: 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;
Связаться

Заявка на проект

Заполните форму — обсудим детали и сроки.

По проекту: Zarifa Material — ткани из Дубая
Следующий проект

Integral — электронный журнал