后端:C/C++ C++11
,STL
,准标准库JsonCpp
,准标准库cpp-httplib
,准标准库mysql
前端:前端三大件(HTML5,CSS,JS),此处使用jQuery替代JS,学习成本较低
;Ajax,在JS中插入,用于向服务器发送请求,实现前后端交互
Centos7 云服务器
,vim/gcc(g++)/Makefile
,Clion
,vscode
,MySQL80
开发环境:CLion,本地MySQL
使用CLion进行开发,使用Cpp通过MySQL原生自带API连接MySQL中相关数据库
监考管理查询系统 系统分为管理员和教师两种角色。 管理员: 导入监考信息(考试科目、监考人员(可多人监考一门考试)、时间、地点)。 监考信息管理(增删改查)。 教师管理(增删改查) 教师: 查看监考信息。
初步设计:
设计三个表,管理员信息(root)、教师信息(teacher)、监考信息(proctoring_information) root (ID, passwd),其中ID为主键,ID与passwd均不能为空 teacher (ID, name),其中ID为主键,ID与name均不能为空 proctoring_information (proctoringID, proctoringName, teacherID, teacherName, startTime, endTime, allTime, access),其中proctoringID和teacherID为主键 数据类型均为varchar
此数据库各表都只遵循了第二范式 虽然满足了“一个考试可以允许有多个监考老师”的要求,但是数据原子性太强,数据中的依赖性强,数据冗余过大,牵一发而动全身,一个数据更改之后,其余数据必须更改,麻烦费力
完善设计: 将proctoring_Information拆分为proctoring_Information和exam_Information
proctoring_Information (proctoringID, teacherID),其中proctroingID和teacherID均为主键 exam_Information (proctoringID, proctoringName, startTime, endTime, allTime, access),proctoringID为主键 proctoring_Information(proctoringID, teacherID),proctoringID和teacherID为主键 数据类型均为varchar
满足第三范式
若检查无误,则会将根据开始时间与结束时间计算出考试总时长(将开始时间结束时间由字符串转换成为整型数据,然后相减,再将结果转化为字符串)
前言:本人不精通前端技术,只是为实现此次程序现学现卖,也只了解到一些基础以及一些开发使用到的技术,若有笔误,请指正
页面结构搭建:html 页面美化:css 页面控制、前后端交互:JS
在后端程序所在目录中新建一个前端文件夹,存放前端文件,cpp中设置将路径的根目录映射到前端文件目录
在前端中,设置index.html、TeacherLogin.html、RootLogin.html三个页面,index.html为初始页面,选择登陆身份,选择教师则跳转到TeacherLogin,选择管理员跳转到RootLogin
JS前端代码示例
cpp后端代码示例
此处AJAX传递参数的时候
可以选择上例中的,在url链接中拼接参数,采用健值对,第一个健值对与链接之间必须加上?
,剩余健值对之间通过&
也可以采用JSON传递,在AJAX中增加一个data项,内容为JSON格式数据,在增加一个dataType项,用来表示数据采用的数据结构为JSON
前一种方式比较简便,但是当传递参数数目过多时,在前端经常报错。而JSON作为专用的网络传递数据结构,在网络传参中有十分优秀的性能,当要传递参数数目多时,要采用第二种方式。 jQuery - $.ajax() data{} 传参三种常见写法及ajax()方法参数详解
JS可以控制html元素的显示与隐藏,由此实现在不刷新界面、不跳转到其他界面情况下,页面内容动态更改的效果。
每次在后端获取到JSON类型的数据库查询结果后,相应的表格都需要动态刷新(本质是清空原表单、动态生成新表单)。借助JS功能实现。详细请见源码。或见此处JavaScript(JS)网页–动态生成表格_js调用服务器接口,html实现网页表格
默认情况下,当在input输入框输入后,点击提交submit,会将输入框所在的表单进行提交,同时html页面会刷新。由于此次采用的JS控制html元素来动态展示页面,因此页面刷新后会回到初始状态,不利于处理。需要更改成为,点击提交submit后不刷新html,同时还可以成功提交表单数据。form表单的submit不重新刷新当前页面
<iframe id="Teacher_del_rfFrame" name="Teacher_del_rfFrame" src="about:blank" style="display:none;"></iframe>
在html中,form元素结束位置下,添加如上代码,id、name自定义
$("#root_Teacher_del").attr("target", "Teacher_del_rfFrame");
在JS中,需要进行表单提交操作的函数中,加入上述代码,控制器中的id更换成对应表单的id,attr中第二个参数更改为之前html中添加的iframe元素的id,第一个参数保持不变。
此项目的编译,设计多文件编程、mysql连接使用、httplib库连接使用、cppjson库连接使用
test: test.o teacherProctoringSystem.o
g++ -Wall -o test test.o teacherProctoringSystem.o -L/usr/lib64/mysql -lmysqlclient -lpthread -ldl -lssl -lcrypto -lresolv -lm -lrt -L /usr/local/lib /usr/local/lib/libjsoncpp.a
test.o: test.cpp teacherProctoringSystem.h
g++ -Wall -std=c++11 -c test.cpp -L/usr/lib64/mysql -lmysqlclient -lpthread -ldl -lssl -lcrypto -lresolv -lm -lrt -L /usr/local/lib /usr/local/lib/libjsoncpp.a
teacherProctoringSystem.o: teacherProctoringSystem.cpp teacherProctoringSystem.h
g++ -Wall -std=c++11 -c teacherProctoringSystem.cpp -L/usr/lib64/mysql -lmysqlclient -lpthread -ldl -lssl -lcrypto -lresolv -lm -lrt -L /usr/local/lib /usr/local/lib/libjsoncpp.a
clean:
rm -f test
rm -f *.o
在编译时要注意和相应的库要建立起动态链接,因此g++命令之后需要添加参数
使用XXX_config
指令查看需要添加的参数
例如想要查看makefile时链接mysql时,g++后需要加什么参数,使用mysql_config
指令,然后寻找-lib或-libs对应的即可
CentOS7 下 C++ 连接 Mysql 数据库的环境配置以及常用API测试_centos7下:vs code如何配置c++与mysql数据库连接-CSDN博客
nohup ./test &
此条指令,是将当前工作目录下的可执行文件test启动(注意是可执行文件,因此必须要先编译过,生成可执行文件),并在允许在后台运行。关闭会话后,test进程也会一直在后台运行。
同时,会在当前工作目录生成nohub.out
文件,用来保存test可执行程序中输出的值,例如cout输出的值,此时就会输入到nohub.out
文件中。输入到的文件是可以自己指定的,默认为nohub.out
。另外可以结合日志文件,将日志输出进去。
ps -axj |grep test
查看当前正在运行的test进程,如下图,可以找到当前正在执行的test进程,第一行就是。第二列中的数字为该进程的PID
kill 13187
使用kill
指令杀掉进程,后面的参数为要杀掉的进程的PID
在连接时,输入ssh指令后,没有反应,如要等待很久。或者输入密码之后很久才进入。
有可能是服务器内存、CPU占用过高,无法响应。可以登陆服务器官网如阿里云等,重启服务器实例。
也可能是链接中的问题:[SSH连接缓慢解决方法_ssh连接慢-CSDN博客](https://blog.csdn.net/tainyu/article/details/124317063#:~:text=下面说下如何解决这样的问题,最为常见的原因是因为server的sshd会去DNS查找访问 client IP的hostname,如果DNS不可用或者没有相关记录,就会耗费大量时间。 1、在server上%2Fetc%2Fhosts文件中把你本机的ip和hostname加入配置文件中 [root@oral8 ],%23 cat %2Fetc%2Fhosts 192.168.1.55 oral8 2、在server上%2Fetc%2Fssh%2Fsshd_config文件中修改或加入UseDNS%3Dno,GSSAPIAuthentication no)
内存不足,在程序make编译时,g++被后台杀死。
原因往往是内存不足,被操作系统杀掉。比如我的云服务器为2G2核,使用vscode远程连接时,vscode远程连接服务会占用很多内存,mysql数据库也会占用很多内存。
解决方法:
free -m
指令查看一下内存分配情况。里面有物理内存,和swap分区内存,云服务器往往没有设置swap分区,此时需要我们手动设置。
g++: internal compiler error: Killed (program cc1plus) 解决办法-CSDN博客
gcc编译出现internal compiler error: Killed (program cc1plus)top
指令查看所有进程信息,然后在查看时使用-k
加PID,终止进程,或者退出查看后kill
掉进程。g++ --version
或
g++ -V
查看一下gcc或者g++版本
若抱错command not found
等,说明gcc服务没有启动
scl enable devstoolset-7 bash
启动g++服务(enable后的参数根据个人g++版本等不同)
注意,通过这种方式启动后,只在本次会话中生效,一旦会话关闭,g++又会不可用
解决方法,设置每次打开会话时自动启动:
vim ~/.bash_profile
更改shell的配置文件(此处我是用的是bash shell,若使用的zsh shell,则是更改~/.zsh_profile)
打开后将scl enable devtoolset-7 bash
添加到最后一行,保存后退出。这样每次启动会话shell都会自动启动g++。
source ~/.bash_profile
最后是配置文件生效
启动mysql服务:
systemctl start mysqld.service
设置mysql服务自启动:
systemctl enable mysqld
systemctl daemon-reload
附加:
stl restart mysqld.service 重启mysql
注:
scl
指令就是systemctl
指令的缩写,二者是一个功能 全称systemcontrol