0%

在线的面试预约系统

总体思路

通过httplib库函数中的Post和Get方法来处理以下四种请求

  • 注册 :处理浏览器传来的数据,并调用数据库函数增加列
  • 登录 :处理浏览器传来的数据,在数据库中进行查询,登陆成功则生成sessionID用以后续使用
  • 数据页面:处理浏览器传来的数据,使用sessionID查询当前登录的用户,在数据库中查询该用户信息并返回
  • 数据提交:处理浏览器传来的数据,根据头部的sessionID查询登陆用户,切割正文提交的信息,插入数据库

IMG_7559

整体结构

http服务

创建了一个类来完成整个项目的运行,这个类用于保存登录数据库的参数、所有登录用户的sessionid、启动http服务,其结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class AisSvr
{
public:
AisSvr()
{ }

int OnInit(const string& config_filename)//初始化
{ }

void Start()//启动http服务
{ }

void GetSessionId(httplib::Request res, string* session_id);//获取当前用户的sessionid

bool Load(const string& config_filename);//打开配置文件

private:
string _svr_ip;//服务端监听的IP地址
uint16_t _svr_port;//服务端监听的端口

//数据库类成员
DataBaseSvr* _db;
string _db_ip;
string _db_user;
string _db_passwd;
string _db_name;
uint16_t _db_port;

AllSessionInfo* _all_session;//所有登录用户的sessionid

httplib::Server _http_svr;
};

数据库操作

对于数据库的操作,同样创建了一个类来完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class DataBaseSvr//数据库类
{

public:
DataBaseSvr(string& host, string& user, string& passwd, string& db, uint16_t port)
{
_host = host;
_user = user;
_passwd = passwd;
_db = db;
_port = port;

mysql_init(&_mysql);
}

~DataBaseSvr()
{
mysql_close(&_mysql);
}
bool QuerySql(const string& sql);//操作数据库接口
bool Connect2MySQL()

bool QueryUserExist(Json::Value& request_json, Json::Value* result);//数据库查询
bool QueryOneStuInfo(string user_id, Json::Value* result);//查询用户信息

private:
//MySQL就是客户端的操作句柄
MYSQL _mysql;
string _host;
string _user;
string _passwd;
string _db;
uint16_t _port;
};

sessionid管理

创建了一个类专门计算MD5值,用另一个类进行封装,同时管理一批sessionid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Session
{
public:
Session()
{}
Session(Json::Value& user_info)
{
_origin_str.clear();
_user_info = user_info;

_origin_str += to_string(_user_info["stu_id"].asInt());
_origin_str += _user_info["stu_name"].asString();
_origin_str += _user_info["stu_interview_time"].asString();
}
~Session()
{}
bool SumMd5();
string& GetSessionId()
{
SumMd5();
return _session_id;
}
//private:因为不想再写个接口获取sessionid所以直接将成员变量设为public(懒惰!)
string _session_id;//保存session_id
string _origin_str;//原始的串,用来生成session_id
Json::Value _user_info;//原始串内容:stu_id, stu_name, stu_interview_time
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class AllSessionInfo
{
public:
AllSessionInfo();
~AllSessionInfo();
//Set Session
bool SetSessionValue(string& session_id, Session& session_info);
//Get Session
bool GetSessionValue(string& session_id, Session* session_info);
private:
//key:sessionid,value:session
unordered_map<string, Session> _session_map;
pthread_mutex_t _map_lock;//所有操作均需要互斥完成
};

工具

该模块主要完成对浏览器响应正文的数据进行分割和解析,输出日志信息,较为简单

执行流程

响应登录请求(Post方法)

  1. 解析提交的内容
  2. 先根据邮箱作为查询条件,如果邮箱不存在,则登陆失败,如果邮箱存在,则校验密码
  3. 上一步校验失败,向浏览器返回false,校验成功则进行下一步
  4. 根据登录用户信息,生成sessionid,用以表示当前用户
  5. 跳转到个人信息页面

个人信息也页面(Get方法)

  1. 根据请求头部的sessionid信息,从管理sessionid的类中获取当前登录用户信息
  2. 查询数据库,获取用户信息
  3. 组织应答

注册请求(Post方法)

  1. 解析请求正文
  2. 将解析出的用户信息插入注册信息表(此处需要开启数据库事务,加入注册信息插入失败,则回滚)
  3. 组织应答

预约请求(Post方法)

基本思路同注册请求

效果预览图与项目代码

注册页面

IMG_7555

登录页面

IMG_7556

数据提交页面

IMG_7554

个人信息页面

IMG_7558

GitHub地址:https://github.com/Latsummer/interview-system

-------------本文结束感谢您的阅读-------------