Загрузка данных
import sys
import pymysql
from PyQt6 import uic
from PyQt6.QtWidgets import *
from PyQt6.QtGui import QPixmap
from PyQt6.QtCore import Qt
ROLE_GUEST = "Гость"
ROLE_CLIENT = "Клиент"
ROLE_MANAGER = "Менеджер"
ROLE_ADMIN = "Администратор"
connection = pymysql.connect(
host="localhost",
user="root",
password="root",
database="demo",
cursorclass=pymysql.cursors.DictCursor
)
cursor = connection.cursor()
class LoginWindow(QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi("login.ui", self)
self.loginButton.clicked.connect(self.login)
self.guestButton.clicked.connect(self.guest_enter)
def login(self):
login = self.loginEdit.text()
password = self.passwordEdit.text()
sql = """
SELECT users.full_name,
roles.role_name
FROM users
JOIN roles
ON users.role_id = roles.role_id
WHERE login=%s AND password=%s
"""
cursor.execute(sql, (login, password))
user = cursor.fetchone()
if user:
full_name = user["full_name"]
role = user["role_name"]
self.products = ProductsWindow(
role,
full_name
)
self.products.show()
self.close()
else:
QMessageBox.warning(
self,
"Ошибка",
"Неверный логин или пароль"
)
def guest_enter(self):
self.products = ProductsWindow(ROLE_GUEST, "Гость")
self.products.show()
self.close()
class ProductsWindow(QMainWindow):
def __init__(self, role, full_name):
super().__init__()
uic.loadUi("products.ui", self)
self.searchEdit.setVisible(False)
self.filterBox.setVisible(False)
self.sortBox.setVisible(False)
self.ordersButton.setVisible(False)
self.deleteButton.setVisible(False)
self.role = role
self.full_name = full_name
self.labelUser.setText(full_name)
self.container = QWidget()
self.scrollArea.setWidget(self.container)
self.scrollArea.setWidgetResizable(True)
self.verticalLayout = QVBoxLayout(self.container)
self.load_suppliers()
self.load_products()
self.setup_role()
self.backButton.clicked.connect(self.go_back)
self.ordersButton.clicked.connect(self.open_orders)
self.searchEdit.textChanged.connect(self.load_products)
self.filterBox.currentTextChanged.connect(self.load_products)
self.sortBox.currentTextChanged.connect(self.load_products)
def load_products(self):
for i in reversed(range(self.verticalLayout.count())):
widget = self.verticalLayout.itemAt(i).widget()
if widget:
widget.setParent(None)
search = self.searchEdit.text()
supplier = self.filterBox.currentText()
sort = self.sortBox.currentText()
sql = """
SELECT
p.product_name,
c.category_name,
p.description,
m.manufacturer_name,
s.supplier_name,
p.price,
p.unit,
p.discount,
p.stock_quantity,
p.image_path
FROM products p
JOIN categories c ON p.category_id = c.category_id
JOIN manufacturers m ON p.manufacturer_id = m.manufacturer_id
JOIN suppliers s ON p.supplier_id = s.supplier_id
WHERE (p.product_name LIKE %s
OR c.category_name LIKE %s
OR m.manufacturer_name LIKE %s
OR s.supplier_name LIKE %s)
"""
params = [
f"%{search}%",
f"%{search}%",
f"%{search}%",
f"%{search}%"
]
# фильтр по поставщику
if supplier != "Все поставщики":
sql += " AND s.supplier_name=%s"
params.append(supplier)
# сортировка
if sort == "По возрастанию":
sql += " ORDER BY p.stock_quantity ASC"
elif sort == "По убыванию":
sql += " ORDER BY p.stock_quantity DESC"
cursor.execute(sql, params)
products = cursor.fetchall()
for product in products:
card = self.create_product_card(product)
self.verticalLayout.addWidget(card)
def create_product_card(self, product):
card = QWidget()
card_layout = QHBoxLayout(card)
image_label = QLabel()
image_label.setFixedSize(120, 120)
pixmap = QPixmap(product["image_path"])
if pixmap.isNull():
image_label.setText("Нет фото")
image_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
else:
image_label.setPixmap(pixmap.scaled(120, 120))
info_text = (
f"Категория: {product['category_name']}\n"
f"Название: {product['product_name']}\n"
f"Описание: {product['description']}\n"
f"Производитель: {product['manufacturer_name']}\n"
f"Поставщик: {product['supplier_name']}\n"
f"Цена: {product['price']} руб.\n"
f"Единица измерения: {product['unit']}\n"
f"Количество: {product['stock_quantity']}"
)
info_label = QLabel(info_text)
info_label.setWordWrap(True)
discount_label = QLabel(str(product["discount"]) + "%")
card_layout.addWidget(image_label)
card_layout.addWidget(info_label)
card_layout.addWidget(discount_label)
card.setStyleSheet("QWidget {border: 1px solid black;}")
image_label.setStyleSheet("border: 1px solid black;")
info_label.setStyleSheet("border: 1px solid black;")
discount_label.setStyleSheet("border: 1px solid black;")
discount_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
return card
def setup_role(self):
if self.role == ROLE_GUEST:
self.labelUser.setText("Вы вошли как Гость")
elif self.role == ROLE_CLIENT:
self.labelUser.setText(self.full_name)
elif self.role == ROLE_MANAGER:
self.labelUser.setText(f"{self.full_name} (Менеджер)")
self.enable_manager_features()
elif self.role == ROLE_ADMIN:
self.labelUser.setText(f"{self.full_name} (Админ)")
self.enable_manager_features()
self.enable_admin_features()
def enable_manager_features(self):
self.searchEdit.setVisible(True)
self.filterBox.setVisible(True)
self.sortBox.setVisible(True)
self.ordersButton.setVisible(True)
def enable_admin_features(self):
self.enable_manager_features()
self.deleteButton.setVisible(True)
def delete_product(self):
print("Удаление товара (позже сделаем SQL)")
def go_back(self):
self.login = LoginWindow()
self.login.show()
self.close()
def open_orders(self):
self.orders_window = OrdersWindow(self.role)
self.orders_window.show()
def load_suppliers(self):
sql = """
SELECT supplier_name
FROM suppliers
"""
cursor.execute(sql)
suppliers = cursor.fetchall()
self.filterBox.clear()
self.filterBox.addItem("Все поставщики")
for supplier in suppliers:
self.filterBox.addItem(supplier["supplier_name"])
class OrdersWindow(QMainWindow):
def __init__(self, role):
super().__init__()
uic.loadUi("orders.ui", self)
self.role = role
self.load_orders()
self.backButton.clicked.connect(self.go_back)
if self.role != ROLE_ADMIN:
self.deleteButton.setVisible(False)
def go_back(self):
self.close()
def load_orders(self):
sql = """
SELECT
order_id,
code,
order_date,
delivery_date,
status
FROM orders
"""
cursor.execute(sql)
orders = cursor.fetchall()
self.ordersList.clear()
for order in orders:
text = (
f"Заказ № {order['order_id']} | "
f"Дата заказа: {order['order_date']} | "
f"Дата доставки: {order['delivery_date']} | "
f"Код: {order['code']} | "
f"Статус: {order['status']}"
)
self.ordersList.addItem(text)
app = QApplication(sys.argv)
window = LoginWindow()
window.show()
sys.exit(app.exec())