├── Database Design Document.docx ├── Database.db ├── Experiment and design 1-2.doc ├── Experiment2.py ├── MySQL Code for Experiment 1.doc ├── Program Manual.docx ├── README.md └── Report of Experiment 1.doc /Database Design Document.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SwordRain2004/SCUT-CS-Database-Experiment/8e06f420057f944ad77310f55a84b9cc17e8f3e1/Database Design Document.docx -------------------------------------------------------------------------------- /Database.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SwordRain2004/SCUT-CS-Database-Experiment/8e06f420057f944ad77310f55a84b9cc17e8f3e1/Database.db -------------------------------------------------------------------------------- /Experiment and design 1-2.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SwordRain2004/SCUT-CS-Database-Experiment/8e06f420057f944ad77310f55a84b9cc17e8f3e1/Experiment and design 1-2.doc -------------------------------------------------------------------------------- /Experiment2.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import sqlite3 3 | import datetime 4 | import PyQt5 5 | from PyQt5 import QtWidgets, QtCore 6 | today = datetime.datetime.today() 7 | userID, userChar, db = "", "", sqlite3.connect('Database.db') 8 | specific_character = ['\\', '/', ':', '?', "\"", "\'", "<", ">", "|"] 9 | def Initialize_Database(): 10 | global db 11 | cursor = db.cursor() 12 | # ---------------------------------Create Tables--------------------------------- 13 | # Create Students Table 14 | cursor.execute('''DROP TABLE IF EXISTS Students;''') 15 | cursor.execute(''' 16 | 17 | CREATE TABLE IF NOT EXISTS Students ( 18 | StudentID TEXT PRIMARY KEY CHECK(length(StudentID) = 10), 19 | StudentName TEXT NOT NULL, 20 | Sex TEXT CHECK(Sex IN ('male', 'female')), 21 | EntranceAge INTEGER CHECK(EntranceAge BETWEEN 10 AND 50), 22 | EntranceYear INTEGER NOT NULL, 23 | Class TEXT NOT NULL 24 | ) 25 | ''') 26 | # Create Course Table 27 | cursor.execute('''DROP TABLE IF EXISTS Courses;''') 28 | cursor.execute(''' 29 | CREATE TABLE IF NOT EXISTS Courses ( 30 | CourseID TEXT PRIMARY KEY CHECK(length(CourseID) = 7), 31 | CourseName TEXT NOT NULL, 32 | TeacherID TEXT NOT NULL CHECK(length(TeacherID) = 5), 33 | Credit REAL NOT NULL, 34 | Grade INTEGER NOT NULL, 35 | CanceledYear INTEGER, 36 | FOREIGN KEY (TeacherID) REFERENCES Teachers(TeacherID) 37 | ) 38 | ''') 39 | # Create Teacher Table 40 | cursor.execute('''DROP TABLE IF EXISTS Teachers;''') 41 | cursor.execute(''' 42 | CREATE TABLE IF NOT EXISTS Teachers ( 43 | TeacherID TEXT PRIMARY KEY CHECK(length(TeacherID) = 5), 44 | TeacherName TEXT NOT NULL 45 | ) 46 | ''') 47 | # Create Course Choosing Table 48 | cursor.execute('''DROP TABLE IF EXISTS CourseChoosing;''') 49 | cursor.execute(''' 50 | CREATE TABLE IF NOT EXISTS CourseChoosing ( 51 | StudentID TEXT NOT NULL CHECK(length(StudentID) = 10), 52 | CourseID TEXT NOT NULL CHECK(length(CourseID) = 7), 53 | TeacherID TEXT NOT NULL CHECK(length(TeacherID) = 5), 54 | ChosenYear INTEGER NOT NULL, 55 | Score REAL, 56 | PRIMARY KEY (StudentID, CourseID, TeacherID), 57 | FOREIGN KEY (StudentID) REFERENCES Students(StudentID) ON DELETE CASCADE, 58 | FOREIGN KEY (CourseID) REFERENCES Courses(CourseID), 59 | FOREIGN KEY (TeacherID) REFERENCES Teachers(TeacherID) 60 | ) 61 | ''') 62 | # Create Account and Password Table 63 | cursor.execute('''DROP TABLE IF EXISTS AccountPassword;''') 64 | cursor.execute(''' 65 | CREATE TABLE IF NOT EXISTS AccountPassword ( 66 | Account TEXT PRIMARY KEY, 67 | Occupation TEXT CHECK(Occupation IN ('student', 'teacher', 'admin')), 68 | Password TEXT NOT NULL, 69 | CHECK((Occupation = 'student' AND length(Account) = 10) OR 70 | (Occupation = 'teacher' AND length(Account) = 5) OR 71 | (Occupation = 'admin')) 72 | ) 73 | ''') 74 | # ----------------------------------Insert Data---------------------------------- 75 | # Insert Student Data 76 | students = [ 77 | ('2022000001', 'Alice', 'female', 18, 2022, 'Class 1'), 78 | ('2022000002', 'Jack', 'male', 19, 2022, 'Class 1'), 79 | ('2022000003', 'Rose', 'female', 18, 2022, 'Class 1'), 80 | ('2021000001', 'Bob', 'male', 20, 2021, 'Class 2'), 81 | ('2020000001', 'Charlie', 'male', 22, 2020, 'Class 3') 82 | ] 83 | 84 | cursor.executemany(''' 85 | INSERT INTO Students (StudentID, StudentName, Sex, EntranceAge, EntranceYear, Class) 86 | VALUES (?, ?, ?, ?, ?, ?) 87 | ''', students) 88 | # Insert Course Data 89 | courses = [ 90 | ('0000001', 'Mathematical analysis', '00001', 4, 1, None), 91 | ('0000002', 'Python Program', '00002', 3, 1, None), 92 | ('0000003', 'C++ Program', '00003', 2, 2, 2023) 93 | ] 94 | 95 | cursor.executemany(''' 96 | INSERT INTO Courses (CourseID, CourseName, TeacherID, Credit, Grade, CanceledYear) 97 | VALUES (?, ?, ?, ?, ?, ?) 98 | ''', courses) 99 | # Insert Teacher Data 100 | teachers = [ 101 | ('00001', 'Smith'), 102 | ('00002', 'Johnson'), 103 | ('00003', 'Williams') 104 | ] 105 | 106 | cursor.executemany(''' 107 | INSERT INTO Teachers (TeacherID, TeacherName) 108 | VALUES (?, ?) 109 | ''', teachers) 110 | # Insert Course Choosing Data 111 | course_choosing = [ 112 | ('2020000001', '0000001', '00001', 2022, 78.0), 113 | ('2020000001', '0000002', '00002', 2021, 100.0), 114 | ('2020000001', '0000003', '00003', 2020, 60.0), 115 | ('2021000001', '0000002', '00002', 2022, 90.0), 116 | ('2021000001', '0000003', '00003', 2021, 99.0), 117 | ('2022000001', '0000003', '00003', 2022, 95.0), 118 | ('2022000002', '0000003', '00003', 2022, 88.5), 119 | ('2022000003', '0000003', '00003', 2022, 78.0) 120 | ] 121 | 122 | cursor.executemany(''' 123 | INSERT INTO CourseChoosing (StudentID, CourseID, TeacherID, ChosenYear, Score) 124 | VALUES (?, ?, ?, ?, ?) 125 | ''', course_choosing) 126 | # Insert Account and Password Data 127 | account_passwords = [ 128 | ('2020000001', 'student', '123456'), 129 | ('2021000001', 'student', '123456'), 130 | ('2022000001', 'student', '123456'), 131 | ('2022000002', 'student', '123456'), 132 | ('2022000003', 'student', '123456'), 133 | ('00001', 'teacher', '123456'), 134 | ('00002', 'teacher', '123456'), 135 | ('00003', 'teacher', '123456'), 136 | ('00000', 'admin', '123456') 137 | ] 138 | cursor.executemany(''' 139 | INSERT INTO AccountPassword (Account, Occupation, Password) 140 | VALUES (?, ?, ?) 141 | ''', account_passwords) 142 | db.commit() 143 | class Login_Ui(QtWidgets.QWidget): 144 | getID = "test" 145 | admin_window = PyQt5.QtCore.pyqtSignal() 146 | teacher_window = PyQt5.QtCore.pyqtSignal() 147 | student_window = PyQt5.QtCore.pyqtSignal() 148 | def __init__(self): 149 | QtWidgets.QWidget.__init__(self) 150 | Form = self 151 | Form.setObjectName("Form") 152 | Form.resize(500, 300) 153 | self.label_Welcome = QtWidgets.QLabel(Form) 154 | self.label_Welcome.setGeometry(PyQt5.QtCore.QRect(125, 30, 300, 51)) 155 | self.label_Welcome.setLayoutDirection(PyQt5.QtCore.Qt.LeftToRight) 156 | self.label_Welcome.setWordWrap(True) 157 | self.label_Welcome.setObjectName("label_3") 158 | self.label_User_ID = QtWidgets.QLabel(Form) 159 | self.label_User_ID.setGeometry(PyQt5.QtCore.QRect(98, 93, 70, 40)) 160 | self.label_User_ID.setObjectName("label") 161 | self.label_Password = QtWidgets.QLabel(Form) 162 | self.label_Password.setGeometry(PyQt5.QtCore.QRect(95, 130, 71, 20)) 163 | self.label_Password.setObjectName("label_2") 164 | self.label_Invalid_Login_Error = QtWidgets.QLabel(Form) 165 | self.label_Invalid_Login_Error.setGeometry(PyQt5.QtCore.QRect(95, 195, 300, 51)) 166 | self.label_Invalid_Login_Error.setAlignment(PyQt5.QtCore.Qt.AlignCenter) 167 | self.label_Invalid_Login_Error.setVisible(False) 168 | self.label_Invalid_Login_Error.setWordWrap(True) 169 | self.label_Invalid_Login_Error.setObjectName("label_4") 170 | self.label_Invalid_Login_Error.setStyleSheet("color: rgb(250, 0, 0);") 171 | self.label_Author = QtWidgets.QLabel(Form) 172 | self.label_Author.setGeometry(PyQt5.QtCore.QRect(0, 240, 500, 50)) 173 | self.label_Author.setAlignment(PyQt5.QtCore.Qt.AlignCenter) 174 | self.label_Author.setObjectName("label_4") 175 | 176 | self.User_ID_Input = QtWidgets.QLineEdit(Form) 177 | self.User_ID_Input.setGeometry(PyQt5.QtCore.QRect(170, 100, 200, 20)) 178 | self.User_ID_Input.setObjectName("lineEdit") 179 | self.Password_Input = QtWidgets.QLineEdit(Form) 180 | self.Password_Input.setGeometry(PyQt5.QtCore.QRect(170, 130, 200, 20)) 181 | self.Password_Input.setObjectName("lineEdit_2") 182 | 183 | self.Button_login = QtWidgets.QPushButton(Form) 184 | self.Button_login.setGeometry(PyQt5.QtCore.QRect(200, 160, 75, 24)) 185 | self.Button_login.setObjectName("pushButton") 186 | self.Button_login.clicked.connect(self.login_check) 187 | 188 | self.retranslateUi(Form) 189 | PyQt5.QtCore.QMetaObject.connectSlotsByName(Form) 190 | def login_check(self): 191 | global db 192 | global userID 193 | global userChar 194 | getID = self.User_ID_Input.text() 195 | if not getID.isdigit(): 196 | self.label_Invalid_Login_Error.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "User ID must be a decimal number\n please try again")) 197 | self.label_Invalid_Login_Error.setVisible(True) 198 | return 199 | getPW = self.Password_Input.text() 200 | cursor = db.cursor() 201 | if getPW != "": 202 | for i in getPW: 203 | if i in specific_character: 204 | self.label_Invalid_Login_Error.setText( 205 | PyQt5.QtCore.QCoreApplication.translate("Form", 206 | "Password should not contain \\, /, :, ?, \", \', <, >, |")) 207 | self.label_Invalid_Login_Error.setVisible(True) 208 | return 209 | sql = f"select * from AccountPassword where Account=\'{getID}\';" 210 | cursor.execute(sql) 211 | results = cursor.fetchall() 212 | if len(results) > 0 and str(results[0][2]) == getPW: 213 | userID = getID 214 | char = results[0][1] 215 | userChar = char 216 | if char == "admin": 217 | self.admin_window.emit() 218 | elif char == "teacher": 219 | self.teacher_window.emit() 220 | elif char == "student": 221 | self.student_window.emit() 222 | else: 223 | self.label_Invalid_Login_Error.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "User ID or Password incorrect please try again")) 224 | self.label_Invalid_Login_Error.setVisible(True) 225 | else: 226 | self.label_Invalid_Login_Error.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Password should not be empty")) 227 | self.label_Invalid_Login_Error.setVisible(True) 228 | def retranslateUi(self, Form): 229 | _translate = PyQt5.QtCore.QCoreApplication.translate 230 | Form.setWindowTitle(_translate("Form", "Login")) 231 | self.Button_login.setText(_translate("Form", "Login")) 232 | self.label_User_ID.setText(_translate("Form", "User ID")) 233 | self.label_Password.setText(_translate("Form", "Password")) 234 | self.label_Welcome.setText(_translate("Form", "Welcome to MIS for Computer\n Science college of SCUT")) 235 | self.label_Invalid_Login_Error.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "User ID or Password incorrect please try again")) 236 | self.label_Author.setText(_translate("Form", "作者:计算机科学与技术(全英创新班) 某学生")) 237 | class Student_Ui(QtWidgets.QWidget): 238 | logout = PyQt5.QtCore.pyqtSignal() 239 | query = PyQt5.QtCore.pyqtSignal() 240 | change = PyQt5.QtCore.pyqtSignal() 241 | def __init__(self): 242 | QtWidgets.QWidget.__init__(self) 243 | Form = self 244 | Form.setObjectName("Form") 245 | Form.resize(541, 365) 246 | self.Button_Query = QtWidgets.QPushButton(Form) 247 | self.Button_Query.setGeometry(PyQt5.QtCore.QRect(180, 90, 161, 61)) 248 | self.Button_Query.setObjectName("pushButton") 249 | self.Button_Query.clicked.connect(lambda: self.query.emit()) 250 | self.Button_Logout = QtWidgets.QPushButton(Form) 251 | self.Button_Logout.setGeometry(PyQt5.QtCore.QRect(180, 230, 161, 61)) 252 | self.Button_Logout.setObjectName("pushButton_2") 253 | self.Button_Logout.clicked.connect(lambda: self.logout.emit()) 254 | self.Button_Change_Password = QtWidgets.QPushButton(Form) 255 | self.Button_Change_Password.setGeometry(PyQt5.QtCore.QRect(180, 160, 161, 61)) 256 | self.Button_Change_Password.setObjectName("pushButton_3") 257 | self.Button_Change_Password.clicked.connect(lambda: self.change.emit()) 258 | 259 | self.retranslateUi(Form) 260 | PyQt5.QtCore.QMetaObject.connectSlotsByName(Form) 261 | def retranslateUi(self, Form): 262 | _translate = PyQt5.QtCore.QCoreApplication.translate 263 | Form.setWindowTitle(_translate("Form", "Student")) 264 | self.Button_Query.setText(_translate("Form", "Query")) 265 | self.Button_Logout.setText(_translate("Form", "Logout")) 266 | self.Button_Change_Password.setText(_translate("Form", "Change Password")) 267 | class Teacher_Ui(QtWidgets.QWidget): 268 | query = PyQt5.QtCore.pyqtSignal() 269 | sss = PyQt5.QtCore.pyqtSignal() 270 | cp = PyQt5.QtCore.pyqtSignal() 271 | lo = PyQt5.QtCore.pyqtSignal() 272 | def __init__(self): 273 | QtWidgets.QWidget.__init__(self) 274 | Form = self 275 | Form.setObjectName("Form") 276 | Form.resize(541, 365) 277 | self.Button_Logout = QtWidgets.QPushButton(Form) 278 | self.Button_Logout.setGeometry(PyQt5.QtCore.QRect(120, 260, 281, 61)) 279 | self.Button_Logout.setObjectName("pushButton") 280 | self.Button_Logout.clicked.connect(lambda: self.lo.emit()) 281 | self.Button_Query = QtWidgets.QPushButton(Form) 282 | self.Button_Query.setGeometry(PyQt5.QtCore.QRect(120, 50, 281, 61)) 283 | self.Button_Query.setObjectName("pushButton_2") 284 | self.Button_Query.clicked.connect(lambda: self.query.emit()) 285 | self.Button_SSS = QtWidgets.QPushButton(Form) 286 | self.Button_SSS.setGeometry(PyQt5.QtCore.QRect(120, 120, 281, 61)) 287 | self.Button_SSS.setObjectName("pushButton_3") 288 | self.Button_SSS.clicked.connect(lambda: self.sss.emit()) 289 | self.Button_CP = QtWidgets.QPushButton(Form) 290 | self.Button_CP.setGeometry(PyQt5.QtCore.QRect(120, 190, 281, 61)) 291 | self.Button_CP.setObjectName("pushButton_4") 292 | self.Button_CP.clicked.connect(lambda: self.cp.emit()) 293 | 294 | self.retranslateUi(Form) 295 | PyQt5.QtCore.QMetaObject.connectSlotsByName(Form) 296 | def retranslateUi(self, Form): 297 | _translate = PyQt5.QtCore.QCoreApplication.translate 298 | Form.setWindowTitle(_translate("Form", "Teacher")) 299 | self.Button_Logout.setText(_translate("Form", "Logout")) 300 | self.Button_Query.setText(_translate("Form", "Query")) 301 | self.Button_SSS.setText(_translate("Form", "Set Student\'s Score")) 302 | self.Button_CP.setText(_translate("Form", "Change Password")) 303 | class Admin_Ui(QtWidgets.QWidget): 304 | query = PyQt5.QtCore.pyqtSignal() 305 | mi = PyQt5.QtCore.pyqtSignal() 306 | cp = PyQt5.QtCore.pyqtSignal() 307 | logout = PyQt5.QtCore.pyqtSignal() 308 | def __init__(self): 309 | QtWidgets.QWidget.__init__(self) 310 | Form = self 311 | Form.setObjectName("Form") 312 | Form.resize(541, 380) 313 | self.Button_Query = QtWidgets.QPushButton(Form) 314 | self.Button_Query.setGeometry(PyQt5.QtCore.QRect(170, 20, 181, 60)) 315 | self.Button_Query.setObjectName("pushButton_2") 316 | self.Button_Query.clicked.connect(lambda: self.query.emit()) 317 | self.Button_MI = QtWidgets.QPushButton(Form) 318 | self.Button_MI.setGeometry(PyQt5.QtCore.QRect(170, 90, 181, 60)) 319 | self.Button_MI.setObjectName("pushButton_5") 320 | self.Button_MI.clicked.connect(lambda: self.mi.emit()) 321 | self.Button_Change_Password = QtWidgets.QPushButton(Form) 322 | self.Button_Change_Password.setGeometry(PyQt5.QtCore.QRect(170, 160, 181, 60)) 323 | self.Button_Change_Password.setObjectName("pushButton_4") 324 | self.Button_Change_Password.clicked.connect(lambda: self.cp.emit()) 325 | self.Button_Initialize_Database = QtWidgets.QPushButton(Form) 326 | self.Button_Initialize_Database.setGeometry(PyQt5.QtCore.QRect(170, 230, 181, 60)) 327 | self.Button_Initialize_Database.setObjectName("pushButton_6") 328 | self.Button_Initialize_Database.clicked.connect(self.initialize_database) 329 | self.Button_Logout = QtWidgets.QPushButton(Form) 330 | self.Button_Logout.setGeometry(PyQt5.QtCore.QRect(170, 300, 181, 60)) 331 | self.Button_Logout.setObjectName("pushButton") 332 | self.Button_Logout.clicked.connect(lambda: self.logout.emit()) 333 | 334 | self.retranslateUi(Form) 335 | PyQt5.QtCore.QMetaObject.connectSlotsByName(Form) 336 | def retranslateUi(self, Form): 337 | _translate = PyQt5.QtCore.QCoreApplication.translate 338 | Form.setWindowTitle(_translate("Form", "Admin")) 339 | self.Button_Logout.setText(_translate("Form", "Logout")) 340 | self.Button_Query.setText(_translate("Form", "Query")) 341 | self.Button_Change_Password.setText(_translate("Form", "Change Password")) 342 | self.Button_Initialize_Database.setText(_translate("Form", "Initialize\nDatabase")) 343 | self.Button_MI.setText(_translate("Form", "Modify Information")) 344 | 345 | def initialize_database(self): 346 | reply = QtWidgets.QMessageBox.question(None, 'Initialize Database', 347 | 'Are you sure to initialize the database? This operation will initialize the database (as shown in the Program Manual)', 348 | QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) 349 | if reply == QtWidgets.QMessageBox.Yes: 350 | Initialize_Database() 351 | else: 352 | pass 353 | class Query_Ui(QtWidgets.QWidget): 354 | stu_info = PyQt5.QtCore.pyqtSignal() 355 | stu_score = PyQt5.QtCore.pyqtSignal() 356 | cou_info = PyQt5.QtCore.pyqtSignal() 357 | ave_score = PyQt5.QtCore.pyqtSignal() 358 | bs = PyQt5.QtCore.pyqtSignal() 359 | ti = PyQt5.QtCore.pyqtSignal() 360 | def __init__(self): 361 | QtWidgets.QWidget.__init__(self) 362 | Form = self 363 | Form.setObjectName("Form") 364 | Form.resize(451, 330) 365 | self.Button_Student_Info = QtWidgets.QPushButton(Form) 366 | self.Button_Student_Info.setGeometry(PyQt5.QtCore.QRect(100, 20, 231, 40)) 367 | self.Button_Student_Info.setObjectName("pushButton_3") 368 | self.Button_Student_Info.clicked.connect(lambda: self.stu_info.emit()) 369 | self.Button_Student_Score_Info = QtWidgets.QPushButton(Form) 370 | self.Button_Student_Score_Info.setGeometry(PyQt5.QtCore.QRect(100, 70, 231, 40)) 371 | self.Button_Student_Score_Info.setObjectName("pushButton_5") 372 | self.Button_Student_Score_Info.clicked.connect(lambda: self.stu_score.emit()) 373 | self.Button_Course_Info = QtWidgets.QPushButton(Form) 374 | self.Button_Course_Info.setGeometry(PyQt5.QtCore.QRect(100, 120, 231, 40)) 375 | self.Button_Course_Info.setObjectName("pushButton") 376 | self.Button_Course_Info.clicked.connect(lambda: self.cou_info.emit()) 377 | self.Button_Teacher_Info = QtWidgets.QPushButton(Form) 378 | self.Button_Teacher_Info.setGeometry(PyQt5.QtCore.QRect(100, 170, 231, 40)) 379 | self.Button_Teacher_Info.setObjectName("pushButton1") 380 | self.Button_Teacher_Info.clicked.connect(lambda: self.ti.emit()) 381 | self.Button_Average_Score_Info = QtWidgets.QPushButton(Form) 382 | self.Button_Average_Score_Info.setGeometry(PyQt5.QtCore.QRect(100, 220, 231, 40)) 383 | self.Button_Average_Score_Info.setObjectName("pushButton_2") 384 | self.Button_Average_Score_Info.clicked.connect(lambda: self.ave_score.emit()) 385 | self.Button_Back = QtWidgets.QPushButton(Form) 386 | self.Button_Back.setGeometry(PyQt5.QtCore.QRect(100, 270, 231, 40)) 387 | self.Button_Back.setObjectName("pushButton_4") 388 | self.Button_Back.clicked.connect(lambda: self.bs.emit()) 389 | 390 | self.retranslateUi(Form) 391 | PyQt5.QtCore.QMetaObject.connectSlotsByName(Form) 392 | def retranslateUi(self, Form): 393 | _translate = PyQt5.QtCore.QCoreApplication.translate 394 | Form.setWindowTitle(_translate("Form", "Query")) 395 | self.Button_Course_Info.setText(_translate("Form", "Course (Choosing) Info")) 396 | self.Button_Average_Score_Info.setText(_translate("Form", "Average Score Info")) 397 | self.Button_Student_Info.setText(_translate("Form", "Student Info")) 398 | self.Button_Teacher_Info.setText(_translate("Form", "Teacher (Teaching) Info")) 399 | self.Button_Back.setText(_translate("Form", "Back")) 400 | self.Button_Student_Score_Info.setText(_translate("Form", "Student Score Info")) 401 | class Student_Info_Query_Ui(QtWidgets.QWidget): 402 | back = PyQt5.QtCore.pyqtSignal() 403 | def __init__(self): 404 | QtWidgets.QWidget.__init__(self) 405 | Form = self 406 | Form.setObjectName("Form") 407 | Form.resize(700, 350) 408 | self.Button_Back = QtWidgets.QPushButton(Form) 409 | self.Button_Back.setGeometry(PyQt5.QtCore.QRect(480, 110, 200, 30)) 410 | self.Button_Back.setObjectName("pushButton_2") 411 | self.Button_Back.clicked.connect(lambda: self.back.emit()) 412 | self.Button_Student_Info = QtWidgets.QPushButton(Form) 413 | self.Button_Student_Info.setGeometry(PyQt5.QtCore.QRect(480, 30, 200, 30)) 414 | self.Button_Student_Info.setObjectName("pushButton_3") 415 | self.Button_Student_Info.clicked.connect(self.Student_Info_Query) 416 | self.Button_Chosen_Course_Info = QtWidgets.QPushButton(Form) 417 | self.Button_Chosen_Course_Info.setGeometry(PyQt5.QtCore.QRect(480, 70, 200, 30)) 418 | self.Button_Chosen_Course_Info.setObjectName("pushButton_1") 419 | self.Button_Chosen_Course_Info.clicked.connect(self.Chosen_Course_Info_Query) 420 | self.label_Student_ID = QtWidgets.QLabel(Form) 421 | self.label_Student_ID.setGeometry(PyQt5.QtCore.QRect(20, 30, 120, 20)) 422 | self.label_Student_ID.setObjectName("label") 423 | self.label_Student_Name = QtWidgets.QLabel(Form) 424 | self.label_Student_Name.setGeometry(PyQt5.QtCore.QRect(20, 90, 120, 20)) 425 | self.label_Student_Name.setObjectName("label_2") 426 | self.label_Query_Result = QtWidgets.QLabel(Form) 427 | self.label_Query_Result.setGeometry(PyQt5.QtCore.QRect(0, 150, 700, 20)) 428 | self.label_Query_Result.setAlignment(PyQt5.QtCore.Qt.AlignCenter) 429 | self.label_Query_Result.setObjectName("label_5") 430 | self.label_Query_Result.setStyleSheet("color: rgb(250, 0, 0);") 431 | 432 | self.lineEdit_Student_ID = QtWidgets.QLineEdit(Form) 433 | self.lineEdit_Student_ID.setGeometry(PyQt5.QtCore.QRect(160, 30, 300, 20)) 434 | self.lineEdit_Student_ID.setObjectName("lineEdit") 435 | self.lineEdit_Student_Name = QtWidgets.QLineEdit(Form) 436 | self.lineEdit_Student_Name.setGeometry(PyQt5.QtCore.QRect(160, 90, 300, 20)) 437 | self.lineEdit_Student_Name.setObjectName("lineEdit_2") 438 | self.tableWidget = QtWidgets.QTableWidget(Form) 439 | self.tableWidget.setGeometry(PyQt5.QtCore.QRect(20, 170, 660, 170)) 440 | self.tableWidget.setObjectName("tableWidget") 441 | self.tableWidget.setColumnCount(0) 442 | self.tableWidget.setRowCount(0) 443 | 444 | self.retranslateUi(Form) 445 | PyQt5.QtCore.QMetaObject.connectSlotsByName(Form) 446 | def Student_Info_Query(self): 447 | global db 448 | Student_ID = self.lineEdit_Student_ID.text() 449 | Student_Name = self.lineEdit_Student_Name.text() 450 | cursor = db.cursor() 451 | if len(Student_Name) == 0 and len(Student_ID) != 0: 452 | if not Student_ID.isdigit() or len(Student_ID) != 10: 453 | self.label_Query_Result.setText( 454 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student ID must be a 10 digit decimal number")) 455 | return 456 | sql = f'SELECT * FROM Students WHERE StudentID=\'{Student_ID}\' ORDER BY StudentID' 457 | elif len(Student_Name) != 0 and len(Student_ID) != 0: 458 | if not Student_ID.isdigit() or len(Student_ID) != 10: 459 | self.label_Query_Result.setText( 460 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student ID must be a decimal number")) 461 | return 462 | if not Student_Name.isalpha(): 463 | self.label_Query_Result.setText( 464 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student name must be English characters")) 465 | return 466 | sql = f'SELECT * FROM Students WHERE StudentID=\'{Student_ID}\' AND StudentName=\'{Student_Name}\' ORDER BY StudentID' 467 | elif len(Student_ID) == 0 and len(Student_Name) != 0: 468 | if not Student_Name.isalpha(): 469 | self.label_Query_Result.setText( 470 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student name must be English characters")) 471 | return 472 | sql = f'SELECT * FROM Students WHERE StudentName=\'{Student_Name}\' ORDER BY StudentID' 473 | elif len(Student_ID) == 0 and len(Student_Name) == 0: 474 | sql = f'SELECT * FROM Students ORDER BY StudentID' 475 | cursor.execute(sql) 476 | results = cursor.fetchall() 477 | if len(results) > 0: 478 | self.label_Query_Result.setText( 479 | PyQt5.QtCore.QCoreApplication.translate("Form", "Query Result")) 480 | self.tableWidget.clear() 481 | self.tableWidget.setColumnCount(0) 482 | self.tableWidget.setRowCount(0) 483 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Query Result")) 484 | col_result = cursor.description 485 | self.row = len(results) # 取得记录个数,用于设置表格的行数 486 | self.vol = len(results[0]) # 取得字段数,用于设置表格的列数 487 | col_result = list(col_result) 488 | a = 0 489 | self.tableWidget.setColumnCount(self.vol) 490 | self.tableWidget.setRowCount(self.row) 491 | for i in col_result: 492 | item = QtWidgets.QTableWidgetItem() 493 | self.tableWidget.setHorizontalHeaderItem(a, item) 494 | item = self.tableWidget.horizontalHeaderItem(a) 495 | item.setText(i[0]) 496 | a = a + 1 497 | results = list(results) 498 | for i in range(len(results)): 499 | results[i] = list(results[i]) 500 | for i in range(self.row): 501 | for j in range(self.vol): 502 | item = QtWidgets.QTableWidgetItem() 503 | self.tableWidget.setItem(i, j, item) 504 | item = self.tableWidget.item(i, j) 505 | item.setText(str(results[i][j])) 506 | else: 507 | self.tableWidget.clear() 508 | self.tableWidget.setColumnCount(0) 509 | self.tableWidget.setRowCount(0) 510 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "There is no data")) 511 | def Chosen_Course_Info_Query(self): 512 | global db 513 | Student_ID = self.lineEdit_Student_ID.text() 514 | Student_Name = self.lineEdit_Student_Name.text() 515 | cursor = db.cursor() 516 | if len(Student_Name) == 0 and len(Student_ID) != 0: 517 | if not Student_ID.isdigit() or len(Student_ID) != 10: 518 | self.label_Query_Result.setText( 519 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student ID must be a 10 digit decimal number")) 520 | return 521 | sql = f'SELECT DISTINCT * FROM Courses WHERE CourseID IN (SELECT DISTINCT CourseID FROM CourseChoosing WHERE StudentID=\'{Student_ID}\' ORDER BY CourseID)' 522 | elif len(Student_Name) != 0 and len(Student_ID) != 0: 523 | if not Student_ID.isdigit() or len(Student_ID) != 10: 524 | self.label_Query_Result.setText( 525 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student ID must be a 10 digit decimal number")) 526 | return 527 | if not Student_Name.isalpha(): 528 | self.label_Query_Result.setText( 529 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student name must be English characters")) 530 | return 531 | sql = f'SELECT * FROM Students WHERE StudentID=\'{Student_ID}\' AND StudentName=\'{Student_Name}\'' 532 | cursor.execute(sql) 533 | results = cursor.fetchall() 534 | if len(results) != 0: 535 | sql = f'SELECT DISTINCT * FROM Courses WHERE CourseID IN (SELECT DISTINCT CourseID FROM CourseChoosing WHERE StudentID=\'{Student_ID}\' ORDER BY CourseID)' 536 | elif len(Student_ID) == 0 and len(Student_Name) != 0: 537 | if not Student_Name.isalpha(): 538 | self.label_Query_Result.setText( 539 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student name must be English characters")) 540 | return 541 | sql = f'SELECT DISTINCT * FROM Courses WHERE CourseID IN (SELECT DISTINCT CourseID FROM CourseChoosing WHERE StudentID IN (SELECT DISTINCT StudentID FROM Students WHERE StudentName=\'{Student_Name}\')) ORDER BY CourseID' 542 | elif len(Student_ID) == 0 and len(Student_Name) == 0: 543 | sql = 'SELECT DISTINCT * FROM Courses WHERE CourseID IN (SELECT DISTINCT CourseID FROM CourseChoosing WHERE StudentID IN (SELECT DISTINCT StudentID FROM Students)) ORDER BY CourseID' 544 | cursor.execute(sql) 545 | results = cursor.fetchall() 546 | if len(results) == 0: 547 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "There is no data")) 548 | self.tableWidget.clear() 549 | self.tableWidget.setColumnCount(0) 550 | self.tableWidget.setRowCount(0) 551 | else: 552 | self.tableWidget.clear() 553 | self.tableWidget.setColumnCount(0) 554 | self.tableWidget.setRowCount(0) 555 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Query Result")) 556 | col_result = cursor.description 557 | self.row = len(results) # 取得记录个数,用于设置表格的行数 558 | self.vol = len(results[0]) # 取得字段数,用于设置表格的列数 559 | col_result = list(col_result) 560 | a = 0 561 | self.tableWidget.setColumnCount(self.vol) 562 | self.tableWidget.setRowCount(self.row) 563 | for i in col_result: 564 | item = QtWidgets.QTableWidgetItem() 565 | self.tableWidget.setHorizontalHeaderItem(a, item) 566 | item = self.tableWidget.horizontalHeaderItem(a) 567 | item.setText(i[0]) 568 | a = a + 1 569 | results = list(results) 570 | for i in range(len(results)): 571 | results[i] = list(results[i]) 572 | for i in range(self.row): 573 | for j in range(self.vol): 574 | item = QtWidgets.QTableWidgetItem() 575 | self.tableWidget.setItem(i, j, item) 576 | item = self.tableWidget.item(i, j) 577 | item.setText(str(results[i][j])) 578 | def retranslateUi(self, Form): 579 | _translate = PyQt5.QtCore.QCoreApplication.translate 580 | Form.setWindowTitle(_translate("Form", "Student Info Query")) 581 | self.Button_Back.setText(_translate("Form", "Back")) 582 | self.label_Student_ID.setText(_translate("Form", "Student ID")) 583 | self.label_Student_Name.setText(_translate("Form", "Student Name")) 584 | self.label_Query_Result.setText(_translate("Form", "Query Result")) 585 | self.Button_Student_Info.setText(_translate("Form", "Student Info")) 586 | self.Button_Chosen_Course_Info.setText(_translate("Form", "Chosen Course Info")) 587 | class Student_Score_Query_Ui(QtWidgets.QWidget): 588 | back = PyQt5.QtCore.pyqtSignal() 589 | def __init__(self): 590 | QtWidgets.QWidget.__init__(self) 591 | Form = self 592 | Form.setObjectName("Form") 593 | Form.resize(700, 350) 594 | self.Button_Back = QtWidgets.QPushButton(Form) 595 | self.Button_Back.setGeometry(PyQt5.QtCore.QRect(480, 110, 200, 30)) 596 | self.Button_Back.setObjectName("pushButton_2") 597 | self.Button_Back.clicked.connect(lambda: self.back.emit()) 598 | self.Button_Student_Score_Info = QtWidgets.QPushButton(Form) 599 | self.Button_Student_Score_Info.setGeometry(PyQt5.QtCore.QRect(480, 30, 200, 30)) 600 | self.Button_Student_Score_Info.setObjectName("pushButton_3") 601 | self.Button_Student_Score_Info.clicked.connect(self.Student_Score_Query) 602 | 603 | self.label_Student_ID = QtWidgets.QLabel(Form) 604 | self.label_Student_ID.setGeometry(PyQt5.QtCore.QRect(20, 30, 120, 20)) 605 | self.label_Student_ID.setObjectName("label") 606 | self.label_Student_Name = QtWidgets.QLabel(Form) 607 | self.label_Student_Name.setGeometry(PyQt5.QtCore.QRect(20, 60, 120, 20)) 608 | self.label_Student_Name.setObjectName("label_2") 609 | self.label_Course_ID = QtWidgets.QLabel(Form) 610 | self.label_Course_ID.setGeometry(PyQt5.QtCore.QRect(20, 90, 120, 20)) 611 | self.label_Course_ID.setObjectName("label_3") 612 | self.label_Course_Name = QtWidgets.QLabel(Form) 613 | self.label_Course_Name.setGeometry(PyQt5.QtCore.QRect(20, 120, 120, 20)) 614 | self.label_Course_Name.setObjectName("label_4") 615 | self.label_Query_Result = QtWidgets.QLabel(Form) 616 | self.label_Query_Result.setGeometry(PyQt5.QtCore.QRect(255, 150, 200, 20)) 617 | self.label_Query_Result.setObjectName("label_5") 618 | self.label_Query_Result.setStyleSheet("color: rgb(250, 0, 0);") 619 | 620 | self.lineEdit_Student_ID = QtWidgets.QLineEdit(Form) 621 | self.lineEdit_Student_ID.setGeometry(PyQt5.QtCore.QRect(160, 30, 300, 20)) 622 | self.lineEdit_Student_ID.setObjectName("lineEdit") 623 | self.lineEdit_Student_Name = QtWidgets.QLineEdit(Form) 624 | self.lineEdit_Student_Name.setGeometry(PyQt5.QtCore.QRect(160, 60, 300, 20)) 625 | self.lineEdit_Student_Name.setObjectName("lineEdit_2") 626 | self.lineEdit_Course_ID = QtWidgets.QLineEdit(Form) 627 | self.lineEdit_Course_ID.setGeometry(PyQt5.QtCore.QRect(160, 90, 300, 20)) 628 | self.lineEdit_Course_ID.setObjectName("lineEdit_3") 629 | self.lineEdit_Course_Name = QtWidgets.QLineEdit(Form) 630 | self.lineEdit_Course_Name.setGeometry(PyQt5.QtCore.QRect(160, 120, 300, 20)) 631 | self.lineEdit_Course_Name.setObjectName("lineEdit_4") 632 | 633 | self.tableWidget = QtWidgets.QTableWidget(Form) 634 | self.tableWidget.setGeometry(PyQt5.QtCore.QRect(20, 170, 660, 170)) 635 | self.tableWidget.setObjectName("tableWidget") 636 | self.tableWidget.setColumnCount(0) 637 | self.tableWidget.setRowCount(0) 638 | 639 | self.retranslateUi(Form) 640 | PyQt5.QtCore.QMetaObject.connectSlotsByName(Form) 641 | def retranslateUi(self, Form): 642 | _translate = PyQt5.QtCore.QCoreApplication.translate 643 | Form.setWindowTitle(_translate("Form", "Student Score Info Query")) 644 | self.Button_Back.setText(_translate("Form", "Back")) 645 | self.label_Student_ID.setText(_translate("Form", "Student ID")) 646 | self.label_Student_Name.setText(_translate("Form", "Student Name")) 647 | self.label_Course_ID.setText(_translate("Form", "Course ID")) 648 | self.label_Course_Name.setText(_translate("Form", "Course Name")) 649 | self.label_Query_Result.setText(_translate("Form", "Query Result")) 650 | self.Button_Student_Score_Info.setText(_translate("Form", "Student Score Info")) 651 | def Student_Score_Query(self): 652 | global db 653 | cursor = db.cursor() 654 | Student_ID = self.lineEdit_Student_ID.text() 655 | if Student_ID != '': 656 | if len(Student_ID) != 10 or not Student_ID.isdigit(): 657 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Student ID must be a 10 digit decimal number")) 658 | return 659 | Student_Name = self.lineEdit_Student_Name.text() 660 | for i in Student_Name: 661 | if i in specific_character: 662 | self.label_Query_Result.setText( 663 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student Name should not contain \\, /, :, ?, \", \', <, >, |")) 664 | return 665 | Course_ID = self.lineEdit_Course_ID.text() 666 | if Course_ID != '': 667 | if len(Course_ID) != 7 or not Course_ID.isdigit(): 668 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Course ID must be a 7 digit decimal number")) 669 | return 670 | Course_Name = self.lineEdit_Course_Name.text() 671 | for i in Course_Name: 672 | if i in specific_character: 673 | self.label_Query_Result.setText( 674 | PyQt5.QtCore.QCoreApplication.translate("Form", 675 | "Course Name should not contain \\, /, :, ?, \", \', <, >, |")) 676 | return 677 | params = [] 678 | if len(Student_ID) == 0 and len(Student_Name) == 0 and len(Course_ID) == 0 and len(Course_Name) == 0: 679 | sql = '''SELECT Students.StudentName, Students.StudentID, Courses.CourseName, Courses.CourseID, CourseChoosing.Score 680 | FROM Students 681 | JOIN CourseChoosing ON Students.StudentID=CourseChoosing.StudentID 682 | JOIN Courses ON Courses.CourseID=CourseChoosing.CourseID 683 | ORDER BY Students.StudentID, Courses.CourseID;''' 684 | elif len(Student_ID) == 0 and len(Student_Name) == 0 and len(Course_ID) == 0 and len(Course_Name) != 0: 685 | sql = '''SELECT Students.StudentName, Students.StudentID, Courses.CourseName, Courses.CourseID, CourseChoosing.Score 686 | FROM Students 687 | JOIN CourseChoosing ON Students.StudentID=CourseChoosing.StudentID 688 | JOIN Courses ON Courses.CourseID=CourseChoosing.CourseID 689 | WHERE Courses.CourseName=? 690 | ORDER BY Students.StudentID, Courses.CourseID;''' 691 | params.append(Course_Name) 692 | elif len(Student_ID) == 0 and len(Student_Name) == 0 and len(Course_ID) != 0 and len(Course_Name) == 0: 693 | sql = '''SELECT Students.StudentName, Students.StudentID, Courses.CourseName, Courses.CourseID, CourseChoosing.Score 694 | FROM Students 695 | JOIN CourseChoosing ON Students.StudentID=CourseChoosing.StudentID 696 | JOIN Courses ON Courses.CourseID=CourseChoosing.CourseID 697 | WHERE Courses.CourseID=? 698 | ORDER BY Students.StudentID, Courses.CourseID;''' 699 | params.append(Course_ID) 700 | elif len(Student_ID) == 0 and len(Student_Name) == 0 and len(Course_ID) != 0 and len(Course_Name) != 0: 701 | sql = '''SELECT Students.StudentName, Students.StudentID, Courses.CourseName, Courses.CourseID, CourseChoosing.Score 702 | FROM Students 703 | JOIN CourseChoosing ON Students.StudentID=CourseChoosing.StudentID 704 | JOIN Courses ON Courses.CourseID=CourseChoosing.CourseID 705 | WHERE Courses.CourseID=? AND Courses.CourseName=? 706 | ORDER BY Students.StudentID, Courses.CourseID;''' 707 | params.append(Course_ID) 708 | params.append(Course_Name) 709 | elif len(Student_ID) == 0 and len(Student_Name) != 0 and len(Course_ID) == 0 and len(Course_Name) == 0: 710 | sql = '''SELECT Students.StudentName, Students.StudentID, Courses.CourseName, Courses.CourseID, CourseChoosing.Score 711 | FROM Students 712 | JOIN CourseChoosing ON Students.StudentID=CourseChoosing.StudentID 713 | JOIN Courses ON Courses.CourseID=CourseChoosing.CourseID 714 | WHERE Students.StudentName=? 715 | ORDER BY Students.StudentID, Courses.CourseID;''' 716 | params.append(Student_Name) 717 | elif len(Student_ID) == 0 and len(Student_Name) != 0 and len(Course_ID) == 0 and len(Course_Name) != 0: 718 | sql = '''SELECT Students.StudentName, Students.StudentID, Courses.CourseName, Courses.CourseID, CourseChoosing.Score 719 | FROM Students 720 | JOIN CourseChoosing ON Students.StudentID=CourseChoosing.StudentID 721 | JOIN Courses ON Courses.CourseID=CourseChoosing.CourseID 722 | WHERE Students.StudentName=? AND Courses.CourseName=? 723 | ORDER BY Students.StudentID, Courses.CourseID;''' 724 | params.append(Student_Name) 725 | params.append(Course_Name) 726 | elif len(Student_ID) == 0 and len(Student_Name) != 0 and len(Course_ID) != 0 and len(Course_Name) == 0: 727 | sql = '''SELECT Students.StudentName, Students.StudentID, Courses.CourseName, Courses.CourseID, CourseChoosing.Score 728 | FROM Students 729 | JOIN CourseChoosing ON Students.StudentID=CourseChoosing.StudentID 730 | JOIN Courses ON Courses.CourseID=CourseChoosing.CourseID 731 | WHERE Students.StudentName=? AND Courses.CourseID=? 732 | ORDER BY Students.StudentID, Courses.CourseID;''' 733 | params.append(Student_Name) 734 | params.append(Course_ID) 735 | elif len(Student_ID) == 0 and len(Student_Name) != 0 and len(Course_ID) != 0 and len(Course_Name) != 0: 736 | sql = '''SELECT Students.StudentName, Students.StudentID, Courses.CourseName, Courses.CourseID, CourseChoosing.Score 737 | FROM Students 738 | JOIN CourseChoosing ON Students.StudentID=CourseChoosing.StudentID 739 | JOIN Courses ON Courses.CourseID=CourseChoosing.CourseID 740 | WHERE Students.StudentName=? AND Courses.CourseID=? AND Courses.CourseName=? 741 | ORDER BY Students.StudentID, Courses.CourseID;''' 742 | params.append(Student_Name) 743 | params.append(Course_ID) 744 | params.append(Course_Name) 745 | elif len(Student_ID) != 0 and len(Student_Name) == 0 and len(Course_ID) == 0 and len(Course_Name) == 0: 746 | sql = '''SELECT Students.StudentName, Students.StudentID, Courses.CourseName, Courses.CourseID, CourseChoosing.Score 747 | FROM Students 748 | JOIN CourseChoosing ON Students.StudentID=CourseChoosing.StudentID 749 | JOIN Courses ON Courses.CourseID=CourseChoosing.CourseID 750 | WHERE Students.StudentID=? 751 | ORDER BY Students.StudentID, Courses.CourseID;''' 752 | params.append(Student_ID) 753 | elif len(Student_ID) != 0 and len(Student_Name) == 0 and len(Course_ID) == 0 and len(Course_Name) != 0: 754 | sql = '''SELECT Students.StudentName, Students.StudentID, Courses.CourseName, Courses.CourseID, CourseChoosing.Score 755 | FROM Students 756 | JOIN CourseChoosing ON Students.StudentID=CourseChoosing.StudentID 757 | JOIN Courses ON Courses.CourseID=CourseChoosing.CourseID 758 | WHERE Students.StudentID=? AND Courses.CourseName=? 759 | ORDER BY Students.StudentID, Courses.CourseID;''' 760 | params.append(Student_ID) 761 | params.append(Course_Name) 762 | elif len(Student_ID) != 0 and len(Student_Name) == 0 and len(Course_ID) != 0 and len(Course_Name) == 0: 763 | sql = '''SELECT Students.StudentName, Students.StudentID, Courses.CourseName, Courses.CourseID, CourseChoosing.Score 764 | FROM Students 765 | JOIN CourseChoosing ON Students.StudentID=CourseChoosing.StudentID 766 | JOIN Courses ON Courses.CourseID=CourseChoosing.CourseID 767 | WHERE Students.StudentID=? AND Courses.CourseID=? 768 | ORDER BY Students.StudentID, Courses.CourseID;''' 769 | params.append(Student_ID) 770 | params.append(Course_ID) 771 | elif len(Student_ID) != 0 and len(Student_Name) == 0 and len(Course_ID) != 0 and len(Course_Name) != 0: 772 | sql = '''SELECT Students.StudentName, Students.StudentID, Courses.CourseName, Courses.CourseID, CourseChoosing.Score 773 | FROM Students 774 | JOIN CourseChoosing ON Students.StudentID=CourseChoosing.StudentID 775 | JOIN Courses ON Courses.CourseID=CourseChoosing.CourseID 776 | WHERE Students.StudentID=? AND Courses.CourseID=? AND Courses.CourseName=? 777 | ORDER BY Students.StudentID, Courses.CourseID;''' 778 | params.append(Student_ID) 779 | params.append(Course_ID) 780 | params.append(Course_Name) 781 | elif len(Student_ID) != 0 and len(Student_Name) != 0 and len(Course_ID) == 0 and len(Course_Name) == 0: 782 | sql = '''SELECT Students.StudentName, Students.StudentID, Courses.CourseName, Courses.CourseID, CourseChoosing.Score 783 | FROM Students 784 | JOIN CourseChoosing ON Students.StudentID=CourseChoosing.StudentID 785 | JOIN Courses ON Courses.CourseID=CourseChoosing.CourseID 786 | WHERE Students.StudentID=? AND Students.StudentName=? 787 | ORDER BY Students.StudentID, Courses.CourseID;''' 788 | params.append(Student_ID) 789 | params.append(Student_Name) 790 | elif len(Student_ID) != 0 and len(Student_Name) != 0 and len(Course_ID) == 0 and len(Course_Name) != 0: 791 | sql = '''SELECT Students.StudentName, Students.StudentID, Courses.CourseName, Courses.CourseID, CourseChoosing.Score 792 | FROM Students 793 | JOIN CourseChoosing ON Students.StudentID=CourseChoosing.StudentID 794 | JOIN Courses ON Courses.CourseID=CourseChoosing.CourseID 795 | WHERE Students.StudentID=? AND Students.StudentName=? AND Courses.CourseName=? 796 | ORDER BY Students.StudentID, Courses.CourseID;''' 797 | params.append(Student_ID) 798 | params.append(Student_Name) 799 | params.append(Course_Name) 800 | elif len(Student_ID) != 0 and len(Student_Name) != 0 and len(Course_ID) != 0 and len(Course_Name) == 0: 801 | sql = '''SELECT Students.StudentName, Students.StudentID, Courses.CourseName, Courses.CourseID, CourseChoosing.Score 802 | FROM Students 803 | JOIN CourseChoosing ON Students.StudentID=CourseChoosing.StudentID 804 | JOIN Courses ON Courses.CourseID=CourseChoosing.CourseID 805 | WHERE Students.StudentID=? AND Students.StudentName=? AND Courses.CourseID=? 806 | ORDER BY Students.StudentID, Courses.CourseID;''' 807 | params.append(Student_ID) 808 | params.append(Student_Name) 809 | params.append(Course_ID) 810 | elif len(Student_ID) != 0 and len(Student_Name) != 0 and len(Course_ID) != 0 and len(Course_Name) != 0: 811 | sql = '''SELECT Students.StudentName, Students.StudentID, Courses.CourseName, Courses.CourseID, CourseChoosing.Score 812 | FROM Students 813 | JOIN CourseChoosing ON Students.StudentID=CourseChoosing.StudentID 814 | JOIN Courses ON Courses.CourseID=CourseChoosing.CourseID 815 | WHERE Students.StudentID=? AND Students.StudentName=? AND Courses.CourseID=? AND Courses.CourseName=? 816 | ORDER BY Students.StudentID, Courses.CourseID;''' 817 | params.append(Student_ID) 818 | params.append(Student_Name) 819 | params.append(Course_ID) 820 | params.append(Course_Name) 821 | cursor.execute(sql, params) 822 | results = cursor.fetchall() 823 | if len(results) == 0: 824 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "There is no data")) 825 | self.tableWidget.clear() 826 | self.tableWidget.setColumnCount(0) 827 | self.tableWidget.setRowCount(0) 828 | else: 829 | self.tableWidget.clear() 830 | self.tableWidget.setColumnCount(0) 831 | self.tableWidget.setRowCount(0) 832 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Query Result")) 833 | col_result = cursor.description 834 | self.row = len(results) # 取得记录个数,用于设置表格的行数 835 | self.vol = len(results[0]) # 取得字段数,用于设置表格的列数 836 | col_result = list(col_result) 837 | a = 0 838 | self.tableWidget.setColumnCount(self.vol) 839 | self.tableWidget.setRowCount(self.row) 840 | for i in col_result: 841 | item = QtWidgets.QTableWidgetItem() 842 | self.tableWidget.setHorizontalHeaderItem(a, item) 843 | item = self.tableWidget.horizontalHeaderItem(a) 844 | item.setText(i[0]) 845 | a = a + 1 846 | results = list(results) 847 | for i in range(len(results)): 848 | results[i] = list(results[i]) 849 | for i in range(self.row): 850 | for j in range(self.vol): 851 | item = QtWidgets.QTableWidgetItem() 852 | self.tableWidget.setItem(i, j, item) 853 | item = self.tableWidget.item(i, j) 854 | item.setText(str(results[i][j])) 855 | class Course_Info_Query_Ui(QtWidgets.QWidget): 856 | back = PyQt5.QtCore.pyqtSignal() 857 | def __init__(self): 858 | QtWidgets.QWidget.__init__(self) 859 | Form = self 860 | Form.setObjectName("Form") 861 | Form.resize(700, 350) 862 | self.Button_Back = QtWidgets.QPushButton(Form) 863 | self.Button_Back.setGeometry(PyQt5.QtCore.QRect(480, 110, 200, 30)) 864 | self.Button_Back.setObjectName("pushButton_2") 865 | self.Button_Back.clicked.connect(lambda: self.back.emit()) 866 | self.Button_Course_Info = QtWidgets.QPushButton(Form) 867 | self.Button_Course_Info.setGeometry(PyQt5.QtCore.QRect(480, 30, 200, 30)) 868 | self.Button_Course_Info.setObjectName("pushButton_3") 869 | self.Button_Course_Info.clicked.connect(self.Course_Info_Query) 870 | self.Button_Course_Choosing_Info = QtWidgets.QPushButton(Form) 871 | self.Button_Course_Choosing_Info.setGeometry(PyQt5.QtCore.QRect(480, 70, 200, 30)) 872 | self.Button_Course_Choosing_Info.setObjectName("pushButton_1") 873 | self.Button_Course_Choosing_Info.clicked.connect(self.Course_Choosing_Info_Query) 874 | 875 | self.label_Course_ID = QtWidgets.QLabel(Form) 876 | self.label_Course_ID.setGeometry(PyQt5.QtCore.QRect(20, 30, 120, 20)) 877 | self.label_Course_ID.setObjectName("label") 878 | self.label_Course_Name = QtWidgets.QLabel(Form) 879 | self.label_Course_Name.setGeometry(PyQt5.QtCore.QRect(20, 90, 120, 20)) 880 | self.label_Course_Name.setObjectName("label_2") 881 | self.label_Query_Result = QtWidgets.QLabel(Form) 882 | self.label_Query_Result.setGeometry(PyQt5.QtCore.QRect(0, 150, 700, 20)) 883 | self.label_Query_Result.setAlignment(PyQt5.QtCore.Qt.AlignCenter) 884 | self.label_Query_Result.setObjectName("label_5") 885 | self.label_Query_Result.setStyleSheet("color: rgb(250, 0, 0);") 886 | 887 | self.lineEdit_Course_ID = QtWidgets.QLineEdit(Form) 888 | self.lineEdit_Course_ID.setGeometry(PyQt5.QtCore.QRect(160, 30, 300, 20)) 889 | self.lineEdit_Course_ID.setObjectName("lineEdit") 890 | self.lineEdit_Course_Name = QtWidgets.QLineEdit(Form) 891 | self.lineEdit_Course_Name.setGeometry(PyQt5.QtCore.QRect(160, 90, 300, 20)) 892 | self.lineEdit_Course_Name.setObjectName("lineEdit_2") 893 | 894 | self.tableWidget = QtWidgets.QTableWidget(Form) 895 | self.tableWidget.setGeometry(PyQt5.QtCore.QRect(20, 170, 660, 170)) 896 | self.tableWidget.setObjectName("tableWidget") 897 | self.tableWidget.setColumnCount(0) 898 | self.tableWidget.setRowCount(0) 899 | 900 | self.retranslateUi(Form) 901 | PyQt5.QtCore.QMetaObject.connectSlotsByName(Form) 902 | def retranslateUi(self, Form): 903 | _translate = PyQt5.QtCore.QCoreApplication.translate 904 | Form.setWindowTitle(_translate("Form", "Course and Course Choosing Info Query")) 905 | self.Button_Back.setText(_translate("Form", "Back")) 906 | self.label_Course_ID.setText(_translate("Form", "Course ID")) 907 | self.label_Course_Name.setText(_translate("Form", "Course Name")) 908 | self.label_Query_Result.setText(_translate("Form", "Query Result")) 909 | self.Button_Course_Info.setText(_translate("Form", "Course Info")) 910 | self.Button_Course_Choosing_Info.setText(_translate("Form", "Course Choosing Info")) 911 | def Course_Info_Query(self): 912 | global db 913 | cursor = db.cursor() 914 | Course_ID = self.lineEdit_Course_ID.text() 915 | Course_Name = self.lineEdit_Course_Name.text() 916 | for i in Course_Name: 917 | if i in specific_character: 918 | self.label_Query_Result.setText( 919 | PyQt5.QtCore.QCoreApplication.translate("Form", "Course Name should not contain \\, /, :, ?, \", \', <, >, |")) 920 | return 921 | params = [] 922 | if len(Course_Name) == 0 and len(Course_ID) != 0: 923 | if not Course_ID.isdigit(): 924 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Course ID must be a decimal number")) 925 | return 926 | sql = """ 927 | SELECT Courses.CourseID, Courses.CourseName, Courses.TeacherID, Teachers.TeacherName, Courses.Credit, Courses.Grade, Courses.CanceledYear 928 | FROM Courses 929 | JOIN Teachers ON Teachers.TeacherID = Courses.TeacherID 930 | WHERE Courses.CourseID = ? 931 | ORDER BY Courses.CourseID; 932 | """ 933 | params.append(Course_ID) 934 | elif len(Course_Name) != 0 and len(Course_ID) != 0: 935 | if not Course_ID.isdigit(): 936 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Course ID must be a decimal number")) 937 | return 938 | sql = """ 939 | SELECT Courses.CourseID, Courses.CourseName, Courses.TeacherID, Teachers.TeacherName, Courses.Credit, Courses.Grade, Courses.CanceledYear 940 | FROM Courses 941 | JOIN Teachers ON Teachers.TeacherID = Courses.TeacherID 942 | WHERE Courses.CourseID = ? AND Courses.CourseName = ? 943 | ORDER BY Courses.CourseID; 944 | """ 945 | params.append(Course_ID) 946 | params.append(Course_Name) 947 | elif len(Course_ID) == 0 and len(Course_Name) != 0: 948 | sql = """ 949 | SELECT Courses.CourseID, Courses.CourseName, Courses.TeacherID, Teachers.TeacherName, Courses.Credit, Courses.Grade, Courses.CanceledYear 950 | FROM Courses 951 | JOIN Teachers ON Teachers.TeacherID = Courses.TeacherID 952 | WHERE Courses.CourseName = ? 953 | ORDER BY Courses.CourseID; 954 | """ 955 | params.append(Course_Name) 956 | elif len(Course_ID) == 0 and len(Course_Name) == 0: 957 | sql = """ 958 | SELECT Courses.CourseID, Courses.CourseName, Courses.TeacherID, Teachers.TeacherName, Courses.Credit, Courses.Grade, Courses.CanceledYear 959 | FROM Courses 960 | JOIN Teachers ON Teachers.TeacherID = Courses.TeacherID 961 | ORDER BY Courses.CourseID; 962 | """ 963 | cursor.execute(sql, params) 964 | results = cursor.fetchall() 965 | if len(results) == 0: 966 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "There is no data")) 967 | self.tableWidget.clear() 968 | self.tableWidget.setColumnCount(0) 969 | self.tableWidget.setRowCount(0) 970 | else: 971 | self.tableWidget.clear() 972 | self.tableWidget.setColumnCount(0) 973 | self.tableWidget.setRowCount(0) 974 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Query Result")) 975 | col_result = cursor.description 976 | self.row = len(results) # 取得记录个数,用于设置表格的行数 977 | self.vol = len(results[0]) # 取得字段数,用于设置表格的列数 978 | col_result = list(col_result) 979 | a = 0 980 | self.tableWidget.setColumnCount(self.vol) 981 | self.tableWidget.setRowCount(self.row) 982 | for i in col_result: 983 | item = QtWidgets.QTableWidgetItem() 984 | self.tableWidget.setHorizontalHeaderItem(a, item) 985 | item = self.tableWidget.horizontalHeaderItem(a) 986 | item.setText(i[0]) 987 | a = a + 1 988 | results = list(results) 989 | for i in range(len(results)): 990 | results[i] = list(results[i]) 991 | for i in range(self.row): 992 | for j in range(self.vol): 993 | item = QtWidgets.QTableWidgetItem() 994 | self.tableWidget.setItem(i, j, item) 995 | item = self.tableWidget.item(i, j) 996 | item.setText(str(results[i][j])) 997 | def Course_Choosing_Info_Query(self): 998 | global db 999 | cursor = db.cursor() 1000 | Course_ID = self.lineEdit_Course_ID.text() 1001 | Course_Name = self.lineEdit_Course_Name.text() 1002 | for i in Course_Name: 1003 | if i in specific_character: 1004 | self.label_Query_Result.setText( 1005 | PyQt5.QtCore.QCoreApplication.translate("Form", "Course Name should not contain \\, /, :, ?, \", \', <, >, |")) 1006 | return 1007 | params = [] 1008 | if len(Course_Name) == 0 and len(Course_ID) != 0: 1009 | sql = """ 1010 | SELECT CourseChoosing.CourseID, Courses.CourseName, CourseChoosing.StudentID, Students.StudentName, CourseChoosing.TeacherID, Teachers.TeacherName, CourseChoosing.ChosenYear, CourseChoosing.Score 1011 | FROM CourseChoosing 1012 | JOIN Teachers ON Teachers.TeacherID = CourseChoosing.TeacherID 1013 | JOIN Students ON Students.StudentID = CourseChoosing.StudentID 1014 | JOIN Courses ON Courses.CourseID = CourseChoosing.CourseID 1015 | WHERE Courses.CourseID = ? 1016 | ORDER BY Courses.CourseID; 1017 | """ 1018 | params.append(Course_ID) 1019 | elif len(Course_Name) != 0 and len(Course_ID) != 0: 1020 | sql = """ 1021 | SELECT CourseChoosing.CourseID, Courses.CourseName, CourseChoosing.StudentID, Students.StudentName, CourseChoosing.TeacherID, Teachers.TeacherName, CourseChoosing.ChosenYear, CourseChoosing.Score 1022 | FROM CourseChoosing 1023 | JOIN Teachers ON Teachers.TeacherID = CourseChoosing.TeacherID 1024 | JOIN Students ON Students.StudentID = CourseChoosing.StudentID 1025 | JOIN Courses ON Courses.CourseID = CourseChoosing.CourseID 1026 | WHERE Courses.CourseID = ? AND Courses.CourseName = ? 1027 | ORDER BY Courses.CourseID; 1028 | """ 1029 | params.append(Course_ID) 1030 | params.append(Course_Name) 1031 | elif len(Course_ID) == 0 and len(Course_Name) != 0: 1032 | sql = """ 1033 | SELECT CourseChoosing.CourseID, Courses.CourseName, CourseChoosing.StudentID, Students.StudentName, CourseChoosing.TeacherID, Teachers.TeacherName, CourseChoosing.ChosenYear, CourseChoosing.Score 1034 | FROM CourseChoosing 1035 | JOIN Teachers ON Teachers.TeacherID = CourseChoosing.TeacherID 1036 | JOIN Students ON Students.StudentID = CourseChoosing.StudentID 1037 | JOIN Courses ON Courses.CourseID = CourseChoosing.CourseID 1038 | WHERE Courses.CourseName = ? 1039 | ORDER BY Courses.CourseID; 1040 | """ 1041 | params.append(Course_Name) 1042 | elif len(Course_ID) == 0 and len(Course_Name) == 0: 1043 | sql = """ 1044 | SELECT CourseChoosing.CourseID, Courses.CourseName, CourseChoosing.StudentID, Students.StudentName, CourseChoosing.TeacherID, Teachers.TeacherName, CourseChoosing.ChosenYear, CourseChoosing.Score 1045 | FROM CourseChoosing 1046 | JOIN Teachers ON Teachers.TeacherID = CourseChoosing.TeacherID 1047 | JOIN Students ON Students.StudentID = CourseChoosing.StudentID 1048 | JOIN Courses ON Courses.CourseID = CourseChoosing.CourseID 1049 | ORDER BY Courses.CourseID; 1050 | """ 1051 | cursor.execute(sql, params) 1052 | results = cursor.fetchall() 1053 | if len(results) == 0: 1054 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "There is no data")) 1055 | self.tableWidget.clear() 1056 | self.tableWidget.setColumnCount(0) 1057 | self.tableWidget.setRowCount(0) 1058 | else: 1059 | self.tableWidget.clear() 1060 | self.tableWidget.setColumnCount(0) 1061 | self.tableWidget.setRowCount(0) 1062 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Query Result")) 1063 | col_result = cursor.description 1064 | self.row = len(results) # 取得记录个数,用于设置表格的行数 1065 | self.vol = len(results[0]) # 取得字段数,用于设置表格的列数 1066 | col_result = list(col_result) 1067 | a = 0 1068 | self.tableWidget.setColumnCount(self.vol) 1069 | self.tableWidget.setRowCount(self.row) 1070 | for i in col_result: 1071 | item = QtWidgets.QTableWidgetItem() 1072 | self.tableWidget.setHorizontalHeaderItem(a, item) 1073 | item = self.tableWidget.horizontalHeaderItem(a) 1074 | item.setText(i[0]) 1075 | a = a + 1 1076 | results = list(results) 1077 | for i in range(len(results)): 1078 | results[i] = list(results[i]) 1079 | for i in range(self.row): 1080 | for j in range(self.vol): 1081 | item = QtWidgets.QTableWidgetItem() 1082 | self.tableWidget.setItem(i, j, item) 1083 | item = self.tableWidget.item(i, j) 1084 | item.setText(str(results[i][j])) 1085 | class Teaching_Info_Query_Ui(QtWidgets.QWidget): 1086 | back = PyQt5.QtCore.pyqtSignal() 1087 | def __init__(self): 1088 | QtWidgets.QWidget.__init__(self) 1089 | Form = self 1090 | Form.setObjectName("Form") 1091 | Form.resize(700, 350) 1092 | self.Button_Back = QtWidgets.QPushButton(Form) 1093 | self.Button_Back.setGeometry(PyQt5.QtCore.QRect(480, 110, 200, 30)) 1094 | self.Button_Back.setObjectName("pushButton_2") 1095 | self.Button_Back.clicked.connect(lambda: self.back.emit()) 1096 | self.Button_Teacher_Info = QtWidgets.QPushButton(Form) 1097 | self.Button_Teacher_Info.setGeometry(PyQt5.QtCore.QRect(480, 30, 200, 30)) 1098 | self.Button_Teacher_Info.setObjectName("pushButton_3") 1099 | self.Button_Teacher_Info.clicked.connect(self.Teacher_Info_Query) 1100 | self.Button_Teaching_Info = QtWidgets.QPushButton(Form) 1101 | self.Button_Teaching_Info.setGeometry(PyQt5.QtCore.QRect(480, 70, 200, 30)) 1102 | self.Button_Teaching_Info.setObjectName("pushButton_1") 1103 | self.Button_Teaching_Info.clicked.connect(self.Teaching_Info_Query) 1104 | self.label_Teacher_ID = QtWidgets.QLabel(Form) 1105 | self.label_Teacher_ID.setGeometry(PyQt5.QtCore.QRect(20, 30, 120, 20)) 1106 | self.label_Teacher_ID.setObjectName("label") 1107 | self.label_Teacher_Name = QtWidgets.QLabel(Form) 1108 | self.label_Teacher_Name.setGeometry(PyQt5.QtCore.QRect(20, 90, 120, 20)) 1109 | self.label_Teacher_Name.setObjectName("label_2") 1110 | self.label_Query_Result = QtWidgets.QLabel(Form) 1111 | self.label_Query_Result.setGeometry(PyQt5.QtCore.QRect(0, 150, 700, 20)) 1112 | self.label_Query_Result.setAlignment(PyQt5.QtCore.Qt.AlignCenter) 1113 | self.label_Query_Result.setObjectName("label_5") 1114 | self.label_Query_Result.setStyleSheet("color: rgb(250, 0, 0);") 1115 | 1116 | self.lineEdit_Teacher_ID = QtWidgets.QLineEdit(Form) 1117 | self.lineEdit_Teacher_ID.setGeometry(PyQt5.QtCore.QRect(160, 30, 300, 20)) 1118 | self.lineEdit_Teacher_ID.setObjectName("lineEdit") 1119 | self.lineEdit_Teacher_Name = QtWidgets.QLineEdit(Form) 1120 | self.lineEdit_Teacher_Name.setGeometry(PyQt5.QtCore.QRect(160, 90, 300, 20)) 1121 | self.lineEdit_Teacher_Name.setObjectName("lineEdit_2") 1122 | self.tableWidget = QtWidgets.QTableWidget(Form) 1123 | self.tableWidget.setGeometry(PyQt5.QtCore.QRect(20, 170, 660, 170)) 1124 | self.tableWidget.setObjectName("tableWidget") 1125 | self.tableWidget.setColumnCount(0) 1126 | self.tableWidget.setRowCount(0) 1127 | 1128 | self.retranslateUi(Form) 1129 | PyQt5.QtCore.QMetaObject.connectSlotsByName(Form) 1130 | def Teacher_Info_Query(self): 1131 | global db 1132 | Teacher_ID = self.lineEdit_Teacher_ID.text() 1133 | Teacher_Name = self.lineEdit_Teacher_Name.text() 1134 | cursor = db.cursor() 1135 | if len(Teacher_Name) == 0 and len(Teacher_ID) != 0: 1136 | if not Teacher_ID.isdigit() or len(Teacher_ID) != 5: 1137 | self.label_Query_Result.setText( 1138 | PyQt5.QtCore.QCoreApplication.translate("Form", "Teacher ID must be a 7 digit decimal number")) 1139 | return 1140 | sql = f'SELECT * FROM Teachers WHERE TeacherID=\'{Teacher_ID}\' ORDER BY TeacherID' 1141 | elif len(Teacher_Name) != 0 and len(Teacher_ID) != 0: 1142 | if not Teacher_ID.isdigit() or len(Teacher_ID) != 5: 1143 | self.label_Query_Result.setText( 1144 | PyQt5.QtCore.QCoreApplication.translate("Form", "Teacher ID must be a decimal number")) 1145 | return 1146 | if not Teacher_Name.isalpha(): 1147 | self.label_Query_Result.setText( 1148 | PyQt5.QtCore.QCoreApplication.translate("Form", "Teacher name must be English characters")) 1149 | return 1150 | sql = f'SELECT * FROM Teachers WHERE TeacherID=\'{Teacher_ID}\' AND TeacherName=\'{Teacher_Name}\' ORDER BY TeacherID' 1151 | elif len(Teacher_ID) == 0 and len(Teacher_Name) != 0: 1152 | if not Teacher_Name.isalpha(): 1153 | self.label_Query_Result.setText( 1154 | PyQt5.QtCore.QCoreApplication.translate("Form", "Teacher name must be English characters")) 1155 | return 1156 | sql = f'SELECT * FROM Teachers WHERE TeacherName=\'{Teacher_Name}\' ORDER BY TeacherID' 1157 | elif len(Teacher_ID) == 0 and len(Teacher_Name) == 0: 1158 | sql = f'SELECT * FROM Teachers ORDER BY TeacherID' 1159 | cursor.execute(sql) 1160 | results = cursor.fetchall() 1161 | if len(results) > 0: 1162 | self.label_Query_Result.setText( 1163 | PyQt5.QtCore.QCoreApplication.translate("Form", "Query Result")) 1164 | self.tableWidget.clear() 1165 | self.tableWidget.setColumnCount(0) 1166 | self.tableWidget.setRowCount(0) 1167 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Query Result")) 1168 | col_result = cursor.description 1169 | self.row = len(results) # 取得记录个数,用于设置表格的行数 1170 | self.vol = len(results[0]) # 取得字段数,用于设置表格的列数 1171 | col_result = list(col_result) 1172 | a = 0 1173 | self.tableWidget.setColumnCount(self.vol) 1174 | self.tableWidget.setRowCount(self.row) 1175 | for i in col_result: 1176 | item = QtWidgets.QTableWidgetItem() 1177 | self.tableWidget.setHorizontalHeaderItem(a, item) 1178 | item = self.tableWidget.horizontalHeaderItem(a) 1179 | item.setText(i[0]) 1180 | a = a + 1 1181 | results = list(results) 1182 | for i in range(len(results)): 1183 | results[i] = list(results[i]) 1184 | for i in range(self.row): 1185 | for j in range(self.vol): 1186 | item = QtWidgets.QTableWidgetItem() 1187 | self.tableWidget.setItem(i, j, item) 1188 | item = self.tableWidget.item(i, j) 1189 | item.setText(str(results[i][j])) 1190 | else: 1191 | self.tableWidget.clear() 1192 | self.tableWidget.setColumnCount(0) 1193 | self.tableWidget.setRowCount(0) 1194 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "There is no data")) 1195 | def Teaching_Info_Query(self): 1196 | global db 1197 | Teacher_ID = self.lineEdit_Teacher_ID.text() 1198 | Teacher_Name = self.lineEdit_Teacher_Name.text() 1199 | cursor = db.cursor() 1200 | if Teacher_ID == '' and Teacher_Name == '': 1201 | sql = f"SELECT DISTINCT Teachers.TeacherName, Teachers.TeacherID, Courses.CourseName, Courses.CourseID, CourseChoosing.ChosenYear, Courses.Credit, Courses.Grade, Courses.CanceledYear FROM Teachers JOIN CourseChoosing ON Teachers.TeacherID=CourseChoosing.TeacherID JOIN Courses ON CourseChoosing.CourseID=Courses.CourseID ORDER BY Teachers.TeacherID, Courses.CourseID, CourseChoosing.ChosenYear;" 1202 | elif Teacher_ID != '' and Teacher_Name == '': 1203 | if len(Teacher_ID) != 5 or not Teacher_ID.isdigit(): 1204 | self.label_Query_Result.setText( 1205 | PyQt5.QtCore.QCoreApplication.translate("Form", "Teacher ID should be a 5 digit decimal number")) 1206 | return 1207 | sql = f"SELECT DISTINCT Teachers.TeacherName, Teachers.TeacherID, Courses.CourseName, Courses.CourseID, CourseChoosing.ChosenYear, Courses.Credit, Courses.Grade, Courses.CanceledYear FROM Teachers JOIN CourseChoosing ON Teachers.TeacherID=CourseChoosing.TeacherID JOIN Courses ON CourseChoosing.CourseID=Courses.CourseID WHERE Teachers.TeacherID=\'{Teacher_ID}\' ORDER BY Courses.CourseID, CourseChoosing.ChosenYear;" 1208 | elif Teacher_ID == '' and Teacher_Name != '': 1209 | for i in Teacher_Name: 1210 | if i in specific_character: 1211 | self.label_Query_Result.setText( 1212 | PyQt5.QtCore.QCoreApplication.translate("Form", 1213 | "Teacher Name should not contain \\, /, :, ?, \", \', <, >, |")) 1214 | return 1215 | sql = f"SELECT DISTINCT Teachers.TeacherName, Teachers.TeacherID, Courses.CourseName, Courses.CourseID, CourseChoosing.ChosenYear, Courses.Credit, Courses.Grade, Courses.CanceledYear FROM Teachers JOIN CourseChoosing ON Teachers.TeacherID=CourseChoosing.TeacherID JOIN Courses ON CourseChoosing.CourseID=Courses.CourseID WHERE Teachers.TeacherName=\'{Teacher_Name}\' ORDER BY Courses.CourseID, CourseChoosing.ChosenYear;" 1216 | elif Teacher_ID != '' and Teacher_Name != '': 1217 | if len(Teacher_ID) != 5 or not Teacher_ID.isdigit(): 1218 | self.label_Query_Result.setText( 1219 | PyQt5.QtCore.QCoreApplication.translate("Form", "Teacher ID should be a 5 digit decimal number")) 1220 | return 1221 | for i in Teacher_Name: 1222 | if i in specific_character: 1223 | self.label_Query_Result.setText( 1224 | PyQt5.QtCore.QCoreApplication.translate("Form", 1225 | "Teacher Name should not contain \\, /, :, ?, \", \', <, >, |")) 1226 | return 1227 | sql = f"SELECT DISTINCT Teachers.TeacherName, Teachers.TeacherID, Courses.CourseName, Courses.CourseID, CourseChoosing.ChosenYear, Courses.Credit, Courses.Grade, Courses.CanceledYear FROM Teachers JOIN CourseChoosing ON Teachers.TeacherID=CourseChoosing.TeacherID JOIN Courses ON CourseChoosing.CourseID=Courses.CourseID WHERE Teachers.TeacherID=\'{Teacher_ID}\' AND Teachers.TeacherName=\'{Teacher_Name}\' ORDER BY Courses.CourseID, CourseChoosing.ChosenYear;" 1228 | cursor.execute(sql) 1229 | results = cursor.fetchall() 1230 | if len(results) == 0: 1231 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "There is no data")) 1232 | self.tableWidget.clear() 1233 | self.tableWidget.setColumnCount(0) 1234 | self.tableWidget.setRowCount(0) 1235 | else: 1236 | self.tableWidget.clear() 1237 | self.tableWidget.setColumnCount(0) 1238 | self.tableWidget.setRowCount(0) 1239 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Query Result")) 1240 | col_result = cursor.description 1241 | self.row = len(results) # 取得记录个数,用于设置表格的行数 1242 | self.vol = len(results[0]) # 取得字段数,用于设置表格的列数 1243 | col_result = list(col_result) 1244 | a = 0 1245 | self.tableWidget.setColumnCount(self.vol) 1246 | self.tableWidget.setRowCount(self.row) 1247 | for i in col_result: 1248 | item = QtWidgets.QTableWidgetItem() 1249 | self.tableWidget.setHorizontalHeaderItem(a, item) 1250 | item = self.tableWidget.horizontalHeaderItem(a) 1251 | item.setText(i[0]) 1252 | a = a + 1 1253 | results = list(results) 1254 | for i in range(len(results)): 1255 | results[i] = list(results[i]) 1256 | for i in range(self.row): 1257 | for j in range(self.vol): 1258 | item = QtWidgets.QTableWidgetItem() 1259 | self.tableWidget.setItem(i, j, item) 1260 | item = self.tableWidget.item(i, j) 1261 | item.setText(str(results[i][j])) 1262 | def retranslateUi(self, Form): 1263 | _translate = PyQt5.QtCore.QCoreApplication.translate 1264 | Form.setWindowTitle(_translate("Form", "Teacher (Teaching) Info Query")) 1265 | self.Button_Back.setText(_translate("Form", "Back")) 1266 | self.label_Teacher_ID.setText(_translate("Form", "Teacher ID")) 1267 | self.label_Teacher_Name.setText(_translate("Form", "Teacher Name")) 1268 | self.label_Query_Result.setText(_translate("Form", "Query Result")) 1269 | self.Button_Teacher_Info.setText(_translate("Form", "Teacher Info")) 1270 | self.Button_Teaching_Info.setText(_translate("Form", "Teaching Info")) 1271 | class Average_Score_Info_Query_Ui(QtWidgets.QWidget): 1272 | back = PyQt5.QtCore.pyqtSignal() 1273 | def __init__(self): 1274 | QtWidgets.QWidget.__init__(self) 1275 | Form = self 1276 | Form.setObjectName("Form") 1277 | Form.resize(500, 179) 1278 | self.label_Student_ID = QtWidgets.QLabel(Form) 1279 | self.label_Student_ID.setGeometry(PyQt5.QtCore.QRect(10, 30, 100, 16)) 1280 | self.label_Student_ID.setObjectName("label") 1281 | self.label_Course_ID = QtWidgets.QLabel(Form) 1282 | self.label_Course_ID.setGeometry(PyQt5.QtCore.QRect(10, 60, 100, 20)) 1283 | self.label_Course_ID.setObjectName("label_2") 1284 | self.label_Class = QtWidgets.QLabel(Form) 1285 | self.label_Class.setGeometry(PyQt5.QtCore.QRect(10, 90, 100, 20)) 1286 | self.label_Class.setObjectName("label_3") 1287 | self.label_Query_Result = QtWidgets.QLabel(Form) 1288 | self.label_Query_Result.setGeometry(PyQt5.QtCore.QRect(0, 130, 500, 50)) 1289 | self.label_Query_Result.setObjectName("label_5") 1290 | self.label_Query_Result.setStyleSheet("color: rgb(250, 0, 0);") 1291 | self.label_Query_Result.setAlignment(PyQt5.QtCore.Qt.AlignCenter) 1292 | 1293 | self.lineEdit_Student_ID = QtWidgets.QLineEdit(Form) 1294 | self.lineEdit_Student_ID.setGeometry(PyQt5.QtCore.QRect(110, 30, 180, 20)) 1295 | self.lineEdit_Student_ID.setObjectName("lineEdit") 1296 | self.lineEdit_Course_ID = QtWidgets.QLineEdit(Form) 1297 | self.lineEdit_Course_ID.setGeometry(PyQt5.QtCore.QRect(110, 60, 180, 20)) 1298 | self.lineEdit_Course_ID.setObjectName("lineEdit_2") 1299 | self.lineEdit_Class = QtWidgets.QLineEdit(Form) 1300 | self.lineEdit_Class.setGeometry(PyQt5.QtCore.QRect(110, 90, 180, 20)) 1301 | self.lineEdit_Class.setObjectName("lineEdit_3") 1302 | 1303 | self.Button_query = QtWidgets.QPushButton(Form) 1304 | self.Button_query.setGeometry(PyQt5.QtCore.QRect(300, 30, 190, 24)) 1305 | self.Button_query.setObjectName("pushButton") 1306 | self.Button_query.clicked.connect(self.Query_Average_Score) 1307 | self.Button_back = QtWidgets.QPushButton(Form) 1308 | self.Button_back.setGeometry(PyQt5.QtCore.QRect(300, 90, 190, 24)) 1309 | self.Button_back.setObjectName("pushButton") 1310 | self.Button_back.clicked.connect(lambda: self.back.emit()) 1311 | 1312 | self.comboBox = QtWidgets.QComboBox(Form) 1313 | self.comboBox.setGeometry(PyQt5.QtCore.QRect(300, 60, 190, 24)) 1314 | self.comboBox.setObjectName("comboBox") 1315 | self.comboBox.addItem("") 1316 | self.comboBox.addItem("") 1317 | self.comboBox.addItem("") 1318 | self.comboBox.addItem("") 1319 | self.comboBox.setEditable(True) 1320 | 1321 | line_edit = self.comboBox.lineEdit() 1322 | line_edit.setAlignment(PyQt5.QtCore.Qt.AlignCenter) 1323 | 1324 | self.retranslateUi(Form) 1325 | PyQt5.QtCore.QMetaObject.connectSlotsByName(Form) 1326 | def retranslateUi(self, Form): 1327 | _translate = PyQt5.QtCore.QCoreApplication.translate 1328 | Form.setWindowTitle(_translate("Form", "Average Score Query")) 1329 | self.label_Student_ID.setText(_translate("Form", "Student ID")) 1330 | self.label_Course_ID.setText(_translate("Form", "Course ID")) 1331 | self.label_Class.setText(_translate("Form", "Class")) 1332 | self.Button_query.setText(_translate("Form", "Query Average Score")) 1333 | self.Button_back.setText(_translate("Form", "Back")) 1334 | self.comboBox.setItemText(0, _translate("Form", "One Student")) 1335 | self.comboBox.setItemText(1, _translate("Form", "All Students")) 1336 | self.comboBox.setItemText(2, _translate("Form", "Course")) 1337 | self.comboBox.setItemText(3, _translate("Form", "Class")) 1338 | self.label_Query_Result.setText(_translate("Form", "Query Result")) 1339 | def Query_Average_Score(self): 1340 | global db 1341 | Student_ID = self.lineEdit_Student_ID.text() 1342 | Course_ID = self.lineEdit_Course_ID.text() 1343 | Class = self.lineEdit_Class.text() 1344 | flag = self.comboBox.currentText() 1345 | cursor = db.cursor() 1346 | if flag == 'One Student': 1347 | if not Student_ID.isdigit(): 1348 | self.label_Query_Result.setText( 1349 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student ID must be a decimal number")) 1350 | return 1351 | cursor.execute(f'SELECT StudentName FROM Students WHERE StudentID=\'{Student_ID}\'') 1352 | results = cursor.fetchall() 1353 | if len(results) == 0: 1354 | self.label_Query_Result.setText( 1355 | PyQt5.QtCore.QCoreApplication.translate("Form", f"There is no StudentID matching {Student_ID}")) 1356 | else: 1357 | Student_Name = results[0][0] 1358 | sql = f'SELECT AVG(Score) FROM CourseChoosing WHERE StudentID=\'{Student_ID}\'' 1359 | cursor.execute(sql) 1360 | results = cursor.fetchall() 1361 | Average_Score = results[0][0] 1362 | self.label_Query_Result.setText( 1363 | PyQt5.QtCore.QCoreApplication.translate("Form", f"The Average Score of {Student_Name} is {Average_Score}.")) 1364 | elif flag == 'All Students': 1365 | sql = 'SELECT AVG(Score) FROM CourseChoosing' 1366 | cursor.execute(sql) 1367 | results = cursor.fetchall() 1368 | self.label_Query_Result.setText( 1369 | PyQt5.QtCore.QCoreApplication.translate("Form", f"The Average Score of all student is {results[0][0]}.")) 1370 | elif flag == 'Course': 1371 | if not Course_ID.isdigit() or len(Course_ID) != 7: 1372 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Course ID must be a 7 digit decimal number")) 1373 | return 1374 | cursor.execute(f'SELECT CourseName FROM Courses WHERE CourseID=\'{Course_ID}\'') 1375 | results = cursor.fetchall() 1376 | if len(results) == 0: 1377 | self.label_Query_Result.setText( 1378 | PyQt5.QtCore.QCoreApplication.translate("Form", f"There is no CourseID matching {Course_ID}")) 1379 | else: 1380 | Course_Name = results[0][0] 1381 | if Class == '': 1382 | sql = f'SELECT AVG(Score) FROM CourseChoosing WHERE CourseID=\'{Course_ID}\'' 1383 | cursor.execute(sql) 1384 | results = cursor.fetchall() 1385 | self.label_Query_Result.setText( 1386 | PyQt5.QtCore.QCoreApplication.translate("Form", f"The Average Score of {Course_Name} is {results[0][0]}.")) 1387 | else: 1388 | for i in Class: 1389 | if i in specific_character: 1390 | self.label_Query_Result.setText( 1391 | PyQt5.QtCore.QCoreApplication.translate("Form", 1392 | "Class should not contain \\, /, :, ?, \", \', <, >, |")) 1393 | return 1394 | cursor.execute(f'SELECT * FROM Students where Class=\'{Class}\'') 1395 | results = cursor.fetchall() 1396 | if len(results) == 0: 1397 | PyQt5.QtCore.QCoreApplication.translate("Form", 1398 | f"There is no such a class named \'{Class}\'") 1399 | return 1400 | # 从CourseChoosing选出StudentID, 然后在Students里找是否有匹配的class 1401 | cursor.execute(f'SELECT * FROM Students where Class=\'{Class}\' AND StudentID in(SELECT StudentID FROM CourseChoosing WHERE CourseID=\'{Course_ID}\')') 1402 | results = cursor.fetchall() 1403 | if len(results) == 0: 1404 | self.label_Query_Result.setText( 1405 | PyQt5.QtCore.QCoreApplication.translate("Form", 1406 | f"There is no student who chose\n{Course_Name} in {Class}")) 1407 | return 1408 | cursor.execute(f'SELECT AVG(Score) FROM CourseChoosing WHERE CourseID=\'{Course_ID}\' AND StudentID IN (SELECT StudentID FROM Students WHERE Class=\'{Class}\')') 1409 | results = cursor.fetchall() 1410 | self.label_Query_Result.setText( 1411 | PyQt5.QtCore.QCoreApplication.translate("Form", 1412 | f"The Average Score of {Class}\nin {Course_Name} is {results[0][0]}.")) 1413 | elif flag == 'Class': 1414 | if Class == '': 1415 | self.label_Query_Result.setText( 1416 | PyQt5.QtCore.QCoreApplication.translate("Form", f"Class should not be empty")) 1417 | return 1418 | cursor.execute(f'SELECT Class FROM Students WHERE Class=\'{Class}\'') 1419 | results = cursor.fetchall() 1420 | if len(results) == 0: 1421 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", f"There is no class named {Class}")) 1422 | return 1423 | if Course_ID == '': 1424 | sql = f'SELECT AVG(Score) FROM CourseChoosing WHERE StudentID IN (SELECT StudentID FROM Students WHERE Class=\'{Class}\')' 1425 | cursor.execute(sql) 1426 | results = cursor.fetchall() 1427 | self.label_Query_Result.setText( 1428 | PyQt5.QtCore.QCoreApplication.translate("Form", 1429 | f"The Average Score of {Class} is {results[0][0]}.")) 1430 | return 1431 | for i in Course_ID: 1432 | if i in specific_character: 1433 | self.label_Query_Result.setText( 1434 | PyQt5.QtCore.QCoreApplication.translate("Form", 1435 | "Course ID should not contain \\, /, :, ?, \", \', <, >, |")) 1436 | return 1437 | cursor.execute(f"SELECT * FROM Courses WHERE CourseID=\'{Course_ID}\'") 1438 | results = cursor.fetchall() 1439 | if len(results) == 0: 1440 | self.label_Query_Result.setText( 1441 | PyQt5.QtCore.QCoreApplication.translate("Form", f"There is no matched course")) 1442 | return 1443 | Course_Name = results[0][1] 1444 | cursor.execute(f"SELECT * FROM CourseChoosing WHERE CourseID=\'{Course_ID}\' AND StudentID IN (SELECT StudentID FROM Students WHERE Class=\'{Class}\')") 1445 | results = cursor.fetchall() 1446 | if len(results) == 0: 1447 | self.label_Query_Result.setText( 1448 | PyQt5.QtCore.QCoreApplication.translate("Form", f"There is no student in {Class} who has chosen {Course_Name}")) 1449 | return 1450 | cursor.execute( 1451 | f"SELECT AVG(Score) FROM CourseChoosing WHERE CourseID=\'{Course_ID}\' AND StudentID IN (SELECT StudentID FROM Students WHERE Class=\'{Class}\')") 1452 | results = cursor.fetchall() 1453 | self.label_Query_Result.setText( 1454 | PyQt5.QtCore.QCoreApplication.translate("Form", 1455 | f"The Average Score of {Class}\nin {Course_Name} is {results[0][0]}.")) 1456 | else: 1457 | self.label_Query_Result.setText( 1458 | PyQt5.QtCore.QCoreApplication.translate("Form", 1459 | f"Please choose one of the four items")) 1460 | class Modify_Info_Ui(QtWidgets.QWidget): 1461 | stu_info = PyQt5.QtCore.pyqtSignal() 1462 | cou_info = PyQt5.QtCore.pyqtSignal() 1463 | coc_info = PyQt5.QtCore.pyqtSignal() 1464 | bs = PyQt5.QtCore.pyqtSignal() 1465 | def __init__(self): 1466 | QtWidgets.QWidget.__init__(self) 1467 | Form = self 1468 | Form.setObjectName("Form") 1469 | Form.resize(451, 313) 1470 | self.Button_Student_Info = QtWidgets.QPushButton(Form) 1471 | self.Button_Student_Info.setGeometry(PyQt5.QtCore.QRect(120, 60, 191, 41)) 1472 | self.Button_Student_Info.setObjectName("pushButton_3") 1473 | self.Button_Student_Info.clicked.connect(lambda: self.stu_info.emit()) 1474 | self.Button_Course_Info = QtWidgets.QPushButton(Form) 1475 | self.Button_Course_Info.setGeometry(PyQt5.QtCore.QRect(120, 110, 191, 41)) 1476 | self.Button_Course_Info.setObjectName("pushButton") 1477 | self.Button_Course_Info.clicked.connect(lambda: self.cou_info.emit()) 1478 | self.Button_Course_Choosing_Info = QtWidgets.QPushButton(Form) 1479 | self.Button_Course_Choosing_Info.setGeometry(PyQt5.QtCore.QRect(120, 160, 191, 41)) 1480 | self.Button_Course_Choosing_Info.setObjectName("pushButton_2") 1481 | self.Button_Course_Choosing_Info.clicked.connect(lambda: self.coc_info.emit()) 1482 | self.Button_Back = QtWidgets.QPushButton(Form) 1483 | self.Button_Back.setGeometry(PyQt5.QtCore.QRect(120, 210, 191, 41)) 1484 | self.Button_Back.setObjectName("pushButton_4") 1485 | self.Button_Back.clicked.connect(lambda: self.bs.emit()) 1486 | 1487 | self.retranslateUi(Form) 1488 | PyQt5.QtCore.QMetaObject.connectSlotsByName(Form) 1489 | def retranslateUi(self, Form): 1490 | _translate = PyQt5.QtCore.QCoreApplication.translate 1491 | Form.setWindowTitle(_translate("Form", "Modify Information")) 1492 | self.Button_Course_Info.setText(_translate("Form", "Course Info")) 1493 | self.Button_Course_Choosing_Info.setText(_translate("Form", "Course Choosing Info")) 1494 | self.Button_Student_Info.setText(_translate("Form", "Student Info")) 1495 | self.Button_Back.setText(_translate("Form", "Back")) 1496 | class Student_Info_Modify_Ui(QtWidgets.QWidget): 1497 | back = PyQt5.QtCore.pyqtSignal() 1498 | def __init__(self): 1499 | QtWidgets.QWidget.__init__(self) 1500 | Form = self 1501 | Form.setObjectName("Form") 1502 | Form.resize(451, 465) 1503 | self.label_Query_Line = QtWidgets.QLabel(Form) 1504 | self.label_Query_Line.setGeometry(PyQt5.QtCore.QRect(10, 10, 431, 20)) 1505 | self.label_Query_Line.setObjectName("label_5") 1506 | self.label_Query_Student_ID = QtWidgets.QLabel(Form) 1507 | self.label_Query_Student_ID.setGeometry(PyQt5.QtCore.QRect(20, 47, 120, 16)) 1508 | self.label_Query_Student_ID.setObjectName("label") 1509 | self.label_Modify_Line = QtWidgets.QLabel(Form) 1510 | self.label_Modify_Line.setGeometry(PyQt5.QtCore.QRect(10, 80, 431, 20)) 1511 | self.label_Modify_Line.setObjectName("label_4") 1512 | self.label_Modify_Student_ID = QtWidgets.QLabel(Form) 1513 | self.label_Modify_Student_ID.setGeometry(PyQt5.QtCore.QRect(20, 100, 120, 16)) 1514 | self.label_Modify_Student_ID.setObjectName("label_7") 1515 | self.label_Student_Name = QtWidgets.QLabel(Form) 1516 | self.label_Student_Name.setGeometry(PyQt5.QtCore.QRect(20, 130, 120, 20)) 1517 | self.label_Student_Name.setObjectName("label_6") 1518 | self.label_Sex = QtWidgets.QLabel(Form) 1519 | self.label_Sex.setGeometry(PyQt5.QtCore.QRect(20, 160, 120, 20)) 1520 | self.label_Sex.setObjectName("label_3") 1521 | self.label_Entrance_Age = QtWidgets.QLabel(Form) 1522 | self.label_Entrance_Age.setGeometry(PyQt5.QtCore.QRect(20, 190, 120, 20)) 1523 | self.label_Entrance_Age.setObjectName("label_9") 1524 | self.label_Entrance_Year = QtWidgets.QLabel(Form) 1525 | self.label_Entrance_Year.setGeometry(PyQt5.QtCore.QRect(20, 220, 120, 20)) 1526 | self.label_Entrance_Year.setObjectName("label_8") 1527 | self.label_Class = QtWidgets.QLabel(Form) 1528 | self.label_Class.setGeometry(PyQt5.QtCore.QRect(20, 250, 120, 20)) 1529 | self.label_Class.setObjectName("label_10") 1530 | self.label_Query_Result = QtWidgets.QLabel(Form) 1531 | self.label_Query_Result.setGeometry(PyQt5.QtCore.QRect(0, 280, 451, 20)) 1532 | self.label_Query_Result.setObjectName("label_11") 1533 | self.label_Query_Result.setAlignment(PyQt5.QtCore.Qt.AlignCenter) 1534 | self.label_Query_Result.setStyleSheet("color: rgb(250, 0, 0);") 1535 | 1536 | self.Button_Query_Student_Info = QtWidgets.QPushButton(Form) 1537 | self.Button_Query_Student_Info.setGeometry(PyQt5.QtCore.QRect(300, 30, 141, 50)) 1538 | self.Button_Query_Student_Info.setObjectName("pushButton") 1539 | self.Button_Query_Student_Info.clicked.connect(self.Query) 1540 | self.Button_Insert = QtWidgets.QPushButton(Form) 1541 | self.Button_Insert.setGeometry(PyQt5.QtCore.QRect(300, 100, 141, 51)) 1542 | self.Button_Insert.setObjectName("pushButton_2") 1543 | self.Button_Insert.clicked.connect(self.Insert) 1544 | self.Button_Update = QtWidgets.QPushButton(Form) 1545 | self.Button_Update.setGeometry(PyQt5.QtCore.QRect(300, 160, 141, 51)) 1546 | self.Button_Update.setObjectName("pushButton_3") 1547 | self.Button_Update.clicked.connect(self.Update) 1548 | self.Button_Delete = QtWidgets.QPushButton(Form) 1549 | self.Button_Delete.setGeometry(PyQt5.QtCore.QRect(300, 220, 141, 51)) 1550 | self.Button_Delete.setObjectName("pushButton_4") 1551 | self.Button_Delete.clicked.connect(self.Delete) 1552 | self.Button_Back = QtWidgets.QPushButton(Form) 1553 | self.Button_Back.setGeometry(PyQt5.QtCore.QRect(190, 435, 75, 24)) 1554 | self.Button_Back.setObjectName("pushButton_5") 1555 | self.Button_Back.clicked.connect(lambda: self.back.emit()) 1556 | 1557 | self.lineEdit_Query_Student_ID = QtWidgets.QLineEdit(Form) 1558 | self.lineEdit_Query_Student_ID.setGeometry(PyQt5.QtCore.QRect(140, 47, 150, 20)) 1559 | self.lineEdit_Query_Student_ID.setObjectName("lineEdit") 1560 | self.lineEdit_Modify_Student_ID = QtWidgets.QLineEdit(Form) 1561 | self.lineEdit_Modify_Student_ID.setGeometry(PyQt5.QtCore.QRect(140, 100, 150, 20)) 1562 | self.lineEdit_Modify_Student_ID.setObjectName("lineEdit_5") 1563 | self.lineEdit_Student_Name = QtWidgets.QLineEdit(Form) 1564 | self.lineEdit_Student_Name.setGeometry(PyQt5.QtCore.QRect(140, 130, 150, 20)) 1565 | self.lineEdit_Student_Name.setObjectName("lineEdit_4") 1566 | self.lineEdit_Sex = QtWidgets.QLineEdit(Form) 1567 | self.lineEdit_Sex.setGeometry(PyQt5.QtCore.QRect(140, 160, 150, 20)) 1568 | self.lineEdit_Sex.setObjectName("lineEdit_3") 1569 | self.lineEdit_Entrance_Age = QtWidgets.QLineEdit(Form) 1570 | self.lineEdit_Entrance_Age.setGeometry(PyQt5.QtCore.QRect(140, 190, 150, 20)) 1571 | self.lineEdit_Entrance_Age.setObjectName("lineEdit_7") 1572 | self.lineEdit_Entrance_Year = QtWidgets.QLineEdit(Form) 1573 | self.lineEdit_Entrance_Year.setGeometry(PyQt5.QtCore.QRect(140, 220, 150, 20)) 1574 | self.lineEdit_Entrance_Year.setObjectName("lineEdit_6") 1575 | self.lineEdit_Class = QtWidgets.QLineEdit(Form) 1576 | self.lineEdit_Class.setGeometry(PyQt5.QtCore.QRect(140, 250, 150, 20)) 1577 | self.lineEdit_Class.setObjectName("lineEdit_8") 1578 | 1579 | self.tableWidget = QtWidgets.QTableWidget(Form) 1580 | self.tableWidget.setGeometry(PyQt5.QtCore.QRect(10, 306, 431, 120)) 1581 | self.tableWidget.setObjectName("tableWidget") 1582 | self.tableWidget.setColumnCount(0) 1583 | self.tableWidget.setRowCount(0) 1584 | 1585 | self.retranslateUi(Form) 1586 | PyQt5.QtCore.QMetaObject.connectSlotsByName(Form) 1587 | def retranslateUi(self, Form): 1588 | _translate = PyQt5.QtCore.QCoreApplication.translate 1589 | Form.setWindowTitle(_translate("Form", "Student Info Modify")) 1590 | self.label_Query_Student_ID.setText(_translate("Form", "Student ID")) 1591 | self.label_Sex.setText(_translate("Form", "Sex")) 1592 | self.Button_Query_Student_Info.setText(_translate("Form", "Query Student\nInfo")) 1593 | self.label_Modify_Line.setText( 1594 | _translate("Form", "---------------------Modify---------------------")) 1595 | self.Button_Insert.setText(_translate("Form", "Insert")) 1596 | self.Button_Update.setText(_translate("Form", "Update")) 1597 | self.Button_Delete.setText(_translate("Form", "Delete")) 1598 | self.label_Query_Line.setText( 1599 | _translate("Form", "----------------------Query---------------------")) 1600 | self.label_Student_Name.setText(_translate("Form", "Student Name")) 1601 | self.label_Modify_Student_ID.setText(_translate("Form", "Student ID")) 1602 | self.label_Entrance_Year.setText(_translate("Form", "Entrance Year")) 1603 | self.label_Entrance_Age.setText(_translate("Form", "Entrance Age")) 1604 | self.label_Class.setText(_translate("Form", "Class")) 1605 | self.Button_Back.setText(_translate("Form", "Back")) 1606 | self.label_Query_Result.setText(_translate("Form", "Operation Result")) 1607 | def Query(self): 1608 | global db 1609 | Student_ID = self.lineEdit_Query_Student_ID.text() 1610 | cursor = db.cursor() 1611 | if Student_ID != '': 1612 | if len(Student_ID) != 10 or not Student_ID.isdigit(): 1613 | self.label_Query_Result.setText( 1614 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student ID must be a 10 digit decimal number")) 1615 | return 1616 | sql = f'SELECT * FROM Students WHERE StudentID=\'{Student_ID}\' ORDER BY StudentID;' 1617 | else: 1618 | sql = 'SELECT * FROM Students ORDER BY StudentID;' 1619 | cursor.execute(sql) 1620 | results = cursor.fetchall() 1621 | if len(results) > 0: 1622 | self.tableWidget.clear() 1623 | self.tableWidget.setColumnCount(0) 1624 | self.tableWidget.setRowCount(0) 1625 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Query Result")) 1626 | col_result = cursor.description 1627 | self.row = len(results) # 取得记录个数,用于设置表格的行数 1628 | self.vol = len(results[0]) # 取得字段数,用于设置表格的列数 1629 | col_result = list(col_result) 1630 | a = 0 1631 | self.tableWidget.setColumnCount(self.vol) 1632 | self.tableWidget.setRowCount(self.row) 1633 | for i in col_result: 1634 | item = QtWidgets.QTableWidgetItem() 1635 | self.tableWidget.setHorizontalHeaderItem(a, item) 1636 | item = self.tableWidget.horizontalHeaderItem(a) 1637 | item.setText(i[0]) 1638 | a = a + 1 1639 | results = list(results) 1640 | for i in range(len(results)): 1641 | results[i] = list(results[i]) 1642 | for i in range(self.row): 1643 | for j in range(self.vol): 1644 | item = QtWidgets.QTableWidgetItem() 1645 | self.tableWidget.setItem(i, j, item) 1646 | item = self.tableWidget.item(i, j) 1647 | item.setText(str(results[i][j])) 1648 | else: 1649 | self.tableWidget.clear() 1650 | self.tableWidget.setColumnCount(0) 1651 | self.tableWidget.setRowCount(0) 1652 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "There is no data")) 1653 | def Insert(self): 1654 | global db 1655 | cursor = db.cursor() 1656 | Student_ID = self.lineEdit_Modify_Student_ID.text() 1657 | if len(Student_ID) != 10 or not Student_ID.isdigit(): 1658 | self.label_Query_Result.setText( 1659 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student ID must be a 10 digit decimal number")) 1660 | return 1661 | Student_Name = self.lineEdit_Student_Name.text() 1662 | if not Student_Name.isalpha(): 1663 | self.label_Query_Result.setText( 1664 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student Name must be English characters")) 1665 | return 1666 | Sex = self.lineEdit_Sex.text() 1667 | if Sex not in ['male', 'female']: 1668 | self.label_Query_Result.setText( 1669 | PyQt5.QtCore.QCoreApplication.translate("Form", "Sex must be \'male\' or \'female\'")) 1670 | return 1671 | Entrance_Age = self.lineEdit_Entrance_Age.text() 1672 | if not Entrance_Age.isdigit(): 1673 | self.label_Query_Result.setText( 1674 | PyQt5.QtCore.QCoreApplication.translate("Form", "Entrance Age must be a decimal number")) 1675 | return 1676 | Entrance_Age = int(Entrance_Age) 1677 | if not 10 <= Entrance_Age <= 50: 1678 | self.label_Query_Result.setText( 1679 | PyQt5.QtCore.QCoreApplication.translate("Form", "Entrance Age must in range [10,50]")) 1680 | return 1681 | Entrance_Year = self.lineEdit_Entrance_Year.text() 1682 | if not Entrance_Year.isdigit(): 1683 | self.label_Query_Result.setText( 1684 | PyQt5.QtCore.QCoreApplication.translate("Form", "Entrance Year must be a decimal number")) 1685 | return 1686 | Entrance_Year = int(Entrance_Year) 1687 | Class = self.lineEdit_Class.text() 1688 | if Class == '': 1689 | self.label_Query_Result.setText( 1690 | PyQt5.QtCore.QCoreApplication.translate("Form", "Please input the class name")) 1691 | return 1692 | for i in Class: 1693 | if i in specific_character: 1694 | self.label_Query_Result.setText( 1695 | PyQt5.QtCore.QCoreApplication.translate("Form", "Class should not contain \\, /, :, ?, \", \', <, >, |")) 1696 | return 1697 | cursor.execute(f'SELECT * FROM Students WHERE StudentID=\'{Student_ID}\'') 1698 | results = cursor.fetchall() 1699 | if len(results) != 0: 1700 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "This student is already exist")) 1701 | else: 1702 | cursor.execute(''' 1703 | INSERT INTO Students (StudentID, StudentName, Sex, EntranceAge, EntranceYear, Class) 1704 | VALUES (?, ?, ?, ?, ?, ?) 1705 | ''', [Student_ID, Student_Name, Sex, Entrance_Age, Entrance_Year, Class]) 1706 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Successfully Insert")) 1707 | cursor.execute(''' 1708 | INSERT INTO AccountPassword (Account, Occupation, Password) 1709 | VALUES (?, ?, ?) 1710 | ''', [Student_ID, "student", "123456"]) 1711 | db.commit() 1712 | def Update(self): 1713 | global db 1714 | cursor = db.cursor() 1715 | Student_ID = self.lineEdit_Modify_Student_ID.text() 1716 | if not Student_ID.isdigit() or len(Student_ID) != 10: 1717 | self.label_Query_Result.setText( 1718 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student ID must be a 10 digit decimal number")) 1719 | return 1720 | cursor.execute(f'SELECT * FROM Students WHERE StudentID=\'{Student_ID}\'') 1721 | results = cursor.fetchall() 1722 | if len(results) == 0: 1723 | self.label_Query_Result.setText( 1724 | PyQt5.QtCore.QCoreApplication.translate("Form", "There is no this student")) 1725 | return 1726 | Student_Name = self.lineEdit_Student_Name.text() 1727 | if len(Student_Name) != 0 and not Student_Name.isalpha(): 1728 | self.label_Query_Result.setText( 1729 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student Name must be English characters")) 1730 | return 1731 | Sex = self.lineEdit_Sex.text() 1732 | if Sex not in ['male', 'female', '']: 1733 | self.label_Query_Result.setText( 1734 | PyQt5.QtCore.QCoreApplication.translate("Form", "Sex must be \'male\' or \'female\'")) 1735 | return 1736 | Entrance_Age = self.lineEdit_Entrance_Age.text() 1737 | if len(Entrance_Age) != 0 and not Entrance_Age.isdigit(): 1738 | self.label_Query_Result.setText( 1739 | PyQt5.QtCore.QCoreApplication.translate("Form", "Entrance Age must in range [10,50]")) 1740 | return 1741 | if len(Entrance_Age) != 0 and not 10 <= int(Entrance_Age) <= 50: 1742 | self.label_Query_Result.setText( 1743 | PyQt5.QtCore.QCoreApplication.translate("Form", "Entrance_Age must in range [10,50]")) 1744 | return 1745 | Entrance_Year = self.lineEdit_Entrance_Year.text() 1746 | if len(Entrance_Year) != 0 and not Entrance_Year.isdigit(): 1747 | self.label_Query_Result.setText( 1748 | PyQt5.QtCore.QCoreApplication.translate("Form", "Entrance Year must a decimal number")) 1749 | return 1750 | Class = self.lineEdit_Class.text() 1751 | if Class != '': 1752 | for i in Class: 1753 | if i in specific_character: 1754 | self.label_Query_Result.setText( 1755 | PyQt5.QtCore.QCoreApplication.translate("Form", 1756 | "Class should not contain \\, /, :, ?, \", \', <, >, |")) 1757 | return 1758 | if Student_Name == '': 1759 | Student_Name = results[0][1] 1760 | if Sex == '': 1761 | Sex = results[0][2] 1762 | if Entrance_Age == '': 1763 | Entrance_Age = results[0][3] 1764 | Entrance_Age = int(Entrance_Age) 1765 | if Entrance_Year == '': 1766 | Entrance_Year = results[0][4] 1767 | Entrance_Year = int(Entrance_Year) 1768 | if Class == '': 1769 | Class = results[0][5] 1770 | cursor.execute(''' 1771 | UPDATE Students 1772 | SET StudentName=?, Sex=?, EntranceAge=?, EntranceYear=?, Class=? 1773 | WHERE StudentID=? 1774 | ''', [Student_Name, Sex, Entrance_Age, Entrance_Year, Class, Student_ID]) 1775 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Successfully Update")) 1776 | db.commit() 1777 | def Delete(self): 1778 | global db 1779 | cursor = db.cursor() 1780 | Student_ID = self.lineEdit_Modify_Student_ID.text() 1781 | if not Student_ID.isdigit() or len(Student_ID) != 10: 1782 | self.label_Query_Result.setText( 1783 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student ID must be a 10 digit decimal number")) 1784 | return 1785 | cursor.execute(f'SELECT * FROM Students WHERE StudentID=\'{Student_ID}\';') 1786 | results = cursor.fetchall() 1787 | if len(results) == 0: 1788 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "There is no data")) 1789 | return 1790 | cursor.execute(f'DELETE FROM Students WHERE StudentID=\'{Student_ID}\'') 1791 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Successfully Delete")) 1792 | cursor.execute(f'DELETE FROM AccountPassword WHERE Account=\'{Student_ID}\'') 1793 | db.commit() 1794 | class Course_Info_Modify_Ui(QtWidgets.QWidget): 1795 | back = PyQt5.QtCore.pyqtSignal() 1796 | def __init__(self): 1797 | QtWidgets.QWidget.__init__(self) 1798 | Form = self 1799 | Form.setObjectName("Form") 1800 | Form.resize(451, 465) 1801 | self.label_Query_Line = QtWidgets.QLabel(Form) 1802 | self.label_Query_Line.setGeometry(PyQt5.QtCore.QRect(10, 10, 431, 20)) 1803 | self.label_Query_Line.setObjectName("label_5") 1804 | self.label_Query_Course_ID = QtWidgets.QLabel(Form) 1805 | self.label_Query_Course_ID.setGeometry(PyQt5.QtCore.QRect(20, 47, 120, 16)) 1806 | self.label_Query_Course_ID.setObjectName("label") 1807 | self.label_Modify_Line = QtWidgets.QLabel(Form) 1808 | self.label_Modify_Line.setGeometry(PyQt5.QtCore.QRect(10, 80, 431, 20)) 1809 | self.label_Modify_Line.setObjectName("label_4") 1810 | self.label_Modify_Course_ID = QtWidgets.QLabel(Form) 1811 | self.label_Modify_Course_ID.setGeometry(PyQt5.QtCore.QRect(20, 100, 120, 16)) 1812 | self.label_Modify_Course_ID.setObjectName("label_7") 1813 | self.label_Course_Name = QtWidgets.QLabel(Form) 1814 | self.label_Course_Name.setGeometry(PyQt5.QtCore.QRect(20, 130, 120, 20)) 1815 | self.label_Course_Name.setObjectName("label_6") 1816 | self.label_Teacher_ID = QtWidgets.QLabel(Form) 1817 | self.label_Teacher_ID.setGeometry(PyQt5.QtCore.QRect(20, 160, 120, 20)) 1818 | self.label_Teacher_ID.setObjectName("label_3") 1819 | self.label_Credit = QtWidgets.QLabel(Form) 1820 | self.label_Credit.setGeometry(PyQt5.QtCore.QRect(20, 190, 120, 20)) 1821 | self.label_Credit.setObjectName("label_9") 1822 | self.label_Grade = QtWidgets.QLabel(Form) 1823 | self.label_Grade.setGeometry(PyQt5.QtCore.QRect(20, 220, 120, 20)) 1824 | self.label_Grade.setObjectName("label_8") 1825 | self.label_Canceled_Year = QtWidgets.QLabel(Form) 1826 | self.label_Canceled_Year.setGeometry(PyQt5.QtCore.QRect(20, 250, 120, 20)) 1827 | self.label_Canceled_Year.setObjectName("label_10") 1828 | self.label_Query_Result = QtWidgets.QLabel(Form) 1829 | self.label_Query_Result.setGeometry(PyQt5.QtCore.QRect(0, 280, 451, 20)) 1830 | self.label_Query_Result.setObjectName("label_11") 1831 | self.label_Query_Result.setAlignment(PyQt5.QtCore.Qt.AlignCenter) 1832 | self.label_Query_Result.setStyleSheet("color: rgb(250, 0, 0);") 1833 | 1834 | self.Button_Query_Course_Info = QtWidgets.QPushButton(Form) 1835 | self.Button_Query_Course_Info.setGeometry(PyQt5.QtCore.QRect(300, 30, 141, 50)) 1836 | self.Button_Query_Course_Info.setObjectName("pushButton") 1837 | self.Button_Query_Course_Info.clicked.connect(self.Query) 1838 | self.Button_Insert = QtWidgets.QPushButton(Form) 1839 | self.Button_Insert.setGeometry(PyQt5.QtCore.QRect(300, 100, 141, 51)) 1840 | self.Button_Insert.setObjectName("pushButton_2") 1841 | self.Button_Insert.clicked.connect(self.Insert) 1842 | self.Button_Update = QtWidgets.QPushButton(Form) 1843 | self.Button_Update.setGeometry(PyQt5.QtCore.QRect(300, 160, 141, 51)) 1844 | self.Button_Update.setObjectName("pushButton_3") 1845 | self.Button_Update.clicked.connect(self.Update) 1846 | self.Button_Delete = QtWidgets.QPushButton(Form) 1847 | self.Button_Delete.setGeometry(PyQt5.QtCore.QRect(300, 220, 141, 51)) 1848 | self.Button_Delete.setObjectName("pushButton_4") 1849 | self.Button_Delete.clicked.connect(self.Delete) 1850 | self.Button_Back = QtWidgets.QPushButton(Form) 1851 | self.Button_Back.setGeometry(PyQt5.QtCore.QRect(190, 435, 75, 24)) 1852 | self.Button_Back.setObjectName("pushButton_5") 1853 | self.Button_Back.clicked.connect(lambda: self.back.emit()) 1854 | 1855 | self.lineEdit_Query_Course_ID = QtWidgets.QLineEdit(Form) 1856 | self.lineEdit_Query_Course_ID.setGeometry(PyQt5.QtCore.QRect(140, 47, 150, 20)) 1857 | self.lineEdit_Query_Course_ID.setObjectName("lineEdit") 1858 | self.lineEdit_Modify_Course_ID = QtWidgets.QLineEdit(Form) 1859 | self.lineEdit_Modify_Course_ID.setGeometry(PyQt5.QtCore.QRect(140, 100, 150, 20)) 1860 | self.lineEdit_Modify_Course_ID.setObjectName("lineEdit_5") 1861 | self.lineEdit_Course_Name = QtWidgets.QLineEdit(Form) 1862 | self.lineEdit_Course_Name.setGeometry(PyQt5.QtCore.QRect(140, 130, 150, 20)) 1863 | self.lineEdit_Course_Name.setObjectName("lineEdit_4") 1864 | self.lineEdit_Teacher_ID = QtWidgets.QLineEdit(Form) 1865 | self.lineEdit_Teacher_ID.setGeometry(PyQt5.QtCore.QRect(140, 160, 150, 20)) 1866 | self.lineEdit_Teacher_ID.setObjectName("lineEdit_3") 1867 | self.lineEdit_Credit = QtWidgets.QLineEdit(Form) 1868 | self.lineEdit_Credit.setGeometry(PyQt5.QtCore.QRect(140, 190, 150, 20)) 1869 | self.lineEdit_Credit.setObjectName("lineEdit_7") 1870 | self.lineEdit_Grade = QtWidgets.QLineEdit(Form) 1871 | self.lineEdit_Grade.setGeometry(PyQt5.QtCore.QRect(140, 220, 150, 20)) 1872 | self.lineEdit_Grade.setObjectName("lineEdit_6") 1873 | self.lineEdit_Canceled_Year = QtWidgets.QLineEdit(Form) 1874 | self.lineEdit_Canceled_Year.setGeometry(PyQt5.QtCore.QRect(140, 250, 150, 20)) 1875 | self.lineEdit_Canceled_Year.setObjectName("lineEdit_8") 1876 | 1877 | self.tableWidget = QtWidgets.QTableWidget(Form) 1878 | self.tableWidget.setGeometry(PyQt5.QtCore.QRect(10, 306, 431, 120)) 1879 | self.tableWidget.setObjectName("tableWidget") 1880 | self.tableWidget.setColumnCount(0) 1881 | self.tableWidget.setRowCount(0) 1882 | 1883 | self.retranslateUi(Form) 1884 | PyQt5.QtCore.QMetaObject.connectSlotsByName(Form) 1885 | def retranslateUi(self, Form): 1886 | _translate = PyQt5.QtCore.QCoreApplication.translate 1887 | Form.setWindowTitle(_translate("Form", "Course Info Modify")) 1888 | self.label_Query_Line.setText(_translate("Form", "----------------------Query---------------------")) 1889 | self.label_Query_Course_ID.setText(_translate("Form", "Course ID")) 1890 | self.label_Modify_Line.setText(_translate("Form", "---------------------Modify---------------------")) 1891 | self.label_Modify_Course_ID.setText(_translate("Form", "Course ID")) 1892 | self.label_Course_Name.setText(_translate("Form", "Course Name")) 1893 | self.label_Teacher_ID.setText(_translate("Form", "Teacher ID")) 1894 | self.label_Credit.setText(_translate("Form", "Credit")) 1895 | self.label_Grade.setText(_translate("Form", "Grade")) 1896 | self.label_Canceled_Year.setText(_translate("Form", "Canceled Year")) 1897 | self.label_Query_Result.setText(_translate("Form", "Operation Result")) 1898 | 1899 | self.Button_Query_Course_Info.setText(_translate("Form", "Query Course\nInfo")) 1900 | self.Button_Insert.setText(_translate("Form", "Insert")) 1901 | self.Button_Update.setText(_translate("Form", "Update")) 1902 | self.Button_Delete.setText(_translate("Form", "Delete")) 1903 | self.Button_Back.setText(_translate("Form", "Back")) 1904 | def Query(self): 1905 | global db 1906 | Course_ID = self.lineEdit_Query_Course_ID.text() 1907 | cursor = db.cursor() 1908 | if Course_ID != '': 1909 | if not Course_ID.isdigit(): 1910 | self.label_Query_Result.setText( 1911 | PyQt5.QtCore.QCoreApplication.translate("Form", "Course ID must be a 7 digit decimal number")) 1912 | return 1913 | sql = f'SELECT * FROM Courses WHERE CourseID=\'{Course_ID}\' ORDER BY CourseID;' 1914 | else: 1915 | sql = 'SELECT * FROM Courses ORDER BY CourseID;' 1916 | cursor.execute(sql) 1917 | results = cursor.fetchall() 1918 | if len(results) > 0: 1919 | self.tableWidget.clear() 1920 | self.tableWidget.setColumnCount(0) 1921 | self.tableWidget.setRowCount(0) 1922 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Query Result")) 1923 | col_result = cursor.description 1924 | self.row = len(results) # 取得记录个数,用于设置表格的行数 1925 | self.vol = len(results[0]) # 取得字段数,用于设置表格的列数 1926 | col_result = list(col_result) 1927 | a = 0 1928 | self.tableWidget.setColumnCount(self.vol) 1929 | self.tableWidget.setRowCount(self.row) 1930 | for i in col_result: 1931 | item = QtWidgets.QTableWidgetItem() 1932 | self.tableWidget.setHorizontalHeaderItem(a, item) 1933 | item = self.tableWidget.horizontalHeaderItem(a) 1934 | item.setText(i[0]) 1935 | a = a + 1 1936 | results = list(results) 1937 | for i in range(len(results)): 1938 | results[i] = list(results[i]) 1939 | for i in range(self.row): 1940 | for j in range(self.vol): 1941 | item = QtWidgets.QTableWidgetItem() 1942 | self.tableWidget.setItem(i, j, item) 1943 | item = self.tableWidget.item(i, j) 1944 | item.setText(str(results[i][j])) 1945 | else: 1946 | self.tableWidget.clear() 1947 | self.tableWidget.setColumnCount(0) 1948 | self.tableWidget.setRowCount(0) 1949 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "There is no data")) 1950 | def Insert(self): 1951 | global db 1952 | cursor = db.cursor() 1953 | Course_ID = self.lineEdit_Modify_Course_ID.text() 1954 | if len(Course_ID) != 7 or not Course_ID.isdigit(): 1955 | self.label_Query_Result.setText( 1956 | PyQt5.QtCore.QCoreApplication.translate("Form", "Course ID must be a 7 digit decimal number")) 1957 | return 1958 | Course_Name = self.lineEdit_Course_Name.text() 1959 | for i in Course_Name: 1960 | if i in specific_character: 1961 | self.label_Query_Result.setText( 1962 | PyQt5.QtCore.QCoreApplication.translate("Form", "Course Name should not contain \\, /, :, ?, \", \', <, >, |")) 1963 | return 1964 | Teacher_ID = self.lineEdit_Teacher_ID.text() 1965 | if len(Teacher_ID) != 5 or not Teacher_ID.isdigit(): 1966 | self.label_Query_Result.setText( 1967 | PyQt5.QtCore.QCoreApplication.translate("Form", "Teacher ID must be a 5 digit decimal number")) 1968 | return 1969 | cursor.execute(f"SELECT * FROM Teachers WHERE TeacherID=\'{Teacher_ID}\'") 1970 | results = cursor.fetchall() 1971 | if len(results) == 0: 1972 | self.label_Query_Result.setText( 1973 | PyQt5.QtCore.QCoreApplication.translate("Form", "There is no matched Teacher")) 1974 | return 1975 | Credit = self.lineEdit_Credit.text() 1976 | if not Credit.isdigit(): 1977 | self.label_Query_Result.setText( 1978 | PyQt5.QtCore.QCoreApplication.translate("Form", "Credit must be a float number")) 1979 | return 1980 | Credit = float(Credit) 1981 | Grade = self.lineEdit_Grade.text() 1982 | if not Grade.isdigit(): 1983 | self.label_Query_Result.setText( 1984 | PyQt5.QtCore.QCoreApplication.translate("Form", "Grade must be an integer number")) 1985 | return 1986 | Grade = int(Grade) 1987 | if not 1 <= Grade <= 5: 1988 | self.label_Query_Result.setText( 1989 | PyQt5.QtCore.QCoreApplication.translate("Form", "Grade must in range [1,5]")) 1990 | return 1991 | Canceled_Year = self.lineEdit_Canceled_Year.text() 1992 | if Canceled_Year != '': 1993 | if not Canceled_Year.isdigit(): 1994 | self.label_Query_Result.setText( 1995 | PyQt5.QtCore.QCoreApplication.translate("Form", "Canceled Year must be an integer number or empty")) 1996 | return 1997 | Canceled_Year = int(Canceled_Year) 1998 | cursor.execute(f'SELECT * FROM Courses WHERE CourseID=\'{Course_ID}\'') 1999 | results = cursor.fetchall() 2000 | if len(results) != 0: 2001 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "This course is already exist")) 2002 | else: 2003 | if Canceled_Year == '': 2004 | cursor.execute(''' 2005 | INSERT INTO Courses (CourseID, CourseName, TeacherID, Credit, Grade) 2006 | VALUES (?, ?, ?, ?, ?) 2007 | ''', [Course_ID, Course_Name, Teacher_ID, Credit, Grade]) 2008 | else: 2009 | cursor.execute(''' 2010 | INSERT INTO Courses (CourseID, CourseName, TeacherID, Credit, Grade, CanceledYear) 2011 | VALUES (?, ?, ?, ?, ?, ?) 2012 | ''', [Course_ID, Course_Name, Teacher_ID, Credit, Grade, Canceled_Year]) 2013 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Successfully Insert")) 2014 | db.commit() 2015 | def Update(self): 2016 | global db 2017 | cursor = db.cursor() 2018 | Course_ID = self.lineEdit_Modify_Course_ID.text() 2019 | if len(Course_ID) != 7 or not Course_ID.isdigit(): 2020 | self.label_Query_Result.setText( 2021 | PyQt5.QtCore.QCoreApplication.translate("Form", "Course ID must be a 7 digit decimal number")) 2022 | return 2023 | cursor.execute(f'SELECT * FROM Courses WHERE CourseID=\'{Course_ID}\'') 2024 | results = cursor.fetchall() 2025 | if len(results) == 0: 2026 | self.label_Query_Result.setText( 2027 | PyQt5.QtCore.QCoreApplication.translate("Form", "There is no matched course")) 2028 | return 2029 | Course_Name = self.lineEdit_Course_Name.text() 2030 | if Course_Name != '': 2031 | for i in Course_Name: 2032 | if i in specific_character: 2033 | self.label_Query_Result.setText( 2034 | PyQt5.QtCore.QCoreApplication.translate("Form", 2035 | "Course Name should not contain \\, /, :, ?, \", \', <, >, |")) 2036 | return 2037 | Teacher_ID = self.lineEdit_Teacher_ID.text() 2038 | if Teacher_ID != '': 2039 | if len(Teacher_ID) != 5 or not Teacher_ID.isdigit(): 2040 | self.label_Query_Result.setText( 2041 | PyQt5.QtCore.QCoreApplication.translate("Form", "Teacher ID must be a 5 digit decimal number")) 2042 | return 2043 | cursor.execute(f'SELECT * FROM Teachers WHERE TeacherID=\'{Teacher_ID}\'') 2044 | result = cursor.fetchall() 2045 | if len(result) == 0: 2046 | self.label_Query_Result.setText( 2047 | PyQt5.QtCore.QCoreApplication.translate("Form", "There is no matched Teacher")) 2048 | return 2049 | Credit = self.lineEdit_Credit.text() 2050 | if Credit != '': 2051 | if not Credit.isdigit(): 2052 | self.label_Query_Result.setText( 2053 | PyQt5.QtCore.QCoreApplication.translate("Form", "Credit must be a float number")) 2054 | return 2055 | Credit = float(Credit) 2056 | Grade = self.lineEdit_Grade.text() 2057 | if Grade != '': 2058 | if not Grade.isdigit(): 2059 | self.label_Query_Result.setText( 2060 | PyQt5.QtCore.QCoreApplication.translate("Form", "Grade must be an integer number")) 2061 | return 2062 | Grade = int(Grade) 2063 | Canceled_Year = self.lineEdit_Canceled_Year.text() 2064 | if Canceled_Year != '': 2065 | if not Canceled_Year.isdigit(): 2066 | self.label_Query_Result.setText( 2067 | PyQt5.QtCore.QCoreApplication.translate("Form", "Canceled_Year must be an integer number")) 2068 | return 2069 | Canceled_Year = int(Canceled_Year) 2070 | if Course_Name == '': 2071 | Course_Name = results[0][1] 2072 | if Teacher_ID == '': 2073 | Teacher_ID = results[0][2] 2074 | if Credit == '': 2075 | Credit = results[0][3] 2076 | if Grade == '': 2077 | Grade = results[0][4] 2078 | if Canceled_Year == '': 2079 | Canceled_Year = results[0][5] 2080 | cursor.execute(''' 2081 | UPDATE Courses 2082 | SET CourseName=?, TeacherID=?, Credit=?, Grade=?, Canceled_Year=? 2083 | WHERE CourseID=? 2084 | ''', [Course_Name, Teacher_ID, Credit, Grade, Canceled_Year, Course_ID]) 2085 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Successfully Insert")) 2086 | db.commit() 2087 | def Delete(self): 2088 | global db 2089 | cursor = db.cursor() 2090 | Course_ID = self.lineEdit_Modify_Course_ID.text() 2091 | if len(Course_ID) != 7 or not Course_ID.isdigit(): 2092 | self.label_Query_Result.setText( 2093 | PyQt5.QtCore.QCoreApplication.translate("Form", "Course ID must be a 7 digit decimal number")) 2094 | return 2095 | cursor.execute(f'SELECT * FROM Courses WHERE CourseID=\'{Course_ID}\';') 2096 | results = cursor.fetchall() 2097 | if len(results) == 0: 2098 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "There is matched course")) 2099 | return 2100 | cursor.execute(f'DELETE FROM Courses WHERE CourseID=\'{Course_ID}\'') 2101 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Successfully Delete")) 2102 | db.commit() 2103 | class Course_Choosing_Info_Modify_Ui(QtWidgets.QWidget): 2104 | back = PyQt5.QtCore.pyqtSignal() 2105 | def __init__(self): 2106 | QtWidgets.QWidget.__init__(self) 2107 | Form = self 2108 | Form.setObjectName("Form") 2109 | Form.resize(451, 404) 2110 | self.label_Query_Line = QtWidgets.QLabel(Form) 2111 | self.label_Query_Line.setGeometry(PyQt5.QtCore.QRect(10, 10, 431, 20)) 2112 | self.label_Query_Line.setObjectName("label_5") 2113 | self.label_Query_Student_ID = QtWidgets.QLabel(Form) 2114 | self.label_Query_Student_ID.setGeometry(PyQt5.QtCore.QRect(20, 33, 120, 20)) 2115 | self.label_Query_Student_ID.setObjectName("label_12") 2116 | self.label_Query_Course_ID = QtWidgets.QLabel(Form) 2117 | self.label_Query_Course_ID.setGeometry(PyQt5.QtCore.QRect(20, 57, 120, 20)) 2118 | self.label_Query_Course_ID.setObjectName("label") 2119 | self.label_Modify_Line = QtWidgets.QLabel(Form) 2120 | self.label_Modify_Line.setGeometry(PyQt5.QtCore.QRect(10, 80, 431, 20)) 2121 | self.label_Modify_Line.setObjectName("label_4") 2122 | self.label_Modify_Student_ID = QtWidgets.QLabel(Form) 2123 | self.label_Modify_Student_ID.setGeometry(PyQt5.QtCore.QRect(20, 100, 120, 20)) 2124 | self.label_Modify_Student_ID.setObjectName("label_7") 2125 | self.label_Modify_Course_ID = QtWidgets.QLabel(Form) 2126 | self.label_Modify_Course_ID.setGeometry(PyQt5.QtCore.QRect(20, 130, 120, 20)) 2127 | self.label_Modify_Course_ID.setObjectName("label_6") 2128 | self.label_Teacher_ID = QtWidgets.QLabel(Form) 2129 | self.label_Teacher_ID.setGeometry(PyQt5.QtCore.QRect(20, 160, 120, 20)) 2130 | self.label_Teacher_ID.setObjectName("label_3") 2131 | self.label_Chosen_Year = QtWidgets.QLabel(Form) 2132 | self.label_Chosen_Year.setGeometry(PyQt5.QtCore.QRect(20, 190, 120, 20)) 2133 | self.label_Chosen_Year.setObjectName("label_9") 2134 | self.label_Query_Result = QtWidgets.QLabel(Form) 2135 | self.label_Query_Result.setGeometry(PyQt5.QtCore.QRect(0, 219, 451, 20)) 2136 | self.label_Query_Result.setObjectName("label_11") 2137 | self.label_Query_Result.setAlignment(PyQt5.QtCore.Qt.AlignCenter) 2138 | self.label_Query_Result.setStyleSheet("color: rgb(250, 0, 0);") 2139 | 2140 | self.Button_Query_Course_Info = QtWidgets.QPushButton(Form) 2141 | self.Button_Query_Course_Info.setGeometry(PyQt5.QtCore.QRect(300, 30, 141, 50)) 2142 | self.Button_Query_Course_Info.setObjectName("pushButton") 2143 | self.Button_Query_Course_Info.clicked.connect(self.Query) 2144 | self.Button_Insert = QtWidgets.QPushButton(Form) 2145 | self.Button_Insert.setGeometry(PyQt5.QtCore.QRect(300, 100, 141, 30)) 2146 | self.Button_Insert.setObjectName("pushButton_2") 2147 | self.Button_Insert.clicked.connect(self.Insert) 2148 | self.Button_Update = QtWidgets.QPushButton(Form) 2149 | self.Button_Update.setGeometry(PyQt5.QtCore.QRect(300, 140, 141, 30)) 2150 | self.Button_Update.setObjectName("pushButton_3") 2151 | self.Button_Update.clicked.connect(self.Update) 2152 | self.Button_Delete = QtWidgets.QPushButton(Form) 2153 | self.Button_Delete.setGeometry(PyQt5.QtCore.QRect(300, 180, 141, 30)) 2154 | self.Button_Delete.setObjectName("pushButton_4") 2155 | self.Button_Delete.clicked.connect(self.Delete) 2156 | self.Button_Back = QtWidgets.QPushButton(Form) 2157 | self.Button_Back.setGeometry(PyQt5.QtCore.QRect(190, 374, 75, 24)) 2158 | self.Button_Back.setObjectName("pushButton_5") 2159 | self.Button_Back.clicked.connect(lambda: self.back.emit()) 2160 | 2161 | self.lineEdit_Query_Student_ID = QtWidgets.QLineEdit(Form) 2162 | self.lineEdit_Query_Student_ID.setGeometry(PyQt5.QtCore.QRect(140, 33, 150, 20)) 2163 | self.lineEdit_Query_Student_ID.setObjectName("lineEdit_8") 2164 | self.lineEdit_Query_Course_ID = QtWidgets.QLineEdit(Form) 2165 | self.lineEdit_Query_Course_ID.setGeometry(PyQt5.QtCore.QRect(140, 57, 150, 20)) 2166 | self.lineEdit_Query_Course_ID.setObjectName("lineEdit") 2167 | self.lineEdit_Modify_Student_ID = QtWidgets.QLineEdit(Form) 2168 | self.lineEdit_Modify_Student_ID.setGeometry(PyQt5.QtCore.QRect(140, 100, 150, 20)) 2169 | self.lineEdit_Modify_Student_ID.setObjectName("lineEdit_5") 2170 | self.lineEdit_Modify_Course_ID = QtWidgets.QLineEdit(Form) 2171 | self.lineEdit_Modify_Course_ID.setGeometry(PyQt5.QtCore.QRect(140, 130, 150, 20)) 2172 | self.lineEdit_Modify_Course_ID.setObjectName("lineEdit_4") 2173 | self.lineEdit_Teacher_ID = QtWidgets.QLineEdit(Form) 2174 | self.lineEdit_Teacher_ID.setGeometry(PyQt5.QtCore.QRect(140, 160, 150, 20)) 2175 | self.lineEdit_Teacher_ID.setObjectName("lineEdit_3") 2176 | self.lineEdit_Chosen_Year = QtWidgets.QLineEdit(Form) 2177 | self.lineEdit_Chosen_Year.setGeometry(PyQt5.QtCore.QRect(140, 190, 150, 20)) 2178 | self.lineEdit_Chosen_Year.setObjectName("lineEdit_7") 2179 | 2180 | self.tableWidget = QtWidgets.QTableWidget(Form) 2181 | self.tableWidget.setGeometry(PyQt5.QtCore.QRect(10, 245, 431, 120)) 2182 | self.tableWidget.setObjectName("tableWidget") 2183 | self.tableWidget.setColumnCount(0) 2184 | self.tableWidget.setRowCount(0) 2185 | 2186 | self.retranslateUi(Form) 2187 | PyQt5.QtCore.QMetaObject.connectSlotsByName(Form) 2188 | def retranslateUi(self, Form): 2189 | _translate = PyQt5.QtCore.QCoreApplication.translate 2190 | Form.setWindowTitle(_translate("Form", "Course Choosing Info Modify")) 2191 | self.label_Query_Line.setText(_translate("Form", "----------------------Query---------------------")) 2192 | self.label_Query_Student_ID.setText(_translate("Form", "Student ID")) 2193 | self.label_Query_Course_ID.setText(_translate("Form", "Course ID")) 2194 | self.label_Modify_Line.setText(_translate("Form", "---------------------Modify---------------------")) 2195 | self.label_Modify_Student_ID.setText(_translate("Form", "Student ID")) 2196 | self.label_Modify_Course_ID.setText(_translate("Form", "Course ID")) 2197 | self.label_Teacher_ID.setText(_translate("Form", "Teacher ID")) 2198 | self.label_Chosen_Year.setText(_translate("Form", "Chosen Year")) 2199 | self.label_Query_Result.setText(_translate("Form", "Operation Result")) 2200 | 2201 | self.Button_Query_Course_Info.setText(_translate("Form", "Query Course\nChoosing Info")) 2202 | self.Button_Insert.setText(_translate("Form", "Insert")) 2203 | self.Button_Update.setText(_translate("Form", "Update")) 2204 | self.Button_Delete.setText(_translate("Form", "Delete")) 2205 | self.Button_Back.setText(_translate("Form", "Back")) 2206 | def Query(self): 2207 | global db 2208 | Student_ID = self.lineEdit_Query_Student_ID.text() 2209 | Course_ID = self.lineEdit_Query_Course_ID.text() 2210 | cursor = db.cursor() 2211 | if Student_ID == '' and Course_ID == '': 2212 | sql = f'SELECT * FROM CourseChoosing ORDER BY StudentID, CourseID;' 2213 | elif Student_ID == '' and Course_ID != '': 2214 | sql = f'SELECT * FROM CourseChoosing WHERE CourseID=\'{Course_ID}\' ORDER BY StudentID, CourseID;' 2215 | elif Student_ID != '' and Course_ID == '': 2216 | sql = f'SELECT * FROM CourseChoosing WHERE StudentID=\'{Student_ID}\' ORDER BY StudentID, CourseID;' 2217 | elif Student_ID != '' and Course_ID != '': 2218 | sql = f'SELECT * FROM CourseChoosing WHERE StudentID=\'{Student_ID}\' AND CourseID=\'{Course_ID}\' ORDER BY StudentID, CourseID;' 2219 | cursor.execute(sql) 2220 | results = cursor.fetchall() 2221 | if len(results) > 0: 2222 | self.tableWidget.clear() 2223 | self.tableWidget.setColumnCount(0) 2224 | self.tableWidget.setRowCount(0) 2225 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Query Result")) 2226 | col_result = cursor.description 2227 | self.row = len(results) # 取得记录个数,用于设置表格的行数 2228 | self.vol = len(results[0]) # 取得字段数,用于设置表格的列数 2229 | col_result = list(col_result) 2230 | a = 0 2231 | self.tableWidget.setColumnCount(self.vol) 2232 | self.tableWidget.setRowCount(self.row) 2233 | for i in col_result: 2234 | item = QtWidgets.QTableWidgetItem() 2235 | self.tableWidget.setHorizontalHeaderItem(a, item) 2236 | item = self.tableWidget.horizontalHeaderItem(a) 2237 | item.setText(i[0]) 2238 | a = a + 1 2239 | results = list(results) 2240 | for i in range(len(results)): 2241 | results[i] = list(results[i]) 2242 | for i in range(self.row): 2243 | for j in range(self.vol): 2244 | item = QtWidgets.QTableWidgetItem() 2245 | self.tableWidget.setItem(i, j, item) 2246 | item = self.tableWidget.item(i, j) 2247 | item.setText(str(results[i][j])) 2248 | else: 2249 | self.tableWidget.clear() 2250 | self.tableWidget.setColumnCount(0) 2251 | self.tableWidget.setRowCount(0) 2252 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "There is no data")) 2253 | def Insert(self): 2254 | global db 2255 | cursor = db.cursor() 2256 | Student_ID = self.lineEdit_Modify_Student_ID.text() 2257 | Course_ID = self.lineEdit_Modify_Course_ID.text() 2258 | Teacher_ID = self.lineEdit_Teacher_ID.text() 2259 | Chosen_Year = self.lineEdit_Chosen_Year.text() 2260 | if len(Student_ID) != 10 or not Student_ID.isdigit(): 2261 | self.label_Query_Result.setText( 2262 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student ID must be a 10 digit decimal number")) 2263 | return 2264 | if len(Course_ID) != 7 or not Course_ID.isdigit(): 2265 | self.label_Query_Result.setText( 2266 | PyQt5.QtCore.QCoreApplication.translate("Form", "Course ID must be a 7 digit decimal number")) 2267 | return 2268 | if len(Teacher_ID) != 5 or not Teacher_ID.isdigit(): 2269 | self.label_Query_Result.setText( 2270 | PyQt5.QtCore.QCoreApplication.translate("Form", "Teacher ID must be a 5 digit decimal number")) 2271 | return 2272 | if not Chosen_Year.isdigit(): 2273 | self.label_Query_Result.setText( 2274 | PyQt5.QtCore.QCoreApplication.translate("Form", "Chosen Year must be a decimal number")) 2275 | return 2276 | Chosen_Year = int(Chosen_Year) 2277 | cursor.execute(f'SELECT * FROM Students WHERE StudentID=\'{Student_ID}\'') 2278 | results = cursor.fetchall() 2279 | if len(results) == 0: 2280 | self.label_Query_Result.setText( 2281 | PyQt5.QtCore.QCoreApplication.translate("Form", "There is no matched student")) 2282 | return 2283 | if 1 <= today.month <= 6: 2284 | Chosen_Grade = Chosen_Year - results[0][4] 2285 | else: 2286 | Chosen_Grade = Chosen_Year - results[0][4] + 1 2287 | cursor.execute(f'SELECT * FROM Courses WHERE CourseID=\'{Course_ID}\'') 2288 | results = cursor.fetchall() 2289 | if len(results) == 0: 2290 | self.label_Query_Result.setText( 2291 | PyQt5.QtCore.QCoreApplication.translate("Form", "There is no matched course")) 2292 | return 2293 | Grade = results[0][4] 2294 | if Grade > Chosen_Grade: 2295 | self.label_Query_Result.setText( 2296 | PyQt5.QtCore.QCoreApplication.translate("Form", 2297 | f"The grade demand of this course is {Grade} while this student is in grade {Chosen_Grade}")) 2298 | return 2299 | if results[0][5] != None and Chosen_Year >= results[0][5]: 2300 | self.label_Query_Result.setText( 2301 | PyQt5.QtCore.QCoreApplication.translate("Form", f"Chosen Year must smaller than Canceled Year: {results[0][5]}")) 2302 | return 2303 | flag = False 2304 | for info in results: 2305 | if info[2] == Teacher_ID: 2306 | flag = True 2307 | break 2308 | if not flag: 2309 | self.label_Query_Result.setText( 2310 | PyQt5.QtCore.QCoreApplication.translate("Form", "There is no matched teacher")) 2311 | return 2312 | cursor.execute(f'SELECT * FROM CourseChoosing WHERE StudentID=\'{Student_ID}\' AND CourseID=\'{Course_ID}\' AND TeacherID=\'{Teacher_ID}\';') 2313 | results = cursor.fetchall() 2314 | if len(results) != 0: 2315 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "This Course Choosing is already exist")) 2316 | return 2317 | cursor.execute(''' 2318 | INSERT INTO CourseChoosing (StudentID, CourseID, TeacherID, ChosenYear) 2319 | VALUES (?, ?, ?, ?) 2320 | ''', [Student_ID, Course_ID, Teacher_ID, Chosen_Year]) 2321 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Successfully Insert")) 2322 | db.commit() 2323 | def Update(self): 2324 | global db 2325 | cursor = db.cursor() 2326 | Student_ID = self.lineEdit_Modify_Student_ID.text() 2327 | Course_ID = self.lineEdit_Modify_Course_ID.text() 2328 | Teacher_ID = self.lineEdit_Teacher_ID.text() 2329 | Chosen_Year = self.label_Chosen_Year.text() 2330 | if len(Student_ID) != 10 or not Student_ID.isdigit(): 2331 | self.label_Query_Result.setText( 2332 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student ID must be a 10 digit decimal number")) 2333 | return 2334 | if len(Course_ID) != 7 or not Course_ID.isdigit(): 2335 | self.label_Query_Result.setText( 2336 | PyQt5.QtCore.QCoreApplication.translate("Form", "Course ID must be a 7 digit decimal number")) 2337 | return 2338 | if len(Teacher_ID) != 5 or not Teacher_ID.isdigit(): 2339 | self.label_Query_Result.setText( 2340 | PyQt5.QtCore.QCoreApplication.translate("Form", "Teacher ID must be a 5 digit decimal number")) 2341 | return 2342 | if Chosen_Year != '': 2343 | if not Chosen_Year.isdigit(): 2344 | self.label_Query_Result.setText( 2345 | PyQt5.QtCore.QCoreApplication.translate("Form", "Chosen Year must be an integer number")) 2346 | return 2347 | Chosen_Year = int(Chosen_Year) 2348 | cursor.execute(f'SELECT * FROM CourseChoosing WHERE CourseID=\'{Course_ID}\' AND StudentID=\'{Student_ID}\' AND TeacherID=\'{Teacher_ID}\';') 2349 | CourseChoosing_Results = cursor.fetchall() 2350 | if len(CourseChoosing_Results) == 0: 2351 | self.label_Query_Result.setText( 2352 | PyQt5.QtCore.QCoreApplication.translate("Form", "There is no matched course choosing record")) 2353 | return 2354 | cursor.execute(f'SELECT * FROM Courses WHERE CourseID=\'{Course_ID}\'') 2355 | Courses_results = cursor.fetchall() 2356 | if Chosen_Year != '' and Courses_results[0][5] != None and Chosen_Year >= Courses_results[0][5]: 2357 | self.label_Query_Result.setText( 2358 | PyQt5.QtCore.QCoreApplication.translate("Form", f"Chosen Year must smaller than Canceled Year: {Courses_results[0][5]}")) 2359 | return 2360 | cursor.execute(f'SELECT * FROM Students WHERE StudentID=\'{Student_ID}\'') 2361 | Student_results = cursor.fetchall() 2362 | if len(Student_results) == 0: 2363 | self.label_Query_Result.setText( 2364 | PyQt5.QtCore.QCoreApplication.translate("Form", 2365 | f"There is no matched student")) 2366 | return 2367 | Grade = Courses_results[0][4] 2368 | if 1 <= today.month <= 6: 2369 | Chosen_Grade = Chosen_Year - Student_results[0][4] 2370 | else: 2371 | Chosen_Grade = Chosen_Year - Student_results[0][4] + 1 2372 | if Grade > Chosen_Grade: 2373 | self.label_Query_Result.setText( 2374 | PyQt5.QtCore.QCoreApplication.translate("Form", 2375 | f"The grade demand of this course is {Grade} while this student is in grade {Chosen_Grade}")) 2376 | return 2377 | if Chosen_Year == '': 2378 | Chosen_Year = CourseChoosing_Results[0][3] 2379 | cursor.execute(''' 2380 | UPDATE CourseChoosing 2381 | SET ChosenYear=? 2382 | WHERE StudentID=? AND CourseID=? AND TeacherID=? 2383 | ''', [Chosen_Year, Student_ID, Course_ID, Teacher_ID]) 2384 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Successfully Update")) 2385 | db.commit() 2386 | def Delete(self): 2387 | global db 2388 | cursor = db.cursor() 2389 | Student_ID = self.lineEdit_Modify_Student_ID.text() 2390 | if len(Student_ID) != 10 or not Student_ID.isdigit(): 2391 | self.label_Query_Result.setText( 2392 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student ID must be a 10 digit decimal number")) 2393 | return 2394 | Course_ID = self.lineEdit_Modify_Course_ID.text() 2395 | if len(Course_ID) != 7 or not Course_ID.isdigit(): 2396 | self.label_Query_Result.setText( 2397 | PyQt5.QtCore.QCoreApplication.translate("Form", "Course ID must be a 7 digit decimal number")) 2398 | return 2399 | Teacher_ID = self.lineEdit_Teacher_ID.text() 2400 | if len(Teacher_ID) != 5 or not Teacher_ID.isdigit(): 2401 | self.label_Query_Result.setText( 2402 | PyQt5.QtCore.QCoreApplication.translate("Form", "Teacher ID must be a 5 digit decimal number")) 2403 | return 2404 | cursor.execute(f'SELECT * FROM CourseChoosing WHERE StudentID=\'{Student_ID}\' AND CourseID=\'{Course_ID}\' AND TeacherID=\'{Teacher_ID}\';') 2405 | results = cursor.fetchall() 2406 | if len(results) == 0: 2407 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "There is matched Course Choosing")) 2408 | return 2409 | cursor.execute(f'DELETE FROM CourseChoosing WHERE StudentID=\'{Student_ID}\' AND CourseID=\'{Course_ID}\' AND TeacherID=\'{Teacher_ID}\';') 2410 | self.label_Query_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Successfully Delete")) 2411 | db.commit() 2412 | class Set_Student_Score_Ui(QtWidgets.QWidget): 2413 | back = PyQt5.QtCore.pyqtSignal() 2414 | def __init__(self): 2415 | QtWidgets.QWidget.__init__(self) 2416 | Form = self 2417 | Form.setObjectName("Form") 2418 | Form.resize(371, 220) 2419 | self.Button_Set_Score = QtWidgets.QPushButton(Form) 2420 | self.Button_Set_Score.setGeometry(PyQt5.QtCore.QRect(90, 120, 90, 40)) 2421 | self.Button_Set_Score.setObjectName("pushButton_2") 2422 | self.Button_Set_Score.clicked.connect(self.set_score) 2423 | self.Button_Back = QtWidgets.QPushButton(Form) 2424 | self.Button_Back.setGeometry(PyQt5.QtCore.QRect(190, 120, 90, 40)) 2425 | self.Button_Back.setObjectName("pushButton_1") 2426 | self.Button_Back.clicked.connect(lambda: self.back.emit()) 2427 | self.label_Student_ID = QtWidgets.QLabel(Form) 2428 | self.label_Student_ID.setGeometry(PyQt5.QtCore.QRect(30, 30, 100, 16)) 2429 | self.label_Student_ID.setObjectName("label") 2430 | self.label_Course_ID = QtWidgets.QLabel(Form) 2431 | self.label_Course_ID.setGeometry(PyQt5.QtCore.QRect(30, 60, 100, 16)) 2432 | self.label_Course_ID.setObjectName("label_2") 2433 | self.label_Score = QtWidgets.QLabel(Form) 2434 | self.label_Score.setGeometry(PyQt5.QtCore.QRect(30, 90, 100, 16)) 2435 | self.label_Score.setObjectName("label_3") 2436 | self.lineEdit_Student_ID = QtWidgets.QLineEdit(Form) 2437 | self.lineEdit_Student_ID.setGeometry(PyQt5.QtCore.QRect(140, 30, 201, 20)) 2438 | self.lineEdit_Student_ID.setObjectName("lineEdit") 2439 | self.lineEdit_Course_ID = QtWidgets.QLineEdit(Form) 2440 | self.lineEdit_Course_ID.setGeometry(PyQt5.QtCore.QRect(140, 60, 201, 20)) 2441 | self.lineEdit_Course_ID.setObjectName("lineEdit_2") 2442 | self.lineEdit_Score = QtWidgets.QLineEdit(Form) 2443 | self.lineEdit_Score.setGeometry(PyQt5.QtCore.QRect(140, 90, 201, 20)) 2444 | self.lineEdit_Score.setObjectName("lineEdit_3") 2445 | self.label_Operation_Result = QtWidgets.QLabel(Form) 2446 | self.label_Operation_Result.setGeometry(PyQt5.QtCore.QRect(0, 170, 371, 40)) 2447 | self.label_Operation_Result.setAlignment(PyQt5.QtCore.Qt.AlignCenter) 2448 | self.label_Operation_Result.setObjectName("label_4") 2449 | self.label_Operation_Result.setStyleSheet("color: rgb(250, 0, 0);") 2450 | 2451 | self.retranslateUi(Form) 2452 | PyQt5.QtCore.QMetaObject.connectSlotsByName(Form) 2453 | def set_score(self): 2454 | global db 2455 | global userID 2456 | StudentID = self.lineEdit_Student_ID.text() 2457 | if not StudentID.isdigit() or len(StudentID) != 10: 2458 | self.label_Operation_Result.setText( 2459 | PyQt5.QtCore.QCoreApplication.translate("Form", "Student ID must be a\n10 digit decimal number")) 2460 | return 2461 | CourseID = self.lineEdit_Course_ID.text() 2462 | if not CourseID.isdigit() or len(CourseID) != 7: 2463 | self.label_Operation_Result.setText( 2464 | PyQt5.QtCore.QCoreApplication.translate("Form", "Course ID must be a\n7 digit decimal number")) 2465 | return 2466 | new_score = self.lineEdit_Score.text() 2467 | if not new_score.isdigit() or not 0 <= float(new_score) <= 100: 2468 | self.label_Operation_Result.setText( 2469 | PyQt5.QtCore.QCoreApplication.translate("Form", "Score must be a real number\nin range [0,100]")) 2470 | return 2471 | cursor = db.cursor() 2472 | sql = f'SELECT * FROM CourseChoosing WHERE TeacherID=\'{userID}\' AND CourseID=\'{CourseID}\' AND StudentID=\'{StudentID}\' ORDER BY ChosenYear DESC;' 2473 | cursor.execute(sql) 2474 | results = cursor.fetchall() 2475 | if len(results) == 0: 2476 | self.label_Operation_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "You have no permission")) 2477 | return 2478 | Chosen_Year = results[0][3] 2479 | sql = f'UPDATE CourseChoosing SET Score=\'{float(new_score)}\' WHERE CourseID=\'{CourseID}\' AND StudentID=\'{StudentID}\' AND ChosenYear=\'{Chosen_Year}\';' 2480 | cursor.execute(sql) 2481 | self.label_Operation_Result.setText(PyQt5.QtCore.QCoreApplication.translate("Form", "Successfully set score")) 2482 | db.commit() 2483 | def retranslateUi(self, Form): 2484 | _translate = PyQt5.QtCore.QCoreApplication.translate 2485 | Form.setWindowTitle(_translate("Form", "Set Student's Score")) 2486 | self.Button_Set_Score.setText(_translate("Form", "Set Score")) 2487 | self.Button_Back.setText(_translate("Form", "Back")) 2488 | self.label_Student_ID.setText(_translate("Form", "Student ID")) 2489 | self.label_Course_ID.setText(_translate("Form", "Course ID")) 2490 | self.label_Score.setText(_translate("Form", "Score")) 2491 | self.label_Operation_Result.setText(_translate("Form", "Operation Result")) 2492 | class Change_Password_Ui(QtWidgets.QWidget): 2493 | ret = PyQt5.QtCore.pyqtSignal() 2494 | def __init__(self): 2495 | QtWidgets.QWidget.__init__(self) 2496 | Form = self 2497 | Form.setObjectName("Form") 2498 | Form.resize(400, 160) 2499 | self.lineEdit_Original_Password = QtWidgets.QLineEdit(Form) 2500 | self.lineEdit_Original_Password.setGeometry(PyQt5.QtCore.QRect(180, 20, 191, 20)) 2501 | self.lineEdit_Original_Password.setObjectName("lineEdit_2") 2502 | self.lineEdit_New_Password = QtWidgets.QLineEdit(Form) 2503 | self.lineEdit_New_Password.setGeometry(PyQt5.QtCore.QRect(180, 50, 191, 20)) 2504 | self.lineEdit_New_Password.setObjectName("lineEdit_3") 2505 | self.label_Original_Password = QtWidgets.QLabel(Form) 2506 | self.label_Original_Password.setGeometry(PyQt5.QtCore.QRect(10, 20, 160, 20)) 2507 | self.label_Original_Password.setObjectName("label") 2508 | self.label_New_Password = QtWidgets.QLabel(Form) 2509 | self.label_New_Password.setGeometry(PyQt5.QtCore.QRect(55, 50, 150, 20)) 2510 | self.label_New_Password.setObjectName("label_2") 2511 | self.Button_Modify = QtWidgets.QPushButton(Form) 2512 | self.Button_Modify.setGeometry(PyQt5.QtCore.QRect(120, 80, 75, 24)) 2513 | self.Button_Modify.setObjectName("pushButton") 2514 | self.Button_Modify.clicked.connect(self.Modify_Password) 2515 | self.Button_Return = QtWidgets.QPushButton(Form) 2516 | self.Button_Return.setGeometry(PyQt5.QtCore.QRect(210, 80, 75, 24)) 2517 | self.Button_Return.setObjectName("pushButton_2") 2518 | self.Button_Return.clicked.connect(self.send_ret_signal) 2519 | self.label_Original_Password_Error = QtWidgets.QLabel(Form) 2520 | self.label_Original_Password_Error.setGeometry(PyQt5.QtCore.QRect(0, 110, 400, 40)) 2521 | self.label_Original_Password_Error.setObjectName("label_3") 2522 | self.label_Original_Password_Error.setVisible(False) 2523 | self.label_Original_Password_Error.setAlignment(PyQt5.QtCore.Qt.AlignCenter) 2524 | self.label_Original_Password_Error.setStyleSheet("color: rgb(250, 0, 0);") 2525 | 2526 | self.retranslateUi(Form) 2527 | PyQt5.QtCore.QMetaObject.connectSlotsByName(Form) 2528 | def Modify_Password(self): 2529 | global userID 2530 | original_password = self.lineEdit_Original_Password.text() 2531 | for i in original_password: 2532 | if i in specific_character: 2533 | self.label_Original_Password_Error.setText( 2534 | QtCore.QCoreApplication.translate("Form", "Original Password should not contain\n\\, /, :, ?, \", \', <, >, |")) 2535 | self.label_Original_Password_Error.setVisible(True) 2536 | return 2537 | new_password = self.lineEdit_New_Password.text() 2538 | for i in new_password: 2539 | if i in specific_character: 2540 | self.label_Original_Password_Error.setText( 2541 | QtCore.QCoreApplication.translate("Form", "New Password Should not contain\n\\, /, :, ?, \", \', <, >, |")) 2542 | self.label_Original_Password_Error.setVisible(True) 2543 | return 2544 | cursor = db.cursor() 2545 | sql = f"select * from AccountPassword where Account=\'{userID}\';" 2546 | cursor.execute(sql) 2547 | results = cursor.fetchall() 2548 | if str(results[0][2]) != original_password: 2549 | self.label_Original_Password_Error.setText(QtCore.QCoreApplication.translate("Form", "Original Password Error")) 2550 | self.label_Original_Password_Error.setVisible(True) 2551 | return 2552 | if len(new_password) == 0: 2553 | self.label_Original_Password_Error.setText(QtCore.QCoreApplication.translate("Form", "Password should not be empty")) 2554 | self.label_Original_Password_Error.setVisible(True) 2555 | return 2556 | sql = f'UPDATE AccountPassword SET Password=\'{new_password}\' WHERE Account=\'{userID}\';' 2557 | cursor.execute(sql) 2558 | self.label_Original_Password_Error.setText( 2559 | QtCore.QCoreApplication.translate("Form", "Successfully Modify")) 2560 | self.label_Original_Password_Error.setVisible(True) 2561 | db.commit() 2562 | def send_ret_signal(self): 2563 | self.ret.emit() 2564 | def retranslateUi(self, Form): 2565 | _translate = PyQt5.QtCore.QCoreApplication.translate 2566 | Form.setWindowTitle(_translate("Form", "Change Password")) 2567 | self.label_Original_Password.setText(_translate("Form", "Original Password")) 2568 | self.Button_Modify.setText(_translate("Form", "Modify")) 2569 | self.label_New_Password.setText(_translate("Form", "New Password")) 2570 | self.label_Original_Password_Error.setText(_translate("Form", "Original Password Error")) 2571 | self.Button_Return.setText(_translate("Form", "Return")) 2572 | class Controller: 2573 | def show_login(self): 2574 | self.login = Login_Ui() 2575 | self.login.admin_window.connect(self.show_admin) 2576 | self.login.teacher_window.connect(self.show_teacher) 2577 | self.login.student_window.connect(self.show_student) 2578 | self.login.show() 2579 | def show_admin(self): 2580 | self.admin = Admin_Ui() 2581 | self.admin.cp.connect(self.show_change_password) 2582 | self.admin.query.connect(self.show_query) 2583 | self.admin.mi.connect(self.show_modify_info) 2584 | self.admin.logout.connect(self.back_login) 2585 | self.admin.show() 2586 | self.login.close() 2587 | def show_teacher(self): 2588 | self.teacher = Teacher_Ui() 2589 | self.teacher.lo.connect(self.back_login) 2590 | self.teacher.query.connect(self.show_query) 2591 | self.teacher.cp.connect(self.show_change_password) 2592 | self.teacher.sss.connect(self.show_set_student_score) 2593 | self.teacher.show() 2594 | self.login.close() 2595 | def show_student(self): 2596 | self.student = Student_Ui() 2597 | self.student.logout.connect(self.back_login) 2598 | self.student.query.connect(self.show_query) 2599 | self.student.change.connect(self.show_change_password) 2600 | self.student.show() 2601 | self.login.close() 2602 | def show_query(self): 2603 | if userChar == "admin": 2604 | self.admin.close() 2605 | elif userChar == "teacher": 2606 | self.teacher.close() 2607 | elif userChar == "student": 2608 | self.student.close() 2609 | self.query = Query_Ui() 2610 | self.query.stu_info.connect(self.show_student_info_query) 2611 | self.query.stu_score.connect(self.show_student_score_info_query) 2612 | self.query.cou_info.connect(self.show_course_info_query) 2613 | self.query.ti.connect(self.show_teacher_info_query) 2614 | self.query.ave_score.connect(self.show_average_score_info_query) 2615 | self.query.bs.connect(self.back_from_query) 2616 | self.query.show() 2617 | def back_from_query(self): 2618 | self.query.close() 2619 | if userChar == "admin": 2620 | self.show_admin() 2621 | elif userChar == "teacher": 2622 | self.show_teacher() 2623 | elif userChar == "student": 2624 | self.show_student() 2625 | def show_student_info_query(self): 2626 | self.query.close() 2627 | self.ssiq = Student_Info_Query_Ui() 2628 | self.ssiq.back.connect(self.show_student_info_query_back_query) 2629 | self.ssiq.show() 2630 | def show_teacher_info_query(self): 2631 | self.query.close() 2632 | self.stiq = Teaching_Info_Query_Ui() 2633 | self.stiq.back.connect(self.show_teacher_info_query_back_query) 2634 | self.stiq.show() 2635 | def show_teacher_info_query_back_query(self): 2636 | self.stiq.close() 2637 | self.query.show() 2638 | def show_student_info_query_back_query(self): 2639 | self.ssiq.close() 2640 | self.query.show() 2641 | def show_student_score_info_query(self): 2642 | self.query.close() 2643 | self.sssiq = Student_Score_Query_Ui() 2644 | self.sssiq.back.connect(self.show_student_scor_info_query_back_query) 2645 | self.sssiq.show() 2646 | def show_student_scor_info_query_back_query(self): 2647 | self.sssiq.close() 2648 | self.query.show() 2649 | def show_course_info_query(self): 2650 | self.query.close() 2651 | self.sciq = Course_Info_Query_Ui() 2652 | self.sciq.back.connect(self.show_course_info_query_back_to_query) 2653 | self.sciq.show() 2654 | def show_course_info_query_back_to_query(self): 2655 | self.sciq.close() 2656 | self.query.show() 2657 | def show_average_score_info_query(self): 2658 | self.query.close() 2659 | self.sasiq = Average_Score_Info_Query_Ui() 2660 | self.sasiq.back.connect(self.show_average_score_info_query_back_to_query) 2661 | self.sasiq.show() 2662 | def show_average_score_info_query_back_to_query(self): 2663 | self.sasiq.close() 2664 | self.query.show() 2665 | def show_set_student_score(self): 2666 | self.teacher.close() 2667 | self.ssss = Set_Student_Score_Ui() 2668 | self.ssss.back.connect(self.set_score_to_teacher) 2669 | self.ssss.show() 2670 | def set_score_to_teacher(self): 2671 | self.ssss.close() 2672 | self.teacher.show() 2673 | def show_modify_info(self): 2674 | self.modify = Modify_Info_Ui() 2675 | self.modify.show() 2676 | self.modify.stu_info.connect(self.show_student_info_modify) 2677 | self.modify.cou_info.connect(self.show_course_info_modify) 2678 | self.modify.coc_info.connect(self.show_course_choosing_info_modify) 2679 | self.modify.bs.connect(self.back_from_modify) 2680 | self.modify.show() 2681 | self.admin.close() 2682 | def back_from_modify(self): 2683 | self.modify.close() 2684 | self.admin.show() 2685 | def show_student_info_modify(self): 2686 | self.modify.close() 2687 | self.ssim = Student_Info_Modify_Ui() 2688 | self.ssim.back.connect(self.back_to_modify_from_ssim) 2689 | self.ssim.show() 2690 | def back_to_modify_from_ssim(self): 2691 | self.ssim.close() 2692 | self.modify.show() 2693 | def show_course_info_modify(self): 2694 | self.modify.close() 2695 | self.scim = Course_Info_Modify_Ui() 2696 | self.scim.back.connect(self.back_to_modify_from_scim) 2697 | self.scim.show() 2698 | def back_to_modify_from_scim(self): 2699 | self.scim.close() 2700 | self.modify.show() 2701 | def show_course_choosing_info_modify(self): 2702 | self.modify.close() 2703 | self.sccim = Course_Choosing_Info_Modify_Ui() 2704 | self.sccim.back.connect(self.back_to_modify_from_sccim) 2705 | self.sccim.show() 2706 | def back_to_modify_from_sccim(self): 2707 | self.sccim.close() 2708 | self.modify.show() 2709 | def back_login(self): 2710 | if userChar == "admin": 2711 | self.admin.close() 2712 | elif userChar == "teacher": 2713 | self.teacher.close() 2714 | elif userChar == "student": 2715 | self.student.close() 2716 | self.show_login() 2717 | def show_change_password(self): 2718 | if userChar == "admin": 2719 | self.admin.close() 2720 | elif userChar == "teacher": 2721 | self.teacher.close() 2722 | elif userChar == "student": 2723 | self.student.close() 2724 | self.CP = Change_Password_Ui() 2725 | self.CP.ret.connect(self.change_password_return) 2726 | self.CP.show() 2727 | def change_password_return(self): 2728 | self.CP.close() 2729 | if userChar == "admin": 2730 | self.show_admin() 2731 | elif userChar == "teacher": 2732 | self.show_teacher() 2733 | elif userChar == "student": 2734 | self.show_student() 2735 | def main(): 2736 | app = QtWidgets.QApplication(sys.argv) 2737 | controller = Controller() 2738 | controller.show_login() 2739 | sys.exit(app.exec_()) 2740 | if __name__ == "__main__": 2741 | main() 2742 | -------------------------------------------------------------------------------- /MySQL Code for Experiment 1.doc: -------------------------------------------------------------------------------- 1 | drop database if exists experiment1; 2 | CREATE DATABASE if not exists experiment1; 3 | 4 | use experiment1; 5 | -- (1) 6 | CREATE TABLE Student( 7 | ID VARCHAR (20) COMMENT 'Student\'s ID', 8 | Name VARCHAR (10) COMMENT 'Student\'s Name', 9 | Age INT COMMENT 'Student\'s Age', 10 | Department VARCHAR(30) COMMENT 'Student\'s Dept' 11 | ); 12 | -- (2) 13 | CREATE TABLE Course( 14 | CourseID VARCHAR (15) COMMENT 'Course\'s ID', 15 | CourseName VARCHAR (30) COMMENT 'Course\'s Name', 16 | CourseBefore VARCHAR (15) NOT NULL DEFAULT '-' COMMENT 'Previous Course' 17 | ); 18 | -- (3) 19 | CREATE TABLE Choose( 20 | ID VARCHAR (20) COMMENT 'Student\'s ID', 21 | CourseID VARCHAR (15) COMMENT 'Course\'s ID', 22 | Score DECIMAL (5,2) COMMENT 'Student\'s Score' 23 | ); 24 | 25 | -- (4) 26 | INSERT INTO Student (ID, Name, Age, Department) 27 | VALUES('00001', 'ZhangSan', 20, 'Computer Science'); 28 | 29 | INSERT INTO Student (ID, Name, Age, Department) 30 | VALUES('00002', 'LiSi', 19, 'Computer Science'); 31 | 32 | INSERT INTO Student (ID, Name, Age, Department) 33 | VALUES('00003', 'WangWu', 21, 'Computer Science'); 34 | 35 | -- (5) 36 | INSERT INTO Course (CourseID, CourseName) 37 | VALUES('C1','Introduction to Computer'); 38 | 39 | INSERT INTO Course (CourseID, CourseName, CourseBefore) 40 | VALUES('C2','PASCAL Programming Language', 'C1'); 41 | 42 | INSERT INTO Course (CourseID, CourseName, CourseBefore) 43 | VALUES('C3','Data Structure', 'C2'); 44 | 45 | -- (6) 46 | INSERT INTO Choose (ID, CourseID, Score) 47 | VALUES('00001','C1',95); 48 | 49 | INSERT INTO Choose (ID, CourseID, Score) 50 | VALUES('00001','C2',80); 51 | 52 | INSERT INTO Choose (ID, CourseID, Score) 53 | VALUES('00001','C3',84); 54 | 55 | INSERT INTO Choose (ID, CourseID, Score) 56 | VALUES('00002','C1',80); 57 | 58 | INSERT INTO Choose (ID, CourseID, Score) 59 | VALUES('00002','C2',85); 60 | 61 | INSERT INTO Choose (ID, CourseID, Score) 62 | VALUES('00003','C1',78); 63 | 64 | INSERT INTO Choose (ID, CourseID, Score) 65 | VALUES('00003','C3',70); 66 | 67 | -- (7) 68 | SELECT ID, Name 69 | FROM Student 70 | WHERE Department = 'Computer Science'; 71 | 72 | -- (8) 73 | SELECT s.ID, s.Name, c.CourseName, ch.Score 74 | FROM Student s 75 | INNER JOIN Choose ch ON s.ID = ch.ID 76 | INNER JOIN Course c ON ch.CourseID = c.CourseID 77 | order by s.ID, CourseName; 78 | 79 | -- (9) 80 | SELECT * 81 | FROM Student 82 | order by ID desc; 83 | 84 | -- (10) 85 | SELECT s.ID, s.Name, avg(ch.Score) 'Average Score' 86 | FROM Student s 87 | INNER JOIN Choose ch ON s.ID = ch.ID 88 | group by s.ID, s.Name; 89 | 90 | -- (11) 91 | SELECT s.ID, s.Name, count(ch.ID) 'Number of Courses' 92 | FROM Student s 93 | INNER JOIN Choose ch ON s.ID = ch.ID 94 | group by s.ID, s.Name; 95 | 96 | -- (12) 97 | SELECT ch.CourseID, co.CourseName, COUNT(ch.CourseID) Student_Number 98 | FROM Choose ch 99 | INNER JOIN Course co ON ch.CourseID = co.CourseID 100 | GROUP BY ch.CourseID, co.CourseName; 101 | 102 | -- (13) 103 | SELECT s.ID Student_ID 104 | FROM Student s 105 | INNER JOIN Choose ch ON s.ID = ch.ID 106 | WHERE ch.CourseID = 'C1' and ch.Score > 80; 107 | 108 | -- (14) 109 | SELECT s.ID Student_ID 110 | FROM Student s 111 | INNER JOIN Choose ch ON s.ID = ch.ID 112 | WHERE ch.CourseID = 'C2'; 113 | 114 | -- (15) 115 | SELECT Department, avg(age) 116 | from Student 117 | group by Department; -------------------------------------------------------------------------------- /Program Manual.docx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SwordRain2004/SCUT-CS-Database-Experiment/8e06f420057f944ad77310f55a84b9cc17e8f3e1/Program Manual.docx -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SCUT-CS-Database-Experiment 2 | 华南理工大学计科全英班数据库实验,求求大家帮我star一下吧!这对我非常重要! 3 | 4 | 实验要求: 5 | 6 | Experiment and design 1-2.docx 7 | 8 | 实验一: 9 | 10 | MySQL Code for Experiment 1.doc 11 | 12 | Report of Experiment 1.doc 13 | 14 | 实验二: 15 | 16 | Experiment2.py 17 | 18 | Database.db 19 | 20 | Database Design Document.docx 21 | 22 | Program Manual.docx 23 | 24 | 下学期的大作业和实验2类似,可以直接按照这个模板去做 25 | -------------------------------------------------------------------------------- /Report of Experiment 1.doc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SwordRain2004/SCUT-CS-Database-Experiment/8e06f420057f944ad77310f55a84b9cc17e8f3e1/Report of Experiment 1.doc --------------------------------------------------------------------------------