Файл: Отчет Создание базы данных и интерфейса "learn school" Авторы Студенты специальности 09. 02. 07.docx
Добавлен: 12.01.2024
Просмотров: 156
Скачиваний: 4
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Государственное бюджетное профессиональное учреждение Московской области Люберецкий техникум имени героя Советского Союза, летчика космонавта Юрия Алексеевича ГагаринаОтчет: Создание базы данных и интерфейса “learn school”Авторы:Студенты специальности 09.02.07 “Информационные системы и программирование”, 2-ого курса, группы ИС-21 Брюханов Никита Анатольевич,Островский Василий Дмитриевич, Фомин Игорь АндреевичРецензент:Тарджиманян Лия Николаевна Оценка:_____Дзержинский 2023 гСодержание:
Время оказания услуги Дата оказания услуги Таблица “Клиенты” имеет следующие атрибуты:IdФамилия Имя Отчество Номер телефона Электронная почта ПолДата рождения Дата регистрации Таблица “Услуги” имеет следующие атрибуты:IdIdКлиентаНазвание Главное изображениеДлительность Стоимость Скидка Таблица “Пользователи”, была создана специально для регистрации и логирования пользователя, имеет следующие атрибуты:Электронная почта ПарольРабота с даннымиОрганизация ввода данных в БД.Первичный ввод записей в базу данных будет производится при помощи импортирования данных из Excel. Далее ввод данных будет производится непосредственно с формы. Организация корректировки БД.Корректироваться данных производится с формы, или непосредственно в Sqlite.Инструкция пользования Описание информационных потребностей пользователей и выбор способов их реализации.У пользователя могут возникнуть следующие потребности пи пользовании интерфейсом:
Изменение данных в таблицеДля того, чтобы изменить данные в таблице необходимо навести курсор на ячейку таблицы, в которой Вы хотите произвести изменения и несколько раз нажать на нее, после чего изменить данные.Удаление записейЕсли данные были введены неверно, то их можно удалить из базы данных. Для того, чтобы удалить данные из базы данных необходимо в нижнем окне, где отображается таблица, навести на номер записи, которую Вы хотите удалить и нажать на кнопку “Удалить”. которая располагается в одной колонке с кнопками “Открыть” и “Добавит”.Поиск по определенным критериямТакже через формы можно выводить данные, которые нужно отсортировать по тому или иному критерию. Для этого в разделе поиска нажимаем на выпадающее окно, где представлены названия столбцов, и выбираем назание столбца, по значением которого нам нужно вывести данные. Ниже, в окошке для ввода данных нужно указать значения, по которым мы будем сортировать и нажимаем кнопку “Найти”. В окошко, через которое отображается таблица, будут выведены необходимые отсортированные данные.Переключение между формамиЧтобы переключаться между формами предусмотрены кнопки, которые располагаются под блоком “Поиск”. Нажимая на одну из кнопок вы будете переходить на другую форму. Все формы работаю аналогично форме “Клиенты”.Разработка интерфейса.Для начала в QT 5 дизайнере необходимо создать внешний вид форм, перенести на окно необходимые кнопки, поля для ввода данных, текстовые значения. После создания внешнего вида формы нам необходимо добавить функции на кнопки и поля ввода, чтобы наш интерес исправно функционировал. Назначение команд для функционирования формИмпортирование необходимых библиотек import sysimport sqlite3from PyQt5 import QtWidgetsfrom PyQt5.QtWidgets import QDialog, QApplication, QTableWidgetItemfrom PyQt5.uic import loadUiПодключение к бдdb = sqlite3.connect("school(1).db")sql = db.cursor()Логирование class Login(QDialog):def __init__(self):super(Login,self).__init__()loadUi("login.ui",self)self.password.setEchoMode(QtWidgets.QLineEdit.Password)self.loginbutton.clicked.connect(self.loginfunction)self.createaccbutton.clicked.connect(self.gotocreate)def loginfunction(self):Запрос у пользователя данных для входа email=self.email.text()password=self.password.text()Поиск данных, которые ввел пользователь, в бд
sql.execute(f"SELECT * FROM users WHERE username = '{self.email.text()}' AND password = '{self.password.text()}';")db.commit()Цикл на авторизациюif sql.fetchone() == None:print("Нет такой записи")else:print('Welcome')loginbutton=Client()widget.addWidget(loginbutton)widget.setCurrentIndex(widget.currentIndex()+1)Кнопка, которая отправляет пользователя на страницу регистрации def gotocreate(self):createaccbutton=CreateAcc()widget.addWidget(createaccbutton)widget.setCurrentIndex(widget.currentIndex()+1)Регистрация class CreateAcc(QDialog):def __init__(self):super(CreateAcc,self).__init__()loadUi("createacc.ui",self)self.signupbutton.clicked.connect(self.createaccfunction)self.password.setEchoMode(QtWidgets.QLineEdit.Password)self.confirmpass.setEchoMode(QtWidgets.QLineEdit.Password)self.conn = Nonedef createaccfunction(self):Запрос на ввод данных от пользователя email = self.email.text()Поиск данных, которые ввел пользовательpassword=self.password.text()if self.password.text()==self.confirmpass.text():Запрос на поиск информации, которую ввел пользовательsql.execute(f"SELECT username, password FROM users WHERE username = '{email}' AND password = '{password}'")Цикл на регистрациюif sql.fetchone() is None:Запрос на добавление новых записей в таблицу для регистрации пользователя sql.execute(f"INSERT INTO users VALUES (?,?)", (email, password))db.commit()print('You have registered')signupbutton=Login()widget.addWidget(signupbutton)widget.setCurrentIndex(widget.currentIndex()+1)else:print('Такая запись уже существует')for i in sql.execute('SELECT * FROM users'):print(i)Первая форма “Клиенты”class Client(QDialog):def __init__(self):super(Client, self).__init__()loadUi("client.ui",self)self.rbMale.setChecked(True)self.pbInsert.clicked.connect(self.insert_staff)self.pbOpen.clicked.connect(self.open_file)self.pbDelete.clicked.connect(self.delete_staff)self.pbFind.clicked.connect(self.find_for_val)self.pushButton_3.clicked.connect(self.gotouslugu)self.pushButton_2.clicked.connect(self.gotosvod)self.conn = NoneКнопк открытия БДdef open_file(self):try:self.conn = sqlite3.connect('school(1).db')cur = self.conn.cursor()Запрос на вывод таблицыdata = cur.execute("select * from client")col_name = [i[0] for i in data.description]data_rows = data.fetchall()except Exception as e:print(f"Проблемы с подключением к БД. {e}")return eself.twStaffs.setColumnCount(len(col_name))self.twStaffs.setHorizontalHeaderLabels(col_name)self.twStaffs.setRowCount(0)self.cbColNames.addItems(col_name)for i, row in enumerate(data_rows):self.twStaffs.setRowCount(self.twStaffs.rowCount() + 1)for j, elem in enumerate(row):self.twStaffs.setItem(i, j, QTableWidgetItem(str(elem)))self.twStaffs.resizeColumnsToContents()self.avg_age()Изменение данных в таблице и ее выводdef update_twStaffs(self, query="select * from client"):try:cur = self.conn.cursor()data = cur.execute(query).fetchall()except Exception as e:print(f"Проблемы с подключением к БД. {e}")return eself.twStaffs.setRowCount(0)for i, row in enumerate(data):self.twStaffs.setRowCount(self.twStaffs.rowCount() + 1)for j, elem in enumerate(row):self.twStaffs.setItem(i, j, QTableWidgetItem(str(elem)))self.twStaffs.resizeColumnsToContents()Добавление данных в таблицу def insert_staff(self):row = [self.leFio.text(), self.leFio_2.text(), self.leFio_3.text(), 'м' if self.rbMale.isChecked() else 'ж', self.lePhone.text(), self.sbAge.text(),
self.leEmail.text(), self.sbAge_2.text()]try:cur = self.conn.cursor()Запрос на добавление новых данных в таблицуcur.execute(f"""insert into client(second_name, first_name, last_name, gender, phone, data_start, Email, data_reg)values('{row[0]}', '{row[1]}', '{row[2]}', '{row[3]}', '{row[4]}', '{row[5]}', '{row[6]}', '{row[7]}')""")self.conn.commit()cur.close()except Exception as e:print(f"Исключение1: {e}")return eself.update_twStaffs()def delete_staff(self):row = self.twStaffs.currentRow()num = self.twStaffs.item(row, 0).text()try:cur = self.conn.cursor()Запрос на удаление данных из таблицы cur.execute(f"delete from client where id = {num}")self.conn.commit()cur.close()except Exception as e:print(f"Исключение: {e}")return eself.update_twStaffs()Поиск информации с сортировкой def find_for_val(self):val = self.leFind.text()col = self.cbColNames.itemText(self.cbColNames.currentIndex())Запрос на сортировку self.update_twStaffs(f"select * from client where {col} like '{val}%'")def closeEvent(self, event):if self.conn is not None:self.conn.close()event.accept()Кнопк, которая переходит на форму “Сводная”def gotosvod(self):pushButton_2=Swod()widget.addWidget(pushButton_2)widget.setCurrentIndex(widget.currentIndex()+1)Кнопк, которая переходит на форму “Услуги”def gotouslugu(self):pushButton_3=Uslugu()widget.addWidget(pushButton_3)widget.setCurrentIndex(widget.currentIndex()+1)Формы: “Сводная” и “Услуги” работают аналогично форме “Клиенты”ЗаключениеВ ходе проделанной работы были выполнены все поставленные задачи: была разработана er-диаграмма по предметной области, по er диаграмме, которую мы разработали была создана база данных, которая была заполнена данными, также был разработан интерес непосредственно под саму базу данных, был создан файл main.pu, в котором мы при помощи языка python связали формы и базу данных, назначили действия на кнопки и поля ввода, которые располагаются на форме.
-
Введение.……………………………………...………………………………3 -
Логическая структура………………………………………………………...4 -
Физическая структура………………………………………………….……..5 -
Ввод данных…………………………………………………………………6 -
Инструкция пользования……………………………………………….….7 -
Разработка интерфейса…………………………………………………...…..9 -
Заключение…………………………………………………………………..16
-
Разработать er диаграмму по предметной области -
По разработанной er диаграмме создать базу данных -
Заполнить данными получившуюся базу данных -
Разработать интерфейс для работы с базой данных -
Связать интерфейс с базой данных с помощью программирования
-
SqlDraw(сайт для создания er диаграммы) -
Sqlite(для разработки базы данных) -
Qt5 дизайнер(для создания визуальной составляющей интерфейса) -
visual studio code(ide для программирования)
-
Sqlite
Время оказания услуги Дата оказания услуги Таблица “Клиенты” имеет следующие атрибуты:IdФамилия Имя Отчество Номер телефона Электронная почта ПолДата рождения Дата регистрации Таблица “Услуги” имеет следующие атрибуты:IdIdКлиентаНазвание Главное изображениеДлительность Стоимость Скидка Таблица “Пользователи”, была создана специально для регистрации и логирования пользователя, имеет следующие атрибуты:Электронная почта ПарольРабота с даннымиОрганизация ввода данных в БД.Первичный ввод записей в базу данных будет производится при помощи импортирования данных из Excel. Далее ввод данных будет производится непосредственно с формы. Организация корректировки БД.Корректироваться данных производится с формы, или непосредственно в Sqlite.Инструкция пользования Описание информационных потребностей пользователей и выбор способов их реализации.У пользователя могут возникнуть следующие потребности пи пользовании интерфейсом:
-
Регистрация на форме -
Авторизация на форме -
Добавление данных в базу данных -
Изменение данных в таблице -
Удаление данных из базы данных -
Поиск отсортированной информации и ее вывод
Изменение данных в таблицеДля того, чтобы изменить данные в таблице необходимо навести курсор на ячейку таблицы, в которой Вы хотите произвести изменения и несколько раз нажать на нее, после чего изменить данные.Удаление записейЕсли данные были введены неверно, то их можно удалить из базы данных. Для того, чтобы удалить данные из базы данных необходимо в нижнем окне, где отображается таблица, навести на номер записи, которую Вы хотите удалить и нажать на кнопку “Удалить”. которая располагается в одной колонке с кнопками “Открыть” и “Добавит”.Поиск по определенным критериямТакже через формы можно выводить данные, которые нужно отсортировать по тому или иному критерию. Для этого в разделе поиска нажимаем на выпадающее окно, где представлены названия столбцов, и выбираем назание столбца, по значением которого нам нужно вывести данные. Ниже, в окошке для ввода данных нужно указать значения, по которым мы будем сортировать и нажимаем кнопку “Найти”. В окошко, через которое отображается таблица, будут выведены необходимые отсортированные данные.Переключение между формамиЧтобы переключаться между формами предусмотрены кнопки, которые располагаются под блоком “Поиск”. Нажимая на одну из кнопок вы будете переходить на другую форму. Все формы работаю аналогично форме “Клиенты”.Разработка интерфейса.Для начала в QT 5 дизайнере необходимо создать внешний вид форм, перенести на окно необходимые кнопки, поля для ввода данных, текстовые значения. После создания внешнего вида формы нам необходимо добавить функции на кнопки и поля ввода, чтобы наш интерес исправно функционировал. Назначение команд для функционирования формИмпортирование необходимых библиотек import sysimport sqlite3from PyQt5 import QtWidgetsfrom PyQt5.QtWidgets import QDialog, QApplication, QTableWidgetItemfrom PyQt5.uic import loadUiПодключение к бдdb = sqlite3.connect("school(1).db")sql = db.cursor()Логирование class Login(QDialog):def __init__(self):super(Login,self).__init__()loadUi("login.ui",self)self.password.setEchoMode(QtWidgets.QLineEdit.Password)self.loginbutton.clicked.connect(self.loginfunction)self.createaccbutton.clicked.connect(self.gotocreate)def loginfunction(self):Запрос у пользователя данных для входа email=self.email.text()password=self.password.text()Поиск данных, которые ввел пользователь, в бд
sql.execute(f"SELECT * FROM users WHERE username = '{self.email.text()}' AND password = '{self.password.text()}';")db.commit()Цикл на авторизациюif sql.fetchone() == None:print("Нет такой записи")else:print('Welcome')loginbutton=Client()widget.addWidget(loginbutton)widget.setCurrentIndex(widget.currentIndex()+1)Кнопка, которая отправляет пользователя на страницу регистрации def gotocreate(self):createaccbutton=CreateAcc()widget.addWidget(createaccbutton)widget.setCurrentIndex(widget.currentIndex()+1)Регистрация class CreateAcc(QDialog):def __init__(self):super(CreateAcc,self).__init__()loadUi("createacc.ui",self)self.signupbutton.clicked.connect(self.createaccfunction)self.password.setEchoMode(QtWidgets.QLineEdit.Password)self.confirmpass.setEchoMode(QtWidgets.QLineEdit.Password)self.conn = Nonedef createaccfunction(self):Запрос на ввод данных от пользователя email = self.email.text()Поиск данных, которые ввел пользовательpassword=self.password.text()if self.password.text()==self.confirmpass.text():Запрос на поиск информации, которую ввел пользовательsql.execute(f"SELECT username, password FROM users WHERE username = '{email}' AND password = '{password}'")Цикл на регистрациюif sql.fetchone() is None:Запрос на добавление новых записей в таблицу для регистрации пользователя sql.execute(f"INSERT INTO users VALUES (?,?)", (email, password))db.commit()print('You have registered')signupbutton=Login()widget.addWidget(signupbutton)widget.setCurrentIndex(widget.currentIndex()+1)else:print('Такая запись уже существует')for i in sql.execute('SELECT * FROM users'):print(i)Первая форма “Клиенты”class Client(QDialog):def __init__(self):super(Client, self).__init__()loadUi("client.ui",self)self.rbMale.setChecked(True)self.pbInsert.clicked.connect(self.insert_staff)self.pbOpen.clicked.connect(self.open_file)self.pbDelete.clicked.connect(self.delete_staff)self.pbFind.clicked.connect(self.find_for_val)self.pushButton_3.clicked.connect(self.gotouslugu)self.pushButton_2.clicked.connect(self.gotosvod)self.conn = NoneКнопк открытия БДdef open_file(self):try:self.conn = sqlite3.connect('school(1).db')cur = self.conn.cursor()Запрос на вывод таблицыdata = cur.execute("select * from client")col_name = [i[0] for i in data.description]data_rows = data.fetchall()except Exception as e:print(f"Проблемы с подключением к БД. {e}")return eself.twStaffs.setColumnCount(len(col_name))self.twStaffs.setHorizontalHeaderLabels(col_name)self.twStaffs.setRowCount(0)self.cbColNames.addItems(col_name)for i, row in enumerate(data_rows):self.twStaffs.setRowCount(self.twStaffs.rowCount() + 1)for j, elem in enumerate(row):self.twStaffs.setItem(i, j, QTableWidgetItem(str(elem)))self.twStaffs.resizeColumnsToContents()self.avg_age()Изменение данных в таблице и ее выводdef update_twStaffs(self, query="select * from client"):try:cur = self.conn.cursor()data = cur.execute(query).fetchall()except Exception as e:print(f"Проблемы с подключением к БД. {e}")return eself.twStaffs.setRowCount(0)for i, row in enumerate(data):self.twStaffs.setRowCount(self.twStaffs.rowCount() + 1)for j, elem in enumerate(row):self.twStaffs.setItem(i, j, QTableWidgetItem(str(elem)))self.twStaffs.resizeColumnsToContents()Добавление данных в таблицу def insert_staff(self):row = [self.leFio.text(), self.leFio_2.text(), self.leFio_3.text(), 'м' if self.rbMale.isChecked() else 'ж', self.lePhone.text(), self.sbAge.text(),
self.leEmail.text(), self.sbAge_2.text()]try:cur = self.conn.cursor()Запрос на добавление новых данных в таблицуcur.execute(f"""insert into client(second_name, first_name, last_name, gender, phone, data_start, Email, data_reg)values('{row[0]}', '{row[1]}', '{row[2]}', '{row[3]}', '{row[4]}', '{row[5]}', '{row[6]}', '{row[7]}')""")self.conn.commit()cur.close()except Exception as e:print(f"Исключение1: {e}")return eself.update_twStaffs()def delete_staff(self):row = self.twStaffs.currentRow()num = self.twStaffs.item(row, 0).text()try:cur = self.conn.cursor()Запрос на удаление данных из таблицы cur.execute(f"delete from client where id = {num}")self.conn.commit()cur.close()except Exception as e:print(f"Исключение: {e}")return eself.update_twStaffs()Поиск информации с сортировкой def find_for_val(self):val = self.leFind.text()col = self.cbColNames.itemText(self.cbColNames.currentIndex())Запрос на сортировку self.update_twStaffs(f"select * from client where {col} like '{val}%'")def closeEvent(self, event):if self.conn is not None:self.conn.close()event.accept()Кнопк, которая переходит на форму “Сводная”def gotosvod(self):pushButton_2=Swod()widget.addWidget(pushButton_2)widget.setCurrentIndex(widget.currentIndex()+1)Кнопк, которая переходит на форму “Услуги”def gotouslugu(self):pushButton_3=Uslugu()widget.addWidget(pushButton_3)widget.setCurrentIndex(widget.currentIndex()+1)Формы: “Сводная” и “Услуги” работают аналогично форме “Клиенты”ЗаключениеВ ходе проделанной работы были выполнены все поставленные задачи: была разработана er-диаграмма по предметной области, по er диаграмме, которую мы разработали была создана база данных, которая была заполнена данными, также был разработан интерес непосредственно под саму базу данных, был создан файл main.pu, в котором мы при помощи языка python связали формы и базу данных, назначили действия на кнопки и поля ввода, которые располагаются на форме.