要求
综合应用Python程序设计的知识设计与实现一款简单的图书管理系统。具体功能要求可参考以下几点。当然,希望你能写出更有价值的功能:
(1)具有用户(学生、教师)注册和登录功能功能,教师用户:姓名、年龄、联系电话,性别,住址;学生用户:姓名、年龄、班级、专业、电话、学号等。
(2)具有学生端功能:可以按课程名称关键字模糊查找所学课程;可以修改个人基本信息;查询所学课程成绩;
(3)具有教师端编辑功能:查询教师信息、学生信息、录入学生成绩、修改学生成绩、删除学生成绩等功能。
(6)期待同学们设计与实现更多其他功能
(7)系统功能完整,程序运行稳定,打包成独立的exe文件
实现效果
实验环境
- anaconda3 — python3.9
- Navicat Premium 15 — SQLite3
- PyQt5
设计
界面
- 1、找到电脑中PySide2的designer.exe
import PySide2 # 导入要查看的库
print(PySide2.__file__) # 打印库文件位置
- 到\Users\86184\anaconda3\lib\site-packages\PySide2中到designer.exe,双击打开。
- 2、选择Main Window创建
ctrl + r 查看效果图 - 3、Label 标签设计
- 背景颜色
background-color:rgb(227, 227, 227);
- 文本
- 文体
- 4、Stacked Widget 堆叠设计
右键可插入页
- 5、PushButton 按钮设计
QPushButton{
background-color:rgba(228, 255, 251);
}
QPushButton::hover{
background-color:rgba(85, 255, 127);
}
文本与字体的设计和上述【Label 标签设计】操作一致。
- 6、Line Edit 输入框、Text Browser 显示框 设计
- 7、按钮触发页面转换
以下讲解原理,不陈述完成代码,完整触发代码直接问GPT。
第一步找到你需要触发的按钮的名称;
第二步找到你需要触发按钮后转换页面的下标
第三步将按钮的名称放于第一行self.后面,页面下标放于最后一行的括号中;其按钮点击后会跳转到teacher函数中触发页面。
# 点击教师端进入教师页面
self.pushButton.clicked.connect(self.teacher)
def teacher(self): # 首页->教师端
self.stackedWidget.setCurrentIndex(0)
- 8、Line Edit 输入框获取输入值
第一步找到你输入完后确定按钮的名称;
第二步找到输入框的名称;
第三步将按钮名称放于第一行代码self.后面,输入框的名称放于teacher_enroll_input函数中代码self.后面;其按钮点击后会跳转到teacher_enroll_input函数中,待获得全部输入值后再进行下一步。
# 首页->教师端->注册,点击确定; teacher_enroll_input为统一输入指令
self.pushButton_10.clicked.connect(self.teacher_enroll_input)
# 注册
def teacher_enroll_input(self): # 教师端注册输入的信息
value1 = str(self.lineEdit_6.text())
value2 = str(self.lineEdit_5.text())
value3 = str(self.lineEdit_4.text())
value4 = str(self.lineEdit_3.text())
value5 = str(self.lineEdit_2.text())
value6 = str(self.lineEdit.text())
- 9、Text Browser 显示框显示
第一步找到显示框的名称;
第二步通过一行代码即可显示,将显示框名称放于self.后面即可;其相当于print(),因此放在哪都可以(其它函数也亦可)。
self.textBrowser_15.append('教师数据录入成功!')
- 初学者目前的掌握程度,仅供参考,如有错误、好方法,欢迎评论、私聊。
数据库
原先使用的是mysql,但写完后发现转db文件太麻烦了,则采用SQLite3直接生成数据库文件,相比于mysql本人觉得不要太方便了。
- 1、建库建表
第一步下载完navicat后,左上角连接选择SQLite;
第二步新建SQLite3,输入连接名,其它的不用输入,点击测试连接,连接成功则点确定即可;
第三步通过代码建表、录入数据;
该代码并不完整,简明讲解原理;大部分原理可以看注释或者问GPT,现只讲解一下注意事项。
将新建的db.sqlite3文件放在同一目录下,使用with 连接,即使中断,它还会再连接上;
在 value 这行代码中,SQLite3与mysql不同在于最后的代码上,MySQL是 ‘VALUE (%s)’,而SQLite3则是’VALUES (?)',同时在插入时也是需要将%s改为?。
import sqlite3 # 导入库
''' 连接数据库 '''
with sqlite3.connect('db.sqlite3') as db:
# 在上下文环境中进行操作
cur = db.cursor() # 声明一个游标
self.sql_teacher(cur, value1, value2, value3, value4, value5, value6)
def sql_teacher(self, cur, user_name, user_password, user_age, user_call, user_sex, user_address):
try: # 捕获异常
# 如果表不存在则创建,教师_Data_Table为表名
sqlQuery = "CREATE TABLE IF NOT EXISTS 教师_Data_Table(姓名 CHAR(20) NOT NULL," \
"密码 CHAR(20) NOT NULL, 年龄 CHAR(20), 联系电话 CHAR(20) NOT NULL, 性别 CHAR(20), 住址 CHAR(20) )"
cur.execute(sqlQuery) # execute() sql语句执行
''' 数据录入 '''
sqlQuery = ' INSERT INTO 教师_Data_Table (姓名,密码,年龄,联系电话,性别,住址) VALUES (?,?,?,?,?,?) '
value = (user_name, user_password, user_age, user_call, user_sex, user_address)
cur.execute(sqlQuery, value)
db.commit()
self.textBrowser_15.append('教师数据录入成功!') # 在textBrowser上显示信息
except sqlite3.Error as e: # 输出Error
self.textBrowser_15.append('教师数据库操作出现错误:' + str(e))
创建了4张表,
教师表
学生表
成绩表
课程表
- 2、账号密码的对比
先将教师表\学生表的账号密码存进字典中;
def login(self,cur, name):
sqlQuery = "SELECT * FROM " + name + "_Data_Table"
try:
res = {}
cur.execute(sqlQuery)
results = cur.fetchall()
for row in results: # 获得姓名、密码
res[row[0]] = row[1]
return res
except sqlite3.Error as e:
self.textBrowser_10.append(name + "数据查询失败:" + str(e))
再for循环匹配输入的账号密码是否与数据库的相同,不同则报错;
# 登录
def student_login_input(self): # 学生端登录输入的信息
names = str(self.lineEdit_16.text()) # 获得姓名、密码
passwords = str(self.lineEdit_17.text())
res = self.login(cur, '学生')
flag = 0 # 标识,防止for循环输出多个提示信息
for k, v in res.items():
if names == k and passwords == v:
self.stackedWidget.setCurrentIndex(16) # 进入学生端页面
flag = 1
if flag == 0:
self.textBrowser_9.append('姓名\密码错误!请重新输入。')
- 3、数据删除
注意的点在于sqlQuery语句中变量的类型要设为?,在value中如果是只有一个变量则需在后面加一个逗号。
def delete(self, name, student_name):
sqlQuery = "DELETE FROM " + name + "_Data_Table where 姓名=?"
value = (student_name,)
try:
cur.execute(sqlQuery, value)
db.commit()
self.textBrowser_6.append('删除成功!')
except sqlite3.Error as e:
self.textBrowser_6.append(name + "数据删除失败:" + str(e))
db.rollback() # 发生错误时回滚
- 4、数据修改
def teacher_revise(self, name, revise_title, revise_agodata, revise_data):
sqlQuery = "UPDATE " + name + "_Data_Table SET " + revise_title + "= ? WHERE " + revise_title + "=?"
value = (revise_data, revise_agodata) # (修改的值,原值)
try:
cur.execute(sqlQuery, value)
db.commit()
except sqlite3.Error as e:
self.textBrowser_7.append("数据更新失败:" + str(e))
db.rollback() # 发生错误时回滚
- 5、关键字模糊查询
由于关键字查询需做到至少输入一个字符即可知道相关课程的信息,而本项目课程表的设计为3位老师,每位老师兼多门课(最多3门),则本项目需设3个course_blur()函数,其中只是查询语句中的课程1、课程2、课程3不同。本人采用简略的方法,如有更好的方法欢迎评论、私信。
def course_blur1(self, cur, inputs):
sqlQuery = "select 姓名,课程1 from 课程_data_table where 课程1 like '" + inputs + "%'"
cur.execute(sqlQuery)
results = cur.fetchall()
for row in results: # 获得个人信息
self.textBrowser_14.append('教师姓名:%s \n课程:%s' % (row[0], row[1]))
exe打包
第一步将需要用到的py、ui、数据库文件放在无英文目录下;
第二步运行一遍py文件(打包时只能有一个py,但可以通过该py再调用其它py),生成一个编译环境(pycache);
第三步在该目录下打开cmd;
第四步输入以下命令 pyinstaller -w conda.py ;
第五步,完成后,再将目录下的全部文件(除了build、dist两个文件夹)复制放在dist中的文件夹中;
第六步然后在exe目录下打开cmd,运行conda.exe;
如有报错则使用以下方法添加缺失的库
import pymysql # 导入要查看的库
print(pymysql.file) # 打印库文件位置
第七步问题解决后即可运行exe了,右键即可添加快捷方式;亦可拖到桌面。
总结
实现本项目是不需要多少时间的,但前提是需要掌握好SQL、QT的使用。本项目还是比较简略的,但作为期末大作业还是可以的。
源代码
- 需要源代码 --> 点赞收藏关注 --> 私信我