[集群聊天服务器]----(五)User类、UserModel类

news2024/10/5 9:10:18

接着上文[集群聊天服务器]----(四)MySQL数据库模块,接下来我们对User类、UserModel类进行剖析,User表和UserModel类是项目最基本也是最重要的部分,通过它我们对用户的id,用户名,密码,状态相关信息进行存储,也决定了登录成功与否以及后续的聊天等内容。

User表设计

在这里插入图片描述
创建 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=password;
        this->state=state;
    }

    void setId(int id) {this->id=id;}
    void setName(string name) {this->name=name;}
    void setPwd(string password) {this->password=password;}
    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
  • 由于user的id是填入表格以后,数据库自动创建的,所以初始时赋予-1,并提供了设置/获取id,用户名,用户密码,用户状态的相关函数。

创造UserModel类对User表进行数据操作

成员函数

    //user表的增加方法
    bool insert(User &user);

    //根据用户号码查询用户信息 
    User query(int id);

    //更新用户的状态信息
    bool updateState(User &user);
    
    //重置用户的状态信息
    void resetState();

user表的增加方法

 bool UserModel::insert(User &user)
 {
    //组装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;
}
  • 首先组装sql语句;
  • 创建数据库对象,并连接数据库,根据sql语句进行更新user表,其中user为表格名字,user()括号中的为要插入的内容标题,values为对应的值,注意,表格名字以及对应的内容标题一定要和表格对应,否则插入失败
  • 更新成功会生成用户id,调用mysql_insert_id()函数在user中进行设置,(mysql.getConnection()作用是获取mysql的连接

根据用户号码查询用户信息

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();
}
  • 组装sql语句,select * from user where id =%d是对user进行查找id;
  • 连接数据库,并根据sql语句调用mysql_use_result()函数(属于MYSQL_RES类型)逐行进行查询,在调用mysql_fetch_row()读取结果;
  • 创建一个User对象,并根据查找结果设置其相应值,返回User对象
  • 注意res为内部动态内存开辟,需要释放资源

更新用户的状态信息

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;
}

  • 组装sql语句,根据id,更新 user表中的状态;
  • 连接数据库进行更新

重置用户的状态信息

void UserModel::resetState()
{
    char sql[1024] = "update user set state = 'offline' where state = 'online'";
    MySQL mysql;

    //连接数据库
    if(mysql.connect()){
        //更新数据库语句
        mysql.update(sql);
    }

}
  • 组装sql语句,这个函数主要是针对捕捉到服务器ctrl+c异常结束后,重置user的状态信息,将表格中online用户的状态都改为offline;
  • 连接数据库进行更新

好了~ 关于集群聊天服务器中的User类和UserModel类的剖析就到此结束了,接下来我们将进入业务模块正题,用户注册、登录、退出以及客户端异常退出回调函数,下一节见~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1690833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VSCode运行CMake教程

参考视频&#xff1a; https://www.youtube.com/watch?vm9HBM1m_EMU 首先下载&安装opencv包以及cmake包 接着配置环境变量 点击环境变量 ---下面系统变量的path 找对应路径 添加后三个: 确定即可 接着创建空目录 右击vscode打开 扩展中安装 c tools、cmake、cmake too…

华为芯片与系统详细梳理--Kirin麒麟 Ascend昇腾 Kunpeng鲲鹏 HarmonyOS鸿蒙 Euler欧拉

华为芯片与系统详细梳理--Kirin麒麟 & Ascend昇腾 & Kunpeng鲲鹏 & HarmonyOS鸿蒙 & Euler欧拉 1 概述2 芯片2.1 整体描述麒麟芯片&#xff08;To C&#xff09;【面向智能终端】昇腾芯片【面向AI计算】鲲鹏芯片【面向通用计算】 2.2 细分系列麒麟芯片&#xf…

基于UDP的tftp的文件传输

#define SER_PORT 69 #define SER_IP "192.168.125.71" #define CLT_PORT 6666 #define CLT_IP "192.168.125.158" int main(int argc, const char *argv[]) {//创建套接字文件描述符int cfd socket(AF_INET,SOCK_DGRAM,0);if(cfd -1){perror("sock…

Hadoop3:HDFS的Fsimage和Edits文件介绍

一、概念 Fsimage文件&#xff1a;HDFS文件系统元数据的一个永久性的检查点&#xff0c;其中包含HDFS文件系统的所有目 录和文件inode的序列化信息。 Edits文件&#xff1a;存放HDFS文件系统的所有更新操作的路径&#xff0c;文件系统客户端执行的所有写操作首先 会被记录到Ed…

掌握RESTful API:从入门到精通,全面解析Web开发的基石!

在现代Web开发中&#xff0c;API&#xff08;应用程序编程接口&#xff09;已经成为不同系统之间通信的重要手段。其中&#xff0c;RESTful API是一种基于HTTP协议的设计风格&#xff0c;它简洁、易用且高效。作为一个资深的技术人员&#xff0c;本文将全面详细地介绍RESTful A…

VM逆向,一篇就够了(下)

实战三 d3sky 这一题需要了解一些TLS相关知识 TLS回调函数 TLS&#xff08;Thread Local Storage&#xff0c;线程局部存储&#xff09;是各线程的独立的存储空间&#xff0c;TLS回调函数是指&#xff0c;每当创建或终止进程的线程时会自动调用执行的函数&#xff0c;且调用…

蓝桥杯Web开发【国赛】2022年真题

1.水果拼盘 目前 CSS3 中新增的 Flex 弹性布局已经成为前端页面布局的首选方案&#xff0c;本题可以使用 Flex 属性快速完成布局。 1.1 题目问题 建议使用 flex 相关属性完成 css/style.css 中的 TODO 部分。 禁止修改圆盘的位置和图片的大小。相同颜色的水果放在相同颜色的…

[Unity报错] The type or namespace name ‘Newtonsoft‘ could not be found

简介 Unity在跑别人的代码时&#xff0c;控制台报了以下错误 The type or namespace name Newtonsoft could not be found 鉴于这块资料较少&#xff0c;写一下教程帮助后来者。 报错的原因主要是因为缺少Newtonsoft.json这个包&#xff0c;导致Unity在using该库时出现错误。…

振动盘配上智能相机后实现全自动化

#智能相机 #振动盘 振动盘配上智能相机后的全自动化技术正在各个行业蓬勃发展。振动盘是一种利用震动作用将物料快速分离和输送的装置&#xff0c;而智能相机的高精度图像识别技术能够准确探测和捕捉物料。将两者结合起来&#xff0c;不仅能提高生产效率&#xff0c;还能降低人…

AI爆文写作:标题需要什么?情绪炸裂,态度要激烈,行为要夸张!

现在这个传播环境下&#xff0c;在公域中&#xff0c;轻声细语&#xff0c;慢慢的说&#xff0c;无法吸引到注意&#xff0c;没有人搭理。 标题要需要情绪张扬&#xff0c;态度激烈&#xff0c;行为夸张&#xff0c;大声喧闹。 唐韧的用户群是互联网产品经理&#xff0c;阅读量…

开源实用!猫抓媒体嗅探浏览器插件

CatCatch&#xff1a;网络资源&#xff0c;一触即发 - 精选真开源&#xff0c;释放新价值。 概览 CatCatch是一个专为浏览器设计的资源嗅探扩展&#xff0c;旨在帮助用户轻松捕获和分析网页中的各种资源。无论是视频、音频还是其他类型的文件&#xff0c;猫爪都能提供直观的界…

了解K8s集群kubectl命令进行陈述式资源管理

前言 在 Kubernetes 集群中&#xff0c;通过陈述式和声明式资源管理是确保应用程序高效运行的关键。认识这两种管理方法&#xff0c;能够更好地掌握 Kubernetes 集群的运维和管理。 目录 一、K8s 资源管理操作分类 1. 陈述式 2. 声明式 3. K8s 集群管理常用命令概览 二…

五分钟”手撕“图书管理系统

前言&#xff1a; 图书馆管理系统需要结合JavaSE的绝大部分知识&#xff0c;是一个很好的训练项目。 为了让大家更加方便的查阅与学习&#xff0c;我把代码放开头&#xff0c;供大家查询。 还有对代码的分析&#xff0c;我将以类为单位分开讲解。 目录 全部代码 Main类 Us…

【NumPy】NumPy实战入门:线性代数(dot、linalg)与随机数(numpy.random)详解

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…

redis--redis Cluster

简介 解决了redis单机写入的瓶颈问题&#xff0c;即单机的redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素无中心架构的redis cluster机制&#xff0c;在无中心的redis集群当中&#xff0c;其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连…

高阶路由过渡处理方案 —— 浏览器堆栈主动介入

目录 01: 前言 02: VueRouter 过渡动效可行性分析 03: 主动介入浏览器堆栈管理&#xff0c;分析可行性方案 04: 主动介入浏览器堆栈管理 05: 基于 GSAP 实现高阶路由过渡动画分析 06: 基于 GSAP 实现高阶路由过渡动画处理 07: 通用组件&#xff1a;navbar 构建方案分析…

202206青少年软件编程(Python)等级考试试卷(三级)

第 1 题 【单选题】 下图所示, 有一个名为"书目.csv"的文件。 小明针对这个文件编写了 5 行代码,请问, 代码运行到最后打印在屏幕上的结果是? ( ) with open(书目.csv, r, encoding=utf-8) as f:for line in f.readlines

Rabbitmq-Windows 安装

第一步&#xff1a;下载并安装erlang &#xff11;.原因&#xff1a;RabbitMQ服务端代码是使用并发式语言Erlang编写的&#xff0c;安装Rabbit MQ的前提是安装Erlang &#xff12;.下载地址&#xff1a;http://www.erlang.org/downloads 3.双击&#xff0c;点next就可以 4.选…

【网络技术】【Kali Linux】Wireshark嗅探(十四)QUIC(快速UDP互联网连接)协议报文捕获及分析

往期 Kali Linux 上的 Wireshark 嗅探实验见博客&#xff1a; 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;一&#xff09;ping 和 ICMP 【网络技术】【Kali Linux】Wireshark嗅探&#xff08;二&#xff09;TCP 协议 【网络技术】【Kali Linux】Wireshark嗅探&…

【Unity2D:Animator】为角色添加动画效果

一、添加Animator组件并创建Animator Controller文件 1. 添加Animator组件&#xff1a; 2. 在Assets-Art文件夹中新建一个名为Animations的文件夹&#xff0c;用来存储所有动画资源 3. 在Animations文件夹中新建一个名为Player的文件夹&#xff0c;再创建一个名为Animators的文…