python学生管理系统的设计过程 (基于python的毕业生信息管理系统)

今天为大家分享一个我在学习Python做的一个小项目---基于Python的学生信息管理系统开发。今天要分享的内容有两点:

  1. 基于Python的学生信息管理系统开发第一部分(模型定义、excel表格处理)
  2. c++如何处理json格式的数据

1、基于Python的学生信息管理系统开发第一部分

这个小项目是我本科学C语言时做的一个小项目,当时是用C写的。它不具有什么可用性。之所以选择它是因为它简单,但是想做出来需要经过一些思考,通过这个过程可以把学到的所有的知识综合到一起,而不是孤立的选择结构、循环结构等。

这个系统用两次分享完,代码也会放在github上,有兴趣的朋友可以从github上*载下**自己运行一下。

(1) 准备工作

我准备为这个系统制作一个简单的界面,用PyQt5制作。然后用Excel表格作为底层数据库来存储学生的信息。这就涉及到了两个第三方模块PyQt5、openpyxl。

下面介绍一下通过Anaconda工具来安装这两个模块:

我理解的Anaconda:如果将所有的模块直接安装在系统中,会导致系统的环境混乱,而且有可能出现版本冲突,安装和卸载也很麻烦。Anaconda是一个虚拟环境管理工具,用它可以创建多个虚拟环境,虚拟环境之间是相互独立的,你可以在各自的虚拟环境中安装该环境所需要的模块,与其他的虚拟环境无关。用anaconda创建一个虚拟环境或者安装、卸载某一个模块都是一条命令的事,非常方便。

关于Anaconda的安装和入门,如果有兴趣的人可以自行搜索一下,网上有大量的教程,这里就不多花篇幅来介绍了。

安装好了之后,需要先创建一个虚拟环境,然后激活虚拟环境,最后为这个虚拟环境安装第三方库,使用anaconda创建虚拟环境并激活虚拟环境的命令如下(win系统,linux稍有不同):

# 可以直接指定python的版本
conda create -n StuSystem python=3.7
# 激活虚拟环境
conda activate StuSystem

安装openpyxl、pyqt5的命令如下

conda install openpyxl
# 安装pyqt的时候先查找pyqt的版本
conda search pyqt
# 然后选择你需要的版本安装就可以了
conda install PyQt=5.9.2

(2) 功能分析

制作一个系统的首要工作就是进行需求分析,当然这里的需求分析和软件功能里的需求分析不太一样,所以我更愿意将它称为功能分析。

管理员:管理员通过自己的账号、密码登录系统后,可以添加新学生的信息、查看所有学生的信息、删除某一个学生的信息、修改某一个学生的信息

学生:学生通过自己的学号、密码登录后,系统直接显示自己的个人的个人信息。

(3) 系统开发

首先,我们要考虑一下如何表示学生这个概念。你可能会很快想到可以编写一个类用来表示学生这个概念,然后我们可以创建任意多个学生类的对象表示多个学生。没错,我也是这么做的。

在学生类的基础上,我们还可以再抽象一下: 学生也属于人,所以我们可以先创建一个人的类,然后学生类继承该类。

这两个类的定义都放在model.py文件中:

#coding: utf-8
’’’
Person具有的基本属性:姓名、年龄、性别、籍贯
’’’
class Person(object):
 def __init__(self, name, age, sex, birthPlace):
 # 所有的属性都设置为私有
 self.__name = name
 self.__age = age
 self.__sex = sex
 self.__birthPlace = birthPlace
 def get_name(self):
 return self.__name
 def get_age(self):
 return self.__age
 def get_sex(self):
 return self.__sex
 def get_birthPlace(self):
 return self.__birthPlace
 def print_self(self):
 return ’name: ’ + self.get_name() \
 + ’\nage:’ + str(self.get_age()) \
 + ’\nsex: ’ + self.get_sex() \
 + ’\nbirthPlace: ’ + self.get_birthPlace()
’’’
Student继承自Person,额外的属性为:学号、学院、专业、密码
’’’
class Student(Person):
 def __init__(self, name, age, sex, birthPlace, id, college, major, password):
 self.__id = id
 self.__college = college
 self.__major = major
 self.__password = password
 Person.__init__(self, name, age, sex, birthPlace)
 def get_id(self):
 return self.__id
 def get_college(self):
 return self.__college
 def get_major(self):
 return self.__major
 def print_self(self):
 return Person.print_self(self) \
 + ’\nid: ’ + str(self.get_id()) \
 + ’\ncollege: ’ + self.get_college() \
 + ’\nmajor: ’ + self.get_major()
’’’
Test
’’’
if __name__ == ’__main__’:
 stu = Student("liulinfeng", ’23’, "man", "BeiJing", "10001", "Computer", "Computer Science", "123456")
 print(stu.print_self())

运行model.py文件的结果如下图所示:

python如何实现学生信息管理系统,学生信息管理系统python

model.py测试运行结果

下面还要考虑的是如何进行数据持久化操作,如果将所有的数据都保存在内存中的话,一旦程序关闭,重新启动所有的数据都会被清空(尽管这只是一个模拟的系统,仍然应该考虑到这一点),因此,我们必须将数据保存在离线的文件或者数据库中(这里选择Excel表格)。

对Excel表格的处理仍然借助openpyxl包来进行,openpyxl是一个专门用来处理excel表格数据的模块,对此不了解的朋友不用太在意,我后面会有专门的文章来介绍这个包。

这里我将所有对Excel表格操作的方法都封装在了FileOperate类中,FileOperate类的定义(在FileOperate.py文件中)如下:

#coding:utf-8
import openpyxl
# 导入自定义的模块
from model import Student
class ExcelOperate(object):
 def __init__(self, file_name):
 self.__file_name = file_name
 #加载Excel文件
 self.__file = openpyxl.load_workbook(file_name)
 ’’’
 读取表格中所有学生的信息,并返回一个列表
 ’’’
 def read_sheet(self, sheet_name):
 work_sheet = self.__file[sheet_name]
 # 学生列表
 stuList = []
 # 最大存储数据的行号
 max_row_number = work_sheet.max_row
 # 第1行是表头,因此从第2行开始遍历
 for i in range(2, max_row_number+1):
 name = work_sheet.cell(i, 1).value
 age = work_sheet.cell(i, 2).value
 sex = work_sheet.cell(i, 3).value
 birthPlace = work_sheet.cell(i, 4).value
 school_id = work_sheet.cell(i, 5).value
 college = work_sheet.cell(i, 6).value
 major = work_sheet.cell(i, 7).value
 password = work_sheet.cell(i, 8).value
 new_stu = Student(name, age, sex, birthPlace, school_id, college, major, password)
 stuList.append(new_stu)
 return stuList
 """
 删除指定学号的学生的信息:
 在遍历表格的时候,判断当前行是不是要删除的学生?
 """
 def delete_byID(self, sheet_name, school_id):
 work_sheet = self.__file[sheet_name]
 max_row_number = work_sheet.max_row
 for i in range(2, max_row_number+1):
 # 取出当前行学生的学号
 tmp_id = str(work_sheet.cell(i, 5).value)
 if tmp_id == school_id:
 print("删除第",i,"行")
 work_sheet.delete_rows(i)
 else:
 continue
 
 # 删除某一行只是在缓冲区中删除了,如果要持久删除需要持久保存
 self.__file.save(self.__file_name)
 
 """
 更新学生的信息,允许老师修改的信息有:学院、专业
 """
 def update_by(self, sheet_name, school_id, new_stu):
 work_sheet = self.__file[sheet_name]
 max_row_number = work_sheet.max_row
 max_col_number = work_sheet.max_column
 for i in range(2, max_row_number+1):
 tmp_id = str(work_sheet.cell(i, 5).value)
 if tmp_id == school_id:
 # new_stu是一个字典结构
 print("new_stu[’学院’] = ", new_stu["学院"])
 work_sheet.cell(i, 6).value = new_stu["学院"]
 work_sheet.cell(i, 7).value = new_stu["专业"]
 else:
 continue
 
 # 保存修改结果
 self.__file.save(self.__file_name)
 
 """
 添加一个新学生的信息
 """
 def add_new_stu(self, sheet_name, new_stu):
 work_sheet = self.__file[sheet_name]
 max_row_number = work_sheet.max_row
 work_sheet.cell(max_row_number+1, 1).value = new_stu["姓名"]
 work_sheet.cell(max_row_number+1, 2).value = new_stu["年龄"]
 work_sheet.cell(max_row_number+1, 3).value = new_stu["性别"]
 work_sheet.cell(max_row_number+1, 4).value = new_stu["籍贯"]
 work_sheet.cell(max_row_number+1, 5).value = new_stu["学号"]
 work_sheet.cell(max_row_number+1, 6).value = new_stu["学院"]
 work_sheet.cell(max_row_number+1, 7).value = new_stu["专业"]
 work_sheet.cell(max_row_number+1, 8).value = new_stu["密码"]
 self.__file.save(self.__file_name)
 
 
if __name__==’__main__’:
 excel_operate = ExcelOperate("stuLists.xlsx")
 new_stu = {
 "姓名": "李四",
 "年龄": 23,
 "性别": "男",
 "籍贯": "上海",
 "学号": "10002",
 "学院": "计算机学院",
 "专业": "电子科学与技术",
 "密码": "1"
 }
 excel_operate.add_new_stu("stuLists", new_stu)

上面只演示测试了一种功能添加新学生信息,结果如下图所示:

添加前stuLists.xlsx中的内容如下:

python如何实现学生信息管理系统,学生信息管理系统python

FileOperate测试数据

使用python FileOperate.py运行,添加后的结果如下:

python如何实现学生信息管理系统,学生信息管理系统python

FileOperate.py测试结果

其他功能已经经过测试,这里就不再演示了。有兴趣的人可以自行跑一下。

关于这个系统的开发今天就先只介绍到这里,在下一篇文章中会介绍如何用PyQt5编写系统界面,敬请期待。