文章目录

  • 群聊功能思路
  • 放码过来
  • groupuser.hpp
  • group.hpp
    • groupmodel.hpp
    • groupmodel.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++搭建集群聊天室(十四):群聊功能相关推荐

  1. Netty+Android搭建一个简易聊天室(实现群聊和私聊)

    零,前言 JRBM项目中无论是好友私聊,公开聊天室,还是比赛平台都需要用到长连接,之前没有接触过网络通信等知识,更别说框架了,因此直接上手netty确实有些困难,在前期主要是在b站上看(https:/ ...

  2. C++搭建集群聊天室(四):工程统帅神器 Cmake,我爱死它了

    "咳咳,讲了这么久,还是不讲点知识点,一直就配置环境配置环境的,烦不烦呐!!!" 快了快了,这个环境搭建完就进主题 文章目录 环境搭建 CMAkeLists.txt 文件编写示例 ...

  3. Openstack云平台脚本部署之Ceph存储集群配置(十四)

    目录 一.简介 二.部署脚本 三.参考文档 四.源码 五.系列文章 一.简介 Openstack的后端存储对接Ceph分布式统一存储,将Glance镜像.Nova虚拟机及快照.Cinder-Volum ...

  4. websocket以及nodejs联手打造的类qq群聊天室 教程 附 原代码

    这次给大家分享的是我自己开发的多人聊天室,利用websocket 以及服务器端使用node.js 来让用户不需要刷新浏览器就可以获得实时更新. 如下面图所示的样子.开发出类QQ群聊天室的主界面,当然U ...

  5. Nodejs+webSocket搭建多人聊天室

    NodeJs+webSocket搭建多人聊天室 准备的东西: 第一步:安装插件并且完善服务端 第二步 :搭建客户端并与服务端的通信 第三步 :添加CSS样式 第四步:总结 今天花了一个上午的时间去学习 ...

  6. 使用WebRTC搭建前端视频聊天室——数据通道篇

    转自 使用WebRTC搭建前端视频聊天室--数据通道篇 在两个浏览器中,为聊天.游戏.或是文件传输等需求发送信息是十分复杂的.通常情况下,我们需要建立一台服务器来转发数据,当然规模比较大的情况下,会扩 ...

  7. golang实现聊天室(四)

    golang实现聊天室(四) 服务端给已经建立连接的客户端发送消息 client1 func main() {var conn, err = net.DialTimeout("tcp&quo ...

  8. 基于flask的网页聊天室(四)

    基于flask的网页聊天室(四) 前言 接前天的内容,今天完成了消息的处理 具体内容 上次使用了flask_login做用户登录,但是直接访问login_requare装饰的函数会报401错误,这里可 ...

  9. 使用WebRTC搭建前端视频聊天室——点对点通信篇

    转载自:使用WebRTC搭建前端视频聊天室--点对点通信篇 WebRTC给我们带来了浏览器中的视频.音频聊天体验.但个人认为,它最实用的特性莫过于DataChannel--在浏览器之间建立一个点对点的 ...

  10. 高级API快速入门之群聊天室【09】

    一.控制台版本的群聊天室                     其原理就是:通过死循环进行保存连接服务器的客户端,并创建一个容器来保存所有连接服务器的客户端              服务器: pa ...

最新文章

  1. CentOS 6 时间,时区,设置修改及时间同步
  2. CF1407D Discrete Centrifugal Jumps(单调队列+DP)
  3. 0x13.基础数据结构 — 链表与邻接表
  4. 利用委托机制处理.NET中的异常
  5. python五十四:isinstance和issubclass
  6. SM37job状态意义
  7. Vr-Vantage之场景与环境
  8. SQL Server 统计信息更新时采样百分比对数据预估准确性的影响
  9. 中python执行shell_IPython,在探索中学习编程
  10. 挖掘频繁模式、关联和Apriori算法
  11. Web App 前端构建(纯净版)
  12. 计算机显示的网络,如何设置在电脑右下角显示网络连接图标
  13. mybatis代码自动生成工具-MyBatis Generator
  14. CS61A 系列课程笔记(一)
  15. android打印机字体大小,热敏打印机字体大小设置,怎么设置打印机字体
  16. 计算机文献信息检索发展的最高阶段,文献检索作业答案.doc
  17. 小米4降级android版本,小米MIUI不再允许降级,小心手机变砖
  18. Win7系统组策略怎么打开 打开组策略的几种方法
  19. 战地4 网页服务器地址,战地4修改的服务器地址
  20. Javascript——下载功能,获取电脑桌面制定下载路径

热门文章

  1. 眼睛有血斑,就是眼底出血?
  2. python中的newline_python open函数newline用法
  3. Java自定义连接池
  4. 公共数据库介绍~联合国数据库UNDATA
  5. 计算机硬盘模式,电脑硬盘模式是什么?怎么转换
  6. 虚拟机配置文件vmx放置路径问题
  7. typora上传图片出现Can‘t find smms config错误
  8. springboot笔记(硅谷)
  9. 高仿精仿微信客户端源码完整版
  10. GILT市场方兴未艾