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
//user.hpp
#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
//usermodel.hpp
#ifndef USERMODEL_H
#define USERMODEL_H

#include"user.hpp"

//User表的数据操作类
class UserModel
{
public:
//User表的增加方法
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
//usermodel.cpp
#include"usermodel.hpp"
#include"db.h"
#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;
if(mysql.connect())
{
if(mysql.update(sql))
{
//获取插入成功的用户数据生成的主键id 当做用户的账号给用户返回回去
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
//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)
{
//注册成功 成功返回0,失败返回1
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());
}
}

//usermoderl.cpp
//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;
if(mysql.connect())
{
if(mysql.update(sql))
{
//获取插入成功的用户数据生成的主键id 当做用户的账号给用户返回回去
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.用户代码测试