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支持以下引擎:
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主要代码:
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的库文件,编译的时候会报错。
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7
系统运行的效果:
4.2 RFID刷卡代码
采用的RFID读卡器是USB接口,厂家提供了DLL动态库,直接连接,调用DLL库就可以完成调用。 型号是: RF-EYE系列非接触式 IC 卡读写器。
所以自己的代码就很简单了,要读取卡号,读写数据,调用对应的DLL库接口就行了。
//#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("卡号:%1n").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.6srcpluginssqldriversmysql
windows电脑上也得先提前安装MySQL,版本选择5.7 下载链接:dev.mysql.com/downloads/
在这个页面显示的是最新版本,如果想下载历史版本,点击页面上的archives
。
历史版本下载地址: downloads.mysql.com/archives/in…
双击进行安装。
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位的路径。
INCLUDEPATH+="C:Users11266Downloadsmysql-connector-c-6.1.11-win32include"
LIBS+="C:Users11266Downloadsmysql-connector-c-6.1.11-win32liblibmysql.lib"
DEPENDPATH += "C:Users11266Downloadsmysql-connector-c-6.1.11-win32include"
还需要注释调用这行代码
#QMAK_USE += mysql
总之要记住:
不同版本和位数的MYSQL里包含不同的 libmysql.dll,不同的 libmysql.dll 必须和配套的 qsqlmysqld.dll (debug 版)或 qsqlmysql.dll(release 版) 一起才能正常工作!
接在修改源码sqldriverbase.pri
文件。
#include($$shadowed($$PWD)/qtsqldrivers-config.pri)
include(./configure.pri)
修改之后保存代码,点击左下角的锤子按钮,构建工程。
我先编译32位,这里构建工程的编译器选择32位的。
构建成功之后,在源码目录下会生成一个编译的目录。
然后按下键盘上的windows图片按键,弹出左边的窗口,找到QT对应的编译器。 (自己构建源码时用的什么编译器,这里打开的就是对应的编译器窗口) 打开之后,执行cd命令,进入到刚才构建生成的工程目录下。
C:QtQt5.12.65.12.6mingw73_32>cd /d C:Users11266Downloadsqtbase-everywhere-src-5.12.6srcpluginssqldriversbuild-mysql-Desktop_Qt_5_12_6_MinGW_64_bit-Release
执行编译、安装命令即可。
mingw32-make
mingw32-make install
执行安装命令过程中,可以看到需要的文件已经生成,并且拷贝到对应的编译器目录下去了。
C:Users11266Downloadsqtbase-everywhere-src-5.12.6srcpluginssqldriversbuild-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 pluginssqldriversqsqlmysql.dll C:QtQt5.12.65.12.6mingw73_32pluginssqldriversqsqlmysql.dll
已复制 1 个文件。
C:QtQt5.12.65.12.6mingw73_32binqmake.exe -install qinstall libcmakeQt5SqlQt5Sql_QMYSQLDriverPlugin.cmake C:QtQt5.12.65.12.6mingw73_32libcmakeQt5SqlQt5Sql_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 pluginssqldriversqsqlmysqld.dll C:QtQt5.12.65.12.6mingw73_32pluginssqldriversqsqlmysqld.dll
已复制 1 个文件。
C:QtQt5.12.65.12.6mingw73_32binqmake.exe -install qinstall libcmakeQt5SqlQt5Sql_QMYSQLDriverPlugin.cmake C:QtQt5.12.65.12.6mingw73_32libcmakeQt5SqlQt5Sql_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安装目录下对应编译器的目录。
C:QtQt5.12.65.12.6mingw73_32pluginssqldrivers
可以看到,对应的qsqlmysql.dll
插件文件已经生成了。 64位的编译器也是一样的操作流程,生成对应的插件。
最后再把MySQL安装目录下的libmysql.dll
文件拷贝到QT对应编译器的bin
目录下即可。
搞定之后,在QT代码目录下执行代码。
//打印Qt支持的数据库驱动
qDebug()