C++项目 | 集群聊天服务器 | Model数据层代码框架设计以及用户注册代码
数据库代码要和业务层分离开
我们希望在业务层看到的都是对象
在数据层操作具体的sql语句
1.User
根据user表封装User对象
就是一些set和get方法,一个User对象对应user表中的一条记录
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| #ifndef USER_H #define USER_H #include<string> using namespace std;
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;} private: int id; string name; string password; string state; };
#endif
|
2.UserModel
根据User对象封装对User对象的操作类usermodel
主要功能就是封装sql操作,让业务层看到的都是对象的方法调用,而不是mysql API的调用
比如注册业务时直接调用可以操作user表的usermodel类就行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #ifndef USERMODEL_H #define USERMODEL_H
#include"user.hpp"
class UserModel { public: bool insert(User &user);
};
#endif
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include"usermodel.hpp" #include"db.h" #include<iostream> using namespace std;
bool UserModel::insert(User &user) { 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; if(mysql.connect()) { if(mysql.update(sql)) { user.setId(mysql_insert_id(mysql.getConnection())); return true; } } return false; }
|
3.用户注册代码实现
我们只要从响应消息中接收json,从里面拿出name和password
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
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()); } else { json response; response["msgid"]=REG_MSG_ACK; response["errno"]=1; conn->send(response.dump()); } }
bool UserModel::insert(User &user) { 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; if(mysql.connect()) { if(mysql.update(sql)) { user.setId(mysql_insert_id(mysql.getConnection())); return true; } } return false; }
|
当收到注册事件时
1.调用ChatService类中的_userModel对象的insert方法,传入user对象
2.user对象绑定name和password
3.insert中组装sql语句
4.insert中创建mysql数据库连接
5.insert中调用mysqlAPI插入一条记录,成功返回true,失败返回false
从这里可以看出业务层代码操作的都是user或者usermodel对象,而不是mysql的API方法,实现了业务层和数据层的解耦合。
4.用户代码测试
