Загрузка данных


import sys
import mysql.connector
from PySide6.QtWidgets import (
    QApplication, QWidget, QLabel, QLineEdit,
    QPushButton, QVBoxLayout, QTableWidget,
    QTableWidgetItem, QMessageBox, QMainWindow,
    QHeaderView
)
from PySide6.QtCore import Qt


DB_CONFIG = {
    'host': 'localhost',
    'user': 'root',
    'password': 'root',
    'database': 'publishing_center',
    'charset': 'utf8mb4'
}


def get_connection():
    return mysql.connector.connect(**DB_CONFIG)


class LoginWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle('Издательский центр — Вход')
        self.setFixedSize(320, 200)
        self.setup_ui()

    def setup_ui(self):
        layout = QVBoxLayout()
        layout.setSpacing(10)
        layout.setContentsMargins(30, 30, 30, 30)

        layout.addWidget(QLabel('Логин:'))
        self.login_input = QLineEdit()
        self.login_input.setPlaceholderText('Введите логин')
        layout.addWidget(self.login_input)

        layout.addWidget(QLabel('Пароль:'))
        self.password_input = QLineEdit()
        self.password_input.setEchoMode(QLineEdit.EchoMode.Password)
        self.password_input.setPlaceholderText('Введите пароль')
        layout.addWidget(self.password_input)

        self.login_btn = QPushButton('Войти')
        self.login_btn.clicked.connect(self.do_login)
        self.password_input.returnPressed.connect(self.do_login)
        layout.addWidget(self.login_btn)

        self.setLayout(layout)

    def do_login(self):
        login = self.login_input.text().strip()
        password = self.password_input.text().strip()

        if not login or not password:
            QMessageBox.warning(self, 'Ошибка', 'Введите логин и пароль.')
            return

        try:
            conn = get_connection()
            cursor = conn.cursor()
            cursor.execute(
                "select customer_id, name from customers"
                " where login = %s and password = %s",
                (login, password)
            )
            row = cursor.fetchone()
            cursor.close()
            conn.close()

            if row:
                customer_id, customer_name = row
                self.orders_win = OrdersWindow(customer_id, customer_name)
                self.orders_win.show()
                self.close()
            else:
                QMessageBox.warning(self, 'Ошибка', 'Неверный логин или пароль.')

        except mysql.connector.Error as e:
            QMessageBox.critical(self, 'Ошибка подключения', str(e))


class OrdersWindow(QMainWindow):
    def __init__(self, customer_id: int, customer_name: str):
        super().__init__()
        self.customer_id = customer_id
        self.setWindowTitle(f'Мои заказы — {customer_name}')
        self.setMinimumSize(750, 420)
        self.setup_ui()
        self.load_orders()

    def setup_ui(self):
        central = QWidget()
        self.setCentralWidget(central)
        layout = QVBoxLayout(central)
        layout.setContentsMargins(10, 10, 10, 10)

        self.table = QTableWidget()
        self.table.setColumnCount(5)
        self.table.setHorizontalHeaderLabels([
            'Номер заказа',
            'Книга',
            'Дата поступления',
            'Дата выполнения',
            'Количество (экз.)'
        ])
        self.table.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers)
        self.table.setSelectionBehavior(QTableWidget.SelectionBehavior.SelectRows)
        self.table.horizontalHeader().setSectionResizeMode(1, QHeaderView.ResizeMode.Stretch)
        self.table.verticalHeader().setVisible(False)

        layout.addWidget(self.table)

    def load_orders(self):
        try:
            conn = get_connection()
            cursor = conn.cursor()
            cursor.execute(
                "select o.order_id, b.title, o.order_date,"
                "       o.fulfillment_date, o.quantity"
                " from orders o"
                " join books b on o.book_id = b.book_id"
                " where o.customer_id = %s"
                " order by o.order_date desc",
                (self.customer_id,)
            )
            rows = cursor.fetchall()
            cursor.close()
            conn.close()

            self.table.setRowCount(len(rows))
            for i, row in enumerate(rows):
                for j, val in enumerate(row):
                    text = str(val) if val is not None else '—'
                    item = QTableWidgetItem(text)
                    item.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
                    self.table.setItem(i, j, item)

        except mysql.connector.Error as e:
            QMessageBox.critical(self, 'Ошибка БД', str(e))


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = LoginWindow()
    window.show()
    sys.exit(app.exec())