QQ聊天室--C++基础项目--QT+Socket网络编程
目录
一、项目概述
二、项目成果
1、QQ基础界面展示:
2、群聊界面展示:
3、聊天功能展示
三、项目代码
1、登录头文件(denglu.h)
2、登录源文件(denglu.cpp)
3、聊天界面头文件(widget.h)
4、聊天界面源文件(widget.cpp)
四、项目优化
一、项目概述
本项目的目标是创建一个QQ聊天室应用,旨在作为学习基础QT语法和网络编程中Socket编程的入门练习。我们利用QT框架来设计并实现QQ的基础用户界面以及群聊窗口,同时,通过Socket编程技术,实现了用户之间的消息群发功能。
二、项目成果
1、QQ基础界面展示:
QQ基础界面如下图所示,页面中展示各个用户,通过点击用户,可以进入群聊界面。
2、群聊界面展示:
点击用户,即可进入群聊,群聊界面展示用户上线、下线、在线人数等信息。消息输入框中能够选择字体、加粗、颜色等功能。
3、聊天功能展示
用户在群聊中发送信息,可以显示用户名称和时间。
三、项目代码
在文章置顶中有zip文件
1、登录头文件(denglu.h)
#ifndef DENGLU_H
#define DENGLU_H#include <QWidget>namespace Ui {
class denglu;
}class denglu : public QWidget
{Q_OBJECTpublic:explicit denglu(QWidget *parent = nullptr);~denglu();private:Ui::denglu *ui;QVector<bool> IsShow;
};#endif // DENGLU_H
2、登录源文件(denglu.cpp)
用于实现头文件中的函数,主要是添加用户和链接群聊界面。
#include "denglu.h"
#include "ui_denglu.h"
#include<QIcon>
#include<QToolButton>
#include<QMessageBox>
#include<widget.h>denglu::denglu(QWidget *parent): QWidget(parent), ui(new Ui::denglu)
{ui->setupUi(this);//设置图标//路径:“:+前缀+路径”this->setWindowIcon(QIcon(":/images/QQ.jpg"));//设置名称this->setWindowTitle("QQ 2024");QList<QString> nameList;nameList << "绿巨人" << "钢铁侠" << "美国队长";QStringList iconNameList;iconNameList << "hulk01" << "gang01" << "mei01";QVector<QToolButton *> vectorbtn;for(int i = 0; i < 3; i++){QToolButton *btn = new QToolButton(this);// 加载图片btn->setIcon(QIcon(QString(":/images/%1.jpg").arg(iconNameList[i])));// 设置图片大小btn->setIconSize(QSize(100, 100));// 设置网名btn->setText(QString("%1").arg(nameList[i]));// 设置为透明btn->setAutoRaise(true);// 设置显示格式btn->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);// 放到vlayout布局ui->vlayout->addWidget(btn);vectorbtn.push_back(btn);IsShow.push_back(false);}// 将按钮进行连接聊天框for(int i = 0; i < 3; i++){connect(vectorbtn[i], &QToolButton::clicked, [=](){if(IsShow[i]){QMessageBox::warning(this, "警告", "该聊天框已被打开!");return;}IsShow[i] = true;Widget *widger = new Widget(nullptr, vectorbtn[i]->text());widger->setWindowIcon(vectorbtn[i]->icon());widger->setWindowTitle(vectorbtn[i]->text());widger->show();// 关闭聊天框时,将IsShow变为Falseconnect(widger, &Widget::closeWidget, this, [=]{IsShow[i] = false;});});}
}denglu::~denglu()
{delete ui;
}
3、聊天界面头文件(widget.h)
用于定义聊天界面功能的函数。
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QUdpSocket>QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = nullptr, QString name = "");enum Msgtype{Msg, UserEnter, UserLeft};void sndMsg(Msgtype type); //广播udp信息QString getName(); //获取名字QString getMsg(); //获取聊天信息void userEnter(QString username); //处理用户进入void userLeft(QString username, QString time); //处理用户离开void ReceiveMessage(); // 接受UDP信息//重写关闭事件void closeEvent(QCloseEvent *);~Widget();signals:void closeWidget();private:Ui::Widget *ui;QString myname;quint16 port; // 端口QUdpSocket *udpSocket; // UDP套接字};
#endif // WIDGET_H
4、聊天界面源文件(widget.cpp)
主要部分,用于实现聊天功能。
#include "widget.h"
#include "ui_widget.h"
#include<QMessageBox>
#include<QDateTime>
#include<QColorDialog>
#include<QFileDialog>Widget::Widget(QWidget *parent, QString name): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);myname = name;this->port = 9999;this->udpSocket = new QUdpSocket(this);udpSocket->bind(port, QUdpSocket::ShareAddress |QUdpSocket::ReuseAddressHint);//监听信号connect(udpSocket, &QUdpSocket::readyRead, this, &Widget::ReceiveMessage);//连接发送按钮connect(ui->sendTBtn, &QPushButton::clicked, [=](){sndMsg(Msg);});//新用户进入sndMsg(UserEnter);//连接退出按钮connect(ui->exitTBtn, &QPushButton::clicked, [=]{this->close();});//连接字体connect(ui->fontCbx, &QFontComboBox::currentFontChanged, [=](const QFont &font){ui->msgTxtEdit->setFont(font);ui->msgTxtEdit->setFocus();});//连接字体大小void (QComboBox:: *sizebtn)(const QString &text) = &QComboBox::currentTextChanged;connect(ui->sizeCbx, sizebtn, [=](const QString &text){ui->msgTxtEdit->setFontPointSize(text.toDouble());ui->msgTxtEdit->setFocus();});//字体加粗connect(ui->boldTBtn, &QToolButton::clicked, this, [=](bool checked){if(checked){ui->msgTxtEdit->setFontWeight(QFont::Bold);}else{ui->msgTxtEdit->setFontWeight(QFont::Normal);}});//字体倾斜connect(ui->italicTbtn, &QToolButton::clicked, this, [=](bool checked){ui->msgTxtEdit->setFontItalic(checked);ui->msgTxtEdit->setFocus();});//下划线connect(ui->underlineTBtn, &QToolButton::clicked, this, [=](bool checked){ui->msgTxtEdit->setFontUnderline(checked);ui->msgTxtEdit->setFocus();});//设置文本颜色connect(ui->colorTBtn, &QToolButton::clicked, this, [=](){QColor color = QColorDialog::getColor(color, this);ui->msgTxtEdit->setTextColor(color);});//清空聊天记录connect(ui->clearTBtn, &QToolButton::clicked, [=](){ui->msgBrowser->clear();});//保存聊天记录connect(ui->saveTBtn, &QToolButton::clicked, [=](){if(ui->msgBrowser->document()->isEmpty()){QMessageBox::warning(this, "警告", "保存的信息不能为空!");}else{QString filename = QFileDialog::getSaveFileName(this, "保存聊天记录", "聊天记录", "(*.txt)");if(!filename.isEmpty()){//保存名称不能为空,再进行保存QFile file(filename);file.open(QIODevice::WriteOnly | QFile::Text);QTextStream stream(&file);stream<<ui->msgBrowser->toPlainText();file.close();}}});}//广播信号
void Widget::sndMsg(Msgtype type)
{QByteArray array;QDataStream stream(&array, QIODevice::WriteOnly);stream<<type<<this->getName();switch(type){case Msg:if(ui->msgTxtEdit->toPlainText()==""){QMessageBox::warning(this, "警告", "发送的内容不能为空!");return;}stream<<this->getMsg();break;case UserEnter:break;case UserLeft:break;}// 书写报文udpSocket->writeDatagram(array.data(), array.size(), QHostAddress::Broadcast, this->port);}QString Widget::getName()
{return this->myname;
}QString Widget::getMsg()
{QString msg = ui->msgTxtEdit->toHtml();ui->msgTxtEdit->clear();ui->msgTxtEdit->setFocus();return msg;
}void Widget::userEnter(QString username)
{bool isEmpty = ui->usrTblWidget->findItems(username, Qt::MatchExactly).isEmpty();if(isEmpty){QTableWidgetItem *user = new QTableWidgetItem(username);ui->usrTblWidget->insertRow(0);ui->usrTblWidget->setItem(0,0,user);ui->msgBrowser->setTextColor(Qt::gray);ui->msgBrowser->append(username+"用户已上线");ui->userNumLbl->setText(QString("在线人数:%1人").arg(ui->usrTblWidget->rowCount()));sndMsg(UserEnter);}
}void Widget::userLeft(QString username, QString time)
{bool isEmpty = ui->usrTblWidget->findItems(username, Qt::MatchExactly).isEmpty();if(!isEmpty){//寻找行int row = ui->usrTblWidget->findItems(username, Qt::MatchExactly).first()->row();//移除行ui->usrTblWidget->removeRow(row);//追加信息ui->msgBrowser->setTextColor(Qt::gray);ui->msgBrowser->append(username+"用户于"+time+"下线");ui->userNumLbl->setText(QString("在线人数:%1").arg(ui->usrTblWidget->rowCount()));}
}void Widget::ReceiveMessage()
{qint64 size = udpSocket->pendingDatagramSize();int mysize = static_cast<int>(size);QByteArray array = QByteArray(mysize, 0);udpSocket->readDatagram(array.data(), size);QDataStream stream(&array, QIODevice::ReadOnly);int msgtype;stream>>msgtype;QString name,msg;QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");switch(msgtype){case Msg:stream>>name>>msg;//增加聊天记录ui->msgBrowser->setTextColor(Qt::blue);ui->msgBrowser->setCurrentFont(QFont("Times New Roman",12));ui->msgBrowser->append("["+name+"]"+time);ui->msgBrowser->append(msg);break;case UserEnter:stream>>name;userEnter(name);break;case UserLeft:stream>>name;userLeft(name, time);break;}
}Widget::~Widget()
{delete ui;
}void Widget::closeEvent(QCloseEvent *)
{emit this->closeWidget();sndMsg(UserLeft);udpSocket->close();udpSocket->destroyed();
}
四、项目优化
1、实现注册登录功能:与数据库进行连接。
2、界面美化:界面简单,未考虑美化问题。
相关文章:
QQ聊天室--C++基础项目--QT+Socket网络编程
目录 一、项目概述 二、项目成果 1、QQ基础界面展示: 2、群聊界面展示: 3、聊天功能展示 三、项目代码 1、登录头文件(denglu.h) 2、登录源文件(denglu.cpp) 3、聊天界面头文件(widget.…...
分布式搜索引擎之elasticsearch基本使用2
分布式搜索引擎之elasticsearch基本使用2 在分布式搜索引擎之elasticsearch基本使用1中,我们已经导入了大量数据到elasticsearch中,实现了elasticsearch的数据存储功能。但elasticsearch最擅长的还是搜索和数据分析。 所以j接下来,我们研究下…...
今日商协丨商协会在“双循环”新发展格局中的作用
在当今全球经济环境中,世界格局正在经历深刻变化,中国正在全面构建“双循环”新发展格局,以实现更高质量、更可持续的发展。在这一过程中,商协会发挥着不可或缺的作用。 商协会在国内大循环中扮演促进者的角色,不仅活…...
前端项目安装node-sass
这个依赖比较难装,因为这个依赖需要安装的版本是和node版本绑定的,所以你需要去sass的官网找到对应关系,下面是我的版本信息: node 16.14.2 node-sass:^6.0.1 sass-loader:^10.2.0 "sass": "^1.82.0", 你…...
算法-字符串-678.有效的括号字符串
一、题目 二、思路解析 1.思路: 用leftMin变量来记录存在的“(”, 用leftMax变量记录字符串中最多的“(” 2.常用方法: 无 3.核心逻辑: 1.遍历字符串: a.当前字符为"(",le…...
linux 压缩文件为zip
在 Linux 系统中,可以使用 zip 命令来压缩文件或目录 打开终端(Terminal)。 使用 cd 命令导航到要压缩的文件或目录所在的路径。 运行以下命令来压缩文件或目录: 压缩单个文件: zip output.zip file.txt这里…...
Cisco Packet Tracer | Cisco Packet Tracer - VLAN 实验 - 交换机的 VLAN 划分
关注这个工具的其它相关笔记:Cisco Packet Tracer —— 使用教程合集-CSDN博客 0x01:VLAN 划分 - 单个交换机 0x0101:拓扑搭建流程 从软件底部拖出一台交换机(笔者选择的型号是 2960 IOS15): 然后再拖出四…...
《计算机网络》(408大题)
2009 路由转发和静态路由的计算 子网划分、路由聚合的计算 注:CIDR中的子网号可以全为0或1,但是其主机号不允许。 注: 这里其实是把到互联网的路由当做了一个默认路由(当一个目的网络地址与路由表中其他都不匹配时,…...
二叉树概述
目录 一、二叉树的基本结构 二、二叉树的遍历 1.前序 2.中序 3.后序 4.层序遍历 三.计算二叉树的相关参数 1.计算节点总个数 2.计算叶子节点的个数 3.计算树的高度 4.计算第k层的子树个数 5.查找树中val为x的节点 四.刷题 1.单值二叉树 2.检查两棵树是否相同 3.一…...
qiankun学习记录
什么是微前端 微前端是指存在于浏览器中的微服务,其借鉴了微服务的架构理念,将微服务的概念扩展到了前端。 如果对微服务的概念比较陌生的话,可以简单的理解为微前端就是将一个大型的前端应用拆分成多个模块,每个微前端模块可以…...
【C++ 20进阶(2):初始化 Initializer
【C 20进阶(2):初始化 Initializer】 原文:https://blog.csdn.net/weixin_44259356/article/details/144377955 引言 本篇文章为系列文章将着重介绍C20新特性,一是希望可以和大家交流分享,二是也便于自己…...
vue3学习——事件监听(v-on)
我们可以使用 v-on 指令监听 DOM 事件: <button v-on:click"increment">{{ count }}</button> 因为其经常使用,v-on 也有一个简写语法: <button click"increment">{{ count }}</button> 此处…...
java全栈day13-后端Web实战2
接上述查询部门实现,完成后续要求 一、统一响应结果 1.1步骤 资料如下 对一开始的代码修改如下 结果如下 1.2测试 指定请求方式 结果 小结 二、前后端联调测试 资料如下: (不行,一定要不带空格和不带中文,要不然启动不了试了半天…...
C++/CX,一个智能的 C++/Windows 平台开发库!
以下是一篇关于C/CX的C学习文章: 开篇 嘿,大家好呀!我是一行。今天咱们来一起探索一个超棒的C开发库——C/CX,它可是在Windows平台开发中非常智能且强大的工具哦,能让我们的开发变得更加高效便捷。让我们一起开启今天的…...
分布式 分布式事务 总结
前言 相关系列 《分布式 & 目录》《分布式 & 分布式事务 & 总结》《分布式 & 分布式事务 & 问题》 分布式事务 所谓分布式事务是指操作范围笼罩多个不同节点的事务。例如对于订单节点&库存节点而言,一次完整的交易需要同时调动两个节…...
数据结构(3)单链表的模拟实现
上一节我们进行了数据结构中的顺序表的模拟式现,今天我们来实现一下另外一个数据结构:单链表。 我们在实现顺序表之后一定会引发一些问题和思考: 1.顺序表在头部和中间插入数据会用到循环,时间复杂O(N) …...
HBU深度学习实验14.5-循环神经网络(1.5)
梯度爆炸实验 造成简单循环网络较难建模长程依赖问题的原因有两个:梯度爆炸和梯度消失。一般来讲,循环网络的梯度爆炸问题比较容易解决,一般通过权重衰减或梯度截断可以较好地来避免;对于梯度消失问题,更加有效的方式…...
Redis01
springbootredis 特点 1.高效性 2.支持多种数据结构 String,list,set,hash.zset 3.稳定性:持久化,主从复制(集群) 4.其他特性:支持过期时间,支持事务,消息订阅。 安装 1.下载安装包 redis官…...
数据库中decimal、float 和 double区别
在计算机科学中,decimal、float 和 double 是用于表示和处理数值的不同数据类型。 - decimal 是一种精确的十进制浮点数表示,通常用于需要高精度计算的场景,比如财务应用。它能够精确表示小数,并且不会出现浮点数运算误差。 - flo…...
HDR视频技术之五:HDR生产流程
在介绍 HDR 的生产流程之前,我们先介绍下视频制作与传输的一些基本知识。 内容类型: 直播内容( live content) ——所谓的直播内容即没有后处理过程以及创作者意图。分发给用户的信息是实时产生并且实时制作并派发的。常见的应用…...
CTFshow-爆破(Web21-28)
CTFshow-爆破(Web21-28) Web21 抓包 选则dic.zip里的字典爆破,记得添加前缀admin: 答案admin:shark63 burp里有一个自定义迭代器,可以设置前几部分,很好用 Web22 题目失效了直接看wp吧 360quake 使用空间搜索引擎—>360quake 搜索语法…...
C++重点和练习
作业题目: #include <iostream> using namespace std; class Rec {const int length;int width; public:void set_length(int l);void set_width(int w);int get_length();int get_width();void show(); };#include <iostream> using namespace std; c…...
UnityShaderLab-实现溶解效果
实现思路: 使用一张噪声图,与一个Cut值计算(加或减),将计算后的值赋值给Alpha,然后小于0的片段就被丢弃掉了。 ShaderGraph实现: ShaderLab实现: Shader "Dissolve" {Properties{_…...
SQLite 数据库学习
1.install sudo apt update sudo apt install sqlitebrowser这是一个开源的图形用户界面工具,专门用于开发、管理和分析 SQLite 数据库。它支持创建或导入导出表、编辑数据、执行 SQL 查询等功能。 2.python 操作数据库 Python 内置了 sqlite3 模块,使…...
【LeetCode: 463. 岛屿的周长 + bfs】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
Bean的注入、单例和多例
目录 注入Bean对象 属性注入 构造注入 属性注入专题 注入集合/数组 级联简单类型赋值 Bean的单例和多例 注入Bean对象 简单类型使用value(除Date),非简单类型使用ref 属性注入 name规则:必须提供set方法,去掉set,第一个字…...
java 使用JSqlParser和CCJSqlParser 解析sql
maven <dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>4.9</version> </dependency>解析SQL String sql "select aa,bb from b"; Statement statementCCJSq…...
Anaconda Conda Pip 的区别与联系
在Python生态中,Anaconda、Conda和Pip是三个非常重要的工具,它们在包管理和环境管理方面发挥着关键作用。 Anaconda Anaconda是一个为科学计算而设计的Python发行版,它集成了Conda、Python以及大量的数据科学相关库,如NumPy、Pandas等。Anaconda的主要优势在于它提供了一个…...
总结的一些MySql面试题
目录 一:基础篇 二:索引原理和SQL优化 三:事务原理 四:缓存策略 一:基础篇 1:定义:按照数据结构来组织、存储和管理数据的仓库;是一个长期存储在计算机内的、有组织的、可共享 的…...
【实验15】LSTM的记忆能力实验
目录 1 模型构建 1.1 LSTM层 1.1.1 自定义LSTM算子 1.1.2 nn.LSTM 1.1.3 将自定义LSTM与pytorch内置的LSTM进行对比 1.2 模型汇总 2 模型训练 2.1 训练指定长度的数字预测模型 2.2 多组训练 2.3 损失函数展示 3 模型评价 4 完整代码 5 LSTM模型门状态和单元状态的…...
SSH克隆github项目
1、生成密钥 ssh-keygen -t rsa -C "你的邮箱xxx.com" 全程回车即可(不用输入ras文件名及密码)、为了方便下面的公钥查看 2、配置公钥 查看公钥内容 cat c:\Users\xxx\.ssh\id_rsa.pub(修改为自己的路径及名字) 将公钥内容复制并粘贴至…...
计算机网络ENSP课设--三层架构企业网络
本课程设计搭建一个小型互联网,并模拟Internet的典型Web服务过程。通过此次课程设计,可以进一步理解Internet的工作原理和协议过程,并提高综合知识的运用能力和分析能力。具体目标包括: (1)掌握网络拓扑的…...
Node.js系统模块
【图书介绍】《Node.jsMongoDBVue.js全栈开发实战》-CSDN博客 《Node.jsMongoDBVue.js全栈开发实战(Web前端技术丛书)》(邹琼俊)【摘要 书评 试读】- 京东图书 (jd.com) 2.2.1 什么是系统模块 由于Node.js运行环境提供的API都是以模块化的方式进行开…...
React - useActionState、useFormStatus与表单处理
参考文档:react18.3.1官方文档 一些概念: React 的 Canary 和 Experimental 频道是 React 团队用于发布和测试新功能的渠道。 useActionState useActionState 是一个可以根据某个表单动作的结果更新 state 的 Hook。 const [state, formAction, isPe…...
GC常见垃圾回收算法,JVM分代模型
如何判断是垃圾?引用计数器和Root可达性算法 如何进行清除?标记清除、复制、标记整理 堆分代模型?Eden,Surevivor,Tenuring 一个对象从创建到消亡的过程? 对象什么时候进入老年代? 一、GC&a…...
深入探索 JVM:原理、机制与实战
一、JVM 概述 JVM(Java Virtual Machine)是 Java 程序运行的核心组件,它提供了一个独立于硬件和操作系统的执行环境,使得 Java 程序能够在不同平台上具有跨平台的特性。 JVM 主要由以下几部分组成: 类装载器…...
前端成长之路:HTML(2)
HTML中有两个非常重要的标签——表格和表单,在介绍之前需要先了解表格和表单的区别:表格是用于展示数据的;表单是用于提交数据的。本文主要介绍表格。 表格标签 表格主要是用于显示、展示数据的,并非是页面布局。它可以使本来难…...
python基础:(七)类
目录 一.创建和使用类二.使用类和实例2.1给属性指定默认值2.2修改属性的值2.2.1直接修改属性的值2.2.2通过方法修改属性的值2.2.3通过方法对属性的值进行递增 三.继承3.1子类的方法__init__()3.2给子类定义属性和方法3.3重写父类的方法 四.导入类4.1语法--1:4.2语法--2 前言 p…...
Spring AOP基础、快速入门
介绍 AOP,面向切面编程,作为面向对象的一种补充,将公共逻辑(事务管理、日志、缓存、权限控制、限流等)封装成切面,跟业务代码进行分离,可以减少系统的重复代码和降低模块之间的耦合度。切面就是…...
Golang使用etcd构建分布式锁案例
在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统。分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要。它有助于维护一致性,防止竞争条件,并确保在任何给定时间只有一个进程独占访问资源。 我们将使用Go作为编程语言&am…...
深度学习:基于MindSpore的极简风大模型微调
什么是PEFT?What is PEFT? PEFT(Parameter Efficient Fine-Tuning)是一系列让大规模预训练模型高效适应于新任务或新数据集的技术。 PEFT在保持大部分模型权重冻结,只修改或添加一小部份参数。这种方法极大得减少了计算量和存储开销&#x…...
如何在 Android 项目中实现跨库传值
背景介绍 在一个复杂的 Android 项目中,我们通常会有多个库(lib),而主应用程序(app)依赖所有这些库。目前遇到的问题是,在这些库中,libAd 需要获取 libVip 的 VIP 等级状态…...
HTML:表格重点
用表格就用table caption为该表上部信息,用来说明表的作用 thead为表头主要信息,效果加粗 tbody为表格中的主体内容 tr是 table row 表格的行 td是table data th是table heading表格标题 ,一般表格第一行的数据都是table heading...
STM32 出租车计价器系统设计(一) 江科大源码改写
STM32 出租车计价器系统设计 功能目标 驱动步进电机模拟车轮旋转,并实现调速功能。 设置车轮周长和单价,检测车轮转速和运转时间。 计算并显示行驶里程和价格。 硬件材料 28BYJ48 五线四相步进电机和 ULN2003 驱动板模块 测速传感器模块 嵌入式小系统…...
Git基础操作快速入门
Git是一个免费开源分布式版本控制工具,是由Linux的作者Linus开发的第二个伟大作品。2005年由于BitKeeper软件公司对Linux社区停止了免费使用权。Linus迫不得己自己开发了一个分布式版本控制工具,从而Git诞生了 目前使用Git作为版本控制的开源软件&#…...
vue‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
在Windows操作系统中,安装了nodeJs之后,并且也安装了vue依赖包,但是在cmd控制台运行vue的时候,会报错:vue‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。针对这个问题我提供如下解决办法,并且是有效的。 一、原因分析 关于尝试这个问题的主要原因,我分析主要…...
JAVA安全—SpringBoot框架MyBatis注入Thymeleaf模板注入
前言 之前我们讲了JAVA的一些组件安全,比如Log4j,fastjson。今天讲一下框架安全,就是这个也是比较常见的SpringBoot框架。 SpringBoot框架 Spring Boot是由Pivotal团队提供的一套开源框架,可以简化spring应用的创建及部署。它提…...
Milvus向量数据库05-常见问题整理
Milvus向量数据库05-常见问题整理 1-什么是PipeLine 这张图展示了一个文档处理和搜索系统的架构,主要分为两个部分:Ingestion Pipeline(摄取管道)和 Search Pipeline(搜索管道)。下面是对图中各部分的详细…...
strncpy在复制含有多个\0的字符串时遇到的问题
strncpy在复制含有多个\0的字符串的时候,会产生截断,因为strncpy在读取源字符串的时候,遇到了\0,函数会认为该字符串已经结束了,然后会向目标字符串内填充\0。 char buffer[100] "ak\0jl";for (int i 0; i…...
C++作业3
作业1: 1.定义一个矩形类Rec,包含私有属性length、width,包含公有成员方法: void set_length(int l);//设置长度 Void set_width(int w);//设置宽度 Int get_length();//获取长度,将长度的值返回给调用处 Int get_widt…...