群组业务包含:管理员创建群,组员加入群,群聊
群组里面包含组员,一个组员可以在多个群组,一个群组可以有多个组员

分为管理员,普通成员

群组业务代码

我们在include下的server下的model下创建文件:group.hpp

#ifndef GROUP_H
#define GROUP_H#include "groupuser.hpp"
#include <string>
#include <vector>
using namespace std;//User表的ORM类
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

我们在include下的server下的model下创建文件: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

我们在include下的server下的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

我们在src下的server下的model下创建文件: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)
{/*1. 先根据userid在groupuser表中查询出该用户所属的群组信息2. 在根据群组信息,查询属于该群组的所有用户的userid,并且和user表进行多表联合查询,查出用户的详细信息*/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);}}//查询群组的用户信息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;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列表,除userid自己,主要用户群聊业务给群组其它成员群发消息
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;
}

我们完善public.hpp

#ifndef PUBLIC_H
#define PUBLIC_H/*
server和client的公共文件
*/
enum EnMsgType
{LOGIN_MSG = 1,//登录消息LOGIN_MSG_ACK,//登录响应消息REG_MSG,//注册消息REG_MSG_ACK,//注册响应消息ONE_CHAT_MSG,//聊天消息ADD_FRIEND_MSG,//添加好友消息CREATE_GROUP_MSG,//创建群组ADD_GROUP_MSG,//加入群组GROUP_CHAT_MSG,//群聊天
};#endif

我们完善chatservice.hpp
新增代码

#include "groupmodel.hpp"
//创建群组业务
void createGroup(const TcpConnectionPtr &conn, json &js, Timestamp time);
//加入群组业务
void addGroup(const TcpConnectionPtr &conn, json &js, Timestamp time);
//群组聊天业务
void groupChat(const TcpConnectionPtr &conn, json &js, Timestamp time);GroupModel _groupModel;

完整代码

#ifndef CHATSERVICE_H
#define CHATSERVICE_H#include <muduo/net/TcpConnection.h>
#include <unordered_map>//一个消息ID映射一个事件处理
#include <functional>
#include <mutex>
using namespace std;
using namespace muduo;
using namespace muduo::net;#include "usermodel.hpp"
#include "offlinemessagemodel.hpp"
#include "friendmodel.hpp"
#include "groupmodel.hpp"
#include "json.hpp"
using json = nlohmann::json;//表示处理消息的事件回调方法类型,事件处理器,派发3个东西
using MsgHandler = std::function<void(const TcpConnectionPtr &conn, json &js, Timestamp)>;//聊天服务器业务类
class ChatService
{public://获取单例对象的接口函数static ChatService *instance();//处理登录业务void login(const TcpConnectionPtr &conn, json &js, Timestamp time);//处理注册业务void reg(const TcpConnectionPtr &conn, json &js, Timestamp time);//一对一聊天业务void oneChat(const TcpConnectionPtr &conn, json &js, Timestamp time);//添加好友业务void addFriend(const TcpConnectionPtr &conn, json &js, Timestamp time);//创建群组业务void createGroup(const TcpConnectionPtr &conn, json &js, Timestamp time);//加入群组业务void addGroup(const TcpConnectionPtr &conn, json &js, Timestamp time);//群组聊天业务void groupChat(const TcpConnectionPtr &conn, json &js, Timestamp time);//处理客户端异常退出void clientCloseException(const TcpConnectionPtr &conn);//服务器异常,业务重置方法void reset();//获取消息对应的处理器MsgHandler getHandler(int msgid);
private:ChatService();//单例 //存储消息id和其对应的业务处理方法,消息处理器的一个表,写消息id对应的处理操作 unordered_map<int, MsgHandler> _msgHandlerMap;//存储在线用户的通信连接,用户的id, TcpConnectionPtrunordered_map<int, TcpConnectionPtr> _userConnMap;//定义互斥锁,保证_userConnMap的线程安全mutex _connMutex;//数据操作类对象UserModel _userModel;OfflineMsgModel _offlineMsgModel;   FriendModel _friendModel;GroupModel _groupModel;};#endif

我们完善chatservice.cpp
新增代码

//群组业务管理相关事件处理回调注册
_msgHandlerMap.insert({CREATE_GROUP_MSG, std::bind(&ChatService::createGroup, this, _1, _2, _3)});
_msgHandlerMap.insert({ADD_GROUP_MSG, std::bind(&ChatService::addGroup, this, _1, _2, _3)});
_msgHandlerMap.insert({GROUP_CHAT_MSG, std::bind(&ChatService::groupChat, this, _1, _2, _3)});
//创建群组业务
void ChatService::createGroup(const TcpConnectionPtr &conn, json &js, Timestamp time)
{int userid = js["id"].get<int>();//创建群的用户的id string name = js["groupname"];string desc = js["groupdesc"];//存储新创建的群组信息Group group(-1, name, desc);if (_groupModel.createGroup(group)){//存储群组创建人信息_groupModel.addGroup(userid, group.getId(), "creator");}
}
//加入群组业务
void ChatService::addGroup(const TcpConnectionPtr &conn, json &js, Timestamp time)
{int userid = js["id"].get<int>();int groupid = js["groupid"].get<int>();_groupModel.addGroup(userid, groupid, "normal");
}
//群组聊天业务
void ChatService::groupChat(const TcpConnectionPtr &conn, json &js, Timestamp time)
{int userid = js["id"].get<int>();int groupid = js["groupid"].get<int>();vector<int> useridVec = _groupModel.queryGroupUsers(userid, groupid);//查询这个用户所在群组的其他用户id lock_guard<mutex> lock(_connMutex);//不允许其他人在map里面增删改查 for (int id : useridVec){auto it = _userConnMap.find(id);if (it != _userConnMap.end())//证明在线,直接转发 {//转发群消息it->second->send(js.dump());}else//离线 {//存储离线群消息_offlineMsgModel.insert(id, js.dump());}}
}//处理登录业务  id  pwd   检测pwd
void ChatService::login(const TcpConnectionPtr &conn, json &js, Timestamp time)
{int id = js["id"].get<int>();//获取id号 string pwd = js["password"];//获取密码 User user = _userModel.query(id);//查找 if (user.getId() == id && user.getPwd() == pwd)//查出来了,登录成功 {if (user.getState() == "online")//该用户已经登录,不允许重复登录{json response;response["msgid"] = LOGIN_MSG_ACK;response["errno"] = 2;response["errmsg"] = "this account is using, input another!";conn->send(response.dump());}else{//登录成功,记录用户连接信息,要考虑线程安全,因为多线程访问 {lock_guard<mutex> lock(_connMutex);_userConnMap.insert({id, conn});}//加个作用域,出了这个右括号就自动解锁//登录成功,更新用户状态信息 state offline=>onlineuser.setState("online");_userModel.updateState(user);json response;response["msgid"] = LOGIN_MSG_ACK;response["errno"] = 0;response["id"] = user.getId();response["name"] = user.getName();//查询该用户是否有离线消息vector<string> vec = _offlineMsgModel.query(id);//查当用户id if (!vec.empty())//不为空 {response["offlinemsg"] = vec;//json库可以和容器之间序列化和反序列化 //读取该用户的离线消息后,把该用户的所有离线消息删除掉_offlineMsgModel.remove(id);}//查询该用户的好友信息并返回vector<User> userVec = _friendModel.query(id);if (!userVec.empty()){vector<string> vec2;for (User &user : userVec){json js;js["id"] = user.getId();js["name"] = user.getName();js["state"] = user.getState();vec2.push_back(js.dump());}response["friends"] = vec2;}//查询用户的群组信息vector<Group> groupuserVec = _groupModel.queryGroups(id);if (!groupuserVec.empty()){//group:[{groupid:[xxx, xxx, xxx, xxx]}]vector<string> groupV;for (Group &group : groupuserVec){json grpjson;grpjson["id"] = group.getId();grpjson["groupname"] = group.getName();grpjson["groupdesc"] = group.getDesc();vector<string> userV;for (GroupUser &user : group.getUsers()){json js;js["id"] = user.getId();js["name"] = user.getName();js["state"] = user.getState();js["role"] = user.getRole();userV.push_back(js.dump());}grpjson["users"] = userV;groupV.push_back(grpjson.dump());}response["groups"] = groupV;}conn->send(response.dump());            }}else{//该用户不存在,用户存在但是密码错误,登录失败json response;response["msgid"] = LOGIN_MSG_ACK;response["errno"] = 1;response["errmsg"] = "id or password is invalid!";conn->send(response.dump());}
}

完整代码

#include "chatservice.hpp"
#include "public.hpp"
#include <muduo/base/Logging.h>//muduo的日志
#include <vector>
using namespace std;
using namespace muduo;//获取单例对象的接口函数
ChatService *ChatService::instance()
{static ChatService service;return &service;
}//构造方法,注册消息以及对应的Handler回调操作
ChatService::ChatService()
{//用户基本业务管理相关事件处理回调注册_msgHandlerMap.insert({LOGIN_MSG, std::bind(&ChatService::login, this, _1, _2, _3)});_msgHandlerMap.insert({REG_MSG, std::bind(&ChatService::reg, this, _1, _2, _3)});_msgHandlerMap.insert({ONE_CHAT_MSG, std::bind(&ChatService::oneChat, this, _1, _2, _3)});   _msgHandlerMap.insert({ADD_FRIEND_MSG, std::bind(&ChatService::addFriend, this, _1, _2, _3)});//群组业务管理相关事件处理回调注册_msgHandlerMap.insert({CREATE_GROUP_MSG, std::bind(&ChatService::createGroup, this, _1, _2, _3)});_msgHandlerMap.insert({ADD_GROUP_MSG, std::bind(&ChatService::addGroup, this, _1, _2, _3)});_msgHandlerMap.insert({GROUP_CHAT_MSG, std::bind(&ChatService::groupChat, this, _1, _2, _3)});}//服务器异常,业务重置方法
void ChatService::reset()
{//把online状态的用户,设置成offline_userModel.resetState();
}//获取消息对应的处理器
MsgHandler ChatService::getHandler(int msgid)
{//记录错误日志,msgid没有对应的事件处理回调auto it = _msgHandlerMap.find(msgid);if (it == _msgHandlerMap.end())//找不到 {//返回一个默认的处理器,空操作,=按值获取 return [=](const TcpConnectionPtr &conn, json &js, Timestamp) {LOG_ERROR << "msgid:" << msgid << " can not find handler!";//muduo日志会自动输出endl };}else//成功的话 {return _msgHandlerMap[msgid];//返回这个处理器 }
}//处理登录业务  id  pwd   检测pwd
void ChatService::login(const TcpConnectionPtr &conn, json &js, Timestamp time)
{int id = js["id"].get<int>();//获取id号 string pwd = js["password"];//获取密码 User user = _userModel.query(id);//查找 if (user.getId() == id && user.getPwd() == pwd)//查出来了,登录成功 {if (user.getState() == "online")//该用户已经登录,不允许重复登录{json response;response["msgid"] = LOGIN_MSG_ACK;response["errno"] = 2;response["errmsg"] = "this account is using, input another!";conn->send(response.dump());}else{//登录成功,记录用户连接信息,要考虑线程安全,因为多线程访问 {lock_guard<mutex> lock(_connMutex);_userConnMap.insert({id, conn});}//加个作用域,出了这个右括号就自动解锁//登录成功,更新用户状态信息 state offline=>onlineuser.setState("online");_userModel.updateState(user);json response;response["msgid"] = LOGIN_MSG_ACK;response["errno"] = 0;response["id"] = user.getId();response["name"] = user.getName();//查询该用户是否有离线消息vector<string> vec = _offlineMsgModel.query(id);//查当用户id if (!vec.empty())//不为空 {response["offlinemsg"] = vec;//json库可以和容器之间序列化和反序列化 //读取该用户的离线消息后,把该用户的所有离线消息删除掉_offlineMsgModel.remove(id);}//查询该用户的好友信息并返回vector<User> userVec = _friendModel.query(id);if (!userVec.empty()){vector<string> vec2;for (User &user : userVec){json js;js["id"] = user.getId();js["name"] = user.getName();js["state"] = user.getState();vec2.push_back(js.dump());}response["friends"] = vec2;}//查询用户的群组信息vector<Group> groupuserVec = _groupModel.queryGroups(id);if (!groupuserVec.empty()){//group:[{groupid:[xxx, xxx, xxx, xxx]}]vector<string> groupV;for (Group &group : groupuserVec){json grpjson;grpjson["id"] = group.getId();grpjson["groupname"] = group.getName();grpjson["groupdesc"] = group.getDesc();vector<string> userV;for (GroupUser &user : group.getUsers()){json js;js["id"] = user.getId();js["name"] = user.getName();js["state"] = user.getState();js["role"] = user.getRole();userV.push_back(js.dump());}grpjson["users"] = userV;groupV.push_back(grpjson.dump());}response["groups"] = groupV;}conn->send(response.dump());            }}else{//该用户不存在,用户存在但是密码错误,登录失败json response;response["msgid"] = LOGIN_MSG_ACK;response["errno"] = 1;response["errmsg"] = "id or password is invalid!";conn->send(response.dump());}
}//处理注册业务  name  password
void ChatService::reg(const TcpConnectionPtr &conn, json &js, Timestamp time)
{string name = js["name"];//获取名字 string pwd = js["password"];//获取密码 User user;//创建用户对象 user.setName(name);user.setPwd(pwd);bool state = _userModel.insert(user);//新用户的插入 if (state)//插入成功 {//注册成功json response;response["msgid"] = REG_MSG_ACK;response["errno"] = 0;response["id"] = user.getId();conn->send(response.dump());//回调 ,返回json字符串 }else//插入失败 {//注册失败json response;response["msgid"] = REG_MSG_ACK;response["errno"] = 1;conn->send(response.dump());//回调 ,返回json字符串 }
}//处理客户端异常退出
void ChatService::clientCloseException(const TcpConnectionPtr &conn)
{User user;{lock_guard<mutex> lock(_connMutex);for (auto it = _userConnMap.begin(); it != _userConnMap.end(); ++it)//用迭代器 {if (it->second == conn){//从map表删除用户的链接信息user.setId(it->first);_userConnMap.erase(it);break;}}}//更新用户的状态信息if (user.getId() != -1){user.setState("offline");_userModel.updateState(user);}
}//一对一聊天业务
void ChatService::oneChat(const TcpConnectionPtr &conn, json &js, Timestamp time)
{int toid = js["toid"].get<int>();//获取对方的id号 {lock_guard<mutex> lock(_connMutex);//访问连接信息表,要保证线程安全 auto it = _userConnMap.find(toid);//查找对方id号 if (it != _userConnMap.end())//找到了 {//toid在线,转发消息  服务器主动推送消息给toid用户it->second->send(js.dump());return;}}//toid不在线,存储离线消息_offlineMsgModel.insert(toid, js.dump());
}//添加好友业务 格式: msgid id friendid
void ChatService::addFriend(const TcpConnectionPtr &conn, json &js, Timestamp time)
{int userid = js["id"].get<int>();//当前用户的id int friendid = js["friendid"].get<int>();//添加好友的id //存储好友信息_friendModel.insert(userid, friendid);
}//创建群组业务
void ChatService::createGroup(const TcpConnectionPtr &conn, json &js, Timestamp time)
{int userid = js["id"].get<int>();//创建群的用户的id string name = js["groupname"];string desc = js["groupdesc"];//存储新创建的群组信息Group group(-1, name, desc);if (_groupModel.createGroup(group)){//存储群组创建人信息_groupModel.addGroup(userid, group.getId(), "creator");}
}
//加入群组业务
void ChatService::addGroup(const TcpConnectionPtr &conn, json &js, Timestamp time)
{int userid = js["id"].get<int>();int groupid = js["groupid"].get<int>();_groupModel.addGroup(userid, groupid, "normal");
}
//群组聊天业务
void ChatService::groupChat(const TcpConnectionPtr &conn, json &js, Timestamp time)
{int userid = js["id"].get<int>();int groupid = js["groupid"].get<int>();vector<int> useridVec = _groupModel.queryGroupUsers(userid, groupid);//查询这个用户所在群组的其他用户id lock_guard<mutex> lock(_connMutex);//不允许其他人在map里面增删改查 for (int id : useridVec){auto it = _userConnMap.find(id);if (it != _userConnMap.end())//证明在线,直接转发 {//转发群消息it->second->send(js.dump());}else//离线 {//存储离线群消息_offlineMsgModel.insert(id, js.dump());}}
}

编译成功。

399-群组业务代码相关推荐

  1. android 群组消息,极光IM- 群组管理 - 极光文档

    群组管理 概述 把多个 username 加入到同一个群组内,在群组内发送群组消息. 创建私有群组.创建公开群组(2.4.0版本新增公开群组) 加入,退出群组: 加群组成员.移除群组成员: 群组管理员 ...

  2. (保守群组测试 非保守群组测试 二次重复测试 自适应二次重复测试)四种群体测试的C++代码

    目录 原理 保守组检测 非保守组检测 二次重复测试 自适应二次重复测试 四种测试方法的核心代码 保守群组测试 非保守群组测试 二次重复测试与自适应二次重复测试 测试代码 参考文献 原理 假设该病在人群 ...

  3. AI如何改善与小公司业务群组之间的工作关系

    对于大大小小的企业家和公司来说,AI并不是我们所担心的大门,而是专业关系的战略基石,最终可以改善公司的专业网络,财务和运营结构. 以下是AI如何改善与四个不同业务群组的工作关系:       员工关系 ...

  4. 唱吧DevOps的落地,微服务CI/CD的范本技术解读----最大的难点并不是实际业务代码的编写,而是服务的监控和调试以及容器的编排...

    1.业务架构:从单体式到微服务 K歌亭是唱吧的一条新业务线,旨在提供线下便捷的快餐式K歌方式,用户可以在一个电话亭大小的空间里完成K歌体验.K歌亭在客户端有VOD.微信和Web共三个交互入口,业务复杂 ...

  5. Zulip 2.0.1 发布,功能强大的群组聊天软件

    开发四年只会写业务代码,分布式高并发都不会还做程序员?   Zulip 2.0.1 发布了,Zulip 是一个强大的开源群组聊天软件. 用 Python 编写,使用 Django 框架,支持通过会话流 ...

  6. FISCO BCOS 2.0发布:新增群组架构克服吞吐瓶颈

    今日,FISCO BCOS开源社区正式对外发布FISCO BCOS的2.0版,该版本在可扩展性.性能.易用性.隐私隔离等方面均取得突破性进展,其新增的群组架构方案,可以让企业间像拉微信群一样快速组链, ...

  7. 马云称自己的成就无关科技与钱;任正非:外籍员工可当华为 CEO,但有条件;雅虎宣布逐步关闭雅虎群组网站 | EA周报...

    EA周报 2019年10月18日 每个星期7分钟,元宝带你喝一杯IT人的浓缩咖啡,了解天下事.掌握IT核心技术. 热点大事件 丰巢回应小学生用照片"刷脸"取件:测试版,已第一时间下 ...

  8. CAD - NFS - 群组数量16限制

    CAD - NFS - 群组数量16限制 文章目录 CAD - NFS - 群组数量16限制 前言 一.NFS有什么方式的认证? 二.服务端打开扩展群组的支持(NetApp) 步骤 三.客户端调整最大 ...

  9. Python工厂模式封装各类Webhook群聊机器人代码片段

    引言 企业存在给 特定群组 自动推送消息的需求,比如:监控报警推送.销售线索推送.运营内容推送等. 你可以在群聊中添加一个自定义机器人,通过服务端调用 webhook 地址,即可将外部系统的通知消息即 ...

最新文章

  1. mysql-win安装教程,WINDOWS下安装MYSQL教程详解
  2. Docker环境运行SpringBoot项目
  3. 被问到有没有内核开发经验_一个人就是一个开发团队!成电硬核毕业生自制迷你电脑走红!...
  4. java第九章编写一个能够产生_第九章java教程.ppt
  5. [leetcode] Merge k Sorted Lists
  6. Python+matplotlib绘制多门课程学生成绩分布饼状图
  7. discuz核心函数库function_core的函数注释
  8. 本周论文推荐(12.14-12.20)
  9. html项目组成员分工情况,分工.html · zhongjingxin/APP_I组_期末项目PRD文档 - Gitee.com...
  10. Spring Boot 2.0 整合 ES 5 文章内容搜索实战
  11. 《信号与系统学习笔记》—线性时不变系统(二)
  12. android c callstack,[MTK] 如何在android native code 打callstack
  13. mysql 超级管理员权限_取得超级管理员权限
  14. 三星复印机载体初始化步骤_三星复印机的使用方法
  15. 计算机软件工程学校排名,软件工程专业全国高校排名前十
  16. Python人脸笑脸识别【人工智能】【CNN】
  17. java ini_Java操作Ini文件
  18. 大数据是什么?初学者怎样理解大数据技术
  19. dalao的tajan模板
  20. (CVE-2020-11800)Zabbix_Server_trapper_命令注入漏洞

热门文章

  1. 教你50招 XP技巧
  2. (附3D大屏模板)详解FineVis如何打造智慧医院BIM方案!
  3. Easyrecovery靠谱不收费的数据恢复电脑软件
  4. python.exe-找不到序数:无法定位序数242与动态链接库libiomp5md.dll上。
  5. 高数__已知一个平面方程_求平行的平面,并且经过某点
  6. [问题]记录腾讯云数据库被黑
  7. 概率图模型(3)朴素贝叶斯分类
  8. STP中,交换机的端口ID为什么要配置为16的倍数?
  9. FPGA价格划分和预估【转载】
  10. kafka发送消息的三种方式