Теперь, когда бот выводит товары из базы данных, нам нужно реализовать корзину, чтобы пользователи могли добавлять товары перед оформлением заказа.
✅ Добавим таблицу cart в базу данных.
✅ Создадим функции добавления и просмотра товаров в корзине.
✅ Обновим обработчики в handlers.py
, чтобы корзина работала в боте.
Добавляем таблицу cart
в базу данных
Теперь в database.py
создадим новую таблицу cart
, которая будет хранить товары, добавленные пользователем.
Обновляем database.py
, добавив код для создания ещё одной таблицы.
# Таблица корзины
cursor.execute("""
CREATE TABLE IF NOT EXISTS cart (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
product_id INTEGER NOT NULL,
quantity INTEGER NOT NULL,
FOREIGN KEY (product_id) REFERENCES products (id)
)
""")
✅ Что добавлено?
- Таблица
cart
для хранения товаров, добавленных пользователями. - Колонки:
user_id
(ID пользователя),product_id
(товар),quantity
(количество).
Теперь при запуске database.py
создастся таблица корзины.
Функции для работы с корзиной
Теперь добавим функции для добавления товаров в корзину и просмотра содержимого корзины.
Дополняем database.py
def add_to_cart(user_id, product_id, quantity=1):
"""Добавляет товар в корзину пользователя"""
conn = sqlite3.connect("shop.db")
cursor = conn.cursor()
# Проверяем, есть ли товар уже в корзине
cursor.execute("SELECT quantity FROM cart WHERE user_id=? AND product_id=?", (user_id, product_id))
result = cursor.fetchone()
if result:
# Если товар уже есть, увеличиваем количество
new_quantity = result[0] + quantity
cursor.execute("UPDATE cart SET quantity=? WHERE user_id=? AND product_id=?", (new_quantity, user_id, product_id))
else:
# Если товара нет, добавляем новую запись
cursor.execute("INSERT INTO cart (user_id, product_id, quantity) VALUES (?, ?, ?)", (user_id, product_id, quantity))
conn.commit()
conn.close()
def get_cart(user_id):
"""Возвращает список товаров в корзине пользователя"""
conn = sqlite3.connect("shop.db")
cursor = conn.cursor()
cursor.execute("""
SELECT products.name, cart.quantity, products.price
FROM cart
JOIN products ON cart.product_id = products.id
WHERE cart.user_id=?
""", (user_id,))
cart_items = cursor.fetchall()
conn.close()
return cart_items
✅ Что добавлено?
add_to_cart(user_id, product_id, quantity)
– добавляет товар в корзину.get_cart(user_id)
– получает список товаров, добавленных пользователем.
Теперь полный код database.py
такой:
import sqlite3
# Подключаемся к базе данных (если файла нет, он создастся автоматически)
conn = sqlite3.connect("shop.db")
cursor = conn.cursor()
# Создаем таблицу для товаров
cursor.execute("""
CREATE TABLE IF NOT EXISTS products (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
price INTEGER NOT NULL
)
""")
# Создаем таблицу для заказов
cursor.execute("""
CREATE TABLE IF NOT EXISTS orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
product_id INTEGER NOT NULL,
quantity INTEGER NOT NULL,
FOREIGN KEY (product_id) REFERENCES products (id)
)
""")
# Таблица корзины
cursor.execute("""
CREATE TABLE IF NOT EXISTS cart (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
product_id INTEGER NOT NULL,
quantity INTEGER NOT NULL,
FOREIGN KEY (product_id) REFERENCES products (id)
)
""")
# Сохраняем изменения и закрываем соединение
conn.commit()
conn.close()
def add_product(name, price):
"""Добавляет товар в базу данных"""
conn = sqlite3.connect("shop.db")
cursor = conn.cursor()
cursor.execute("INSERT INTO products (name, price) VALUES (?, ?)", (name, price))
conn.commit()
conn.close()
def get_products():
"""Получает список всех товаров"""
conn = sqlite3.connect("shop.db")
cursor = conn.cursor()
cursor.execute("SELECT * FROM products")
products = cursor.fetchall()
conn.close()
return products
def add_to_cart(user_id, product_id, quantity=1):
"""Добавляет товар в корзину пользователя"""
conn = sqlite3.connect("shop.db")
cursor = conn.cursor()
# Проверяем, есть ли товар уже в корзине
cursor.execute("SELECT quantity FROM cart WHERE user_id=? AND product_id=?", (user_id, product_id))
result = cursor.fetchone()
if result:
# Если товар уже есть, увеличиваем количество
new_quantity = result[0] + quantity
cursor.execute("UPDATE cart SET quantity=? WHERE user_id=? AND product_id=?", (new_quantity, user_id, product_id))
else:
# Если товара нет, добавляем новую запись
cursor.execute("INSERT INTO cart (user_id, product_id, quantity) VALUES (?, ?, ?)", (user_id, product_id, quantity))
conn.commit()
conn.close()
def get_cart(user_id):
"""Возвращает список товаров в корзине пользователя"""
conn = sqlite3.connect("shop.db")
cursor = conn.cursor()
cursor.execute("""
SELECT products.name, cart.quantity, products.price
FROM cart
JOIN products ON cart.product_id = products.id
WHERE cart.user_id=?
""", (user_id,))
cart_items = cursor.fetchall()
conn.close()
return cart_items
Обновляем handlers.py
: добавление товаров в корзину
Теперь обновим handlers.py
, чтобы пользователь мог добавлять товары в корзину через inline-кнопки.
Обновленный handlers.py
from aiogram import Router, F
from aiogram.types import Message, CallbackQuery, InlineKeyboardMarkup, InlineKeyboardButton # Добавили импорт
from keyboards import main_menu
from database import get_products, add_to_cart, get_cart
router = Router()
# Обработчик команды /start
@router.message(F.text == "/start")
async def start_command(message: Message):
await message.answer("Добро пожаловать в магазин! Выберите действие:", reply_markup=main_menu)
# Обработчик кнопки "Каталог"
@router.message(F.text == "🛍 Каталог")
async def catalog_command(message: Message):
await message.answer("Вот наш каталог. Нажмите кнопку, чтобы добавить товар в корзину:")
products = get_products() # Получаем товары из базы данных
for product in products:
product_id, name, price = product
await message.answer(
f"{name} - {price}₽",
reply_markup=InlineKeyboardMarkup(inline_keyboard=[
[InlineKeyboardButton(text="🛒 Добавить в корзину", callback_data=f"add_{product_id}")]
])
)
# Обработчик кнопок "Добавить в корзину"
@router.callback_query(F.data.startswith("add_"))
async def add_to_cart_handler(callback: CallbackQuery):
product_id = int(callback.data.split("_")[1])
add_to_cart(callback.from_user.id, product_id) # Добавляем товар в корзину
await callback.answer("✅ Товар добавлен в корзину!")
# Обработчик кнопки "Корзина"
@router.message(F.text == "🛒 Корзина")
async def cart_command(message: Message):
cart_items = get_cart(message.from_user.id) # Получаем товары из корзины
if not cart_items:
await message.answer("Ваша корзина пуста.")
else:
cart_text = "🛒 Ваша корзина:\n"
total_price = 0
for name, quantity, price in cart_items:
total_price += quantity * price
cart_text += f"{name} — {quantity} шт. × {price}₽ = {quantity * price}₽\n"
cart_text += f"\n💰 Итоговая сумма: {total_price}₽"
await message.answer(cart_text)
✅ Что добавлено?
- Кнопки «🛒 Добавить в корзину» для каждого товара.
- Обработчик
add_to_cart_handler
– добавляет товар в корзину. - Обработчик
cart_command
– показывает содержимое корзины.
Проверяем работу корзины
1️⃣ Запускаем бота: python bot.py
2️⃣ Отправляем /start
, затем «Каталог».
3️⃣ Нажимаем «🛒 Добавить в корзину» – бот должен подтвердить добавление.
4️⃣ Нажимаем «🛒 Корзина» – бот покажет список товаров с итоговой суммой.
Заключение
Теперь наш бот поддерживает корзину товаров! 🎉
✅ Добавили таблицу cart
для хранения товаров.
✅ Реализовали кнопки «🛒 Добавить в корзину».
✅ Бот теперь показывает содержимое корзины.
Что дальше?
В следующей статье мы добавим оформление заказа и оплату, чтобы пользователи могли покупать товары прямо в Telegram! 🚀
Пока нет комментариев. Будьте первым!