做网站和app报价,常州网站制作费用,在百度做推广需要网站,昆明网站制作方案定制在前几节的研究中#xff0c;我们已经实现网络层与业务层分离#xff0c;本节实现数据层与业务层分离#xff0c;降低各层之间的耦合性#xff0c;同时实现用户注册业务。
网络层专注于处理网络通信与读写事件
业务层专注于处理读写事件到来时所需求的各项业务
数据层专…在前几节的研究中我们已经实现网络层与业务层分离本节实现数据层与业务层分离降低各层之间的耦合性同时实现用户注册业务。
网络层专注于处理网络通信与读写事件
业务层专注于处理读写事件到来时所需求的各项业务
数据层专注于与底层数据库间进行增删改查。
数据库中有User、Friend、AllGroup、GroupUser和OfflineMessage表在model数据层中要提供一些类与数据库中的表对应起来以便于将数据库中读取到的字段信息也对象的方式提供给业务模块使用
项目流程如下
1、项目环境搭建
C项目——集群聊天服务器项目(一)项目介绍、环境搭建、Boost库安装、Muduo库安装、Linux与vscode配置_c集群聊天服务器-CSDN博客
2、Json第三方库介绍
C项目——集群聊天服务器项目(二)Json第三方库-CSDN博客
3、muduo网络库介绍
C项目——集群聊天服务器项目(三)muduo网络库-CSDN博客
4、MySQL数据库创建
C项目——集群聊天服务器项目(四)MySQL数据库-CSDN博客
5、网络模块与业务模块代码编写
C项目——集群聊天服务器项目(五)网络模块与业务模块-CSDN博客
6、MySQL模块编写
C项目——集群聊天服务器项目(六)MySQL模块-CSDN博客
一、User类
在include/server下创建model文件夹在model文件夹下创建与用户表对应的、操作用户的User类定义在头文件user.hpp中由于代码体量较小直接在头文件中进行实现
用户表user #ifndef USER_H
#define USER_H#include string
using namespace std;//User表的ORM类
class User
{
public:User(int id -1, string name , string pwd , string state offline){this-id id;this-name name;this-password pwd;this-state state;}//设置 void setId(int id) { this-id id; }void setName(string name) { this-name name; }void setPwd(string pwd) { this-password pwd; }void setState(string state) { this-state state; }//获取 int getId() { return this-id; }string getName() { return this-name; }string getPwd() { return this-password; }string getState() { return this-state; }protected:int id;//ID号 string name;//姓名 string password;//密码 string state;//状态
};#endif二、UserModel类
UserModel为操纵数据库User表的类主要实现增加用户、查询用户、更新用户、重置用户信息
在include/server/model文件创建usermodel.hpp
#ifndef USERMODEL_H
#define USERMODEL_H#include user.hpp//User表的数据操作类
class UserModel {
public://User表的增加方法bool insert(User user);//根据用户号码查询用户信息User query(int id);//更新用户的状态信息bool updateState(User user);//重置用户的状态信息void resetState();
};#endif在src/server中创建model文件夹创建usermodel.cpp对UserModel类中insert方法进行实现
#include usermodel.hpp
#include db.hpp
#include iostream
using namespace std;// User表的增加方法
bool UserModel::insert(User user)
{// 1.组装sql语句char sql[1024] {0};sprintf(sql, insert into user(name, password, state) values(%s, %s, %s),user.getName().c_str(), user.getPwd().c_str(), user.getState().c_str());MySQL mysql; // 定义一个mysql对象if (mysql.connect()) // 连接成功了{if (mysql.update(sql)) // 更新这个sql语句传进去{// 获取插入成功的用户数据生成的主键iduser.setId(mysql_insert_id(mysql.getConnection())); // 拿到数据库生成的id作为用户的id号return true;}}return false;
}其余方法在实现后续功能模块中进行实现
三、注册功能
本节来实现注册功能判断是否能通过UserModel类顺利将用户信息插入数据库中。
在public.hpp中定义注册消息和注册响应消息
#ifndef PUBLIC_H
#define PUBLIC_H/*
server和client的公共文件
*/
enum EnMsgType
{LOGIN_MSG 1, //登录消息REG_MSG, //注册消息 REG_MSG_ACK, //注册响应消息
};#endif
注此时登录消息对应的msgid1注册消息对应的msgid2
在第五节C项目——集群聊天服务器项目(五)网络模块与业务模块-CSDN博客中注册与登录信息仅仅为一个日志信息此处将注册业务进行实现
在chatservice.hpp中定义用户操作类对象
#ifndef CHATSERVICE_H
#define CHATSERVICE_H#include muduo/net/TcpConnection.h
#include unordered_map//一个消息ID映射一个事件处理
#include functionalusing namespace std;
using namespace muduo;
using namespace muduo::net;#include usermodel.hpp
#include json.hpp
using json nlohmann::json;//表示处理消息的事件回调方法类型事件处理器派发3个东西
using MsgHandler std::functionvoid(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);private:ChatService();//单例 //存储消息id和其对应的业务处理方法消息处理器的一个表写消息id对应的处理操作 unordered_mapint, MsgHandler _msgHandlerMap;//数据操作类对象UserModel _userModel;};#endif在chatservice.cpp中编写注册业务函数
// 处理注册业务 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字符串}
}
步骤
1从json对象中获取姓名和密码
2实例化User对象分别将姓名和密码传入使用UserModel类进行新用户的插入
注状态默认为不在线(实际上创建的时候用户确实不在线)id由数据库派发
3定义json对象回调响应信息error 0代表创建成功error 1代表创建失败。
若创建成功需额外将创建成功的用户id号返回如果失败直接将json序列化发送回客户端
四、功能实现
使用CMake编译成功后执行我们的ChatServer服务器开启监听客户端连接
客户端使用下述命令登录服务器
telnet 127.0.0.1 6000
密码123456
服务端显示有一个新的连接接入
客户端输入
{msgid:2,name:Jiao,password:123456}
创建成功返回error0用户id号以及注册响应msgid如图所示 客户端显示mysql连接成功了 我们进底层数据库看一下 新建用户成功功能实现完毕(其他用户为自行学习时创建的)
感兴趣的小伙伴一起来试一下吧~
如果有问题还请及时联系我哦感谢~