失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > C++搭建集群聊天室(十四):群聊功能

C++搭建集群聊天室(十四):群聊功能

时间:2023-04-24 01:12:54

相关推荐

C++搭建集群聊天室(十四):群聊功能

文章目录

群聊功能思路放码过来groupuser.hppgroup.hppgroupmodel.hppgroupmodel.cpp

群聊功能思路

1、创建群聊,提交群信息,返回群号

2、拉取群人员基本信息,包括昵称、ID。

3、群发消息时,如果成员在线则直接推送,成员不在线则存储相应群员的离线消息。

放码过来

照例先修改一下 public.hpp 文件。

#ifndef PUBLIC_H_#define PUBLIC_H_enum EnMsgType{LOGIN_TYPE = 1, //正常登录LOGIN_MSG_ACK, //登录相应消息REG_TYPE, //正常注册REG_MSG_ACK, //注册相应消息ONE_CHAT_MSG, //一对一聊天消息ADD_FRINEND_MSG,//添加好友CREATE_GROUP_MSG, // 创建群组ADD_GROUP_MSG, // 加入群组GROUP_CHAT_MSG, // 群聊天};#endif

成员基本信息和 User 重合度高,所以直接继承 User 类。

groupuser.hpp

#ifndef GROUPUSER_H#define GROUPUSER_H#include "user.hpp"// 群组用户,多了一个role角色信息,从User类直接继承,复用User的其它信息class GroupUser : public User{public:void setRole(string role) {this->role = role; }string getRole() {return this->role; }private:string role;};#endif

group.hpp

这个文件映射的是 AllGroup 的数据表。

#ifndef GROUP_H#define GROUP_H#include "groupuser.hpp"#include <string>#include <vector>using namespace std;// GroupUser表的映射class Group{public:Group(int id = -1, string name = "", string desc = ""){this->id = id;this->name = name;this->desc = desc;}void setId(int id) {this->id = id; }void setName(string name) {this->name = name; }void setDesc(string desc) {this->desc = desc; }int getId() {return this->id; }string getName() {return this->name; }string getDesc() {return this->desc; }vector<GroupUser> &getUsers() {return this->users; }private:int id;string name;string desc;vector<GroupUser> users;};#endif

接下来,是model类的声明及其实现。

groupmodel.hpp

#ifndef GROUPMODEL_H_#define GROUPMODEL_H_#include "group.hpp"#include <string>#include <vector>using namespace std;// 维护群组信息的操作接口方法class GroupModel{public:// 创建群组bool createGroup(Group &group);// 加入群组void addGroup(int userid, int groupid, string role);// 查询用户所在群组信息vector<Group> queryGroups(int userid);// 根据指定的groupid查询群组用户id列表,除userid自己,主要用户群聊业务给群组其它成员群发消息vector<int> queryGroupUsers(int userid, int groupid);};#endif

groupmodel.cpp

#include "groupmodel.hpp"#include "db.hpp"// 创建群组bool GroupModel::createGroup(Group &group){// 1.组装sql语句char sql[1024] = {0};sprintf(sql, "insert into AllGroup(groupname, groupdesc) values('%s', '%s')",group.getName().c_str(), group.getDesc().c_str());MySQL mysql;if (mysql.connect()){if (mysql.update(sql)){group.setId(mysql_insert_id(mysql.getconnection()));return true;}}return false;}// 加入群组void GroupModel::addGroup(int userid, int groupid, string role){// 1.组装sql语句char sql[1024] = {0};sprintf(sql, "insert into groupuser values(%d, %d, '%s')",groupid, userid, role.c_str());MySQL mysql;if (mysql.connect()){mysql.update(sql);}}// 查询用户所在群组信息vector<Group> GroupModel::queryGroups(int userid){// 根据userid在groupuser表中查询出该用户所属的群组信息char sql[1024] = {0};sprintf(sql, "select a.id,a.groupname,a.groupdesc from allgroup a inner join groupuser b on a.id = b.groupid where b.userid=%d",userid);vector<Group> groupVec;MySQL mysql;if (mysql.connect()){MYSQL_RES *res = mysql.query(sql);if (res != nullptr){MYSQL_ROW row;// 查出userid所有的群组信息while ((row = mysql_fetch_row(res)) != nullptr){Group group;group.setId(atoi(row[0]));group.setName(row[1]);group.setDesc(row[2]);groupVec.push_back(group);}mysql_free_result(res);}}// 根据群组信息,查询属于该群组的所有用户的userid,并且和user表进行多表联合查询,查出用户的详细信息for (Group &group : groupVec){sprintf(sql, "select a.id,a.name,a.state,b.grouprole from user a inner join groupuser b on b.userid = a.id where b.groupid=%d",group.getId());MYSQL_RES *res = mysql.query(sql);if (res != nullptr){MYSQL_ROW row;// 对 group 中 user 字段进行填充while ((row = mysql_fetch_row(res)) != nullptr){GroupUser user;user.setID(atoi(row[0]));user.setname(row[1]);user.setstate(row[2]);user.setRole(row[3]);group.getUsers().push_back(user);}mysql_free_result(res);}}return groupVec;}// 根据指定的groupid查询群组用户id列表,就是上面功能中的一小块儿剥离出来// 用于消息群发vector<int> GroupModel::queryGroupUsers(int userid, int groupid){char sql[1024] = {0};sprintf(sql, "select userid from groupuser where groupid = %d and userid != %d", groupid, userid);vector<int> idVec;MySQL mysql;if (mysql.connect()){MYSQL_RES *res = mysql.query(sql);if (res != nullptr){MYSQL_ROW row;while ((row = mysql_fetch_row(res)) != nullptr){idVec.push_back(atoi(row[0]));}mysql_free_result(res);}}return idVec;}

一切准备妥当,至此我们的单台服务器开发完成。

调整一下代码版块,把model层代码放到model模块中,再修改一下cmake。

如果觉得《C++搭建集群聊天室(十四):群聊功能》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。