实验目的
生产实习软件部分目的是锻炼学生从事开发计算机应用系统的能力和协同工作的能力。
使学生初步掌握以SQL Server数据库系统为核心,采用C/S结构的计算机应用系统开发方法(用Delphi语言开发),
使学生得到如何进行系统开发的初步锻炼。
PS:
其实,我们并没有使用SQL Server(MySQL),C/S(B/S)结构和Delphi(Python) ^_^
主要是Delphi太过时了。
MySQL是因为有现成的云数据库,就不想搭建了。
B/S是因为html比较熟悉,而且Python写客户端,实在是很难看。
系统结构设计
整个系统包括四部分,分别是数据库服务器、WEB服务器、传输机和前置机。

连接与数据传输
数据库、WEB服务器与传输机之间使用网线连接,传输机与前置机之间使用串口线连接。
数据库与WEB服务器之间,使用MySQL的3306端口通讯,通过在数据库中添加远程受限用户,来访问数据库。
WEB服务器与前置机之间,使用HTTP协议传输数据,用户数据通过JSON封装。
前置机与传输机之间,用JSON封装数据,以换行符('\n')为结束标志。
刷卡流程
- 前置机获取卡号信息,并以字符串的方式发送到传输机。
- 传输机将卡号以POST方式,发送到WEB服务器。
- WEB服务器通过卡号,从数据库获取相关信息。
- WEB服务器将卡片信息封装程JSON格式,并返回给传输机。
- 传输机将信息通过串口发送给前置机。
- 前置机解封数据,并最终显示。
代码结构
1 | root |
各功能模块设计
WEB服务器
服务器端使用的是Flask框架,目录结构如下:
1 | server |
数据库通过flask-sqlalchemy将数据库抽象出来,并且实现数据库表与module之间的自由转换,
从而将WEB处理与数据库分离,可以适应各种不同的数据库,如:SQL Server、SQLite等。
通过CSRF实现防御跨站请求伪造攻击(Cross-Site Request Forgery),
其原理是在表单中插入一个随机的input值,并在表单提交后,对其进行验证。从而防止跨站请求伪造攻击。
预约界面:
管理界面:
传输机
传输机作为一个简单的传输模块,需要负责将前置机获取的学号通过POST请求发送到服务器,
同时在界面显示接收日志,以及是否传输成功。
传输机还要将服务器返回的内容通过串口发送给前置机,并在界面显示发送日志,以及是否传输成功。
作为传输机,需要有专门的一个线程负责监听串口的活动。由于Python的线程模块没有专门的停止方法,
只能等待线程自己停止。因此,我设置了一个isStop的变量,作为监听线程是否停止的标志。
由于这个变量被两个线程使用,因此,需要进行一些PV操作。通过Python中的threading.Lock()方法,
可以创建一个信号量,用来控制isStop变量的访问。从而解决资源冲突。
传输机界面:
前置机
前置机作为,主要任务是负责获取卡号,并显示必要的信息。因此需要GUI,本次实验使用的GUI模块为Python自带的Tkinter,
作为内置模块,操作相对简单,上手比较容易,适合新手学习使用,但是由于没有可视化操作,所以只能用代码实现简单的界面。
本次主要使用的GUI组件为Label和Button。Label负责在界面显示内容,Button负责与用户交互。
同样,如果需要更为美观的界面,可以使用wxPython等第三方GUI库。
由于串口的通讯是由前置机主动发起的,因此,前置机不需要单独的线程去监听串口,只需要在发送之后,立刻转入监听模式,
当收到信息后或者超时后,结束监听,回到待刷卡状态。
当然,为了保证通讯的质量,我们还可以在前置机与传输机、传输机与服务器之间,每隔一段时间,发送特定的报文,
用于验证是否处于联机状态,以确保通讯质量。
如果实验用于生产环境是,还需要对信息进行加密和校验,此处为实验环境,此功能不做考虑。
前置机界面:
数据库表结构设计及功能说明
数据库类型及版本
本次数据库是部署在阿里云上的MySQL,数据库版本为5.7。
使用这个数据库的原因是,我在阿里云上一直由一个可用的数据库,延时在20ms之内,速度较快,因此,不想在自己的PC上再安装。
由于本次实验是与学生相关,因此最好需要一个完整的学生信息数据库。
因此本次实验只是挑选了一部分与本实验相关的数据,进行了存储,因此,学生信息只有一张表。
Admin表
该表格为后台管理员表格,主要存放管理员的账号及密码。
在实际生产过程中,密码应密文保存,但在本次试验中,便于调试,使用的明文保存。
表结构如下:

Computer表
该表为设备表,用来存放当前学校中,受该系统管理的所有设备信息。
表结构如下:

Log表
该表为日志表,主要用于存放所有用户的操作信息,对于删除和修改信息应当更加详细。
该表格可以在管理员误删信或者修改信息后,用于信息重建。
表结构如下:

Reservation表
该表为预约信息表,主要用来存放学生预约信息。
表结构如下:

StuInfo表
该表为学生信息表,主要用来存放学生信息。该表应该与学生信息管理系统相关联,以提供完整的学生信息。
表结构如下:

实验心得
王浩宇
在本次试验中,我作为项目负责人,使用自顶向下的方法,设计了整个系统,虽然整个系统的扩展性并不好,稳定性也可能存在不少问题,但是,这次实验让我对软件设计有了更深入的了解。主动尝试了软件工程中的桩,将本应该只能在机房编写代码,通过增加桩,可以使不需要串口功能的模块在宿舍也可以编写,提高了工作效率。
这次实验使用Git最为代码的版本管理,可以方便的进行多人合作变成,每个人创建自己的开发分支,完成既定功能后,合入master分支中,不会出现一个人写代码,4个人旁边看着的情况。每个人都可以在自己的电脑上完成自己的工作,然后push到云上,这也是未来工作的模式。
这次实验中又一次使用了轻量级的Python Web框架——flask。并且又在这个基础上,增加了一下之前没有用过的功能,加深了对flask的理解。同时,在网上查找了关于web框架的资料,了解了web框架的基本原理。
余一帆
这次这个学生管理及上机及考勤系统的实验,加深了几台PC机是怎样协同工作是什么原理的理解。平常上课都是单独学习网页设计、数据库等,现在一下子完成一个简单的系统的操作,让我对整个过程的理解更加深入。
我们这次比较特殊的是我们用了python,而且为了共享代码还用了码云,这些对我来说都是比较陌生的东西。刚开始的时候为了把代码push到码云就花了不少时间,其他的我主要写前段这些,通过上网查资料和问组员倒是还好。
在这个实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在此次实验课中,我们把抽象的书本上的知识变成自己的。而这是日后最实用的,真的是受益匪浅。但是学习无止境,我们得不断的学习、实践,再学习、再实践。
朱依凡
这次软件课程设计我和何颖婕一起跟着王浩宇设计前端部分,这次软件课设接触了新的语言python,我们花了一点时间来学习这个新的语言,我主要负责利用gui库tkinter来布置前端界面,刚开始以为会很困难,但是看了教程和请教了同学之后发现并没有想象中的困难,一步步都逐渐解决了问题,同时这次还接触到了git,熟悉了git的基本操作,刚开始学习git的时候觉得操作步骤很繁琐,但是到后来就发现它的基本操作并不多,熟悉了之后就非常方便,为我们提供了很大的便利。这次课设我感觉学到了很多新的知识,接触了新的语言python,新的版本控制系统github,我受益匪浅。
左智文
通过这次的生产实习串口通讯部分的实践,不仅学会了使用git进行多人协作项目,而且应用了python 的一个轻量级的web框架flask,熟练了对于web前端的使用,感觉受益匪浅。
何颖婕
在本次试验中,我主要是负责端页面的设计和编码,在组长的指导下完成实验的这个过程。在实验的过程中有很多困难,但在组员的团结合作下,以及上网或者在图书馆查阅资料都一一的克服了。看到自己的心血能运转起来,真的很开心,也通过这次实验学到了很多东西。在系统的设计上,大家一起思考,虽然整个系统的扩展性有待加强,功能也不是特别全面,但通过这次实验让我们对软件设计有了更深入的了解。
在实验的过程中,因为是团队写代码,实验使用Git代码管理的软件,让每个人的工作内容更加的明确,也使代码的编写更加的方便。在实验中,我们的代码的主要语言是Python, Python是一种简约语言,开发快,语言简洁。因为是一个相对而言,不那么复杂的系统,所以Python还是为我们提供了极大的便利。在这次实验中,使用了之前没有接触的Git和Python,对这些语言又有了新的了解。作为一个计算机专业的学生我觉得接触新的语言是很有必要的,会让我们从不同的角度去思考问题,比较各种语言的优缺点。通过这次实验,也让我体会到了,团队合作编写系统是一个怎样的过程,大家齐心协力为一个目标而努力的感觉真的很棒。希望自己将来走上工作岗位的时候,能继续享受工作带给我的成就感。