Интернет-магазин по продаже удобрений всех типов с удобным каталогом, корзиной и личным кабинетом.
- PHP 8.1 — Бэкенд
- Apache — Веб-сервер
- MySQL — База данных
- jQuery — Интерактивность
- Bootstrap 5 (CDN) — Стилизация
💡 Аватар можно изменить простым перетаскиванием изображения!
| Поле | Тип | Описание |
|---|---|---|
| id | INT | Идентификатор |
| login | VARCHAR | Логин |
| password | VARCHAR | Хэш пароля |
| firstname | VARCHAR | Имя |
| secondname | VARCHAR | Фамилия |
| phone | VARCHAR | Телефон |
| delivery_address | VARCHAR | Адрес доставки |
| VARCHAR | Электронная почта | |
| payment_id | INT | Способ оплаты |
| avatar_src | VARCHAR | Путь к аватару |
| role | VARCHAR | Роль пользователя |
| Поле | Тип | Описание |
|---|---|---|
| id | INT | Идентификатор |
| category_id | INT | Категория |
| title | VARCHAR | Название |
| description | TEXT | Описание |
| vendor | VARCHAR | Производитель |
| price | DECIMAL | Цена |
| img_src | VARCHAR | Путь к изображению |
| Поле | Тип | Описание |
|---|---|---|
| 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— Лендинг/страница "О нас"
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;
};PDO работает медленно + приходится создавать новое подключение для каждого скрипта. Т.к. проект целенаправленно разрабатывался без использования разного рода PHP фреймворков, приходилось терпеть это недоразумение.
Пример "PHP внутри JS", такое возможно только в PHP:
<script>
handle_cart_view();
toggle_tabs_handler(
[
<? foreach ($category_query as $category): ?>
$('#radio_<? echo $category['id']?>'),
<? endforeach; ?>
],
// ... остальной код
);
</script>PHP как язык интересен, но для бэкенда, по моему, не подходит.






