当用户收到消息时,若该用户不在线,则需要将消息存到离线消息表,服务器待用户上线后转发消息
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,增加三处代码
完整的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的消息已经存放在离线消息表了
现在让li si登录,登录后服务器会在离线消息表offlinemessage中查找是否存在li si的离线消息,有则转发给li si
离线消息转发给li si后,表中的消息被清除,我们查看一下此时的离线消息表offlinemessage