
- •Введение
- •Краткое описание предметной области
- •2 Описание входных документов для заполнения базы данных
- •Выделение сущностей
- •4 Анализ сущностей и связей между ними
- •5 Описание пользователей информационной системы
- •Заполнение таблицы transactions
- •7 Составление запросов к базе данных и их инкапсуляция в процедуры
- •8 Описание выходных документов
- •9 Триггеры
- •10 Проектирование пользовательского интерфейса
- •11 Обработка данных
- •12 Заключение
- •Список использованных источников
- •Приложение а. Первоначальное наполнение таблиц базы данных
- •Приложение б. Код функциия для заполнения таблицы transactions
- •Приложение в. Полный код для генерации пользовательского интерфейса
- •Приложение г. Код функций для выполнения запросов к бд
- •Приложение д. Код создание бд
10 Проектирование пользовательского интерфейса
Для разработки пользовательского интерфейса использовался модуль Tkinter. Tkinter — это кроссплатформенный графический интерфейс Python, позволяющий работать с библиотекой Tk. Он содержит элементы графического интерфейса пользователя (GUI — Graphical User Interface), с помощью которых можно создавать различные приложения.
При разработке интерфейса использовался функциональный подход, где каждая функция (помимо функций выполняющих операции с базой данных и других вспомогательных функций) отвечает за каждую отдельную страницу интерфейса. Каждая функция, отвечающая за страницу интерфейса, принимает на вход три объекта:
app - это объект из модуля tkinter, который представляет графическое окно приложения.
cursor – это «курсор» базы данных. Он используется для выполнения SQL-запросов к базе данных.
conn – это объект из модуля MySQL, разработанный специально для связи языка программирования Python и СУБД MySQL. Он используется для установления соединения с базой данных.
Полный код генерации графического интерфейса приложения представлен в приложении В.
В листинге 29 представлен код подключения к базе данных и генерации главной страницы приложения. Главная страница генерируется путем вызова функции create_admin_interface.
Листинг 29 – Подключение к базе данных и создание основных объектов, необходимых для работы приложения
def main():
# Подключение к базе данных
conn = mysql.connector.connect(
host="localhost",
port = "3306",
user="root",
password="8&5jypSfzFyDhL",
database = 'hobbiton_bank'
)
# Создание курсора для выполнения SQL-запросов
cursor = conn.cursor(buffered=True)
app = tk.Tk()
# Установка фона окна черным
app.configure(bg='black')
app.protocol("WM_DELETE_WINDOW", lambda: on_closing(app, conn))
# Установка размеров окна на 1000*1000
app.geometry("1000x1000")
app.title("Служба безопасности банка Хоббитон")
create_admin_interface(app, cursor, conn)
app.mainloop()
main()
Рисунок 35 – Главная страница пользовательского интерфейса
После запуска программы у сотрудника банка есть возможность открыть список запросов к базе данных, список графиков, которые можно построить, а также «перейти на день вперед».
Кнопка «перейти на день вперед» отвечает за несколько функций (представлены в порядке выполнения):
Получение следующий даты (дата, следующая за датой последней транзакции в базе данных).
Добавление в базу данных случайное количество новых транзакций (от 1 до 1000).
Обновление балансов и лимитов счетов.
При нажатии на данную кнопку вызывается функция skip_day. Код функции представлен в листинге 30.
Листинг 30 – Код функции skip_day
def skip_day(app, conn, cursor, start_date):
start_date = datetime.strptime(start_date, '%d.%m.%Y') + timedelta(days=1)
fill_transactions(start_date, cursor, conn)
update_balances(start_date, cursor, conn)
create_admin_interface(app, cursor, conn)
Функция fill_transactions() отвечает за добавление новых транзакций в базу данных. Данная функция принимает на вход объекты cursor и conn для работы с базой данных и объект start_date – дату, на которую будут генерироваться новые транзакции. Код функции представлен в приложении Б.
Функция update_balances() отвечает за обновление балансов счетов основе новых транзакций. Также, данная функция отвечает за сброс дневных и месячных лимитов. Данная функция принимает на вход объекты conn и cursor для работы с базой данных и объект today_date – дату новых транзакций. Код функции представлен в листинге 31.
Функция create_admin_interface отвечает за повторную генерацию главной страницы приложения для корректного отображения текущей даты.
Листинг 31 – Код функции update_balances ()
def update_balances(today_date, cursor, conn):
cursor.execute('SELECT * FROM transactions WHERE date_time > %s', (today_date,))
transactions = cursor.fetchall()
for transaction in transactions:
amount = transaction[1]
sender_account = transaction[3]
recipient_account = transaction[4]
# Обновление баланса отправителя
cursor.execute('SELECT * FROM bank_accounts WHERE id = %s', (sender_account,))
sender_account_info = cursor.fetchone()
sender_balance = sender_account_info[2]
# Если транзакция прошла через карту
if transaction[5] is not None:
cursor.execute('SELECT * FROM cards WHERE id = %s' % transaction[5])
card_info = cursor.fetchone()
if card_info[5] != None and (card_info[5] - amount < 0 or card_info[6] - amount < 0):
continue
cursor.execute('UPDATE bank_accounts SET balance = %s WHERE id = %s' % (sender_balance - amount, sender_account))
# Обновление баланса получателя
cursor.execute('SELECT * FROM bank_accounts WHERE id = %s' % recipient_account)
recipient_account_info = cursor.fetchone()
recipient_balance = recipient_account_info[2]
cursor.execute('UPDATE bank_accounts SET balance = %s WHERE id = %s' % (recipient_balance + amount, recipient_account))
# Подтверждение изменений
conn.commit()
cursor.execute('SELECT * FROM cards WHERE daily_limit is not NULL')
cards = cursor.fetchall()
cursor.execute('SELECT MAX(date_time) FROM transactions')
last_month = cursor.fetchone()[0].month
# Обновление остатков дневных и месячных лимитов
for card in cards:
cursor.execute('UPDATE cards SET daily_limit_left = %s WHERE id = %s', (card[3], card[0]))
if last_month < today_date.month:
cursor.execute('UPDATE cards SET monthly_limit_left = %s WHERE id = %s', (card[4], card[0]))
При нажатии на кнопку «Запросы» вызывается функция create_requests_interface, которая создает интерфейс выбора запроса к базе данных. Интерфейс выбора запроса представлен на рисунке 36.
Рисунок 36 – Интерфейс выбора запроса
При нажатии кнопки одного из запросов вызывается соответствующая функция, отвечающая за генерацию интерфейса для запроса. Каждый интерфейс запроса состоит из:
Названия запроса в верхней части экрана
Даты последней транзакции в базе данных
Таблицы для вывода результатов запроса
Кнопки «Выполнить запрос» для выполнения запроса и отображения результата в таблице
Кнопки «Очистить таблицу» для очистки результатов запроса.
Полей для ввода параметров запроса, если они необходимы
Кнопка «Выполнить запрос» вызывает одну из 10 соответсвующих функций, выполняющих запрос к базе данных. Код функций для выполнения запросов представлен в приложении Г.
На рисунках 37-46 представлены интерфейсы для каждого запроса.
Рисунок 37 – Интерфейс выполнения запроса на максимальный баланс счета
Рисунок 38 – Интерфейс запроса на вывод счета с максимальным количеством карточек
Рисунок 39 – Интерфейс запроса на поиск «двойной покупки»
Рисунок 40 – Интерфейс запроса на поиск поломанного банкомата
Рисунок 41- Интерфейс запроса на поиск операций, выходящих за лимиты карты
Рисунок 42 – Интерфейс запроса на поиск карты с максимальным количеством операций
Рисунок 43 – Интерфейс запроса на поиск операций, проведенных в нерабочее время предприятий
Рисунок 44 – Интерфейс запроса на поиск интернет-магазинов с наибольшим количеством заказов
Рисунок 45 – Интерфейс запроса на вывод статистики по продажам предприятия
Рисунок 46 – Интерфейс запроса на вывод статистики по покупкам гражданина
Если запрос выводит исключение, оно открывается в отдельном окне ошибки. Пример окна ошибки представлен на рисунке 47.
Рисунок 47 – Окно ошибки
При нажатии на кнопку «Графики» на главной странице приложения вызывается функция create_graphs_interface, которая отвечает за вывод интерфейса выбора графика для построения. Интерфейс выбора графика представлен на рисунке 48.
Рисунок 48 – Интерфейс выбора графика
При нажатии одной из кнопок с названием графика вызывается соответствующая функция, которая отвечает за построение графика и вывод его на экран в интерфейсе приложения. Интерфейсы построения графиков представлены на рисунках 49, 50, 51.
Рисунок 49 – Интерфейс графика зависимости суммы транзакций от даты
Рисунок 50 – Интерфейс гистограммы суммы продаж по предприятиям
Рисунок 51 – Интерфейс графика зависимости количества транзакций в зависимости от времени