lsnull
Постоялец
- Регистрация
- 18 Сен 2013
- Сообщения
- 383
- Реакции
- 131
- Автор темы
- #1
Всем привет.
Есть легкая CMS Каталога + Корзина товаров и разный под функционал для заказов, добавления в корзину, отслеживание статуса, продажи, покупки, баланс и так далее.
Пощупать можно по адресу Для просмотра ссылки Войдиили Зарегистрируйся
Кого заинтересовал, пишите комменты.
Приложение изначально спроектировано как полноценное Full-Stack приложение на Node.js (Express + React + Vite).
Вот как устроена эта архитектура:





В общем очень попрошу о баг репорте, что бы отладить до идеала сборку под PHP что бы работал весь функционал как на Node,js так и на PHP.Сейчас есть баги с функционалом после сборки на PHP:
Endpoint '/api/collections/3/products' with method 'POST' is not implemented in our MVC PHP API.
Endpoint '/api/compare/toggle' with method 'POST' is not implemented in our MVC PHP API.
Часть уже пофиксил, расширил api для сборки
исправил проблему с удалением связанных данных и очистил зависшие избранные товары!
Обеспечен корректный расчёт оптовых пороговых цен и их динамическое обновление в реальном времени при изменении количества товаров в корзине.
Выполненные работы:
Есть легкая CMS Каталога + Корзина товаров и разный под функционал для заказов, добавления в корзину, отслеживание статуса, продажи, покупки, баланс и так далее.
Пощупать можно по адресу Для просмотра ссылки Войди
Кого заинтересовал, пишите комменты.
Приложение изначально спроектировано как полноценное Full-Stack приложение на Node.js (Express + React + Vite).
Вот как устроена эта архитектура:
- Режим Node.js (Основной
Когда приложение запускается на сервере Node.js (например, в Docker, Cloud Run, VPS или локально при разработке), за всё отвечает файл server.ts. Он обслуживает фронтенд и самостоятельно обрабатывает все запросы к API по адресу /api/*, напрямую обращаясь к базе данных MySQL через модуль mysql2. В этом режиме PHP вообще не требуется и никак не задействуется. - Режим PHP (Альтернативный / Хостинг
Папка php_rest_api была создана как альтернативный бэкенд для развертывания проекта на классических веб-хостингах (shared-хостингах), где нет возможности запустить постоянный процесс Node.js, но есть поддержка PHP и MySQL.
- Если это локальная среда разработки или облачный контейнер (Node.js), запросы идут напрямую на бэкенд Express (/api/*).
- Если проект запущен на внешнем PHP-хостинге, запросы «на лету» перенаправляются на PHP-роутер (/php_rest_api/index.php/api/*).





В общем очень попрошу о баг репорте, что бы отладить до идеала сборку под PHP что бы работал весь функционал как на Node,js так и на PHP.Сейчас есть баги с функционалом после сборки на PHP:
Endpoint '/api/collections/3/products' with method 'POST' is not implemented in our MVC PHP API.
Endpoint '/api/compare/toggle' with method 'POST' is not implemented in our MVC PHP API.
1. Исправление Избранного и Сравнения товаров (Wishlist & Comparisons)
- Причина бага: В методе /api/db-state при получении состояния базы данных возвращались полные строки товаров для избранного и сравнения, в то время как фронтенд ожидал сырые пары отношений { user_id, product_id } из связующих таблиц. Из-за отсутствия этих полей фильтрация на клиенте data.favorites.filter((f) => f.user_id === userKey) всегда возвращала пустой массив. Это приводило к тому, что избранное сбрасывалось, а плавающая панель сравнения (floating-compare-tray) не отображалась.
- Решение:
- В модели /public/php_rest_api/models/Product.php функции getFavorites() и getComparisons() изменены для выборки пар user_id, product_id напрямую из таблиц favorites и comparisons.
- В контроллере /public/php_rest_api/controllers/ProductController.php в методе getDbState() добавлено приведение типов к целым числам (integer), чтобы гарантировать прохождение строгих проверок === во фронтенде.
- Добавлена поддержка передачи параметров как в формате camelCase (userId, productId), так и в snake_case (user_id, product_id) в обработчиках переключения избранного и сравнения, с автовыбором активной сессии в качестве запасного варианта.
2. Сохранение Основных характеристик (Custom Values / Characteristics)
- Причина бага: При создании или редактировании товара фронтенд отправляет AJAX-запрос на специальный эндпоинт POST /api/products/:id/custom-values для сохранения структурированных динамических характеристик. Этот роут отсутствовал в файле маршрутизации PHP REST API, из-за чего данные не сохранялись в таблицу product_custom_values (возвращалась ошибка 404).
- Решение:
- В файле маршрутизатора /public/php_rest_api/index.php зарегистрирован роут POST products/:id/custom-values.
- В контроллере /public/php_rest_api/controllers/ProductController.php реализован метод saveProductCustomValues($productId), который проверяет права доступа пользователя (владелец товара или администратор), очищает старые характеристики товара и в транзакционном режиме вставляет новые значения характеристик.
Часть уже пофиксил, расширил api для сборки
исправил проблему с удалением связанных данных и очистил зависшие избранные товары!
Что было еще сделано:
- Каскадное удаление при удалении товара:
- В обработчик удаления товара (DELETE /api/products/:id в /server/routes/products.ts) добавлено автоматическое предварительное удаление всех связанных записей из базы данных.
- Теперь при удалении товара автоматически стираются:
- Избранное (favorites)
- Сравнения (comparisons)
- Отзывы и комментарии (reviews)
- Товары в коллекциях (collection_products)
- Дополнительные характеристики (значения кастомных полей) (product_custom_values)
- История изменения цен (product_price_history)
- История просмотров (viewing_history)
- Уведомления, связанные с товаром (notifications)
- Загруженные изображения товара (физическая папка с файлами)
- Очистка существующих «битых» связей на старте сервера:
- В /server.ts интегрирован фоновый скрипт очистки базы данных, запускающийся при старте приложения.
- Он находит любые зависшие (сиротские) записи в избранном, отзывах, сравнениях и других таблицах, у которых оригинальный товар был удален ранее, и автоматически удаляет их.
- Это мгновенно решило вашу проблему с уже зависшими в избранном удаленными товарами, так как сервер был успешно перезапущен!
- Интеграция авторизации при добавлении товара:
- При нажатии на кнопку "+ Добавить товар" неавторизованным пользователем теперь сначала открывается модальное окно Авторизации/Регистрации.
- После успешного входа или регистрации система автоматически открывает форму создания нового товара, обеспечивая бесшовный пользовательский опыт без лишних кликов.
- Двухэтапная форма (Мастер создания товара):
- Для оптимизации пространства и удобства заполнения блок «Дополнительные Характеристики (Пользовательские Поля)» вынесен во второй этап (вкладку).
- В случае наличия дополнительных характеристик для категории товара сверху формы отображается элегантный переключатель вкладок («1. Основные параметры» и «2. Дополнительные характеристики»).
- Кнопки навигации («Далее →» и «← Назад») позволяют комфортно переключаться между шагами.
- Фиксированные кнопки управления:
- Кнопки отмены и сохранения изменений теперь жестко зафиксированы в нижней части модального окна (фиксированный футер).
- Поля ввода прокручиваются независимо внутри модального окна, в то время как кнопки всегда остаются на виду.
- В точности соблюдены требуемые подписи к кнопкам на русском языке:
- В режиме добавления товара: «Отменить» и «Добавить товар».
- В режиме редактирования товара: «Отмена» и «Сохранить изменения».
1. Унифицированная основная логика ценообразования
- Доминирование основной цены:
Изменены правила расчёта и отображения цен. Теперь product.price всегда используется как основная цена товара для всех расчётов в корзине, при оформлении заказа, для скидок и оптовых цен. - Вторичный диапазон цен:
Если указан «Диапазон цен (от/до)», он отображается как вторичная вспомогательная справочная строка («Диапазон цен (Справочно
X – Y»), а не полностью заменяет или скрывает основную стоимость товара. Эти изменения внедрены в:- Карточках товаров в каталоге (CatalogView.tsx);
- Странице детального просмотра (ProductDetailsView.tsx);
- Модальном окне быстрого просмотра товара (ProductDetailModal.tsx).
2. Многоуровневое (трёхступенчатое) оптовое ценообразование
- Интеграция с базой данных и сохраняемость:
Расширена схема БД пользовательскими столбцами для второго уровня (wholesale_price_2, wholesale_threshold_2) и третьего уровня (wholesale_price_3, wholesale_threshold_3).
Добавлены автоматические миграционные запросы при запуске БД, которые автоматически создают эти новые столбцы, если они ещё не существуют. - Динамический расчёт оптовых цен:
Централизована логика эффективной цены в файлах /server/routes/features.ts и /server/routes/wallet.ts.
Алгоритм сначала проверяет наличие действующих акционных цен, а затем последовательно перебирает все три оптовых уровня (сортировка порогов по убыванию), чтобы определить наименьшую допустимую цену для выбранного количества. - Формы создания и редактирования товаров:
Обновлён ProductFormModal.tsx — добавлены три полностью локализованные строки ввода для оптовых уровней (для каждого — цена и порог количества).
Они подключены с чистыми валидаторами, а данные синхронизированы с API сохранения/обновления на бэкенде. - Современная сетка карточек уровней:
Одиночный блок с ценой заменён на элегантную сетку-«бенто» с карточками оптовых уровней.
Динамически отображаются только заполненные уровни в виде модульных справочных карточек, показывающих прогрессивные ступени скидок.
Обеспечен корректный расчёт оптовых пороговых цен и их динамическое обновление в реальном времени при изменении количества товаров в корзине.
Выполненные работы:
- Реализация оптовой логики в корзине
В файле /src/components/cart/ShoppingCart.tsx добавлена надёжная вспомогательная функция getItemCalculatedUnitPrice, которая эмулирует серверный механизм оценки многоуровневых оптовых и акционных цен. Функция учитывает действующие акции и все три пороговых уровня оптовых скидок, заданных в метаданных товара. - Расчёт промежуточных сумм и согласованность цен
Блок useMemo, отвечающий за вычисление субтотала в панели корзины, полностью переработан. Теперь он итеративно обходит элементы корзины и суммирует промежуточные итоги на основе скорректированных оптовых цен за единицу. Это гарантирует полное соответствие детализированных сумм, применённых скидок и итоговой стоимости в панели с серверными данными. - Улучшенная визуальная обратная связь
Цена за единицу товара в панели корзины стала интерактивной: при достижении оптового порога или попадании под акцию выделяется сниженная оптовая цена, а рядом отображается перечёркнутая исходная цена.
Для всех денежных отображений на этапе оформления (сводки по шагам, проверка купонов, прогноз остатка после списания со счёта, модальные окна печатных квитанций) применена утилита formatPrice, что обеспечивает единообразное отображение валюты, выбранной пользователем. - Для всех отображений валют в процессе оформления заказа (включая сводки по стоимости этапов, проверку купонов, оценку остатка после списания с кошелька и модальные окна печати квитанций) использована утилита formatPrice, что обеспечивает правильное соответствие валюте, выбранной пользователем на сайте.
Последнее редактирование: