1.前言
当前设计的这个考勤系统主要应用于高校课堂考勤,目前高校管理系统里有很多成功的案例,排课系统,教务管理系统、学生管理系统等等,这些系统的应用直接提高了师生的工作效率,下发课堂作业,检查课设报告等等,都可以直接在网上操作,非常方便。
目前设计的这个基于RFID的考勤系统,采用C++作为编程语言,UI界面采用QT设计,RFID刷卡插件使用C++开发,RFID刷卡设备是USB接口协议,数据库采用华为云的MySQL(RDS for MySQL),方便不同课堂、设备上运行软件可以同步考勤数据。
当前考勤系统包含的功能模块如下:
【1】登录模块:用户名和密码登录,本设计有三类用户名,包括系统管理员,教师和学生; 【2】学生信息管理模块:学生基本信息的增加,删除,修改,查询; 【3】考勤管理模块:进行学生签到和签退; 【4】射频卡管理模块:利用射频卡对学生的考勤情况进行记录; 【5】查询模块:管理员,教师,学生都可以对自己权限范围内考勤结果进行查询; 【6】请假查询模块:通过ID查询学生请假情况; 【7】数据备份模块:系统数据定期进行保存,但系统服务器出现故障时提供帮助。
该系统有3个用户权限,学生操作页面、管理员操作页面、教师操作页面。学生操作页面,可以查看自己的考勤记录;教师操作页面可以查看自己班级学生的考勤记录,添加考勤的学生;管理员可以查看所有人的考勤记录,支持所有功能。
当前系统里存储数据采用的华为云的在线云数据库MySQL,MySQL数据库是目前最受欢迎的开源数据库之一,其性能卓越,搭配LAMP(Linux + Apache + MySQL + Perl/PHP/Python),成为WEB开发的高效解决方案。 华为云的RDS for MySQL 数据库拥有稳定可靠、安全运行、弹性伸缩、轻松管理、经济实用等特点。
上面提到的云数据库RDS(Relational Database Service,简称RDS)是一种基于云计算平台的稳定可靠、弹性伸缩、便捷管理的在线云数据库服务。 目前华为云数据库RDS支持以下引擎:
cpp
MySQL
PostgreSQL
SQL Server
云数据库RDS服务具有完善的性能监控体系和多重安全防护措施,并提供了专业的数据库管理平台, 让用户能够在云上轻松的进行设置和扩展云数据库。通过云数据库RDS服务的管理控制台,用户无需编程就可以执行所有必需任务,简化运营流程,减少日常运维工作量,从而专注于开发应用和业务发展。
2. 部署(RDS for MySQL)云数据库
在华为云官网可以免费领取一个月的(RDS for MySQL)云数据库使用权,可以利用这个免费的机会,充分了解、体验(RDS for MySQL)数据库的使用效果。
注意: 数据库购买部署之后如果需要外网访问,需要绑定公网IP地址,如果之前购买过公网IP,在购买数据库时注意选择相同的区域。
官网地址:activity.huaweicloud.com/free_test/i...
向下翻,找到MySQL数据库,点击抢购。 根据引导页面填充信息,设置数据库登录密码。 最后完成支付。 查看订单详情。
购买成功后,接下来进入控制台管理页面。
稍等片刻就会处理完成。
然后在订单详情页面左上角点击控制台。
展开服务列表,找到云数据库RDS。
也可以在资源管理里找到自己的实例。
选择自己购买的区域。
选择正确区域后,就能看到自己订单页面了。
地址: console.huaweicloud.com/rds/?agency...
进去之后可以看查看数据库信息。
在内网页面上可以直接登录数据库。 输入账号密码后,点击测试连接。 测量连接成功后,再点击登录。
登录之后,接下来就可以新建数据库测试了。 数据库创建后就可以建表、填充数据,正常的进行数据库的事务操作了。
3. 绑定公网IP地址
3.1 购买公网IP地址
为了方便数据库支持外网连接,需要给数据库实例绑定公网IP地址。 没有公网IP地址就点击右上角买一个。 如果是试用期测试的话,可以先买一个月的。
公网IP购买成功之后就可以看到处于未绑定状态,接下来绑定即可。
在刚才的页面继续绑定。
公网IP地址绑定成功。
3.2 添加入口规则
根据自己的需要开放指定的端口、IP地址范围,这样可以有效的限制网络攻击。
4. 考勤软件连接数据库与RFID读卡器
4.1 连接数据库
软件是采用QT设计的,在QT里要连接MySQL数据库还有点麻烦,需要自己编辑MQYSQL的库才行。
主要是Qt 5在高版本中取消了对MySQL数据库的默认支持,主要是因为随着商业版的MySQL推出,MySQL已经不能算是一个完全开源的数据库了,Qt默认只会给完全开源的数据库提供支持。
要使用数据库,需要在QT的.pro工程文件里加上QT += sql
。
下面是QT里连接MQYSQL主要代码:
cpp
LoginWindow::LoginWindow(QWidget *parent) :
QWidget(parent),
ui(new Ui::LoginWindow)
{
ui->setupUi(this);
this->setWindowTitle("学生考勤管理系统");
//设置主题样式
SetStyle(":/blue.css");
//设置密码框为密码显示模式
ui->lineEdit_password->setEchoMode(QLineEdit::Password);
//设置背景提示文字
ui->lineEdit_password->setPlaceholderText("请输入密码");
//设置背景提示文字
ui->lineEdit_user_name->setPlaceholderText("请输入用户名");
//读配置
read_config();
//读取数据库
//设置并打开数据库
if (QSqlDatabase::contains(LOG_IN_DATABASE_CONNECT_NAME))
{
database = QSqlDatabase::database(LOG_IN_DATABASE_CONNECT_NAME);
}
else
{
//数据库类型
database = QSqlDatabase::addDatabase("QMYSQL");
database.setDatabaseName(LOG_IN_DATABASE_NAME); //数据库名称
database.setUserName("root"); //用户名
database.setPassword("12345678"); //数据库的登录密码
database.setHostName("114.116.250.107"); //连接本地主机
database.setPort(3389);
}
//打开数据库,如果数据库存在就打开,不存在就自动创建
if(database.open()==false)
{
qDebug("数据库打开失败.请检查程序运行路径和权限.\n");
}
else
{
qDebug("连接数据库成功.\n");
}
//建表--存放账号密码
CreateUserPassTAB();
}
如果没有编译设置好mySQL的库文件,编译的时候会报错。
cpp
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7
系统运行的效果:
4.2 RFID刷卡代码
采用的RFID读卡器是USB接口,厂家提供了DLL动态库,直接连接,调用DLL库就可以完成调用。 型号是: RF-EYE系列非接触式 IC 卡读写器。
所以自己的代码就很简单了,要读取卡号,读写数据,调用对应的DLL库接口就行了。
cpp
//#ifdef _WIN32
//typedef HANDLE void*;
//#else
//typedef HANDLE int;
//#endif
#define HANDLE void*
extern "C"
{
HANDLE __stdcall rf_init(__int16 port,long baud);
__int16 __stdcall rf_beep(HANDLE icdev,unsigned short _Msec);
__int16 __stdcall rf_card(HANDLE icdev,unsigned char _Mode,unsigned long *_Snr);
};
//读卡-RFID
QString Widget::read_card()
{
int st=0;
unsigned long Snr;
QString card_number;
HANDLE icdev;
icdev=rf_init(0,9600);
//设置蜂鸣器
rf_beep(icdev, 25);
//读卡
st=rf_card(icdev,1,&Snr);
//卡号
card_number=QString("%1").arg(Snr);
if(st==0)
{
Log_Text_Display(QString("卡号:%1\n").arg(Snr));
}
else
{
Log_Text_Display(QString("卡号读取错误.\n"));
}
return card_number;
}
4.3 编译MySQL驱动
由于Qt 5在高版本中取消了对MySQL数据库的默认支持,要在QT里继续使用mysql需要自己编译库。
源码下载地址: download.qt.io/archive/qt/...
我使用的是QT5.12.6,如果是使用了其他版本QT,下载对应的源码即可。如果在安装QT时,默认安装了QT源码,就不用单独下载源码了。
下载后解压,打开下面这个工程:
工程路径: qtbase-everywhere-src-5.12.6\src\plugins\sqldrivers\mysql
windows电脑上也得先提前安装MySQL,版本选择5.7 下载链接:dev.mysql.com/downloads/
在这个页面显示的是最新版本,如果想下载历史版本,点击页面上的archives
。
历史版本下载地址: downloads.mysql.com/archives/in...
双击进行安装。
sql
Developer Default:开发者默认安装------MySQL服务器和MySQL应用程序开发所需的工具。此设置类型包括:MySQL服务器、MySQL外壳、MySQL路由器、MySQL工作台、用于VisualStudio的MySQL、MySQL连接器、示例和教程、文件。
Server only:仅限服务器------只安装MySQL服务器。
Client only:仅限客户------安装MySQL应用程序开发所需的工具,但不包括MySQL服务器本身。此设置类型包括:MySQL外壳、MySQL路由器、MySQL工作台、MySQL Visual Studio插件、MySQL连接器、示例和教程、文件。
Full:全部------安装此目录中所有可用的产品,包括MySQL服务器、MySQL外壳、MySQL路由器、MySQL工作台、MySQL连接器、文档、示例和示例等。
Custom:定制------允许准确选择要安装的产品。这还允许选择其他服务器版本和体系结构。
或者下载mysql-connector-c-6.1.11-win32
也行的。 downloads.mysql.com/archives/c-... (这个库根据自己需要的版本下载)。
我这里分别下载了X86_64bit和X86_32bit,下载下来解压后的文件如下。 (截图截的是32位的,64位是一样的流程)
接下来就打开刚才下载的QT源码工程,mysql工程。
然后修改源码mysql.pro
文件。
这个路径要根据自己的实际路径进行修改,如果要编译32位的就设置32位的路径,64位就设置64位的路径。
makefile
INCLUDEPATH+="C:\Users\11266\Downloads\mysql-connector-c-6.1.11-win32\include"
LIBS+="C:\Users\11266\Downloads\mysql-connector-c-6.1.11-win32\lib\libmysql.lib"
DEPENDPATH += "C:\Users\11266\Downloads\mysql-connector-c-6.1.11-win32\include"
还需要注释调用这行代码
#QMAK_USE += mysql
总之要记住:
arduino
不同版本和位数的MYSQL里包含不同的 libmysql.dll,不同的 libmysql.dll 必须和配套的 qsqlmysqld.dll (debug 版)或 qsqlmysql.dll(release 版) 一起才能正常工作!
接在修改源码sqldriverbase.pri
文件。
shell
#include($$shadowed($$PWD)/qtsqldrivers-config.pri)
include(./configure.pri)
修改之后保存代码,点击左下角的锤子按钮,构建工程。
我先编译32位,这里构建工程的编译器选择32位的。
构建成功之后,在源码目录下会生成一个编译的目录。
然后按下键盘上的windows图片按键,弹出左边的窗口,找到QT对应的编译器。 (自己构建源码时用的什么编译器,这里打开的就是对应的编译器窗口) 打开之后,执行cd命令,进入到刚才构建生成的工程目录下。
cpp
C:\Qt\Qt5.12.6\5.12.6\mingw73_32>cd /d C:\Users\11266\Downloads\qtbase-everywhere-src-5.12.6\src\plugins\sqldrivers\build-mysql-Desktop_Qt_5_12_6_MinGW_64_bit-Release
执行编译、安装命令即可。
cpp
mingw32-make
mingw32-make install
执行安装命令过程中,可以看到需要的文件已经生成,并且拷贝到对应的编译器目录下去了。
cpp
C:\Users\11266\Downloads\qtbase-everywhere-src-5.12.6\src\plugins\sqldrivers\build-mysql-Desktop_Qt_5_12_6_MinGW_32_bit-Release>mingw32-make install
mingw32-make -f Makefile.Release install
mingw32-make[1]: Entering directory 'C:/Users/11266/Downloads/qtbase-everywhere-src-5.12.6/src/plugins/sqldrivers/build-mysql-Desktop_Qt_5_12_6_MinGW_32_bit-Release'
copy /y \plugins\sqldrivers\qsqlmysql.dll C:\Qt\Qt5.12.6\5.12.6\mingw73_32\plugins\sqldrivers\qsqlmysql.dll
已复制 1 个文件。
C:\Qt\Qt5.12.6\5.12.6\mingw73_32\bin\qmake.exe -install qinstall \lib\cmake\Qt5Sql\Qt5Sql_QMYSQLDriverPlugin.cmake C:\Qt\Qt5.12.6\5.12.6\mingw73_32\lib\cmake\Qt5Sql\Qt5Sql_QMYSQLDriverPlugin.cmake
mingw32-make[1]: Leaving directory 'C:/Users/11266/Downloads/qtbase-everywhere-src-5.12.6/src/plugins/sqldrivers/build-mysql-Desktop_Qt_5_12_6_MinGW_32_bit-Release'
mingw32-make -f Makefile.Debug install
mingw32-make[1]: Entering directory 'C:/Users/11266/Downloads/qtbase-everywhere-src-5.12.6/src/plugins/sqldrivers/build-mysql-Desktop_Qt_5_12_6_MinGW_32_bit-Release'
copy /y \plugins\sqldrivers\qsqlmysqld.dll C:\Qt\Qt5.12.6\5.12.6\mingw73_32\plugins\sqldrivers\qsqlmysqld.dll
已复制 1 个文件。
C:\Qt\Qt5.12.6\5.12.6\mingw73_32\bin\qmake.exe -install qinstall \lib\cmake\Qt5Sql\Qt5Sql_QMYSQLDriverPlugin.cmake C:\Qt\Qt5.12.6\5.12.6\mingw73_32\lib\cmake\Qt5Sql\Qt5Sql_QMYSQLDriverPlugin.cmake
mingw32-make[1]: Leaving directory 'C:/Users/11266/Downloads/qtbase-everywhere-src-5.12.6/src/plugins/sqldrivers/build-mysql-Desktop_Qt_5_12_6_MinGW_32_bit-Release'
然后打开QT安装目录下对应编译器的目录。
cpp
C:\Qt\Qt5.12.6\5.12.6\mingw73_32\plugins\sqldrivers
可以看到,对应的qsqlmysql.dll
插件文件已经生成了。 64位的编译器也是一样的操作流程,生成对应的插件。
最后再把MySQL安装目录下的libmysql.dll
文件拷贝到QT对应编译器的bin
目录下即可。
搞定之后,在QT代码目录下执行代码。
scss
//打印Qt支持的数据库驱动
qDebug()<<QSqlDatabase::drivers();
在控制台会输出:
arduino
("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")
可以看到,里面已经包含了QMYSQL数据库的支持了。
5. 软件设计流程与思路
5.1 需求分析
(1)使用范围 此系统主要给高校的教师使用;上课时,学生进入教室拿出学生卡自己进行打开考勤,可以在系统里申请请假以及查看在校期间所有的上课出勤信息。
考虑到整个学校学生众多,个人隐私问题,为此每个新学生需要由管理员或自己的班主任教师登录进入学生信息管理页面进行增加学生的信息操作,进行添加学生的相关信息;再由学生自己到登录界面进行学生注册操作,完善自己的其他信息,当注册成功提示后,在进入到登陆界面填入注册时的账号和密码就可以登录成功,最后才可以使用学生操作页面的功能模块等操作。教师则需要通过指定的教师账号和密码登录到教师管理后台,才能使用教师的操作页面的功能模块等。系统管理员则需要通过指定的管理员账号、密码登录到管理员后台,才能使用管理员操作页面的功能模块等。三者的操作页面相互独立,都有权限限制。
(2)5.2 学生权限 学生可以在密码信息管理模块对自己的账号修改密码操作;还可以在个人信息管理模块进行修改关于自己其他的各项信息,学号、电话、紧急联系人、宿舍编号等;可在学生信息管理的模块查看自己所有的信息,可以刷卡快速读取卡号信息,匹配到指定的学生;可在建议信息管理模块来增加、查询自己或者别人的建议信息;可在成绩信息管理模块来查询自己的成绩信息;可在考勤签到提醒管理模块来查看自己之前未签到,迟到的相关信息以及查询系统对自己的评价记录;如果需进行退出系统,可点击右上角的XX退出系统模块。如果学生忘记密码,可以在软件的登陆界面点击找回密码按钮,再填写相关信息就可找回密码,或者管理员帮助修改密码。
(3)教师与管理员权限 教师可以在密码信息管理模块的页面上进行修改密码操作;然后可在个人的信息管理模块页面来修改关于自己的各项信息,比如:联系方式,姓名,职务等等;可以在注册教师管理模块页面查看自己注册的信息,可以查询本班级注册的其他学生;可在学生信息管理模块进行增加、查询学生的信息操作;可在成绩管理模块进行增加、查询学生成绩信息的操作;可在班费信息管理模块进行增加、查询班级活动费用的信息操作;可在通知公告管理模块页面进行增加、查询发布的通知公告操作......如果需要进行退出系统操作,可以点击退出系统模块,也可点击右上角的退出按钮。管理员是当前系统的最高权限者,在教师可进行的操作模块上还可以进行增加、查询教师用户的操作。
5.2 系统功能模块图
功能页面主要展示首页、考勤管理模块、查询模块、请假查询模块、用户登录、管理登录界面。新的学生在登录界面点击注册按钮注册个人信息。学生、管理员与教师需要通过各自登陆界面进入操作平台。
5.3 学生登录平台
(1)学生注册流程图 在学生注册页面填写注册信息,必须由学生填写相关的注册信息,反之则无法进行登录操作。需要填写的注册信息包括姓名、班级、专业、学号、联系方式、登录密码和密保邮箱等。 (2)学生登录流程图 学生填写登录信息的模块流程,学生账号需要与注册的时候填为一致,登录密码与自己完成注册时输入的密码一致 (3) 学生找回密码流程图 学生填写找回密码信息的模块,需要输入登录账号和密保邮箱(与学生注册时所输入的密保邮箱一致)。