客户端登录功能
登录界面新增err_tip,用来提示用户登陆结果。至于密码输入框大家可以根据注册界面的逻辑实现隐藏和显示的功能。这里留给大家自己实现。
点击登录需要发送http 请求到GateServer,GateServer先验证登录密码,再调用grpc请求给StatusServer,获取聊天服务器ip信息和token信息反馈给客户端。
结构图如下
我们先实现客户端登录,为登录按钮添加槽函数响应
1 | void LoginDialog::on_login_btn_clicked() |
增加检测函数
1 | bool LoginDialog::checkUserValid(){ |
在HttpMgr中添加sig_login_mod_finish信号,收到http请求完成回包的槽函数中添加登录模块的响应,将登录模块的消息发送到登录界面
1 | void HttpMgr::slot_http_finish(ReqId id, QString res, ErrorCodes err, Modules mod) |
在LoginDialog的构造函数中添加消息对应的槽函数连接
1 | LoginDialog::LoginDialog(QWidget *parent) : |
initHttpHandlers为初始化http回调逻辑, 并添加_handlers成员
1 | void LoginDialog::initHttpHandlers() |
在LoginDialog中添加槽函数slot_login_mod_finish
1 | void LoginDialog::slot_login_mod_finish(ReqId id, QString res, ErrorCodes err) |
到此客户端登陆请求发送的模块封装完了
GateServer完善登陆逻辑
在LogicSystem的构造函数中添加登陆请求的注册。
1 | //用户登录逻辑 |
在MysqlMgr中添加CheckPwd函数
1 | bool MysqlMgr::CheckPwd(const std::string& name, const std::string& pwd, UserInfo& userInfo) { |
在DAO层添加根据用户名查询sql逻辑,并且判断pwd是否匹配。
1 | bool MysqlDao::CheckPwd(const std::string& name, const std::string& pwd, UserInfo& userInfo) { |
因为要调用grpc访问StatusServer,所以我们这里先完善协议proto文件
1 | syntax = "proto3"; |
我们用下面两条命令重新生成pb.h和grpc.pb.h
1 | D:\cppsoft\grpc\visualpro\third_party\protobuf\Debug\protoc.exe --cpp_out=. "message.proto" |
生成grpc.pb.h
1 | D:\cppsoft\grpc\visualpro\third_party\protobuf\Debug\protoc.exe -I="." --grpc_out="." --plugin=protoc-gen-grpc="D:\cppsoft\grpc\visualpro\Debug\grpc_cpp_plugin.exe" "message.proto" |
这俩命令执行完成后总计生成四个文件
实现StatusGrpcClient
1 |
|
具体实现
1 |
|
当然GateServer的config.ini文件也要做更新
1 | [GateServer] |
StatusGrpcClient用到了StatusConPool, 将其实现放在StatusGrpcClient类之上
1 | class StatusConPool { |
StatusServer状态服务
我们要实现状态服务,主要是用来监听其他服务器的查询请求, 用visual studio创建项目,名字为StatusServer.
在主函数所在文件StatusServer.cpp中实现如下逻辑
1 |
|
在开始逻辑之前,我们需要先更新下config.ini文件
1 | [StatusServer] |
然后我们将GateServer之前生成的pb文件和proto文件拷贝到StatusServer中。并且加入到项目中。
我们在项目中添加一个新的类StatusServiceImpl,该类主要继承自StatusService::Service。
1 |
|
具体实现
1 |
|
其余的文件为了保持复用,我们不重复开发,将GateServer中的RedisMgr,MysqlMgr,Singleton,IOSerivePool等统统拷贝过来并添加到项目中。
联调测试
我们启动StatusServer,GateServer以及QT客户端,输入密码和用户名,点击登陆,会看到前端收到登陆成功的消息