总体思路
通过httplib库函数中的Post和Get方法来处理以下四种请求
注册
:处理浏览器传来的数据,并调用数据库函数增加列
登录
:处理浏览器传来的数据,在数据库中进行查询,登陆成功则生成sessionID用以后续使用
数据页面
:处理浏览器传来的数据,使用sessionID查询当前登录的用户,在数据库中查询该用户信息并返回
数据提交
:处理浏览器传来的数据,根据头部的sessionID查询登陆用户,切割正文提交的信息,插入数据库
整体结构
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() { }
void GetSessionId(httplib::Request res, string* session_id);
bool Load(const string& config_filename);
private: string _svr_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;
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; 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; } string _session_id; string _origin_str; Json::Value _user_info; };
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class AllSessionInfo { public: AllSessionInfo(); ~AllSessionInfo(); bool SetSessionValue(string& session_id, Session& session_info); bool GetSessionValue(string& session_id, Session* session_info); private: unordered_map<string, Session> _session_map; pthread_mutex_t _map_lock; };
|
工具
该模块主要完成对浏览器响应正文的数据进行分割和解析,输出日志信息,较为简单
执行流程
响应登录请求(Post方法)
- 解析提交的内容
- 先根据邮箱作为查询条件,如果邮箱不存在,则登陆失败,如果邮箱存在,则校验密码
- 上一步校验失败,向浏览器返回false,校验成功则进行下一步
- 根据登录用户信息,生成sessionid,用以表示当前用户
- 跳转到个人信息页面
个人信息也页面(Get方法)
- 根据请求头部的sessionid信息,从管理sessionid的类中获取当前登录用户信息
- 查询数据库,获取用户信息
- 组织应答
注册请求(Post方法)
- 解析请求正文
- 将解析出的用户信息插入注册信息表(此处需要开启数据库事务,加入注册信息插入失败,则回滚)
- 组织应答
预约请求(Post方法)
基本思路同注册请求
效果预览图与项目代码
注册页面
登录页面
数据提交页面
个人信息页面
GitHub地址:https://github.com/Latsummer/interview-system