C++聊天集群服务器3
这部分的主要业务逻辑是网络层获取到json文件解析后,调用注册好的登录事件回调函数login,然后获取id和密码,通过查询是否在数据库里判断下一步业务,然后更新其在数据库里的在线在线状态,处理错误。因此,需要在对user表操作的类添加查询以及更新函数。
一、用户登录代码
将chatservice的登录业务函数实现:
// 处理登录业务 id pwd
void ChatService::login(const TcpConnectionPtr &conn, json &js, Timestamp time)
{
int id = js["id"].get<int>();
string pwd = js["password"];
User user = _usermodel.query(id);
if(user.getId()!=-1 && user.getPwd() == pwd)
{
if(user.getState() == "online")
{
//已经登录,不允许重复登录
//失败 组装json发送回去
json response;
response["msgid"] = LOGIN_MSG_ACK;
response["errno"] = 2;
response["errmsg"] ="该账号已经登录,请重新输入";
}
else
{
user.setState("online");
_usermodel.updateState(user);
//成功 组装json发送回去
json response;
response["msgid"] = LOGIN_MSG_ACK;
response["errno"] = 0;
response["id"] = user.getId();
response["name"] = user.getName();
conn->send(response.dump());
}
}
else
{
//失败 组装json发送回去
json response;
response["msgid"] = LOGIN_MSG_ACK;
response["errno"] = 1;
response["errmsg"] ="用户名或者密码错误";
}
}
二、增加数据库代码
具体实现:
三、添加对user表操作类函数
实现:
User UserModel::query(int id)
{
//1.组装sql语句
char sql[1024]={0};
sprintf(sql,"select * from user where id = %d;",id);
MySQL mysql;
if(mysql.connect())
{
MYSQL_RES* res = mysql.query(sql);
if(res != nullptr)
{
MYSQL_ROW row = mysql_fetch_row(res);
if(row != nullptr)
{
User user;
user.setId(atoi(row[0]));
user.setName(row[1]);
user.setPwd(row[2]);
user.setState(row[3]);
//释放
mysql_free_result(res);
return user;
}
}
}
return User();
}
//更新用户状态信息
bool UserModel::updateState(User user)
{
//1.组装sql语句
char sql[1024]={0};
sprintf(sql,"update user set state = '%s' where id = %d;",user.getState().c_str(),user.getId());
MySQL mysql;
if(mysql.connect())
{
if(mysql.update(sql))
{
return true;
}
}
return false;
}
四、测试
可以看到存在数据库里的账号可以登录,返回的错误码为0代表没问题,下面测试错误情况:
这里可以看见登录同一个账号没反应,经过排查是忘了把错误信息发回来了,并无问题,至此登录业务代码开发完毕。测试通过。