Skip to content

illoprin/fecalis-inc

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🌱 FecalisInc — Интернет-магазин удобрений

Главный баннер

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

🛠 Технологии

  • PHP 8.1 — Бэкенд
  • Apache — Веб-сервер
  • MySQL — База данных
  • jQuery — Интерактивность
  • Bootstrap 5 (CDN) — Стилизация

📸 Скриншоты

🔹 Форма регистрации

Форма регистрации

🔹 Форма авторизации

Форма авторизации

🔹 Каталог товаров

Каталог

🔹 Корзина товаров

Корзина

🔹 Личный кабинет

Личный кабинет

💡 Аватар можно изменить простым перетаскиванием изображения!

🔹 Админ-панель (добавление товара)

Админ-панель

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

👥 Таблица User

Поле Тип Описание
id INT Идентификатор
login VARCHAR Логин
password VARCHAR Хэш пароля
firstname VARCHAR Имя
secondname VARCHAR Фамилия
phone VARCHAR Телефон
delivery_address VARCHAR Адрес доставки
email VARCHAR Электронная почта
payment_id INT Способ оплаты
avatar_src VARCHAR Путь к аватару
role VARCHAR Роль пользователя

🧪 Таблица Product

Поле Тип Описание
id INT Идентификатор
category_id INT Категория
title VARCHAR Название
description TEXT Описание
vendor VARCHAR Производитель
price DECIMAL Цена
img_src VARCHAR Путь к изображению

🛒 Таблица Purchase (заказы)

Поле Тип Описание
id INT Идентификатор
client_id INT ID клиента
entries JSON Состав заказа
time_created DATETIME Дата создания
delivery_date DATETIME Дата доставки
total_cost DECIMAL Итоговая стоимость
delivery_status VARCHAR Статус доставки

Примечания:

  • entries хранит JSON с информацией о товарах (даже если они удалены из каталога)
  • delivery_date генерируется случайно (3-5 дней)
  • Также есть вспомогательные таблицы category, payment, rating

🚀 Основные маршруты

  • /app/catalogue — Каталог товаров с корзиной
  • /app/product/:id — Страница товара (данные корзины в $_SESSION['cart'])
  • /app/purchase — Оформление заказа
  • /app/account — Личный кабинет (данные/заказы)
  • /app/authorization/:mode=reg|login — Авторизация/регистрация
  • /app/admin/:mode=order|product — Админ-панель
  • /index.php — Точка входа (редирект на лендинг/ЛК)
  • /static/index.php — Лендинг/страница "О нас"

💻 Самописные JS-скрипты

🔢 Форматирование ввода данных

const format = (clear_str, pattern = 'xxx xxx xx xx') => {
    let new_str = "";
    let offset = 0;
    for (let i = 0; i < pattern.length; i++) {
        if (pattern.charAt(i) === 'x')
            new_str += clear_str.charAt(i - offset) ? clear_str.charAt(i - offset) : ''; 
        else{
            new_str += pattern.charAt(i);
            offset++;
        }
    }
    return new_str;
};

🔄 Переключение между вкладками

const toggle_tabs_handler = (radios = [], blocks = [], event_to_handle, hide_class, on_toggle_event = (block) => {}) => {
    radios.forEach((radio) => {
        radio.on(event_to_handle, () => {
            blocks.forEach((block) => {
                if (block.attr('id') === radio.attr('data-show-panel')){
                    block.removeClass(hide_class)
                    on_toggle_event(block[0]);
                    return block[0];
                }else {
                    block.addClass(hide_class);
                }
            });
        });
    });
}

🧹 Очистка и сбор данных формы

const get_data = (form, trim = false) => {
    let hasEmpty = 0;
    const values = Object.fromEntries(new Map(Array.from(form.elements)
        .filter((item) => ((!item.getAttribute('readonly')) && (item.name)))
        .map((element) => {
            let {name, value} = element;
            value != "" ? value = value.replace(/[^a-zA-z0-9а-яА-Я@.,&?]/g, "") : hasEmpty = true;
            value = trim ? $.trim(value) : value;
            return [ name, value ]
    })));
    return hasEmpty ? false : values;
};

💭 Размышления о PHP

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

Пример "PHP внутри JS", такое возможно только в PHP:

<script>
    handle_cart_view();
    toggle_tabs_handler(
        [
            <? foreach ($category_query as $category): ?>
                $('#radio_<? echo $category['id']?>'),
            <? endforeach; ?>
        ],
        // ... остальной код
    );
</script>

PHP как язык интересен, но для бэкенда, по моему, не подходит.

About

A shop selling shit created in 3 days on PHP

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published