Создание корзины в Telegram-магазине (Часть 4)

Создание корзины в Telegram-магазине (Часть 4)

Теперь, когда бот выводит товары из базы данных, нам нужно реализовать корзину, чтобы пользователи могли добавлять товары перед оформлением заказа.

✅ Добавим таблицу 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! 🚀

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

Чтобы оставить комментарий, пожалуйста, войдите или зарегистрируйтесь.