Описание реализации решения
Описание архитектуры программы
В создании программы «Сайт игровых приставок» было выделено 4 основных пункта: создание главного окна программы; проектирование базы данных для программы; объединение БД с программой; вывод созданной программы на экран.
Программа была написана с помощью языка программирования Python, база данных создавалась с помощью СУБД MySQL.
Также при написании программы использовалась технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных» (ORM) [3].
К основным этапам роботы программы можно отнести: получение БД с сайта игровых приставок; обработка БД и вывод ее таблиц в программу; просмотр и внесение изменений пользователем программы.
Программа «Сайт магазина игровых приставок» состоит из 4х отдельных файлов, каждый из которых выполняет определенные функции и состоит из классов и методов, используемых для решения поставленной задачи.
Первый файл программы имеет название Settings. Этот файл отвечает за настройки программы. В нем находятся константы, которые не меняются на протяжении работы программы. Методы, которые содержаться в данном файле можно посмотреть в таблице В.8.
Второй файл программы имеет название Model и содержит в себе классы, методы и блоки обработки информации, которые отвечают за описание базы данных. В нем описаны какие таблицы есть и как они связаны друг с другом. В файле Model имеется 5 классов, которые соответствуют названиям таблиц. Методы и функции, которые содержаться в данных классах можно посмотреть в таблице В.3.
Третий файл программы имеет название Сreate_db. Этот файл отвечает за создание в базе данных таблиц.
Четвертый файл программы имеет название Main, он имеет 4 класса, методы и функции, которые отвечают за всю основную логику программы, а именно за создание интерфейса или за действия, выполняемые программой. Методы и функции, которые содержаться в данных классах можно посмотреть в таблице В.4 – В.7.
Фрагмент кода Б.1 содержит код из файла Settings.
Фрагмент кода Б.2 содержит код из файла Сreate_db, который отвечает за создание в базе данных таблиц.
В фрагменте кода Б.3 представлен листинг программы, который отвечает за описание БД.
Формирование главного окна программы можно просмотреть на фрагменте кода Б.4
Код, который создает сессию работы с БД отображен в фрагменте кода Б.5
Фрагмент кода Б.6 содержит вывод созданной программы на экран.
Поскольку благодаря технологии ORM по коду не встречается описание запросов, они выведены в консоли программы, а также заносятся в отдельный текстовый файл с названием sql-query-log. Этот файл содержит все запросы, которые адресовались к БД. При первом открытии программы файл создается автоматически, в последующие сессии работы программы запросы дописываются в конец файла. Дабы избежать путаницы, рекомендуется самостоятельно очищать файл sql-query-log перед новой работой с программой.
Описание данных
Используемые элементы управления:
QPushButton – кнопки переключения между таблицами;
QAction – выпадающие подписи кнопок;
QTabWidget – отображает список таблиц в виде вкладок;
QDialog – отображает диалоговые окна;
QLineEdit - текстовый редактор одной строки.
QMessageBox – выводит окно сообщения при ошибках [11].
Описание средств реализации
При разработке программы был использован язык программирования Python. Для построения БД была использована система управления базами данных MySQL.
MySQL – это одна из самых популярных и самых распространенных СУБД (система управления базами данных) в интернете. Она не предназначена для работы с большими объемами информации, но ее применение идеально для интернет сайтов, как небольших, так и достаточно крупных [4][5].
Достоинства MySQL:
Скорость работы;
Доступность;
Имеет API, через который быстро взаимодействует с приложением;
Имеет встроенный сервер, т.е. можно включить в приложение и не устанавливать сервер отдельно от программы;
Таблицы MyISAM одни из быстрых таблиц.
Недостатки MySQL:
Наиболее быстрый тип таблиц MyISAM имеет не высокую надёжность, при достижении таблиц размера более 10Gb;
Таблицы типа MyISAM не поддерживают транзакции;
Не предназначена для работы с большими объемами информации;
Поддерживает не все элементы SQL-стандарта [6].
Кроме того, при разработке и использовании программы «Сайт магазина игровых приставок» понадобилось загружать дополнительные библиотеки, такие как:
библиотека PyQt4 - представляет собой инструмент для создания GUI приложений. PyQt представляет собой сочетание языка программирования Python и превосходной библиотеки Qt. PyQt реализована в виде набора модулей Python. Он насчитывает более 300 классов, и почти 6000 функций и методов. Он представляет собой платформо-независимый инструмент. То есть он работает на всех основных операционных систем (Unix, Windows и Mac) [7];
библиотека sqlalchemy 1.0.11 - это программная библиотека на языке Python для работы с реляционными СУБД с применением технологии ORM. Служит для синхронизации объектов Python и записей реляционной базы данных. SQLAlchemy позволяет описывать структуры баз данных и способы взаимодействия с ними на языке Python без использования [8];
Описание графического интерфейса
Дизайн интерфейсов сводится к вопросу о том, как оформить и расположить визуальные элементы таким образом, чтобы внятно отразить поведение и представить информацию. Каждый элемент визуальной композиции имеет ряд свойств, таких как форма и цвет. Каждое отдельное свойство само по себе редко обладает естественным смыслом. Скорее можно сказать, что пользователь получает возможность разобраться в интерфейсе благодаря различным способам приложения этих свойств к каждому из элементов интерфейса [12].
Форма – главный признак сущности объекта для человека. В данной программе используется прямоугольная форма окна, блока для вывода таблиц на экран и кнопки. Их размеры задаются вручную, и для того, чтобы их изменить необходимо обращаться непосредственно к коду программы.
В качестве оформления использовался минималистический дизайн. В качестве приветствия с пользователем было создано отдельное окно, которое содержит надпись, изображение и кнопку, которая запускает саму программу. Данное окно имеет приятный фиолетовый цвет и изображение, выполненное в минималистичном стиле. Ознакомиться с окном приветствия программы можно на рисунке А.6. В главном же окне программы преобладают серые и белые тона.
Кроме этого был создан логический маршрут, который совпадает с движением взгляда пользователя. Он представлен на рисунке А.7. Сначала, когда пользователь смотрит на экранную форму, предполагается, что он визуально просматривает название программы. После того, как пользователь ознакомился с названием, предполагается, что его внимание привлекут единственные красочные кнопки программы добавления записи, удаления записи и обновление окна. Далее, после того, как пользователь зрительно ознакомился с кнопками управления данными, предполагается, что его внимание привлечет копки с названиями таблиц. После их ознакомления, пользователь переведет свое внимание на рабочее поле, где отображаются таблицы. В конечном итоге, не увидев больше ничего, пользователь закончит свой просмотр на кнопках сворачивания, полноэкранного режима и закрытия.
Вместимость данных
Начиная с MySQL версии 3.23, где используется новый тип таблиц, максимальный размер таблицы доведен до 8 миллионов терабайт (263 bytes). Однако следует заметить, что операционные системы имеют свои собственные ограничения по размерам файлов. Ниже приведено несколько примеров:
32-разрядная Linux-Intel – размер таблицы 4 Гб.
Solaris 2.7 Intel - 4 Гб
Solaris 2.7 UltraSPARC - 512 Гб
WindowsXP - 4 Гб
Как можно видеть, размер таблицы в базе данных MySQL обычно лимитируется операционной системой. По умолчанию MySQL-таблицы имеют максимальный размер около 4 Гб. Для любой таблицы можно проверить/определить ее максимальный размер с помощью команд SHOW TABLE STATUS или myisamchk -dv table_name. Если большая таблица предназначена только для чтения, можно воспользоваться myisampack, чтобы слить несколько таблиц в одну и сжать ее. Обычно myisampack ужимает таблицу по крайней мере на 50%, поэтому в результате можно получить очень большие таблицы.
Описание требований к ПО и АО
Минимальные программные требования для работы приложения:
ОС Windows 98 – для работы приложения;
Python 3.4 и выше – для работы приложения;
Библиотека PyQt4 – для работы приложения;
Библиотека sqlalchemy 1.0.11 – для работы приложения;
Минимальные аппаратные требования для работы приложения:
CPU: 1 ГГц;
Память: 1 Гб;
HDD: 14 Гб. свободного места;
Видеоадаптер с поддержкой DirectX.
Описание контрольных примеров
Рассмотрим результат работы программы «Сайт магазина игровых приставок» и правильность его обработки пользовательских запросов.
Пусть пользователю необходимо внести данные нового товара в базу. Результат обработки данного запроса отображен на рисунке А.9.
Пусть пользователю необходимо удалить данные из таблицы «Категории». Результат обработки данного запроса отображен на рисунке А.10 и А.11.
Пусть пользователю необходимо внести изменение в описание товара. Результат обработки данного запроса отображен на рисунке А.12.
Пусть пользователю захотелось нажать на кнопку удаления строки в пустой таблице. Результат обработки данного запроса отображен на рисунке А.13.
Описание инструкций пользователя
Для запуска приложения необходимо на диске найти папку с названием «Сайт магазина игровых приставок». Затем перейдя в эту папку найти еще одну точно такую папку. После перехода необходимо найти файл с названием «main» и запустить его, щелкнув по нему 2 раза. Предполагается, что у пользователя уже установлены с прилагаемого диска все необходимые библиотеки, MySQL и программа Python.
После запуска файла «main», откроется главное окно программы. Главное окно программы условно разделено на три части. В основной части находится рабочее поле, в котором отображаются таблицы изображение персонального ассистента. В левой части находятся кнопки для редактирования базы данных. Также ниже предыдущей области, в левой части находятся кнопки, благодаря которым осуществляется переход между таблицами базы данных. Более детально ознакомиться с главным окном программы можно просмотрев его на рисунке А.8.
Для просмотра какой-либо таблицы необходимо кликнуть по кнопке с названием, которое соответствует названию таблицы. Для произведения какого-либо редактирования базы данных, необходимо кликнуть по соответствующему рисунку, предварительно выбрав таблицу, в которой хотите производить изменения. Пример выполнения этих действий можно посмотреть на рисунках А.8 – А.12.
ВЫВОДЫ
В ходе работы над проектом были реализованы следующие задачи:
• проанализированы и выделены основные этапы работы программы;
• разработана база данных, сформированы таблицы в соответствии с третьей нормальной формой;
• разработано приложение, которое выполняет функции редактирования базы данных.
Изучены общепризнанные методы и ознакомлены с особенностями использования MySQL на Python.
Выяснены основные достоинства программы «Сайт магазина игровых приставок» и его особенности, способствующие дальнейшему развитию и популярности среди различных категорий пользователей.
Результатом данной работы является разработанная программа «Сайт магазина игровых приставок» в которой обработка данных организована в виде реляционной базы данных.
При дальнейшем развитии этого приложения, можно расширить его функции.
СПИСОК ССЫЛОК
Индустрия компьютерных игр, [Электронный ресурс]. Режим доступа https://ru.wikipedia.org/wiki/Индустрия_компьютерных_игр — Дата доступа: 08.05.2016
Виртуальная реальность, [Электронный ресурс]. Режим доступа: https://ru.wikipedia.org/wiki/Виртуальная_реальность — Дата доступа: 08.05.2016
ORM, [Электронный ресурс]. Режим доступа http://dic.academic.ru/dic.nsf/ruwiki/209846 — Дата доступа: 08.05.2016
MySQL, [Электронный ресурс]. Режим доступа: https://ru.wikipedia.org/wiki/MySQL— Дата доступа: 08.05.2016
Что такое MySQL. Взаимодействие с PHP, [Электронный ресурс]. Режим доступа: http://www.softtime.ru/bookphp/gl12_1.php — Дата доступа: 08.05.2016
Преимущества и недостатки MySQL, [Электронный ресурс]. Режим доступа: http://www.softtime.ru/forum/read.php?id_forum=3&id_theme=30947 — Дата доступа: 08.05.2016
Введение в среду PyQt4, [Электронный ресурс]. Режим доступа: http://wiki.python.su/Документации/ВведениеВСредуPyQt4 — Дата доступа: 08.05.2016
SQLAlchemy, [Электронный ресурс]. Режим доступа: http://dic.academic.ru/dic.nsf/ruwiki/1273414 — Дата доступа: 08.05.2016
Python, [Электронный ресурс]. Режим доступа: http://ideafix.name/wp-content/uploads/2012/08/Python-12.pdf — Дата доступа: 08.05.2016
Python Imaging Library, [Электронный ресурс]. Режим доступа: https://ru.wikipedia.org/wiki/Python_Imaging_Library — Дата доступа: 08.05.2016
Список всех классов Qt., [Электронный ресурс]. Режим доступа: http://doc.crossplatform.ru/qt/4.7.x/classes.html — Дата доступа: 08.05.2016
Купер А. Алан Купер об интерфейсе. Основы проектирования взаимодействия /А. Купер, Р. Рейман, Д. Кронин. Пер. с англ. СПб. Символ-Плюс, 2009 г., 688с., ил.
ПРИЛОЖЕНИЕ А
ПОЯСНЯЮЩИЕ ИЛЛЮСТРАЦИИ
Рисунок А.1 – ER-диаграмма.
Рисунок А.2 – Реляционная модель данных.
Рисунок А.3 – Первая нормальная форма.
Рисунок А.4 – Вторая нормальная форма.
Рисунок А.5 – Третья нормальная форма.
Рисунок А.6 – Окно приветствия.
Рисунок А.7 – Логический маршрут.
Рисунок А.8 – Главное окно программы.
Рисунок А.9 – Ввод нового товара в базу
Рисунок А.10 – Удаление данных из базы.
Рисунок А.11 – Удаление данных из базы.
Рисунок А.12 – Изменение данных в БД.
Рисунок А.13 – Вывод ошибки в БД
ПРИЛОЖЕНИЕ Б
ФРАГМЕНТЫ ЛИСТИНГА
import os # библиотека для работы с системными вызовами и консолью
BASE_URL = os.path.split(__file__)[0]
DATABASE_URL='mysql+mysqlconnector://root:1234@localhost/database_editor?charset=utf8' # подключение к БД
Рисунок Б.1 – Подключение к БД
from sqlalchemy import create_engine
from model import Base
from settings import DATABASE_URL
def create_db():
engine = create_engine(DATABASE_URL)
Base.metadata.create_all(engine)
create_db()
Рисунок Б.2 – Создание таблиц в БД
from sqlalchemy import Column, ForeignKey, Integer, Float, String, Text
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
Base = declarative_base()
class Category(Base):
""" Категория """
__tablename__ = 'category'
id = Column(Integer, primary_key=True)
name = Column(String(150))
description = Column(Text())
items = relationship('Item', backref='items')
def __repr__(self):
return '<Category> {}'.format(self.name)
def __str__(self):
return '<Category> {}'.format(self.name)
class Item(Base):
""" Товар """
__tablename__ = 'item'
id = Column(Integer, primary_key=True)
id_category = Column(Integer, ForeignKey('category.id'))
id_manufacturer = Column(Integer, ForeignKey('manufacturer.id'))
name = Column(String(150))
description = Column(Text())
price = Column(Float)
count = Column(Integer)
def __repr__(self):
return '<Item> {}'.format(self.name)
def __str__(self):
return '<Item> {}'.format(self.name)
class Manufacturer(Base):
""" Производитель """
__tablename__ = 'manufacturer'
id = Column(Integer, primary_key=True)
name = Column(String(150))
def __repr__(self):
return '<Manufacturer> {}'.format(self.name)
def __str__(self):
return '<Manufacturer> {}'.format(self.name)
class Order(Base):
""" Заказ """
__tablename__ = 'order'
id = Column(Integer, primary_key=True)
id_item = Column(Integer, ForeignKey('item.id'))
id_buyer = Column(Integer, ForeignKey('buyer.id'))
# series_number = Column(Integer)
# season_number = Column(Integer)
# looked = Column(Boolean(), default=False)
def __repr__(self):
return '<Order> {}'.format(self.id_item)
def __str__(self):
return '<Order> {}'.format(self.id_item)
class Buyer(Base):
""" Заказ """
__tablename__ = 'buyer'
id = Column(Integer, primary_key=True)
nick = Column(String(150))
email = Column(String(150))
def __repr__(self):
return '<Buyer> {}'.format(self.nick)
def __str__(self):
return '<Buyer> {}'.format(self.nick)
Рисунок Б.3 – Описание таблиц БД
class MainWindow(QtGui.QMainWindow):
def __init__(self):
super(MainWindow, self).__init__(None)
self.db_metadata = Base.metadata
self.main_widget = QtGui.QWidget()
self.main_layout = QtGui.QVBoxLayout()
self.main_widget.setLayout(self.main_layout)
self.setCentralWidget(self.main_widget)
self.menu_buttons = []
self.tab_tables = TabTablesWidget()
self.toolbar = self.addToolBar('Работа с БД')
self.build_toolbar()
self.build_widgets()
def build_toolbar(self):
add_action = QtGui.QAction(
QtGui.QIcon('icons/add.png'), 'Добавить новую строку', self
)
add_action.triggered.connect(self.add_new_row)
rm_action = QtGui.QAction(
QtGui.QIcon('icons/delete.png'), 'Удалить строку', self
)
rm_action.triggered.connect(self.remove_row)
update_action = QtGui.QAction(
QtGui.QIcon('icons/update.png'), 'Обновить', self
)
update_action.triggered.connect(self.update_table_view)
self.toolbar.addAction(add_action)
self.toolbar.addAction(rm_action)
self.toolbar.addAction(update_action)
def build_widgets(self):
splitter = QtGui.QSplitter(QtCore.Qt.Horizontal)
splitter.addWidget(self.create_menu())
splitter.addWidget(self.create_tabs_area())
self.main_layout.addWidget(splitter)
def create_menu(self):
menu = QtGui.QFrame(self)
menu.setLayout(QtGui.QVBoxLayout())
menu.setFrameShape(QtGui.QFrame.StyledPanel)
for table_name in self.db_metadata.sorted_tables:
table_name = table_name.name
button = QtGui.QPushButton(rus[table_name].capitalize())
button.clicked.connect(
lambda event, name=table_name: self.tab_tables.create_tab(name)
)
menu.layout().addWidget(button)
menu.layout().addStretch(len(self.menu_buttons))
menu.setFixedWidth(menu.sizeHint().width())
return menu
def create_tabs_area(self):
tabs_area = QtGui.QFrame(self)
tabs_area.setLayout(QtGui.QVBoxLayout())
tabs_area.layout().addWidget(self.tab_tables)
tabs_area.setFrameShape(QtGui.QFrame.StyledPanel)
return tabs_area
def add_new_row(self):
current_widget = self.tab_tables.current_widget()
if current_widget:
self.dialog = DialogAddingNewRecord(current_widget.table)
self.dialog.button_ok.clicked.connect(
lambda: current_widget.add_new_row(self.dialog.get_values())
)
self.dialog.button_cancel.clicked.connect(self.dialog.close)
self.dialog.show()
def remove_row(self):
current_widget = self.tab_tables.current_widget()
if not current_widget:
return
elif not current_widget.selected_cell:
QtGui.QMessageBox.warning(
self, 'Ошибка', 'Выберите строку, которую хотите удалить',
QtGui.QMessageBox.Yes
)
return
current_widget.remove_row()
def update_table_view(self):
current_widget = self.tab_tables.current_widget()
if current_widget:
current_widget.load_data()
Рисунок Б.4 – Формирование главного окна программы
def create_db_session() -> Session:
engine = create_engine(DATABASE_URL)
new_session = sessionmaker(bind=engine)
return new_session()
session = create_db_session()
Рисунок Б.5 – Код, который создает сессию работы с БД
app = QtGui.QApplication(sys.argv)
main_window = MainWindow()
main_window.setWindowTitle('Магазин игровых приставок')
main_window.setGeometry(100, 100, 700, 400)
main_window.show()
app.exec_()
Рисунок Б.6 – Вывод созданной программы на экран
ПРИЛОЖЕНИЕ В
ТАБЛИЦЫ
Таблица В.1 – Структура таблицы «Сайт игровых приставок»
-
Имя поля
Тип
Ширина
1
Назв_товара
Character
150
2
Описан_товара
Text
3
Назв_категории
Character
150
4
Описан_категории
Text
5
Кол-во
Numeric
11
6
Цена
Numeric
11
7
Назв_производителя
Character
150
8
Имя_покупателя
Character
150
9
Электр_почта_покупателя
Character
150
Таблица В.2 – Примеры хранимых данных
-
Имя поля
Запись 1
Запись 2
Назв_товара
Игровая консоль x-box 360
Игровая консоль Sony PlayStation 4
Описан_товара
Игровая консоль x-box 360
Игровая консоль Sony PlayStation 4
Назв_категории
Консоли
Консоли
Описан_категории
Игровые приставки
Игровые приставки
Кол-во_товара
1
1
Цена_товара
3500 грн
6000 грн
Назв_производителя
Microsoft
Sony
Имя_покупателя
tomb
Richard
Электр_почта_покупателя
tmb@mail.ru
Rich@rambler.ru
Таблица В.3 – Блоки обработки информации классов Category, Item, Manufacturer, Order, Buyer
Название блока (def) |
Описание функции |
__repr__ |
Метод для получения строкового представления объекта. Возвращает "сырые" данные, использующиеся для внутреннего представления в python. |
__str__ |
Метод для получения строкового представления объекта. Возвращает значения в читаемой для пользователя форме. |
Таблица В.4 – Блоки обработки информации класса MainWindow
Название блока (def) |
Описание функции |
_init_ |
Запускает __init__ базового класса, чтобы были проинициализированы все нужные атрибуты, а также рассматривает некоторые свойства виджета и рамещения. |
build_widgets |
Создаёт виджеты, которые отображаются в окне. |
build_toolbar |
Создает панель инструментов графического интерфейса пользователя, предназначенный для размещения на нем нескольких других элементов, таких как: кнопки, меню, поле с текстом, списки и т.д |
create_menu |
Создает меню, где отображаются все таблицы БД и из которого можно перейти к нужной таблице для редактирования |
create_tabs_area |
Создает виджет, отображающий открытые для редактирования таблицы |
add_new_row |
Запускает диалог добавления новой записи в БД |
remove_row |
Удаляет выделенную строку из таблицы |
update_table_view |
Обновляет данные в таблице (синхронизует таблицу с таблицей БД) |
Таблица В.5 – Блоки обработки информации класса DatabaseTableView
Название блока (def) |
Описание функции |
__init__ |
Запускает __init__ базового класса, чтобы были проинициализированы все нужные атрибуты, а также рассматривает некоторые свойства виджета и рамещения. |
load_data |
Загружает в таблицу данные из базы данных |
view_clicked |
срабатывает, когда пользователь кликает по ячейке таблицы, для того, чтобы узнать куда кликнули |
add_new_row |
Добавляет в базу новую запись |
remove_row |
Удаляет из базы данных выделенную в таблице строку и удаляет ее из таблицы |
Таблица В.6 – Блоки обработки информации класса TabTablesWidget
Название блока (def) |
Описание функции |
__init__ |
Запускает __init__ базового класса, чтобы были проинициализированы все нужные атрибуты, а также рассматривает некоторые свойства виджета и рамещения. |
create_tab |
Добавляет в окно вкладку |
close_tab |
Запускается для удаления вкладки из виджета |
current_widget |
Возвращает текущую таблицу |
Таблица В.7 – Блоки обработки информации класса DialogAddingNewRecord
Название блока (def) |
Описание функции |
__init__ |
Запускает __init__ базового класса, чтобы были проинициализированы все нужные атрибуты, а также рассматривает некоторые свойства виджета и рамещения. |
build_widgets |
Создаёт виджеты, которые отображаются в окне. |
get_values |
Возвращает данные введеные пользователем в поля |
create_db_session |
Создает сессию работы с БД |
Таблица В.8 – Методы файла Settings
Методы |
Описание |
os.path.split()
|
Разбивает путь на кортеж (голова, хвост), где хвост - последний компонент пути, а голова - всё остальное. |
ПРИЛОЖЕНИЕ Г
ФАЙЛ README
Прежде чем открыть программу необходимо:
1. Установить Python v3.4 и выше. Прилагается установочный файл на версию 3.4.2
2. Установить MySQL. Прилагается установочный архив.
3. Установить библиотеку PyQt4. Прилагается установочный файл.
4. Установить библиотеку sqlalchemy==1.0.11, для этого необходимо перейти в командную строку компьютера, и написать:
cd C:\Python34\Scripts
pip3.exe install sqlalchemy==1.0.11
После чего можно закрыть консоль и запускать файл "main"
