C++聊天集群服务器3

发布时间 2023-11-28 10:35:41作者: 桂洛克船长

​ 这部分的主要业务逻辑是网络层获取到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"] ="用户名或者密码错误";
    }
}

二、增加数据库代码

image-20231127204848043

具体实现:

image-20231127204908355

三、添加对user表操作类函数

image-20231127205605258

​ 实现:

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;
}

四、测试

image-20231127210111503

​ 可以看到存在数据库里的账号可以登录,返回的错误码为0代表没问题,下面测试错误情况:

image-20231127210311467

​ 这里可以看见登录同一个账号没反应,经过排查是忘了把错误信息发回来了,并无问题,至此登录业务代码开发完毕。测试通过。