import sys import sqlite3 from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QLabel, QLineEdit, QPushButton, \ QMessageBox from PySide6.QtSql import QSqlDatabase, QSqlQuery from PySide6.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QLabel, QLineEdit, QPushButton, \ QMessageBox, QPlainTextEdit from PySide6.QtWidgets import QDialog # 创建数据库连接 conn = sqlite3.connect('students.db') # 创建学生表 conn.execute('''CREATE TABLE IF NOT EXISTS students (name TEXT NOT NULL, student_number INTEGER NOT NULL, score INTEGER NOT NULL)''') # 创建用户表 conn.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, password TEXT NOT NULL)''') # 创建图书列表表 conn.execute('''CREATE TABLE IF NOT EXISTS books (book_id INTEGER PRIMARY KEY, book_name TEXT NOT NULL, book_status TEXT NOT NULL)''') class LoginWindow(QWidget): def __init__(self): super().__init__() self.db = QSqlDatabase.addDatabase('QSQLITE') self.db.setDatabaseName('students.db') self.db.open() self.createTable() self.username = QLineEdit() self.password = QLineEdit() self.password.setEchoMode(QLineEdit.Password) login_button = QPushButton('登录') login_button.clicked.connect(self.login) register_button = QPushButton('注册') register_button.clicked.connect(self.register) layout = QVBoxLayout() layout.addWidget(QLabel("账号:")) layout.addWidget(self.username) layout.addWidget(QLabel("密码:")) layout.addWidget(self.password) layout.addWidget(login_button) layout.addWidget(register_button) self.setLayout(layout) def login(self): username = self.username.text() password = self.password.text() if not username or not password: QMessageBox.warning(self, '错误', '账号密码不能为空') return query = QSqlQuery(self.db) query.exec("SELECT * FROM users WHERE username='%s' AND password='%s'" % (username, password)) if query.next(): self.hide() is_admin = username == 'van' # 检查是否为管理员 self.window = StudentApp(username, is_admin) # 传递用户名和管理员参数 self.window.show() else: QMessageBox.warning(self, '错误', '账号或密码错误') self.password.clear() def register(self): username = self.username.text() password = self.password.text() if not username or not password: QMessageBox.warning(self, '错误', '账号和密码不能为空') return query = QSqlQuery(self.db) query.exec(f"SELECT * FROM users WHERE username='{username}'") if query.next(): QMessageBox.warning(self, '错误', '该账户已经存在') return query.prepare("INSERT INTO users (username, password) VALUES (?, ?)") query.bindValue(0, username) query.bindValue(1, password) if query.exec(): QMessageBox.information(self, '成功', '你已成功注册') else: QMessageBox.warning(self, '错误', '注册失败') def createTable(self): query = QSqlQuery(self.db) query.exec("CREATE TABLE IF NOT EXISTS users (username varchar(20), password varchar(20))") # 添加管理员账号 query.exec("SELECT * FROM users WHERE username='van'") if not query.next(): query.prepare("INSERT INTO users (username, password) VALUES (?, ?)") query.bindValue(0, 'van') query.bindValue(1, '123456') query.exec() class StudentApp(QMainWindow): def __init__(self, username, is_admin): # 接收用户名和管理员参数 super().__init__() self.username = username # 保存用户名 self.is_admin = is_admin # 保存管理员状态 self.setWindowTitle(f'学生信息管理 - {username}') # 设置窗口标题为用户名 central_widget = QWidget() self.setCentralWidget(central_widget) layout = QVBoxLayout() welcome_label = QLabel(f'你好,{username}') # 显示欢迎消息 layout.addWidget(welcome_label) self.name_label = QLabel("姓名:") self.name_edit = QLineEdit() layout.addWidget(self.name_label) layout.addWidget(self.name_edit) self.student_number_label = QLabel("学号:") self.student_number_edit = QLineEdit() layout.addWidget(self.student_number_label) layout.addWidget(self.student_number_edit) self.score_label = QLabel("成绩:") self.score_edit = QLineEdit() layout.addWidget(self.score_label) layout.addWidget(self.score_edit) self.add_student_btn = QPushButton('添加学生信息') self.add_student_btn.clicked.connect(self.add_student) layout.addWidget(self.add_student_btn) self.find_student_btn = QPushButton('查找学生信息') self.find_student_btn.clicked.connect(self.find_student) layout.addWidget(self.find_student_btn) self.delete_student_btn = QPushButton('删除学生信息') self.delete_student_btn.clicked.connect(self.delete_student) layout.addWidget(self.delete_student_btn) self.clear_table_btn = QPushButton('清空表数据') self.clear_table_btn.clicked.connect(self.clear_table) layout.addWidget(self.clear_table_btn) self.sort_by_score_btn = QPushButton('按成绩排序') self.sort_by_score_btn.clicked.connect(self.sort_by_score) layout.addWidget(self.sort_by_score_btn) self.sort_by_student_number_btn = QPushButton('按学号排序') self.sort_by_student_number_btn.clicked.connect(self.sort_by_student_number) layout.addWidget(self.sort_by_student_number_btn) self.library_system_btn = QPushButton('图书管理系统') self.library_system_btn.clicked.connect(self.open_library_system) layout.addWidget(self.library_system_btn) self.output_label = QLabel("操作结果:") self.output_text = QPlainTextEdit() self.output_text.setReadOnly(True) layout.addWidget(self.output_label) layout.addWidget(self.output_text) self.manage_users_btn = QPushButton('管理登录用户') self.manage_users_btn.clicked.connect(self.manage_users) layout.addWidget(self.manage_users_btn) self.change_password_btn = QPushButton('修改密码') self.change_password_btn.clicked.connect(self.change_password) layout.addWidget(self.change_password_btn) self.logout_btn = QPushButton('退出') self.logout_btn.clicked.connect(self.logout) layout.addWidget(self.logout_btn) central_widget.setLayout(layout) if not is_admin: self.add_student_btn.setEnabled(False) self.delete_student_btn.setEnabled(False) self.clear_table_btn.setEnabled(False) self.show() def manage_users(self): if self.is_admin: self.manage_users_window = ManageUsersWindow() self.manage_users_window.show() else: QMessageBox.warning(self, '权限错误', '您无权访问') def change_password(self): self.change_password_window = ChangePasswordWindow(self.username, self) self.change_password_window.show() def open_library_system(self): self.library_system = LibrarySystemWindow(self.username,self.is_admin) # 传递当前登录用户的用户名 self.library_system.show() def add_student(self): name = self.name_edit.text() student_number = self.student_number_edit.text() score = self.score_edit.text() if not name or not student_number or not score: QMessageBox.warning(self, '输入错误', '姓名、学号和成绩不能为空') return cursor = conn.execute("SELECT * FROM students WHERE student_number=?", (student_number,)) existing_student = cursor.fetchone() if existing_student: self.output_text.setPlainText("已存在该学号的学生信息!") return conn.execute("INSERT INTO students (name, student_number, score) VALUES (?, ?, ?)", (name, student_number, score)) conn.commit() self.output_text.setPlainText("学生信息已添加成功!") self.clear_inputs() def find_student(self): student_number = self.student_number_edit.text() name = self.name_edit.text() if not student_number and not name: QMessageBox.warning(self, '输入错误', '姓名和学号不能同时为空') return cursor = conn.execute("SELECT name, student_number, score FROM students WHERE name=? OR student_number=?", (name, student_number)) students = cursor.fetchall() if students: if student_number and name: # 如果姓名和学号都输入了 name_matched = False for student in students: if str(student_number) == str(student[1]) and name == student[0]: name_matched = True break if not name_matched: self.output_text.setPlainText("学号与姓名不匹配!") self.name_edit.clear() self.student_number_edit.clear() return self.output_text.setPlainText("学生信息:\n") count = 1 for student in students: self.output_text.appendPlainText(f"编号: {count}") self.output_text.appendPlainText("姓名: " + student[0]) self.output_text.appendPlainText("学号: " + str(student[1])) self.output_text.appendPlainText("成绩: " + str(student[2])) self.output_text.appendPlainText("------------------") count += 1 else: self.output_text.setPlainText("未找到学生信息!") self.name_edit.clear() def delete_student(self): student_number = self.student_number_edit.text() cursor = conn.execute("SELECT * FROM students WHERE student_number=?", (student_number,)) student = cursor.fetchone() if student: conn.execute("DELETE FROM students WHERE student_number=?", (student_number,)) conn.commit() self.output_text.setPlainText("学生信息已删除!") self.clear_inputs() else: self.output_text.setPlainText("未找到学生信息!") def clear_table(self): conn.execute("DELETE FROM students") conn.commit() self.output_text.setPlainText("表数据已清空!") self.clear_inputs() def sort_by_score(self): cursor = conn.execute("SELECT name, student_number, score FROM students ORDER BY score DESC") students = cursor.fetchall() self.display_students(students) def sort_by_student_number(self): cursor = conn.execute("SELECT name, student_number, score FROM students ORDER BY student_number ASC") students = cursor.fetchall() self.display_students(students) def display_students(self, students): if students: self.output_text.setPlainText("学生信息:\n") count = 1 for student in students: self.output_text.appendPlainText(f"编号: {count}") self.output_text.appendPlainText("姓名: " + student[0]) self.output_text.appendPlainText("学号: " + str(student[1])) self.output_text.appendPlainText("成绩: " + str(student[2])) self.output_text.appendPlainText("------------------") count += 1 else: self.output_text.setPlainText("数据库中没有学生信息!") def clear_inputs(self): self.name_edit.clear() self.student_number_edit.clear() self.score_edit.clear() def logout(self): self.close() login_window.show() class ChangePasswordWindow(QDialog): def __init__(self, username, parent=None): super().__init__(parent) self.setWindowTitle("修改密码") self.username = username self.old_password_edit = QLineEdit() self.old_password_edit.setEchoMode(QLineEdit.Password) self.new_password_edit = QLineEdit() self.new_password_edit.setEchoMode(QLineEdit.Password) save_button = QPushButton("保存") save_button.clicked.connect(self.change_password) layout = QVBoxLayout() layout.addWidget(QLabel("旧密码:")) layout.addWidget(self.old_password_edit) layout.addWidget(QLabel("新密码:")) layout.addWidget(self.new_password_edit) layout.addWidget(save_button) self.setLayout(layout) def change_password(self): old_password = self.old_password_edit.text() new_password = self.new_password_edit.text() query = QSqlQuery() query.exec(f"SELECT * FROM users WHERE username='{self.username}' AND password='{old_password}'") if query.next(): query.prepare("UPDATE users SET password=? WHERE username=?") query.bindValue(0, new_password) query.bindValue(1, self.username) if query.exec(): QMessageBox.information(self, "成功", "密码修改成功") self.close() else: QMessageBox.warning(self, "失败", "密码修改失败") else: QMessageBox.warning(self, "失败", "旧密码错误") class ManageUsersWindow(QDialog): def __init__(self): super().__init__() self.setWindowTitle('管理登录用户') self.setMinimumWidth(400) self.search_username_edit = QLineEdit() self.search_username_edit.setPlaceholderText('输入用户名') self.search_username_button = QPushButton('搜索') self.search_username_button.clicked.connect(self.search_username) self.delete_user_button = QPushButton('删除该账户') self.delete_user_button.clicked.connect(self.delete_user) self.show_all_users_button = QPushButton('显示所有的用户') self.show_all_users_button.clicked.connect(self.show_all_users) self.output_text = QPlainTextEdit() self.output_text.setReadOnly(True) layout = QVBoxLayout() layout.addWidget(QLabel('搜索账号:')) layout.addWidget(self.search_username_edit) layout.addWidget(self.search_username_button) layout.addWidget(self.show_all_users_button) layout.addWidget(self.delete_user_button) layout.addWidget(QLabel('用户列表:')) layout.addWidget(self.output_text) self.setLayout(layout) def search_username(self): username = self.search_username_edit.text() if not username: QMessageBox.warning(self, '错误', '请输入用户名') return query = QSqlQuery() query.exec(f"SELECT * FROM users WHERE username='{username}'") if query.next(): password = query.value(2) self.output_text.setPlainText(f'用户名: {username}\n密码: {password}') else: self.output_text.setPlainText('未找到该用户') def show_all_users(self): query = QSqlQuery() query.exec('SELECT * FROM users') users = [] while query.next(): username = query.value(1) password = query.value(2) users.append(f'用户名: {username}\n密码: {password}\n') users.append('------------------\n') if users: self.output_text.setPlainText(''.join(users)) else: self.output_text.setPlainText('用户表为空') def delete_user(self): username = self.search_username_edit.text() if not username: QMessageBox.warning(self, '错误', '请输入用户名') return query = QSqlQuery() query.exec(f"SELECT * FROM users WHERE username='{username}'") if query.next(): query.exec(f"DELETE FROM users WHERE username='{username}'") self.output_text.setPlainText(f'已删除账户: {username}') self.search_username_edit.clear() else: self.output_text.setPlainText('未找到该用户') class LibrarySystemWindow(QMainWindow): def __init__(self, username,is_admin): super().__init__() self.setWindowTitle('图书管理系统') self.username = username # 保存用户名 self.is_admin=is_admin central_widget = QWidget() self.setCentralWidget(central_widget) layout = QVBoxLayout() self.book_id_label = QLabel("图书编号:") self.book_id_edit = QLineEdit() layout.addWidget(self.book_id_label) layout.addWidget(self.book_id_edit) self.book_name_label = QLabel("图书名称:") self.book_name_edit = QLineEdit() layout.addWidget(self.book_name_label) layout.addWidget(self.book_name_edit) self.borrow_btn = QPushButton('借出') self.borrow_btn.clicked.connect(self.borrow_book) layout.addWidget(self.borrow_btn) self.return_btn = QPushButton('还书') self.return_btn.clicked.connect(self.return_book) layout.addWidget(self.return_btn) self.add_book_btn = QPushButton('添加图书') self.add_book_btn.clicked.connect(self.add_book) layout.addWidget(self.add_book_btn) self.find_book_btn = QPushButton('查找图书') self.find_book_btn.clicked.connect(self.find_book) layout.addWidget(self.find_book_btn) self.delete_book_btn = QPushButton('删除图书') self.delete_book_btn.clicked.connect(self.delete_book) layout.addWidget(self.delete_book_btn) self.show_all_books_btn = QPushButton('显示所有图书') self.show_all_books_btn.clicked.connect(self.show_all_books) layout.addWidget(self.show_all_books_btn) self.output_label = QLabel("操作结果:") self.output_text = QPlainTextEdit() self.output_text.setFixedSize(400, 300) self.output_text.setReadOnly(True) layout.addWidget(self.output_label) layout.addWidget(self.output_text) central_widget.setLayout(layout) def open_library_system(self): self.library_system = LibrarySystemWindow(self.username) self.library_system.show() def add_book(self): if not self.is_admin: self.output_text.setPlainText("您无权限执行该操作!") return book_id = self.book_id_edit.text() book_name = self.book_name_edit.text() cursor = conn.execute("SELECT * FROM books WHERE book_id=?", (book_id,)) existing_book = cursor.fetchone() if existing_book: self.output_text.setPlainText("已存在该图书编号的图书!") self.clear_inputs() return conn.execute("INSERT INTO books (book_id, book_name, book_status) VALUES (?, ?, '未借出')", (book_id, book_name)) conn.commit() self.output_text.setPlainText("图书已成功添加!") self.clear_inputs() def borrow_book(self): book_id = self.book_id_edit.text() cursor = conn.execute("SELECT * FROM books WHERE book_id=?", (book_id,)) book = cursor.fetchone() if book: book_status = book[2] if "未借出" in book_status: borrower = self.username # 使用登录界面的账号作为借书人 updated_status = "已借出 by " + borrower conn.execute("UPDATE books SET book_status=? WHERE book_id=?", (updated_status, book_id)) conn.commit() self.output_text.setPlainText("图书已成功借出!") self.clear_inputs() else: self.output_text.setPlainText("图书已借出,无法再次借阅!") self.clear_inputs() else: self.output_text.setPlainText("未找到图书信息!") self.clear_inputs() self.clear_inputs() def return_book(self): book_id = self.book_id_edit.text() cursor = conn.execute("SELECT * FROM books WHERE book_id=?", (book_id,)) book = cursor.fetchone() if book: if "未借出" in book[2]: self.output_text.setPlainText("您未借阅该图书!") else: borrower = book[2].split("by ")[1] # 获取当前借书人 if borrower == self.username: # 判断是否为当前用户借出的书 updated_status = "未借出" # 设置为未借出状态 conn.execute("UPDATE books SET book_status=? WHERE book_id=?", (updated_status, book_id)) conn.commit() self.output_text.setPlainText("图书已成功归还!") self.clear_inputs() else: self.output_text.setPlainText("您无需归还该书!") self.clear_inputs() else: self.output_text.setPlainText("未找到图书信息!") self.clear_inputs() def find_book(self): book_id = self.book_id_edit.text() book_name = self.book_name_edit.text() if not book_id and not book_name: QMessageBox.warning(self, '输入错误', '图书编号和图书名称不能同时为空') return cursor = conn.execute("SELECT book_id, book_name, book_status FROM books WHERE book_id=? OR book_name=?", (book_id, book_name)) books = cursor.fetchall() if books: if book_id and book_name: # 如果图书编号和图书名称都输入了 name_matched = False for book in books: if str(book_id) == str(book[0]) and book_name == book[1]: name_matched = True break if not name_matched: self.output_text.setPlainText("图书名称与编号不匹配!") self.clear_inputs() return self.output_text.setPlainText("图书信息:\n") for book in books: self.output_text.appendPlainText("图书编号: " + str(book[0])) self.output_text.appendPlainText("图书名称: " + book[1]) self.output_text.appendPlainText("图书借出情况: " + book[2]) self.output_text.appendPlainText("------------------") else: self.output_text.setPlainText("未找到图书信息!") self.clear_inputs() def delete_book(self): if not self.is_admin: self.output_text.setPlainText("您无权限执行该操作!") return book_id = self.book_id_edit.text() cursor = conn.execute("SELECT * FROM books WHERE book_id=?", (book_id,)) book = cursor.fetchone() if book: conn.execute("DELETE FROM books WHERE book_id=?", (book_id,)) conn.commit() self.output_text.setPlainText("图书已成功删除!") self.clear_inputs() else: self.output_text.setPlainText("未找到图书信息!") def show_all_books(self): cursor = conn.execute("SELECT * FROM books") books = cursor.fetchall() if books: self.output_text.setPlainText("所有图书信息:\n") for book in books: self.output_text.appendPlainText("图书编号: " + str(book[0])) self.output_text.appendPlainText("图书名称: " + book[1]) self.output_text.appendPlainText("图书借出情况: " + book[2]) self.output_text.appendPlainText("-----------------------------") else: self.output_text.setPlainText("图书列表为空!") def return_to_student_app(self): self.parent().show() self.close() def clear_inputs(self): self.book_id_edit.clear() self.book_name_edit.clear() if __name__ == '__main__': app = QApplication(sys.argv) login_window = LoginWindow() login_window.show() sys.exit(app.exec())