基于qt软件的网上聊天室软件
1.服务器:
1).功能:
用于创建一个客户端,通过文本编辑器来获得端口号,根据获得的端口号创建服务器,等待客户端连接
创建成功会提示服务器创建成功
在收到客户端发送的信息时,把这条信息发送给其他所有客户端,实现群聊功能
2).代码:
-------------------------------------------------------------------
.pro
-------------------------------------------------------------------
QT += core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
-------------------------------------------------------------------
widget.h
-------------------------------------------------------------------
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QMessageBox>
#include <QTcpServer>
#include <QTcpSocket>
#include <QPushButton>
#include <QLabel>
#include <QListWidget>
#include <QLineEdit>
#include <QList>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();public slots:void connectbtn_slot();void connected_slot();void readyread_slot();private:Ui::Widget *ui;//定义服务器QTcpServer *server;//定义一个链表存放连接的客户端数据QList<QTcpSocket *> client;};
#endif // WIDGET_H
-------------------------------------------------------------------
main.cpp
-------------------------------------------------------------------
#include "widget.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.show();return a.exec();
}
-------------------------------------------------------------------
widget.cpp
-------------------------------------------------------------------
#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//实例化服务器server = new QTcpServer(this);//连接按钮与对应槽函数connect(ui->connectbtn,&QPushButton::clicked,this,&Widget::connectbtn_slot);}Widget::~Widget()
{delete ui;
}//按下按钮后启动服务器
void Widget::connectbtn_slot()
{//读取端口号quint16 port = ui->portedit->text().toInt();//设置为监听状态if(!server->listen(QHostAddress::Any,port)){QMessageBox::critical(this,"失败","服务器启动失败");return ;}QMessageBox::information(this,"成功","服务器启动成功");//连接客户端信号与槽函数connect(server,&QTcpServer::newConnection,this,&Widget::connected_slot);
}//客户端连接槽函数
void Widget::connected_slot()
{//获取客户端套接字QTcpSocket *cli = server->nextPendingConnection();//将得到的套接字写入链表client.push_back(cli);//把新套接字与接收信号连接connect(cli,&QTcpSocket::readyRead,this,&Widget::readyread_slot);}//有信息写入准备读取
void Widget::readyread_slot()
{//删除已经断开的客户端for(int i = 0;i < client.size();i++){if(client.at(i)->state() == 0){client.removeAt(i);}}//遍历发送数据的客户端for(int i = 0;i < client.size();i++){if(client.at(i)->bytesAvailable() != 0){//读取客户端数据QByteArray msg = client.at(i)->readAll();//将数据写到ui界面中ui->listWidget->addItem(QString::fromLocal8Bit(msg));//将数据发送给所有客户端for(int j = 0;j < client.size();j++){client.at(j)->write(msg);}}}}
2.客户端:
登陆界面 :
1).功能:
输入账号密码,如果点击注册按钮,会将输入的账号密码存入数据库中
且对输入的账号密码进行判断(没输入账号会提示请输入账号,没输入密码会提示请输入密码),输入的账号不能重复,但是密码可以重复;
如果点击登录按钮,会读取数据库中注册的账号密码,与输入的账号密码进行对比,
如果一致则提示登录成功并跳转到聊天室界面,如果在数据库中找不到账号则提示账号不存在,如果存在账号但是密码不正确,则输出密码错误
2).代码:
-------------------------------------------------------------------
.pro
-------------------------------------------------------------------
QT += core gui network sqlgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0SOURCES += \chat.cpp \main.cpp \widget.cppHEADERS += \chat.h \widget.h# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += targetRESOURCES += \Icon.qrcFORMS += \chat.ui
-------------------------------------------------------------------
widget.h
-------------------------------------------------------------------
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>#include <QIcon>
#include <QLabel>
#include <QPushButton>
#include <QLineEdit>#include <QMessageBox>
#include <QDebug>#include <QSqlDatabase>
#include <QSqlQuery>class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();signals:void loginsuccess_signal(QString account);public slots:void loginbtn_slot();void signinbtn_slot();private://组件QPushButton *login_btn;QPushButton *signin_btn;QLineEdit *account_edit;QLineEdit *pwd_edit;QLabel *main_lab;QLabel *account_lab;QLabel *pwd_lab;//数据库初始化QSqlDatabase db;};
#endif // WIDGET_H
-------------------------------------------------------------------
main.cpp
-------------------------------------------------------------------
#include "widget.h"
#include "chat.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;chat c;w.show();QObject::connect(&w,&Widget::loginsuccess_signal,&c,&chat::openchatroom_slot);return a.exec();
}
-------------------------------------------------------------------
widget.cpp
-------------------------------------------------------------------
#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent)
{//---------------------------------窗口设置---------------------------------//设置窗口为固定大小this->setFixedSize(540,410);//设置窗口iconthis->setWindowIcon(QIcon(":/icon/wodepeizhenshi.png"));//设置窗口名this->setWindowTitle("鹏哥快聊");//---------------------------------标签设置---------------------------------//=====创建界面标签=====main_lab = new QLabel(this);//修改标签大小main_lab->resize(540,200);//在标签中插入图片main_lab->setPixmap(QPixmap(":/icon/logo.png"));//设置为自适应main_lab->setScaledContents(1);//=====创建账号标签=====account_lab = new QLabel(this);//修改标签大小account_lab->resize(50,40);//在标签中插入图片account_lab->setPixmap(QPixmap(":/icon/userName.jpg"));//移动到合适位置account_lab->move(90,220);//设置为自适应account_lab->setScaledContents(1);//=====创建密码标签=====pwd_lab = new QLabel(this);//修改标签大小pwd_lab->resize(account_lab->size());//在标签中插入图片pwd_lab->setPixmap(QPixmap(":/icon/passwd.jpg"));//移动到合适位置pwd_lab->move(account_lab->x(),account_lab->y()+80);//设置为自适应pwd_lab->setScaledContents(1);//---------------------------------按钮设置---------------------------------//=====创建登录按钮=====login_btn = new QPushButton(this);//设置按钮大小login_btn->resize(100,40);//在按钮上插入图片login_btn->setIcon(QIcon(":/icon/login.png"));//在按钮上输入文本login_btn->setText("登录");//移动到合适位置login_btn->move(270,360);connect(login_btn,&QPushButton::clicked,this,&Widget::loginbtn_slot);//=====创建注册按钮=====signin_btn = new QPushButton(this);//设置按钮大小signin_btn->resize(100,40);//在按钮上插入图片signin_btn->setIcon(QIcon(":/icon/cancel.png"));//在按钮上输入文本signin_btn->setText("注册");//移动到合适位置signin_btn->move(login_btn->x()+120,login_btn->y());connect(signin_btn,&QPushButton::clicked,this,&Widget::signinbtn_slot);//---------------------------------输入设置---------------------------------//=====创建账号输入=====account_edit = new QLineEdit(this);//设置占位文本account_edit->setPlaceholderText("QQ号码/手机/邮箱");//设置大小account_edit->resize(200,40);//移动到适合位置account_edit->move(account_lab->x()+100,account_lab->y());//=====创建密码输入=====pwd_edit = new QLineEdit(this);//设置占位文本pwd_edit->setPlaceholderText("密码");//设置大小pwd_edit->resize(account_edit->size());//移动到合适位置pwd_edit->move(pwd_lab->x()+100,pwd_lab->y());//设置回文显示模式pwd_edit->setEchoMode(QLineEdit::Password);//--------------------------------数据库设置--------------------------------//判断数据库是否存在if(!db.contains("user.db")){//不存在//创建一个数据库db = QSqlDatabase::addDatabase("QSQLITE");//命名为user.dbdb.setDatabaseName("user.db");}//存在//打开数据库if(!db.open()){//打开失败QMessageBox::critical(this,"error","数据库打开失败");return;}//打开成功//创建一个表//准备sql语句QString sql = "create table if not exists usertab(""account char primary key,""passwd char)";//创建一个数据库指令执行者QSqlQuery commend;//执行sql语句if(!commend.exec(sql)){//创建表失败QMessageBox::critical(this,"error","表格创建失败");return;}}Widget::~Widget()
{
}//登录按钮槽函数
void Widget::loginbtn_slot()
{//获取账号和密码QString account = account_edit->text();QString passwd = pwd_edit->text();//从数据库中读取账号和密码QString sql = "select * from usertab";//创建执行者并执行sql语句QSqlQuery commend;if(!commend.exec(sql)){//查找失败QMessageBox::critical(this,"error","获取注册表失败");return;}//查找成功,循环比较数据库信息与输入的信息while (commend.next()){if(commend.value(0).toString() == account){//账号正确if(commend.value(1).toString() == passwd){QMessageBox::information(this,"success","登录成功");emit loginsuccess_signal(account);this->close();return;}//密码错误QMessageBox::critical(this,"failed","登录失败,密码错误");pwd_edit->clear();return;}}//账号错误QMessageBox::critical(this,"failed","登录失败,账号不存在");pwd_edit->clear();
}//注册按钮槽函数
void Widget::signinbtn_slot()
{//判断是否填写完整信息if(account_edit->text() == ""){QMessageBox::critical(this,"error","请输入账号");return;}if(pwd_edit->text() == ""){QMessageBox::critical(this,"error","请输入密码");return;}//获取界面上的账号和密码QString account = account_edit->text();QString passwd = pwd_edit->text();//将注册的账号密码写入数据库中//准备sql语句QString sql = QString("insert into usertab values(\"%1\",\"%2\")").arg(account).arg(passwd);//创建执行者并执行sql语句QSqlQuery commend;if(!commend.exec(sql)){//注册失败,账号重复QMessageBox::critical(this,"error","重复注册");return;}//注册成功QMessageBox::information(this,"success","注册成功");
}
聊天室界面:
1).功能:
进入时,显示登录时的账号,且发送按钮、断开按钮和发送的文本编辑器不可用
通过主机的IP和端口号进行连接至主机后,给服务器发送xxx : 进入聊天室,发送按钮、断开按钮和发送的文本编辑器重新可用,使IP和端口号的文本编辑器以及连接聊天室按钮不可用
在发送的文本编辑器中写入信息并按下发送按钮后,会整合发送信息然后发送信息给服务器,发送后清空文本内容,
点击断开聊天室按钮,重新使发送按钮、断开按钮和发送的文本编辑器不可用,使IP和端口号的文本编辑器以及连接聊天室按钮可用
并会给服务器发送一条xxx : 离开聊天室的信息
2).代码:
-------------------------------------------------------------------
chat.h
-------------------------------------------------------------------
#ifndef CHAT_H
#define CHAT_H#include <QWidget>
#include <QTcpSocket>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QListWidget>
#include <QMessageBox>namespace Ui {
class chat;
}class chat : public QWidget
{Q_OBJECTpublic:explicit chat(QWidget *parent = nullptr);~chat();public slots:void openchatroom_slot(QString account);void connectbtn_slot();void connected_slot();void readyread_slot();void sndbtn_slot();void disconbtn_slot();void disconnect_slot();private:Ui::chat *ui;//定义一个客户端套接字QTcpSocket *client;//定义一个用户名QString username;};#endif // CHAT_H
-------------------------------------------------------------------
chat.cpp
-------------------------------------------------------------------
#include "chat.h"
#include "ui_chat.h"chat::chat(QWidget *parent) :QWidget(parent),ui(new Ui::chat)
{//将用户名居中显示//ui->usernamelab_2->setAlignment(Qt::AlignCenter);ui->setupUi(this);//为客户端套接字实例化空间client = new QTcpSocket(this);//连接按钮与对应槽函数连接connect(ui->connectbtn,&QPushButton::clicked,this,&chat::connectbtn_slot);//已连接信号与对应槽函数连接connect(client,&QTcpSocket::connected,this,&chat::connected_slot);//服务器发送信息信号与对应槽函数连接connect(client,&QTcpSocket::readyRead,this,&chat::readyread_slot);//发送按钮与对应槽函数连接connect(ui->sndbtn,&QPushButton::clicked,this,&chat::sndbtn_slot);//断开按钮与对应槽函数connect(ui->disconbtn,&QPushButton::clicked,this,&chat::disconbtn_slot);//断开连接信号与对应槽函数connect(client,&QTcpSocket::disconnected,this,&chat::disconnect_slot);//设置按钮与编辑框可用ui->disconbtn->setEnabled(0);ui->sndbtn->setEnabled(0);ui->msgedit->setEnabled(0);
}chat::~chat()
{delete ui;
}void chat::openchatroom_slot(QString account)
{username = account;qDebug() << account;qDebug() << username;ui->usernamelab_2->setText(username);this->show();
}//连接按钮槽函数
void chat::connectbtn_slot()
{//从ui界面读取IP与portQString IP = ui->IPedit->text();quint16 port = ui->portedit->text().toUInt();//连接服务器client->connectToHost(IP,port);
}//已连接槽函数
void chat::connected_slot()
{//连接完成提示信息QMessageBox::information(this,"成功","成功进入聊天室");//发送xx进入聊天室提示给服务器QString sndmsg = username + " : 进入聊天室";client->write(sndmsg.toLocal8Bit());//设置按钮与编辑框可用ui->IPedit->setEnabled(0);ui->portedit->setEnabled(0);ui->connectbtn->setEnabled(0);ui->sndbtn->setEnabled(1);ui->msgedit->setEnabled(1);ui->disconbtn->setEnabled(1);}//读取服务器发送信息
void chat::readyread_slot()
{//读取信息QByteArray msg = client->readAll();//将读取的信息发送到信息框内ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}//发送按钮对应槽函数
void chat::sndbtn_slot()
{//读取ui界面发送框内信息QString msg = ui->msgedit->text();msg = username + " : " + msg;//将数据发送给服务器client->write(msg.toLocal8Bit());ui->msgedit->clear();
}//断开连接按钮对应槽函数
void chat::disconbtn_slot()
{//准备发送离开信息QString msg = username + " : 离开聊天室";client->write(msg.toLocal8Bit());//断开连接client->disconnectFromHost();
}//断开连接信号槽函数
void chat::disconnect_slot()
{QMessageBox::information(this,"断开连接","成功退出聊天室");//设置按钮与编辑框可用ui->IPedit->setEnabled(1);ui->portedit->setEnabled(1);ui->connectbtn->setEnabled(1);ui->disconbtn->setEnabled(0);ui->sndbtn->setEnabled(0);ui->msgedit->setEnabled(0);
}
相关文章:

基于qt软件的网上聊天室软件
1.服务器: 1).功能: 用于创建一个客户端,通过文本编辑器来获得端口号,根据获得的端口号创建服务器,等待客户端连接 创建成功会提示服务器创建成功 在收到客户端发送的信息时,把这条信息发送给其他所有客户端,实现群…...
本是同根生-双数据库集群keepalived virtual_route_id冲突导致连接故障
项目场景: 一企业近期陆续开始升级办公与大数据系统,新的承包商。原有的数据库是某国内大品牌A,现在新的功能准备陆续迁移到大品牌B上。系统部署后,A依旧承担比较轻松的财务、仓库管理,B承担实时的线上业务。项目验收…...
『力扣每日一题06』字符串中的第一个唯一字符
今天是学习新知识的一天,String 类中有太多细枝末节,需要我去学习跟掌握了。 话不多说,今天给大家带来一道字符串的题目~ 一、题目 给定一个字符串 s ,找到 它的第一个不重复的字符,并返回它的索引 。如果不存在&…...
selenium鼠标操作方法
1.0 selenium新版本封装驱动 from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import ChromiumOptions from selenium.webdriver.chrome.service import Servicedef get_chrome_driver(driver_path):chrome_options ChromiumOptions()chrome_…...

医者无疆 | AI赋能大医精诚,医疗制药的进阶与突破
在历史的长河中,医学一直是人类文明的重要组成部分。从古希腊的希波克拉底到现代医学研究,医学始终与时俱进,为人类的健康和福祉做出了巨大的贡献。在互联网、大数据、5G等信息技术的迭代下,人工智能(AI)的…...

使用 Hue 玩转 Amazon EMR(SparkSQL, Phoenix) 和 Amazon Redshift
现状 Apache Hue 是一个基于 Web 的交互式 SQL 助手,通过它可以帮助大数据从业人员(数仓工程师,数据分析师等)与数据仓库进行 SQL 交互。在 Amazon EMR 集群启动时,通过勾选 Hue 进行安装。在 Hue 启用以后࿰…...

Unity中神秘的Transform和transform(小写)的关系
1.为什么Transform类是保护的不能通过new 来实例化对象,也没有静态函数,而Rotate()这种方法却属于它,该如何访问? Transform 类还是被保护的不允许用户修改! protected Transform(); 是一个受保护的构造函数,不能直接实例化 Transform 类。 2.为甚么transform可以访问Tr…...

【LeetCode-中等题】78. 子集
文章目录 题目方法一:动态规划方法二:递归加回溯(关键----startIndex) 题目 注意:这里的nums数组里面的元素是各不相同的,所以不存在去重操作 方法一:动态规划 public List<List<Integer>> subsets(int[]…...
学习设计模式之代理模式,但是宝可梦
前言 作者在准备秋招中,学习设计模式,做点小笔记,用宝可梦为场景举例,有错误欢迎指出。 代码同步更新到 github ,要是点个Star您就是我的神 目录 前言代理模式1.情景模拟1.1静态代理优点局限 1.2 动态代理 2.应用3.局限4.解决方…...

自学Python01-创建文件写入内容
此处省去安装和前言,需要两个东西 一个去下载安装python官方库 Welcome to Python.org 一个是编译器pycharm PyCharm 安装教程(Windows) | 菜鸟教程 PyCharm: the Python IDE for Professional Developers by JetBrains 第一节 练习print…...

Qt —UDP通信QUdpSocket 简介 +案例
1. UDP通信概述 UDP是无连接、不可靠、面向数据报(datagram)的协议,可以应用于对可靠性要求不高的场合。与TCP通信不同,UDP通信无需预先建立持久的socket连接,UDP每次发送数据报都需要指定目标地址和端口。 QUdpSocket…...

五大类注解和方法注解详解
五大类注解为Controller,Service,Repository,Configuration,Component,方法注解为Bean。 需要注意的是:Bean注解必须要在类注解修饰的类内才能正常使用。 一、与配置文件的关系 在spring原生项目中 如果你使用的spri…...

机器人中的数值优化(十)——线性共轭梯度法
本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,…...

数据结构与算法之贪心动态规划
一:思考 1.某天早上公司领导找你解决一个问题,明天公司有N个同等级的会议需要使用同一个会议室,现在给你这个N个会议的开始和结束 时间,你怎么样安排才能使会议室最大利用?即安排最多场次的会议?电影的话 那…...
【网络编程】网络基础概念
(꒪ꇴ꒪ ),Hello我是祐言QAQ我的博客主页:C/C语言,数据结构,Linux基础,ARM开发板,网络编程等领域UP🌍快上🚘,一起学习,让我们成为一个强大的攻城狮࿰…...

连接虚拟机报错 Could not connect to ‘192.168.xxx.xxx‘ (port 22): Connection failed.
使用xshell连接虚拟机报错 Connecting to 192.168.204.129:22… Could not connect to ‘192.168.204.129’ (port 22): Connection failed. Type help’ to learn how to use Xshell prompt. 按网上的方法 是否能ping通内外网 ping www.baidu.com防火墙是否关闭 firewal…...

数学建模--Topsis评价方法的Python实现
目录 1.算法流程简介 2.算法核心代码 3.算法效果展示 1.算法流程简介 """ TOPSIS(综合评价方法):主要是根据根据各测评对象与理想目标的接近程度进行排序. 然后在现有研究对象中进行相对优劣评价。 其基本原理就是求解计算各评价对象与最优解和最劣解的距离…...

超越时间与人力的软件开发智慧:《人月神话》
目录 1、写在前面2、沟通!沟通!沟通!3、“银弹论”4、“人月神话”不能成立的原因5、影响力6、图书推荐 1、写在前面 《人月神话》是由计算机科学家弗雷德里克布鲁克斯所著的一本经典著作,首次出版于1975年。这本书以一个个小故事…...

Java Stream 流对象(实用技巧)
目录 一、InputStream & OutputStream 1.1、InputStream 和 OutputStream 一般使用 1.2、特殊使用 1.2.1、如何表示文件读取完毕?(DataInputStream) 1.2.2、字符读取/文本数据读取(Scanner) 1.2.3、文件的随机…...

【用unity实现100个游戏之8】用Unity制作一个炸弹人游戏
文章目录 前言素材开始一、绘制地图二、玩家设置三、玩家移动四、玩家四方向动画运动切换 五、放置炸弹六、生成爆炸效果七、墙壁和可破坏障碍物的判断八、道具生成和效果九、玩家死亡十、简单的敌人AI十一、简单敌人AI十二、随机绘制地图十三、虚拟摇杆 最终效果待续源码完结 …...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)
升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点,但无自动故障转移能力,Master宕机后需人工切换,期间消息可能无法读取。Slave仅存储数据,无法主动升级为Master响应请求ÿ…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...