离线消息业务代码和测试

65 阅读2分钟

当用户收到消息时,若该用户不在线,则需要将消息存到离线消息表,服务器待用户上线后转发消息

image.png

1. 创建offlinemessagemodel.hpp

在include/server/model下创建文件:offlinemessagemodel.hpp,该类用于操作表offlinemessage

#ifndef OFFLINEMESSAGEMODEL_H
#define OFFLINEMESSAGEMODEL_H

#include <string>
#include <vector>
using namespace std;

//提供离线消息表的操作接口方法
class OfflineMsgModel
{
public:
    //存储用户的离线信息
    void insert(int userid, string msg);

    //删除用户的离线信息
    void remove(int userid);

    //查询用户的离线消息
    vector<string> query(int userid);
};

#endif

2. 创建offlinemessagemodel.cpp

在src/server/model下创建文件:offlinemessagemodel.cpp

#include "offlinemessagemodel.hpp"
#include "db.h"

//存储用户的离线信息
void OfflineMsgModel::insert(int userid, string msg)
{
    // 1. 组装sql语句
    char sql[1024] = {0};

    sprintf(sql, "insert into offlinemessage values(%d, '%s')", userid, msg);
    MySQL mysql;

    if (mysql.connect())
    {
       mysql.update(sql))
    }
}

//删除用户的离线信息
void OfflineMsgModel::remove(int userid)
{
    // 1. 组装sql语句
    char sql[1024] = {0};

    sprintf(sql, "delete from offlinemessage where userid=%d", userid);
    MySQL mysql;

    if (mysql.connect())
    {
       mysql.update(sql))
    }
}

//查询用户的离线消息
vector<string> OfflineMsgModel::query(int userid)
{
    // 1. 组装sql语句
    char sql[1024] = {0};
    sprintf(sql, "select message from offlinemessage where userid = %d", userid);

    vector<string> vec;
    MySQL mysql;

    if (mysql.connect())
    {
        MYSQL_RES *res = mysql.query(sql);
        if (res != nullptr)
        {
            //把userid用户的所有离线消息放入vec中返回
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(res)) != nullptr)
            {
                vec.push_back(row[0]);
            }
            mysql_free_result(res);
        }
    }
    // 如果数据库没有连接上,或者没查找到id对应数据,则返回默认构造的user,id=-1
    return vec;
}

3.chatservice.hpp添加离线消息对象

在include/server/chatservice.hpp操作数据库存储离线消息对象:_offlineMsgModel

#include "offlinemessagemodel.hpp"
//操作数据库存储离线消息对象
OfflineMsgModel _offlineMsgModel;

4. 在chatservice.cpp的oneChat方法中添加保存离线消息的代码

完善src/server/chatservice.cpp,增加三处代码

image.png

image.png

image.png 完整的chatservice.cpp代码

#include "offlinemessagemodel.hpp"
#include "db.h"


//存储用户的离线信息
void OfflineMsgModel::insert(int userid, string msg)
{
    // 1. 组装sql语句
    char sql[1024] = {0};

    sprintf(sql, "insert into offlinemessage values(%d, '%s')", userid, msg.c_str());
    MySQL mysql;

    if (mysql.connect())
    {
       mysql.update(sql);
    }
}

//删除用户的离线信息
void OfflineMsgModel::remove(int userid)
{
    // 1. 组装sql语句
    char sql[1024] = {0};

    sprintf(sql, "delete from offlinemessage where userid=%d", userid);
    MySQL mysql;

    if (mysql.connect())
    {
       mysql.update(sql);
    }
}

//查询用户的离线消息
vector<string> OfflineMsgModel::query(int userid)
{
    // 1. 组装sql语句
    char sql[1024] = {0};
    sprintf(sql, "select message from offlinemessage where userid = %d", userid);

    vector<string> vec;
    MySQL mysql;

    if (mysql.connect())
    {
        MYSQL_RES *res = mysql.query(sql);
        if (res != nullptr)
        {
            //把userid用户的所有离线消息放入vec中返回
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(res)) != nullptr)
            {
                vec.push_back(row[0]);
            }
            mysql_free_result(res);
        }
    }
    // 如果数据库没有连接上,或者没查找到id对应数据,则返回默认构造的user,id=-1
    return vec;
}

5. 编译测试

编译成功后让登录zhang san并给离线的li si发送消息,检测数据库zhang san给li si的消息已经存放在离线消息表了

image.png 现在让li si登录,登录后服务器会在离线消息表offlinemessage中查找是否存在li si的离线消息,有则转发给li si

image.png 离线消息转发给li si后,表中的消息被清除,我们查看一下此时的离线消息表offlinemessage

image.png