最新python学生管理系统(pyqt5 含界面)_学生管理系统pyqt5,Golang开发者必须收藏的8个开源库

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

sudo service docker status(q退出)


或者`docker -v` 


### 安装Mysql


1、拉取mysql。



docker pull mysql


2、创建一个目录存放mysql数据文件。



mkdir mysql


3、 进入mysql目录。



cd mysql


4、启动mysql。(scc110186为密码,自己设置,开放安全组3306端口)



docker run --name mysqlserver -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=scc110186 -d -i -p 3306:3306 mysql:latest


5、查看mysql在容器的名称。



docker ps -a


6、进入docker mysql容器。



docker exec -it mysqlserver bash


7、连接mysql。



mysql -uroot -pscc110186


8、执行命令。



ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘password’;
ALTER USER ‘root’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘scc110186’;


9、打开SQLyog等数据库连接软件,输入主机地址,用户名,密码,进行连接,即可连接成功。


## 项目功能插件部分


### Mysql数据库操作部分


#### 连接数据库


首先,因为我们的代码中,经常出现增删查改的部分,那么我们可以认为这个部分就是高频调用部分,那么一般我们再写项目的时候,我们可以将高频调用的部分,直接放入我们的函数中,再用一个类对这些函数统一进行封装,来封装出类的方法。  
 那么首先我们的类的初始化部分,一定要对数据库进行连接,然后创建游标。用self来修饰变量,使他们可以在整个类中被访问到。  
 下面的代码涉及到数据库参数的部分,被我清除了,请大家自行写入。



class db_handle:
def init(self):
# 初始化自动连接Mysql数据库
self.db = pymysql.connect(host=“”,
user=“”,
password=“”,
database=“”)
self.cur = self.db.cursor()


上面的代码中self.db和self.cur为整个db\_handle类中公用的部分。所以我们可以在类的方法中进行调用、访问。


#### 账号密码登陆验证


其次就是账号密码登录部分,我们可以封装一个方法,接受两个形参,一个是账号,一个是密码。因为账号为数据库的主键,所以账号是唯一的,所以我们可以通过搜索账号,获取数据库中存储的密码,来进行验证。代码如下:



def login_check(self, id, pwd):
“”"
登录时账号密码的检查函数
Author:SCC
:param id: 账号
:param pwd: 密码
:return: True / False
“”"
sql_message = “SELECT pwd FROM login_db WHERE id=‘{}’”.format(id) # 因为 id 为主键
self.cur.execute(sql_message)
data = self.cur.fetchall()
logger.debug(data)
right_pwd = data[0][0]
if pwd == right_pwd:
return True
else:
return False


那么我们可以看到一个搜索数据库的一个方法。`SELECT ? FROM ? WHERE ?`。搜索到的结果一般是以元组来装载的,在元组中又是一个又一个小的元组。我们可以通过下标进行访问。用for或while进行遍历输出。函数的返回值为True或者False。这样我们的界面在调用函数时,就可以清楚的知道账号密码是否正确。同时可以通过if判断来对函数返回值的True和False做判断,实现登陆界面是否跳转主界面的逻辑。


#### 搜索表内所有学生数据


在界面打开后我们需要搜索所有学生的信息,并显示在tableWidget控件上。那么我们可以继续使用搜索语句,搜索数据库中所有的学生信息。



def info_init(self):
sql_message = “SELECT * FROM student_info” # 搜索所有学生信息数据
self.cur.execute(sql_message) # 执行语句
datas = self.cur.fetchall() # 获取所有信息结果
logger.debug(datas)
data_list = [data for data in datas]
return data_list


上面就是对所有学生信息进行查询的方法,在查询之后,将每一组学生数据通过列表进行存储。上述存储方式使用的为列表推导式。如果为初学阶段,可以改为如下代码。



for data in datas:
data_list.append(data)


上面为简易版本,但是速度上存在差异,不适用于高数据IO时进行使用。如果可以的话,甚至可以封装一个queue队列,进行先入先出显示。存储在线程中。会让程序更加高效。


#### 删除学生信息


现在就是我们进入增删改查部分的编写了,我们要先对学生的信息删除进行编写。代码如下:



def remove(self, name, id, class_text, phone, addr):
sql_message = “DELETE FROM student_info WHERE name=‘{}’”
" and id=‘{}’"
" and class=‘{}’"
" and phone=‘{}’"
" and addr=‘{}’".format(name, id, class_text, phone, addr)
self.cur.execute(sql_message)
self.db.commit()


上述代码中包含了删除的书写方式,同时可以将删除部分写在一行中,但是因为Python书写规范中明确表明:一行字符最多不能超过120个,所以使用这种方式更加规范,易读。


#### 增加、更改、查询学生信息


剩下的代码就是增删改查中增、改、查部分了。主题思路与删除一致。不过多赘述。



def search(self, name):
sql_message = “SELECT * FROM student_info WHERE name=‘{}’”.format(name)
self.cur.execute(sql_message)
datas = self.cur.fetchall()
data_list = [data for data in datas]
return data_list

def insert(self, name, id, class_text, phone, addr):
sql_message = “INSERT INTO student_info(name, id, class, phone, addr)”
" values(‘{}’, ‘{}’, ‘{}’, ‘{}’, ‘{}’)".format(name, id, class_text, phone, addr)
self.cur.execute(sql_message)
self.db.commit()

def change(self, name, id, class_text, phone, addr, oname, oid, oclass_text, ophone, oaddr):
sql_message = “UPDATE student_info set name=‘{}’,id=‘{}’,class=‘{}’,phone = ‘{}’,addr=‘{}’”
“where name = ‘{}’ and id=‘{}’ and class=‘{}’ and phone = ‘{}’ and addr=‘{}’”.format(
name, id, class_text, phone, addr, oname, oid, oclass_text, ophone, oaddr
)
self.cur.execute(sql_message)
self.db.commit()


### UI界面设计


因为初版为Demo版本所以界面,没有过多美化。大家可以自行添加QSS进行修改。先给大家放一下我们两个界面的设计图。  
 ![在这里插入图片描述](https://img-blog.csdnimg.cn/7d1e7a7d3b9149feacac4d9040352647.png)


上面这个就是用控件图绘制的界面。


#### 登陆界面


下面我们来讲一下登陆界面的逻辑,首先登录界面有账号密码登录,人脸识别登录。因为人脸识别涉及到了一些dll动态链接库和一些不同操作系统下的检测,并且算法属于实验室二次开发出来的,就不在这里进行展示。只展示账号密码部分的逻辑。  
 账号密码的逻辑就是将我们两个输入框的文本进行获取,在获取之后,进行一个数据库的比对,正确时进行界面跳转,错误是弹窗警报。


##### 退出与最小化


我们的界面需要退出或者最小化,而这个又是最好实现的功能。那么我们就看一下这个应该如何去写。



self.close_btn.clicked.connect(lambda: sys.exit())
self.mini_btn.clicked.connect(lambda: self.showMinimized())


我们直接定义两个按钮的信号与槽,然后绑定一个匿名函数,一个用于关闭系统,另一个用于最小化界面。匿名函数看不懂的话,可以写成如下效果。



self.close_btn.clicked.connect(self.close_ui)
self.mini_btn.clicked.connect(self.minisize_ui)

def close_ui(self):
self.close()

def minisize_ui(self):
self.showMinimized()


##### 数据库匹配登录


我们可以像如下代码一样编写一个登录验证的函数,并且绑定信号与槽,这里我就不写绑定部分了,可以从上一部分学习一下。



def login(self):
    """
    进行登陆的函数
    Author:SCC
    :return: None
    """
    try:
        id_text = self.id_edit.text()
        pwd_text = self.pwd_edit.text()
    except BaseException as e:
        QMessageBox.about(self, 'Error', '请正确输入账号或密码!')
        return
    if id_text.replace(" ", "") == "" or pwd_text.replace(" ", "") == "":
        QMessageBox.about(self, 'Error', '请正确输入账号或密码!')
    else:
        logger.debug(id_text)
        logger.debug(pwd_text)
        if self.db_handle.login_check(id_text, pwd_text):
            logger.debug("ok")
            self.cap.release()
            self.info_ui = info_ui()
            self.info_ui.show()
            self.close()
        else:
            QMessageBox.about(self, 'Error', '账号或密码错误!')

在这里我们为了防止出现Bug,接入了一个try except。因为无论何时,我们都不能保证用户是一个正常的思维使用我们的项目,他可能不输入,也可能乱输入。所以要进行报错处理。在获取输入之后,我们将数据放入Mysql中进行匹配查找。当查找函数返回为True,代表查找结果成功,存在对应的数据。相对应的登陆成功,出现登录成功的弹窗。但是若返回参数为False,那么代表数据库中未找到匹配的人员信息,那么登录失败,出现帐号或密码错误的弹窗。


##### 界面跳转


界面跳转讲几个步骤。


1. 首先实例化第一个类
2. 其次显示这个界面
3. 最后关闭当前界面



self.info_ui = info_ui() # 实例化新的界面类
self.info_ui.show() # 显示新界面
self.close() # 关闭当前界面


#### 信息管理界面


##### 数据准备


我们在界面跳转后,进入我们的增删改查界面,首先我们要将学生的信息自动显示在tableWidget中,那么对于大量的数据IO,我们不能将查找的算法直接写在进程中,因为这样在大量数据出现时,容易导致进程阻塞,最后界面进入假死状态。所以我们要写到对应的线程中。  
 线程是一个在后期经常使用的写法,因为一个程序中多个功能同步或异步进行的情况非常多,如果将所有代码放在一个进程中,一定会出现一些卡顿,甚至是异常状态。那么这个时候我们一般将线程放置到我们的代码中,来解决这样的问题。代码如下:



class db_init(QThread):

img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

``
class db_init(QThread):

[外链图片转存中…(img-0em9N6xy-1715573377844)]
[外链图片转存中…(img-Sn5TInMa-1715573377844)]
[外链图片转存中…(img-EIdfT7hQ-1715573377845)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值