C++搭建集群聊天室(十三):添加好友功能实现

举报
看,未来 发表于 2021/08/26 13:21:09 2021/08/26
【摘要】 添加好友又是一个新模块,好友功能。所以,照旧,先在public中写上,然后写上一个model类,再绑定一下,并在service中调用即可。最后重新编译,轻车熟路了。 public.hpp#ifndef PUBLIC_H_#define PUBLIC_H_enum EnMsgType{ LOGIN_TYPE = 1, //正常登录 LOGIN_MSG_ACK, //登录相应消息...

请添加图片描述

添加好友

又是一个新模块,好友功能。

所以,照旧,先在public中写上,然后写上一个model类,再绑定一下,并在service中调用即可。

最后重新编译,轻车熟路了。


public.hpp

#ifndef PUBLIC_H_
#define PUBLIC_H_

enum EnMsgType{
    LOGIN_TYPE = 1, //正常登录
    LOGIN_MSG_ACK,  //登录相应消息
    REG_TYPE,       //正常注册
    REG_MSG_ACK,    //注册相应消息
    ONE_CHAT_MSG,   //一对一聊天消息
    GROUP_CHAT_MSG, //群聊聊天消息
    ADD_FRINEND_MSG,//添加好友
};

#endif

friendmodel.hpp

#ifndef FRIENDMODEL_H_
#define FRIENDMODEL_H_

#include<vector>
#include"user.hpp"

using namespace std;

//好友信息方法
class FriendModel{
public:
    void insert(int userid,int friendid);

    vector<User> query(int userid);

private:

};

#endif

friendmodel.cpp

#include"friendmodel.hpp"
#include"db.hpp"

void FriendModel::insert(int userid,int friendid){
    char sql[128] = {0};

    sprintf(sql,"insert into Friend(userid,friendid) values(%d,%d)",userid,friendid);

    MySQL mysql;
    if(mysql.connect()){
        mysql.update(sql);
    }
}

vector<User> FriendModel::query(int userid){
    // 1.组装sql语句
    char sql[256] = {0};
    sprintf(sql, "select a.id,a.name,a.state from User a inner join Friend b on b.friendid = a.id where b.userid = %d", userid);

    vector<User> vec;

    MySQL mysql;
    if (mysql.connect())
    {
        MYSQL_RES *res = mysql.query(sql);
        
        if (res != nullptr)
        {
            MYSQL_ROW row;
            while((row = mysql_fetch_row(res)) != nullptr){
                User user;
                user.setID(atoi(row[0]));
                user.setname(row[1]);
                user.setstate(row[2]);

                vec.push_back(user);
            }
            mysql_free_result(res);
        }
    }

    return vec;
}

chatservice.hpp 中添加部分

#include"friendmodel.hpp"

//添加好友
void addFriend(const TcpConnectionPtr &conn,json &js,Timestamp time);

FriendModel _friendmodel;

chatservice.cpp 部分

绑定自己绑

void ChatService::login(const TcpConnectionPtr &conn,json &js,Timestamp time){
    int id = js["id"].get<int>();
    string pwd = js["password"];

    User user = _usermodel.query(id);
    if (user.getID() == id && user.getpassword() == 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=>online
            user.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> vecofflinemsg = _offlineMsgmodel.query(id);
            if(!vecofflinemsg.empty()){
                response["offlinemsg"] = vecofflinemsg;

                //清空离线消息
                _offlineMsgmodel.remove(id);
            }

            vector<User> uservec = _friendmodel.query(id);
            if(!uservec.empty()){
                vector<string> vecfriend;
                for(User &user:uservec){
                    json js;
                    js["id"] = user.getID();
                    js["name"] = user.getname();
                    js["state"] = user.getstate();

                    vecfriend.push_back(js.dump());
                }
                response["friends"] = vecfriend;
            }

            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());
    }
}
void ChatService::addFriend(const TcpConnectionPtr &conn,json &js,Timestamp time){
    int userid = js["id"].get<int>();
    int friendid = js["friendid"].get<int>();

    _friendmodel.insert(userid,friendid);
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。