Next.js веб-приложение для продвижения услуг мастерской 3D-печати. Проект объединяет клиентский интерфейс для пользователей и административную панель, позволяя автоматизировать цикл работы с заказами — от подачи заявки до оплаты.
📑 Содержание
✨ Возможности приложения
🧱 Технологический стек
🚀 Описание функционала
📚 Скрипты
🔐 Аутентификация
🧭 Роутинг
🔗 API
🛢️ Структура базы данных
🗄️🔑 Регистрация в качестве администратора
Пользователь имеет возможность:
- ознакомиться с услугами мастерской и расценками;
- запросить консультацию;
- загрузить 3D-модель и рассчитать предварительную стоимость печати;
- оформить заказ и отслеживать его статус;
- оплачивать услуги через встроенный платежный сервис;
- управлять личными данными, заказами и заявками.
Администратор получает возможность:
- просматривать и обрабатывать заявки на консультацию;
- управлять заказами и их статусами;
- назначать стоимость, состав и параметры заказа;
- работать с загруженными пользователями 3D-моделями;
- создавать ссылки для оплаты и отправлять клиентам счета.
Интерфейс:
- адаптивный
Стек UI:
- Next.js 15
- React 19
- Material UI
- SCSS-модули
- Three.js (для просмотра 3D-моделей и расчета их геометрических характеристик)
Методология построения архитектуры:
- Feature-Sliced Design
Управление состоянием:
- MobX
Аутентификация:
- NextAuth
База данных:
- PostgreSQL (Neon)
- TypeORM
Хранение файлов:
- S3-совместимое хранилище (Timeweb Cloud)
- Zod
- Vitest
- React Testing Library
- ЮКасса (YooKassa)
Приложение развернуто на платформе Vercel
👉 https://3d-studio-nine.vercel.app
| Команда | Описание |
|---|---|
dev |
Запуск разработки |
build |
Сборка production версии |
start |
Запуск собранного приложения |
lint |
Линтинг ESLint |
format |
Prettier форматирование |
test |
Запуск тестов |
Процесс аутентификации реализован на основе NextAuth.js с использованием JWT-токенов.
В качестве провайдеров задействованы:
• CredentialsProvider — для аутентификации по логину и паролю;
• GoogleProvider — для входа через Google аккаунт.
Данные администраторов хранятся в таблице master_users.
Для всех защищённых маршрутов и API-эндпоинтов выполняется серверная проверка соответствия email текущего пользователя записям в master_users.
Эти страницы доступны всем посетителям без необходимости авторизации:
/3d-printing- основная страница с общей информацией о 3D печати./contacts- контактная информация мастерской./logistic- информация о вариантах доставки./plastic- информация о видах используемых пластиков./price- страница с функционалом предварительного расчета стоимости заказа.
Доступны только после авторизации (или с особыми правами):
/admin_register- регистрация авторизованного пользователя как администратора (используется в демонстрационных целях)./auth_error- заглушка при ошибке аутентификации./unauthorized- заглушка при ошибке аутентификации./crm/dashboard- панель управления: списком всех заказов и заявок./crm/settings- настройки параметров ценообразования.
Эти маршруты доступны без авторизации:
/api/crm/materials- получение списка используемых пластиков./api/crm/services- получение перечня предоставляемых услуг./api/check-user- авторизация пользователя через Credentials Provider./api/check-authenticated-user- проверка, что пользователь, авторизованный через Google Provider, имеет роль администратора./api/auth- служебный эндпоинт библиотеки NextAuth (не предназначен для прямого использования).
Эндпоинты доступны только после авторизации (или с особыми правами):
/api/admin_register- регистрация пользователя, как администратора./api/crm/getSignedUrlToS3- генерация подписанного URL для скачивания файла из хранилища./api/crm/submited_order- получение данных заказа./api/crm/submited_order/update- обновление данных заказа./api/crm/submited_order/delete- удаление заказа./api/crm/submited_orders- получение списка всех заказов./api/calculate- предварительный расчет стоимости заказа./api/consultation- создание / удаление консультационной заявки пользователя./api/consultation/list- список консультационных заявок конкретного пользователя./api/orders- создание / удаление заказа пользователя./api/orders/list- получение списка заказов пользователя./api/invoice/confirmation_url- создание счета для клиента./api/payment/confirmation_url- создание платежя для проведения оплаты клентом.
Таблица используется для хранения заявок на консультацию, созданных пользователями через сайт. Каждая запись соответствует одной заявке и содержит информацию для обратной связи, а также текущий статус обработки.
| Поле | Тип | Ограничения | Описание |
|---|---|---|---|
| id | int |
PK, auto-increment | Уникальный идентификатор записи. |
| contact | varchar(50) |
NOT NULL | Контакт пользователя: телефон или email |
varchar(255) |
NULL | Email пользователя (необязательно). | |
| name | varchar(255) |
NULL | Имя пользователя (необязательно). |
| created_at | timestamptz |
NOT NULL, default CURRENT_TIMESTAMP |
Дата и время создания заявки (UTC). Добавляется автоматически. |
| order_status | varchar(50) |
NOT NULL | Текущий статус заявки |
Таблица хранит информацию о заказах клиентов в мастерской 3D-печати. Используется для управления заказами, отображения деталей и отслеживания оплаты.
| Поле | Тип | Ограничения | Описание |
|---|---|---|---|
| id | int |
PK, auto-increment | Уникальный идентификатор заказа. |
| file_path | text |
nullable | Путь к загруженному клиентом файлу модели. |
| name | varchar(255) |
NOT NULL | Имя заказчика. |
| phone | varchar(50) |
NOT NULL | Контактный телефон заказчика. |
varchar(255) |
NOT NULL | Электронная почта заказчика. | |
| plastic_type | varchar(50) |
nullable | Тип используемого пластика. |
| color | varchar(20) |
nullable | Цвет пластика. |
| with_postprocessing | boolean |
default false |
Флаг, требуется ли постобработка модели. |
| with_modelling | boolean |
default false |
Флаг, требуется ли 3D-моделирование. |
| comment | text |
nullable | Комментарий заказчика. |
| created_at | timestamp |
default CURRENT_TIMESTAMP |
Дата и время создания заказа. |
| order_status | varchar(50) |
NOT NULL | Статус заказа (например, «in_work», «completed»). |
| payment_status | varchar(50) |
NOT NULL | Статус оплаты (например, «not_paid», «paid»). |
| price | float |
nullable | Стоимость заказа. |
| invoice_url | varchar(255) |
nullable | Ссылка на счет для оплаты. |
| invoice_id | varchar(255) |
nullable | Идентификатор счета в платежной системе. |
Таблица хранит данные пользователей, имеющих административные права в CRM-системе. Записи создаются после регистрации администратора и используются механизмом авторизации для доступа к закрытым разделам панели управления.
| Поле | Тип | Ограничения | Описание |
|---|---|---|---|
| id | int |
PK, auto-increment | Уникальный идентификатор администратора. |
| name | varchar |
NULL | Имя пользователя (необязательное поле). |
varchar |
NULL, UNIQUE | Email администратора. Используется как логин. | |
| emailVerified | varchar |
NULL | Дата подтверждения email в текстовом формате (зависит от провайдера). |
| image | varchar |
NULL | URL аватара пользователя (если используется внешний OAuth-провайдер). |
| password | varchar |
NOT NULL | Хэш пароля администратора. Хранится только в зашифрованном виде. |
Таблица хранит информацию о материалах, используемых в мастерской 3D-печати. Данные применяются для расчета стоимости заказа и выбора подходящего пластика для печати.
| Поле | Тип | Ограничения | Описание |
|---|---|---|---|
| id | int |
PK, auto-increment | Уникальный идентификатор материала. |
| name | varchar |
длина до 100 | Название материала (например, PLA, ABS). |
| density | float |
NOT NULL | Плотность материала в г/см³. Используется для расчета веса модели. |
| price_per_kg | integer |
NOT NULL | Стоимость 1 кг материала в рублях. |
Таблица хранит информацию об услугах, предоставляемых мастерской 3D-печати. Данные используются для отображения списка услуг и расчета стоимости заказа.
| Поле | Тип | Ограничения | Описание |
|---|---|---|---|
| id | int |
PK, auto-increment | Уникальный идентификатор услуги. |
| title | varchar |
длина до 100 | Название услуги (например, «3D печать модели»). |
| alias | varchar |
длина до 100 | Уникальный алиас услуги, используемый для ссылок и идентификации. |
| price | integer |
NOT NULL | Стоимость услуги в рублях. |
- Для регистрации в качестве администратора и получения доступа к CRM необходимо пройти аутентификацию через Google-провайдер.
- Перейти на маршрут /admin_register.
- Заполнить форму регистрации.
- После успешной регистрации произойдет редирект на основную страницу сайта.
- По клику на кнопку "Вход в CRM" появится возможность перейти в CRM приложения.