文章目录
项目场景
面试预约系统
1.目的:方便学校或者公司来和用户预约一个面试时间
2.使用技术:http协议,MySQL数据库,C++11,json数据格式
3.需要安装环境
3.1 jsoncpp
安装jsoncpp-devel方法:
yum -y install epel-release
yum install jsoncpp-devel
3.2 mysql客户端开发环境
安装 mariadb 服务
yum install -y mariadb-server 安装 mariadb 命令行客户端
yum install -y mariadb 安装 mariadb C library
yum install -y mariadb-libs 安装 mariadb开发包
yum install -y mariadb-devel
更改配置
更改 /etc/my.cnf.d/client.cnf 文件
[client] 下加一行配置 default-character-set=utf8
更改 /etc/my.cnf.d/mysql-clients.cnf 文件
[mysql] 下加一行配置 default-character-set=utf8
更改 /etc/my.cnf.d/server.cnf配置
[mysqld] 下加配置
collation-server = utf8_general_ci
init-connect=‘SET NAMES utf8’
character-set-server = utf8
sql-mode = TRADITIONAL
项目需求
- 能够支持用户注册
- 能够支持用户登录
- 能够支持用户预约时间
项目整体框架
项目基础实现
http模块
理解http服务器
采用http协议实现的服务器,http协议是一个应用层协议,在传输层使用的是tcp协议.就是一个tcp服务器,只是在应用层,完成http协议格式的请求与响应的解析以及针对请求提供服务
如何搭建http服务器:
-
搭建tcp服务器
-
等待客户端请求,解析请求,得到http协议格式中的各个要素(请求方法,url(path资源路径以及查询字符串),头部字段,正文)
-
根据客户端的请求,完成业务处理后,组织http响应数据,进行响应
httplib库
httplib库的下载
我们需要去Github,下载所需的httplib库代码,如下图所示,点击code,复制,在linux终端输入命令:
git clone https://github.com/yhirose/cpp-httplib.git
我们借助httplib库,能够更高效更健壮的编写我们的代码.
httplib基本使用
1.实例化server对象
2.对server注册请求–业务处理路由关系(告诉服务器哪个请求对应使用哪个函数进行业务处理)
3.开始监听处理
注意:在使用httplib时,需要使用高版本gcc进行编译,否则会运行崩溃
升级高版本gcc的方法(httplib需要高版本):
# 先获取 root 权限
yum install centos-release-scl-rh centos-release-scl
yum check-update
yum install devtoolset-7-gcc devtoolset-7-gcc-c++
source /opt/rh/devtoolset-7/enable
(这个可以放到 ~/.bashrc 里,否则每次登陆和打开新终端都需要运行命令重新加载配置)
httplib处理流程
- 先提前编写不同请求对应的处理函数 void(*hander)(Request &req,Response &rsp)
- 实例化Server对象(对象中包含两个关键信息:请求与处理函数映射表,线程池)
- 程序员自己根据不同的请求以及业务处理,在Server对象中建立映射关系 Server.Get()/.Post()/.Put()/.Delete()
- 搭建tcp服务器开始监听
- 有新连接到来,则将新连接抛入到线程池进行处理
- 线程池中处理流程
1.接收http请求头部,进行解析,并且根据头部中的content-length接收正文,将解析得到的各个元素填充Request对象
2.根据请求方法+资源路径,在映射表中查找对应请求的处理函数,找到之后执行函数,传入请求信息
3,对我们自己编写的函数根据request中的请求信息,进行业务处理,处理完成后填充Response对象
4.处理函数执行完成后,线程根据Response对象中的数据组织http响应,发送给客户端
5.如果是短连接则关闭套接字,处理完毕;如果是长连接,则等待下一条请求
数据库表设计
1.用户表:用户ID,用户名字,用户密码,用户邮箱----->注册+登录
2.用户信息表:个人信息+笔试信息+面试信息(面试时间,面试分数,面试建议)
目录结构设计
bin:可执行程序+配置文件
src:
ais_system.cpp 主类
database.hpp 数据库对应头文件
tools.hpp 工具类
log.hpp 日志文件
session.hpp 会话
test:测试文件
项目模块实现
注册模块
当用户第一次使用这个系统,需要注册成为系统的用户;
注册的时候需要姓名,密码,邮箱,学校,专业,年级,电话等信息。
注册请求, 用户名字,密码, 邮箱
1.插入数据库当中1.1 针对注册的信息, 先插入注册信息表 1.2 组织插入语句
开启事务------>创建保存点----->回滚(失败)---->提交事务
2.给浏览器响应一个应答, 需要是json格式
登录模块
登录模块,需要向后台提交邮箱跟密码,我们后台拿到用户提交的信息,去数据库模块里校验,查看reg_userinfo数据库是否有这个邮箱,有的话再去校验密码是否正确;错误返回false给浏览器,如果是true则进入会话模块。
1.解析提交内容
2.校验用户的邮箱密码
3.登录成功后,返回sessionid,标识当前用户3.1 获取指定用户的信息 3.2 生成sessionid
会话模块
当这个用户存在并且登陆的时候,我们为了标识这个用户,会分配给它一个session_id,用其编号+姓名+预约时间,拼接成一个长的string,然后MD5加密这个长字符串作为我们的session_id;
同时可能有好几个用户访问这个系统,所以我们要有一个session_id的数组,这个session_id同时还是map的key,它的value是用户的其他信息,以string的形式存在一个Session的类中。
1.要根据请求头部当中的sessinid, 从all_session_,查询到对应的用户信息
2.在去查询数据库,获取用户的信息
3.组织应答
业务模块
用户登陆上来后,可以预约面试时间,点击预约,会跳转到预约面试页面,然后输入自己的笔试成绩,选择一个时间进行预约面试,最后点击提交完成
1.从header获取sessionid
2.获取正文当中那个提交的信息, 进行切割,获取到value
3.组织更新的sql语句
4.调用执行sql语句的函数
5.组织应答
代码
GiuHub: https://github.com/Hedenghui/Myproject