You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
4.1 KiB
107 lines
4.1 KiB
"""
|
|
学生管理组件
|
|
"""
|
|
from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QTableWidget, QTableWidgetItem, QPushButton,
|
|
QFileDialog, QMessageBox, QHeaderView, QLabel)
|
|
from PyQt5.QtCore import Qt
|
|
from frontend.utils.api_client import APIClient
|
|
|
|
|
|
class StudentManagementWidget(QWidget):
|
|
"""学生管理界面"""
|
|
|
|
def __init__(self, api_client: APIClient, parent=None):
|
|
super().__init__(parent)
|
|
self.api_client = api_client
|
|
self.init_ui()
|
|
self.load_students()
|
|
|
|
def init_ui(self):
|
|
"""初始化界面"""
|
|
layout = QVBoxLayout()
|
|
|
|
# 标题
|
|
title = QLabel("学生管理")
|
|
title.setStyleSheet("font-size: 18px; font-weight: bold; margin: 10px;")
|
|
layout.addWidget(title)
|
|
|
|
# 按钮栏
|
|
button_layout = QHBoxLayout()
|
|
|
|
self.import_btn = QPushButton("导入Excel")
|
|
self.import_btn.clicked.connect(self.import_excel)
|
|
button_layout.addWidget(self.import_btn)
|
|
|
|
self.refresh_btn = QPushButton("刷新")
|
|
self.refresh_btn.clicked.connect(self.load_students)
|
|
button_layout.addWidget(self.refresh_btn)
|
|
|
|
self.delete_btn = QPushButton("删除选中")
|
|
self.delete_btn.clicked.connect(self.delete_selected)
|
|
button_layout.addWidget(self.delete_btn)
|
|
|
|
button_layout.addStretch()
|
|
layout.addLayout(button_layout)
|
|
|
|
# 表格
|
|
self.table = QTableWidget()
|
|
self.table.setColumnCount(5)
|
|
self.table.setHorizontalHeaderLabels(["ID", "学号", "姓名", "专业", "总积分"])
|
|
self.table.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
|
|
self.table.setSelectionBehavior(QTableWidget.SelectRows)
|
|
layout.addWidget(self.table)
|
|
|
|
self.setLayout(layout)
|
|
|
|
def load_students(self):
|
|
"""加载学生列表"""
|
|
try:
|
|
students = self.api_client.get_students()
|
|
self.table.setRowCount(len(students))
|
|
|
|
for row, student in enumerate(students):
|
|
self.table.setItem(row, 0, QTableWidgetItem(str(student['id'])))
|
|
self.table.setItem(row, 1, QTableWidgetItem(student['student_id']))
|
|
self.table.setItem(row, 2, QTableWidgetItem(student['name']))
|
|
self.table.setItem(row, 3, QTableWidgetItem(student.get('major', '')))
|
|
self.table.setItem(row, 4, QTableWidgetItem(str(student['total_score'])))
|
|
|
|
QMessageBox.information(self, "成功", f"已加载{len(students)}名学生")
|
|
except Exception as e:
|
|
QMessageBox.critical(self, "错误", f"加载学生列表失败: {str(e)}")
|
|
|
|
def import_excel(self):
|
|
"""导入Excel文件"""
|
|
file_path, _ = QFileDialog.getOpenFileName(self, "选择Excel文件", "", "Excel Files (*.xlsx *.xls)")
|
|
|
|
if not file_path:
|
|
return
|
|
|
|
try:
|
|
result = self.api_client.import_students_from_excel(file_path)
|
|
QMessageBox.information(
|
|
self, "导入成功", f"{result['message']}\n成功: {result['imported_count']}, 失败: {result['failed_count']}")
|
|
self.load_students()
|
|
except Exception as e:
|
|
QMessageBox.critical(self, "导入失败", f"导入Excel文件失败: {str(e)}")
|
|
|
|
def delete_selected(self):
|
|
"""删除选中的学生"""
|
|
current_row = self.table.currentRow()
|
|
if current_row < 0:
|
|
QMessageBox.warning(self, "提示", "请先选择要删除的学生")
|
|
return
|
|
|
|
student_id = int(self.table.item(current_row, 0).text())
|
|
student_name = self.table.item(current_row, 2).text()
|
|
|
|
reply = QMessageBox.question(self, "确认删除", f"确定要删除学生 {student_name} 吗?", QMessageBox.Yes | QMessageBox.No)
|
|
|
|
if reply == QMessageBox.Yes:
|
|
try:
|
|
self.api_client.delete_student(student_id)
|
|
QMessageBox.information(self, "成功", "删除成功")
|
|
self.load_students()
|
|
except Exception as e:
|
|
QMessageBox.critical(self, "错误", f"删除失败: {str(e)}")
|