diff --git a/学生管理系统.py b/学生管理系统.py new file mode 100644 index 0000000..09727a1 --- /dev/null +++ b/学生管理系统.py @@ -0,0 +1,607 @@ +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: + 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: + 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()) \ No newline at end of file