Skip to content

Latest commit

 

History

History
255 lines (180 loc) · 18.4 KB

File metadata and controls

255 lines (180 loc) · 18.4 KB

🧩Сайт мастерской 3D-печати

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

Открытые

Эти маршруты доступны без авторизации:

  • /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 - создание платежя для проведения оплаты клентом.

🛢️ Структура базы данных

⚠️ В документации приведены только таблицы, которые участвуют в бизнес-логике приложения. Существуют также системные таблицы, создаваемые библиотекой NextAuth (accounts, users), которые используются для хранения данных аутентификации и авторизации.

Таблица consultations

Таблица используется для хранения заявок на консультацию, созданных пользователями через сайт. Каждая запись соответствует одной заявке и содержит информацию для обратной связи, а также текущий статус обработки.

Поле Тип Ограничения Описание
id int PK, auto-increment Уникальный идентификатор записи.
contact varchar(50) NOT NULL Контакт пользователя: телефон или email
email varchar(255) NULL Email пользователя (необязательно).
name varchar(255) NULL Имя пользователя (необязательно).
created_at timestamptz NOT NULL, default CURRENT_TIMESTAMP Дата и время создания заявки (UTC). Добавляется автоматически.
order_status varchar(50) NOT NULL Текущий статус заявки

Таблица print_orders

Таблица хранит информацию о заказах клиентов в мастерской 3D-печати. Используется для управления заказами, отображения деталей и отслеживания оплаты.

Поле Тип Ограничения Описание
id int PK, auto-increment Уникальный идентификатор заказа.
file_path text nullable Путь к загруженному клиентом файлу модели.
name varchar(255) NOT NULL Имя заказчика.
phone varchar(50) NOT NULL Контактный телефон заказчика.
email 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 Идентификатор счета в платежной системе.

Таблица master_users

Таблица хранит данные пользователей, имеющих административные права в CRM-системе. Записи создаются после регистрации администратора и используются механизмом авторизации для доступа к закрытым разделам панели управления.

Поле Тип Ограничения Описание
id int PK, auto-increment Уникальный идентификатор администратора.
name varchar NULL Имя пользователя (необязательное поле).
email varchar NULL, UNIQUE Email администратора. Используется как логин.
emailVerified varchar NULL Дата подтверждения email в текстовом формате (зависит от провайдера).
image varchar NULL URL аватара пользователя (если используется внешний OAuth-провайдер).
password varchar NOT NULL Хэш пароля администратора. Хранится только в зашифрованном виде.

Таблица materials

Таблица хранит информацию о материалах, используемых в мастерской 3D-печати. Данные применяются для расчета стоимости заказа и выбора подходящего пластика для печати.

Поле Тип Ограничения Описание
id int PK, auto-increment Уникальный идентификатор материала.
name varchar длина до 100 Название материала (например, PLA, ABS).
density float NOT NULL Плотность материала в г/см³. Используется для расчета веса модели.
price_per_kg integer NOT NULL Стоимость 1 кг материала в рублях.

Таблица services

Таблица хранит информацию об услугах, предоставляемых мастерской 3D-печати. Данные используются для отображения списка услуг и расчета стоимости заказа.

Поле Тип Ограничения Описание
id int PK, auto-increment Уникальный идентификатор услуги.
title varchar длина до 100 Название услуги (например, «3D печать модели»).
alias varchar длина до 100 Уникальный алиас услуги, используемый для ссылок и идентификации.
price integer NOT NULL Стоимость услуги в рублях.

🗄️🔑 Регистрация в качестве администратора

  1. Для регистрации в качестве администратора и получения доступа к CRM необходимо пройти аутентификацию через Google-провайдер.
  2. Перейти на маршрут /admin_register.
  3. Заполнить форму регистрации.
  4. После успешной регистрации произойдет редирект на основную страницу сайта.
  5. По клику на кнопку "Вход в CRM" появится возможность перейти в CRM приложения.