1. 完善include/public.hpp
#ifndef PUBLIC_H
#define PUBLIC_H
enum EnMsgType
{
LOGIN_MSG = 1,
LOGIN_MSG_ACK,
REG_MSG,
REG_MSG_ACK
};
#endif
2. 完善include/server/model/usermodel.hpp
#ifndef USERMODEL_H
#define USERMODEL_H
#include "user.hpp"
class UserModel
{
public:
bool insert(User &user);
User query(int id);
bool updateState(User user);
};
#endif
3. 完善include/server/model/usermodel.cpp,这个文件负责连接数据库进行的DRUD
#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;
}
User UserModel::query(int id)
{
char sql[1024] = {0};
sprintf(sql, "select * from user where id = %d", id);
MySQL mysql;
if (mysql.connect())
{
MYSQL_RES *res = mysql.query(sql);
if (res != nullptr)
{
MYSQL_ROW row = mysql_fetch_row(res);
if (row != nullptr)
{
User user;
user.setId(atoi(row[0]));
user.setName(row[1]);
user.setPwd(row[2]);
user.setState(row[3]);
mysql_free_result(res);
return user;
}
}
}
return User();
}
bool UserModel::updateState(User user)
{
char sql[1024] = {0};
sprintf(sql, "update user set state = '%s' where id = %d", user.getState().c_str(), user.getId());
MySQL mysql;
if (mysql.connect())
{
if (mysql.update(sql))
{
return true;
}
}
return false;
}
4. 完善src/server/chatservice.cpp中的login方法
#include "chatservice.hpp"
#include "public.hpp"
#include <muduo/base/Logging.h>
#include <string>
using namespace std;
using namespace muduo;
ChatService *ChatService::instance()
{
static ChatService service;
return &service;
}
ChatService ::ChatService()
{
_msgHandlerMap.insert({LOGIN_MSG, bind(&ChatService::login, this, _1, _2, _3)});
_msgHandlerMap.insert({REG_MSG, bind(&ChatService::reg, this, _1, _2, _3)});
}
MsgHandler ChatService::getHandler(int 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!";
};
}
else
{
return _msgHandlerMap[msgid];
}
}
void ChatService ::login(const TcpConnectionPtr &conn, json &js, Timestamp)
{
int id = js["id"];
string pwd = js["password"];
User user = _userModel.query(id);
if (user.getId() == id && user.getPwd() == pwd)
{
if (user.getState() == "online")
{
json responce;
responce["msgid"] = LOGIN_MSG_ACK;
responce["errno"] = 2;
responce["errmsg"] = "该账号已经登录,请重新输入账号";
conn->send(responce.dump());
}
else
{
user.setState("online");
_userModel.updateState(user);
json responce;
responce["msgid"] = LOGIN_MSG_ACK;
responce["errno"] = 0;
responce["id"] = user.getId();
responce["name"] = user.getName();
conn->send(responce.dump());
}
}
else
{
json responce;
responce["msgid"] = LOGIN_MSG_ACK;
responce["errno"] = 1;
responce["errmsg"] = "用户名或密码错误";
conn->send(responce.dump());
}
}
void ChatService ::reg(const TcpConnectionPtr &conn, json &js, Timestamp)
{
string name = js["name"];
string pwd = js["password"];
User user;
user.setName(name);
user.setPwd(pwd);
bool state = _userModel.insert(user);
if (state)
{
json responce;
responce["msgid"] = REG_MSG_ACK;
responce["errno"] = 0;
responce["id"] = user.getId();
conn->send(responce.dump());
}
else
{
json responce;
responce["msgid"] = REG_MSG_ACK;
responce["errno"] = 1;
conn->send(responce.dump());
}
}
5. 编译测试
