Compare commits

...

7 Commits

@ -0,0 +1,93 @@
"""
代码功能添加用户界面设计与功能实现
"""
import sys
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox
from ComboCheckBox import QComboCheckBox
from db import sql_execute
from sqls import *
class AddAdmin(object):
# 界面设计
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(360, 279)
self.label = QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(40, 40, 54, 12))
self.label.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label.setObjectName("label")
self.textEdit = QtWidgets.QLineEdit(Form)
self.textEdit.setGeometry(QtCore.QRect(100, 30, 181, 31))
self.textEdit.setObjectName("textEdit")
self.label0 = QtWidgets.QLabel(Form)
self.label0.setGeometry(QtCore.QRect(40, 90, 54, 12))
self.label0.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label0.setObjectName("label")
self.textEdit0 = QtWidgets.QLineEdit(Form)
self.textEdit0.setGeometry(QtCore.QRect(100, 80, 181, 31))
self.textEdit0.setObjectName("textEdit")
self.textEdit_2 = QtWidgets.QLineEdit(Form)
self.textEdit_2.setGeometry(QtCore.QRect(100, 130, 181, 31))
self.textEdit_2.setObjectName("textEdit_2")
self.label_2 = QtWidgets.QLabel(Form)
self.label_2.setGeometry(QtCore.QRect(40, 140, 54, 12))
self.label_2.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_2.setObjectName("label_2")
classlist = sql_execute(getClassList('0', ''))
self.textEdit_3 = QComboCheckBox(Form)
for class_ in classlist:
self.textEdit_3.add_item('%d.%s' % (class_[0], class_[1]), flag=False)
self.textEdit_3.setGeometry(QtCore.QRect(100, 180, 181, 31))
self.textEdit_3.setObjectName("textEdit_3")
self.label_3 = QtWidgets.QLabel(Form)
self.label_3.setGeometry(QtCore.QRect(23, 190, 71, 20))
self.label_3.setObjectName("label_3")
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(110, 240, 75, 23))
self.pushButton.setObjectName("pushButton")
# 提交按钮
self.pushButton.clicked.connect(lambda: self.addAdmin(Form))
self.pushButton_2 = QtWidgets.QPushButton(Form)
self.pushButton_2.setGeometry(QtCore.QRect(190, 240, 75, 23))
self.pushButton_2.setObjectName("pushButton_2")
# 取消按钮
self.pushButton_2.clicked.connect(lambda: Form.hide())
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "新增角色"))
self.label.setText(_translate("Form", "用户名:"))
self.label0.setText(_translate("Form", "密码:"))
self.label_2.setText(_translate("Form", "备注:"))
self.label_3.setText(_translate("Form", "可管理班级:"))
self.pushButton.setText(_translate("Form", "提交"))
self.pushButton_2.setText(_translate("Form", "取消"))
# 功能实现
def addAdmin(self, Form):
username = self.textEdit.text()
password = self.textEdit0.text()
mark = self.textEdit_2.text()
classids = self.textEdit_3.get_class_text()
sql_execute(insertAdmin(username, password, mark, classids))
QMessageBox.about(Form, '成功', "添加成功!请刷新列表数据。")
Form.hide()
# 测试
if __name__ == "__main__":
App = QApplication(sys.argv) # 创建QApplication对象作为GUI主程序入口
aw = AddAdmin() # 创建主窗体对象实例化Ui_MainWindow
w = QMainWindow() # 实例化QMainWindow类
aw.setupUi(w) # 主窗体对象调用setupUi方法对QMainWindow对象进行设置
w.show() # 显示主窗体
w.setWindowTitle('Python学生管理系统-新增用户')
sys.exit(App.exec_()) # 循环中等待退出程序

@ -0,0 +1,125 @@
from PyQt5.QtWidgets import QWidget, QComboBox, QLineEdit, QListView
from PyQt5.QtGui import QStandardItemModel, QStandardItem, QMouseEvent
from PyQt5.Qt import Qt
global classIds
classIds = ''
# 全选与单选的绑定(没有这个会导致勾选数据错乱)
def show_text(function):
def wrapped(self, *args, **kwargs):
global classIds
if self.vars["showTextLock"]:
self.vars["showTextLock"] = False
result = function(self, *args, **kwargs)
items = self.get_selected()
l = len(items)
l_ = self.vars["listViewModel"].rowCount() - 1
self.vars["listViewModel"].item(0).setCheckState(
Qt.Checked if l == l_ else Qt.Unchecked if l == 0 else Qt.PartiallyChecked)
self.vars["lineEdit"].setText(
"(全选)" if l == l_ else "(无选择)" if l == 0 else ";".join((item.text() for item in items)))
self.vars["showTextLock"] = True
classIds = "" if l == 0 else ",".join((item.text().split('.')[0] for item in items))
else:
result = function(self, *args, **kwargs)
return result
return wrapped
# 选项的渲染和选择后的显示
class QComboCheckBox(QComboBox):
class MyListView(QListView):
def __init__(self, parent: QWidget = None, vars=None):
super().__init__(parent)
self.vars = vars
def mousePressEvent(self, event: QMouseEvent):
self.vars["lock"] = False
super().mousePressEvent(event)
def mouseDoubleClickEvent(self, event: QMouseEvent):
self.vars["lock"] = False
super().mouseDoubleClickEvent(event)
def __init__(self, parent: QWidget = None):
super().__init__(parent)
self.vars = dict()
self.vars["lock"] = True
self.vars["showTextLock"] = True
# 装饰器锁避免批量操作时重复改变lineEdit的显示
self.vars["lineEdit"] = QLineEdit(self)
self.vars["lineEdit"].setReadOnly(True)
self.vars["listView"] = self.MyListView(self, self.vars)
self.vars["listViewModel"] = QStandardItemModel(self)
self.setModel(self.vars["listViewModel"])
self.setView(self.vars["listView"])
self.setLineEdit(self.vars["lineEdit"])
self.activated.connect(self.__show_selected)
self.add_item("(全选)")
@show_text
def add_item(self, text: "str", flag=False):
# 根据文本添加子项
item = QStandardItem()
item.setText(text)
item.setCheckable(True)
if flag:
item.setCheckState(Qt.Checked)
self.vars["listViewModel"].appendRow(item)
# 根据文本查找子项
def find_text(self, text: "str"):
tempList = self.vars["listViewModel"].findItems(text)
tempList.pop(0) if tempList and tempList[0].row() == 0 else tempList
return tempList
# 获取班级ids
def get_class_text(self):
return classIds
@show_text # 全选
def select_all(self):
for row in range(0, self.vars["listViewModel"].rowCount()):
self.vars["listViewModel"].item(row).setCheckState(Qt.Checked)
@show_text # 全不选
def select_clear(self):
for row in range(0, self.vars["listViewModel"].rowCount()):
self.vars["listViewModel"].item(row).setCheckState(Qt.Unchecked)
# 获取当前选择的子项
def get_selected(self):
items = list()
for row in range(1, self.vars["listViewModel"].rowCount()):
item = self.vars["listViewModel"].item(row)
if item.checkState() == Qt.Checked:
items.append(item)
return items
@show_text # 显示选中的选项
def __show_selected(self, index):
# 未被选中
if not self.vars["lock"]:
# 选中全选
if index == 0:
if self.vars["listViewModel"].item(0).checkState() == Qt.Checked:
self.select_clear()
else:
self.select_all()
# 选中其他
else:
self.__select_reverse(index)
self.vars["lock"] = True
# 选中一个选项
def __select_reverse(self, row: "int"):
item = self.vars["listViewModel"].item(row)
item.setCheckState(Qt.Unchecked if item.checkState() == Qt.Checked else Qt.Checked)

@ -0,0 +1,24 @@
"""
项目名称python pyqt5 mysql 学生管理系统
作者bhml
时间2022/11/28
代码功能存放系统中需要多次使用的全局变量
"""
USER = (1, 'admin', '0', '0', '0')
# 管理模块标识
FLAG_STUDENT = 1 # 学生管理
FLAG_CLASS = 2 # 班级管理
FLAG_ADMIN = 3 # 角色管理
FLAG_GRADE = 4 # 成绩管理
FLAG_INFO = 5 # 修改资料
# 登录窗口
LOGIN_WINDOW = None
# 数据库配置
DB_HOST = 'localhost'
DB_USER = 'root'
DB_PASSWORD = '123456'
DB_NAME = 'db_studentms'

@ -0,0 +1,122 @@
"""
代码功能修改用户界面设计与功能实现
"""
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow, QMessageBox, QInputDialog, QLineEdit
from ComboCheckBox import QComboCheckBox
from db import sql_execute
from sqls import *
class EditAdmin(object):
# 界面设计
def setupUi(self, Form, adminId):
Form.setObjectName("Form")
Form.resize(360, 279)
self.label = QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(40, 40, 54, 12))
self.label.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label.setObjectName("label")
admin = sql_execute(getAdminById(adminId))[0]
self.textEdit = QtWidgets.QLineEdit(Form)
self.textEdit.setGeometry(QtCore.QRect(100, 30, 181, 31))
self.textEdit.setText(admin[1])
self.textEdit.setObjectName("textEdit")
self.textEdit_2 = QtWidgets.QLineEdit(Form)
self.textEdit_2.setGeometry(QtCore.QRect(100, 80, 181, 31))
self.textEdit_2.setText(admin[3])
self.textEdit_2.setObjectName("textEdit_2")
self.label_2 = QtWidgets.QLabel(Form)
self.label_2.setGeometry(QtCore.QRect(40, 90, 54, 12))
self.label_2.setAlignment(QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter)
self.label_2.setObjectName("label_2")
self.textEdit_3 = QComboCheckBox(Form)
class_dict = []
try:
# 不为超级管理员
if admin[4] != '0':
data4 = admin[4].split(',')
for d in data4:
class_dict.append(d)
except Exception as e:
pass
# 获取班级列表(供老师选择来管理)
classlist = sql_execute(getClassList('0', ''))
for class_ in classlist:
self.textEdit_3.add_item('%d.%s' % (class_[0], class_[1]),
flag=admin[4] == '0' or str(class_[0]) in class_dict)
self.textEdit_3.setGeometry(QtCore.QRect(100, 130, 181, 31))
self.textEdit_3.setObjectName("textEdit_3")
self.label_3 = QtWidgets.QLabel(Form)
self.label_3.setGeometry(QtCore.QRect(23, 140, 71, 20))
self.label_3.setObjectName("label_3")
self.pushButton = QtWidgets.QPushButton(Form)
self.pushButton.setGeometry(QtCore.QRect(150, 220, 75, 23))
self.pushButton.setObjectName("pushButton")
# 提交按钮
self.pushButton.clicked.connect(lambda: self.updateAdmin(adminId, Form))
self.pushButton_2 = QtWidgets.QPushButton(Form)
self.pushButton_2.setGeometry(QtCore.QRect(230, 220, 75, 23))
self.pushButton_2.setObjectName("pushButton_2")
# 取消按钮
self.pushButton_2.clicked.connect(lambda: Form.hide())
self.pushButton_3 = QtWidgets.QPushButton(Form)
self.pushButton_3.setGeometry(QtCore.QRect(10, 220, 75, 23))
self.pushButton_3.setObjectName("pushButton_3")
# 重置密码按钮
self.pushButton_3.clicked.connect(lambda: self.resetPassw(adminId, Form))
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
# 重新翻译(针对性修改)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "编辑角色"))
self.label.setText(_translate("Form", "用户名:"))
self.label_2.setText(_translate("Form", "备注:"))
self.label_3.setText(_translate("Form", "可管理班级:"))
self.pushButton.setText(_translate("Form", "提交"))
self.pushButton_2.setText(_translate("Form", "取消"))
self.pushButton_3.setText(_translate("Form", "重置密码"))
# 功能实现(修改用户名)
def updateAdmin(self, adminId, Form):
username = self.textEdit.text()
mark = self.textEdit_2.text()
classids = self.textEdit_3.get_class_text()
sql_execute(updateAdminById(adminId, username, mark, classids))
QMessageBox.about(Form, '成功', "编辑成功!请刷新列表数据。")
Form.hide()
# 功能实现(重置密码)
def resetPassw(self, adminId, Form):
text, okPressed = QInputDialog.getText(Form, "重置密码", "新密码:", QLineEdit.Normal, '')
if okPressed:
try:
sql_execute(resetAdminPasswById(adminId, text))
QMessageBox.about(Form, '成功', '重置密码成功!')
except Exception as e:
QMessageBox.critical(Form, '失败', '重置密码失败:\n')
Form.hide()
# 测试
if __name__ == "__main__":
import sys
App = QApplication(sys.argv) # 创建QApplication对象作为GUI主程序入口
aw = EditAdmin() # 创建主窗体对象实例化Ui_MainWindow
w = QMainWindow() # 实例化QMainWindow类
aw.setupUi(w, 1) # 主窗体对象调用setupUi方法对QMainWindow对象进行设置
w.show() # 显示主窗体
w.setWindowTitle('Python学生管理系统-修改用户')
sys.exit(App.exec_()) # 循环中等待退出程序

45
db.py

@ -0,0 +1,45 @@
"""
代码功能数据库链接与交互
"""
import pymysql
import hashlib
import Config as C
global conn
conn = None
# 01获取数据库连接
def conn_mysql():
conn = None
try:
conn = pymysql.connect(host=C.DB_HOST, port=3306, user=C.DB_USER, password=C.DB_PASSWORD, db=C.DB_NAME,
charset='utf8')
except Exception as e:
print(e)
return conn
# 02根据SQL语句操作数据库
def sql_execute(sql):
global conn
if conn is None:
conn = conn_mysql()
cur = conn.cursor()
cur.execute(sql)
result = cur.fetchall()
cur.close()
return result
# 03获取MD5加密结果
def md5(text):
text = bytes(text, encoding='utf-8')
return hashlib.md5(text).hexdigest()
if __name__ == "__main__":
str_md5 = md5("123456")
print('MD5加密后为 ' + str_md5)

@ -0,0 +1,81 @@
/*
Navicat MySQL Data Transfer
Source Server : mysql57
Source Server Type : MySQL
Source Server Version : 50709
Source Host : localhost:3306
Source Schema : db_studentms
Target Server Type : MySQL
Target Server Version : 50709
File Encoding : 65001
Date: 03/02/2023 00:46:44
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for admin
-- ----------------------------
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (
`a_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '1.超级管理员 其他.班级管理员',
`a_username` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '用户名',
`a_password` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '密码 长度6-18 (MD5加密)',
`a_mark` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '备注',
`a_classid` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '可管理班级id多个班级id可用,隔开',
PRIMARY KEY (`a_id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 17 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '管理员表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of admin
-- ----------------------------
INSERT INTO `admin` VALUES (1, 'admin', 'e10adc3949ba59abbe56e057f20f883e', '超级管理员', '0');
INSERT INTO `admin` VALUES (2, 'bhml', 'e10adc3949ba59abbe56e057f20f883e', '兵慌码乱', '1');
INSERT INTO `admin` VALUES (3, 'lyt', 'e10adc3949ba59abbe56e057f20f883e', '李有田', '2');
INSERT INTO `admin` VALUES (4, 'james', 'e10adc3949ba59abbe56e057f20f883e', '詹姆斯', '1,2');
-- ----------------------------
-- Table structure for class_
-- ----------------------------
DROP TABLE IF EXISTS `class_`;
CREATE TABLE `class_` (
`c_id` int(11) NOT NULL AUTO_INCREMENT,
`c_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '班级名称',
PRIMARY KEY (`c_id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 16 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '班级表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of class_
-- ----------------------------
INSERT INTO `class_` VALUES (1, '软件工程1班');
INSERT INTO `class_` VALUES (2, '网络工程1班');
-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
`s_id` int(11) NOT NULL AUTO_INCREMENT,
`s_realname` varchar(5) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '姓名',
`s_number` int(11) NULL DEFAULT NULL COMMENT '学号',
`s_sex` int(11) NOT NULL DEFAULT 0 COMMENT '性别 1.男2.女',
`s_class` int(11) NOT NULL DEFAULT 0 COMMENT '所属班级id',
`s_chinese` int(11) NOT NULL DEFAULT 0 COMMENT '语文成绩',
`s_math` int(11) NOT NULL DEFAULT 0 COMMENT '数学成绩',
`s_english` int(11) NOT NULL DEFAULT 0 COMMENT '外语成绩',
PRIMARY KEY (`s_id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 529 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '学生信息表' ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (4, 'kobe', 1004, 1, 2, 0, 0, 0);
INSERT INTO `student` VALUES (3, '高启兰', 1003, 2, 1, 0, 0, 0);
INSERT INTO `student` VALUES (2, '安欣', 1002, 1, 2, 0, 0, 0);
INSERT INTO `student` VALUES (1, '高启强', 1001, 1, 1, 99, 99, 60);
SET FOREIGN_KEY_CHECKS = 1;

1677
main.py

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save