当前位置: 首页 > news >正文

qt简易网络聊天室 数据库的练习

qt网络聊天室

服务器:

配置文件.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 <QTcpServer>   //服务器类头文件
#include <QDebug>   //信息调试类
#include <QMessageBox>  //消息对话框类头文件
#include <QTcpSocket>  //套接字类头文件QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_startBtn_clicked();void newConnection_slot();   //自定义处理newConnection信号的函数void readyRead_slot();   //自定义处理readyRead信号的槽函数private:Ui::Widget *ui;//定义一个服务器指针QTcpServer *server;//定义一个客户端容器QList<QTcpSocket *> clientList;
};
#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

//服务器
//1、实例化服务器类对象,该对象就是服务器
//2、服务器调用成员函数listen()将服务器设置为被动监听状态,监听时可以指定主机地址,也可以any监听所有的主机地址。 端口号若为0,则服务器自动分配,也可指定端口号
//3、若有客户端连接,则服务器会发送一个newconnection信号,连接到对应的槽函数中处理相关逻辑
//4、在处理connect信号的槽函数中,使用nextPendingConntiin获取最新连接的客户端套接字
//5、将获取的套接字存入客户端容器中
//6、若客户端有数据项向服务器发送,则客户端套接字会自动发射一个readyRead信号,来凝结到对应的槽函数中处理相关逻辑
//7、在处理readyRead信号的槽函数中,来读取数据,
//7-1、先循环遍历哪些套接字是无效的(断开连接的客户端),将其从客户端容器中删除,使用state函数判断状态,为0则是断开连接的,不为0不是断开的
//7-2、在循环遍历判断是哪个客户端发来的数据,使用BytesAviable来判断哪个客户端有数据,为0则代表无
//7-3、若有数据,使用read readLine readAll函数读取数据,
//11、向套接字中写数据,可以使用write函数#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//给服务器实例化对象server = new QTcpServer(this);  //该对象就是服务器,服务器创建完成}Widget::~Widget()
{delete ui;
}//启动服务器的槽函数
void Widget::on_startBtn_clicked()
{if(ui->portEdit->text().isEmpty()){QMessageBox::critical(this, "失败", "端口号不可为空");return;}//调用成员函数listen()将服务器设置为被动监听状态//函数原型:bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0);//参数1:主机号,any监听所有的主机地址, 指定主机地址,监听指定的主机地址。//参数2:通过哪个端口号访问服务器,若为0,则服务器自由分配,若不为0,则指定要监听的端口号, quint16 是无符号的16位整型, short//返回值,成功返回真,失败返回假//获取端口号quint16 port = ui->portEdit->text().toUInt();  //toUInt(), 转为无符号整型if(!server->listen(QHostAddress::Any, port)){QMessageBox::critical(this, "失败", "服务器启动失败");return;}else{QMessageBox::information(this, "成功", "服务器启动成功");}//此时说明服务器启动成功,并对客户端进行监听//若有客户端发送连接请求,则服务器会自动发射一个newconnection信号//将给信号连接到对应的槽函数中connect(server, &QTcpServer::newConnection, this, &Widget::newConnection_slot);
}//处理newConnection函数的槽函数的实现
void Widget::newConnection_slot()
{//循环遍历,从客户端套接字容器中删去已断开连接的客户端套接字//函数原型:SocketState state() const;//功能:判断套接字的状态//参数,无//返回值:返回套接字的状态(枚举, 0代表断开连接)for(int i = 0; i<clientList.count(); i++){if(0 == clientList.at(i)->state()){//移除下标为i的无效的客户端clientList.removeAt(i);}}//获取新连接的客户端的套接字//函数原型:virtual QTcpSocket *nextPendingConnection();//功能:获取新连接的客户端的套接字//无参,返回值就是获取到的客户端的套接字的指针QTcpSocket *s = server->nextPendingConnection();//将获取到的套接字存入到客户端套接字容器中clientList.push_back(s);//此时客户端和服务器建立连接//如果套接字有数据项发送给服务器时,该套接字自动发射一个readyRead信号//将readyRead信号连接到对应的槽函数中处理相关逻辑connect(s, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);}//自定义处理readyRead信号的槽函数的实现
void Widget::readyRead_slot()
{//遍历判断是哪个客户端套发来的数据//使用BytesAvalible函数,若无数据可读则为0for(int i=0; i<clientList.count(); i++){if(clientList[i]->bytesAvailable() != 0){//读取套接字中的数据,可用read/readall/readline//函数原型QByteArray readAll();//功能:读取数据//无参,返回值,c风格的字符串QByteArray msg = clientList[i]->readAll();//将数据展示到ui界面上ui->msgList->addItem(QString::fromLocal8Bit(msg));  //将C风格的字符串转为QString类型的//将接收到的消息发送给所有的客户端for(int j=0; j<clientList.count(); j++){clientList[j]->write(msg);}}}}

ui界面

客户端

配置文件.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

头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QTcpSocket>     //客户端头文件
#include <QDebug>        //信息调试类头文件
#include <QMessageBox>  //消息对话框类头文件QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_connectBtn_clicked();void connected_slot();  //自定义处理connected信号的槽函数void readyRead_slot();  //自定义处理readyRead信号的槽函数void on_sendBtn_clicked();void on_disConnectBtn_clicked();void disconnected_slot();  //自定义处理disconnected信号的槽函数private:Ui::Widget *ui;//定义一个客户端指针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

//客户端
//1、实例化QTcpSocket类对象,该对象就是客户端
//2、调用客户端对象的connecTtoHost的成员函数向服务器发送连接请求,需要给定服务器的ip和端口
//3、如果与服务器连接成功,客户端自动发射一个connected信号,将信号与对应的槽函数进行连接处理相关逻辑即可
//4、如果服务器有数据项向客户端发送,客户端会自动发射一个readyRead信号,将信号连接到对应的槽函数读取数据
//5、若客户端要给服务器发送消息,使用write函数
//6、在处理readyRead信号的槽函数中,使用read/readLine/readAll函数读取数据
//7、使用该客户端对象的disconnectFromHost函数端口与服务器的连接,
//8、如果成功断开则会自动发射disconnected信号,将disconnected信号与对应的槽函数连接处理即可#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//实例化客户端空间client  = new QTcpSocket(this);   //该对象就是客户端,创建客户端成功ui->sendBtn->setEnabled(false);ui->disConnectBtn->setEnabled(false);//若连接成功,则客户端自动发射一个connected信号//将connected信号连接到对应的槽函数处理相关逻辑//因为只需要连接一次,所以将其写到构造函数中connect(client, &QTcpSocket::connected, this, &Widget::connected_slot);//若服务器有数据项向客户端发送,客户端会自动发送readyRead信号//将readyRead信号与对应的槽函数连接//由于只需连接一次,所以写在构造函数中connect(client, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);//若断开成功,则客户端会自动发射一个disconnected信号//连接到对应的槽函数处理即可//因只需要连接一次,写在构造函数即可connect(client, &QTcpSocket::disconnected, this, &Widget::disconnected_slot);
}Widget::~Widget()
{delete ui;
}//连接服务器按钮的槽函数
void Widget::on_connectBtn_clicked()
{if(ui->userNameEdit->text().isEmpty() || ui->ipEdit->text().isEmpty() || ui->portEdit->text().isEmpty()){QMessageBox::critical(this, "Error", "信息填写不完整");return;}//获取服务器的主机地址QString ip = ui->ipEdit->text();//获取服务器的端口号quint16 port = ui->portEdit->text().toUInt();  //toUInt()转化为无符号整数//该客户端对象调用成员函数连接服务器//函数原型:virtual void connectToHost(const QHostAddress &address, quint16 port, OpenMode mode = ReadWrite);//功能:客户端连接服务器//参数1:服务器的ip地址//参数2:客户端的端口号 , quint16 无符号的16位的整型 short//返回值:无client->connectToHost(ip, port);//顺便向客户端发送一条数据QString msg = ui->userNameEdit->text();msg = msg+ ": 进入聊天室";//使用write函数向服务器发送数据client->write(msg.toLocal8Bit());  // toLocal8Bit()转为C风格字符串//若连接成功,则客户端自动发射一个connected信号//将connected信号连接到对应的槽函数处理相关逻辑//因为只需要连接一次,所以将其写到构造函数中
}//处理connected信号的槽函数的实现
void Widget::connected_slot()
{//说明连接成功ui->userNameEdit->setEnabled(false);ui->ipEdit->setEnabled(false);ui->portEdit->setEnabled(false);ui->connectBtn->setEnabled(false);ui->disConnectBtn->setEnabled(true);ui->sendBtn->setEnabled(true);//若服务器有数据项向客户端发送,客户端会自动发送readyRead信号//将readyRead信号与对应的槽函数连接//由于只需连接一次,所以写在构造函数中}//处理readyRead信号的槽函数
void Widget::readyRead_slot()
{//使用read/readLine/readAll读取数据QByteArray msg =client->readAll();//将读取的数据展示到ui界面上ui->msgList->addItem(QString::fromLocal8Bit(msg));}//发送按钮的槽函数
void Widget::on_sendBtn_clicked()
{//获取用户名QString userName = ui->userNameEdit->text();//获取文本输入框的内容QString msg = ui->textEdit->toPlainText();msg = userName + ": " + msg;//将数据发送给服务器client->write(msg.toLocal8Bit());//清空文本输入框ui->textEdit->clear();}//断开按钮对应的槽函数
void Widget::on_disConnectBtn_clicked()
{//告知服务器即将断开连接QString userName = ui->userNameEdit->text();QString msg = userName + ": 退出聊天室";client->write(msg.toLocal8Bit());//使用该类对象调用disconnectFromHost断开与服务器的连接//函数原型:virtual void disconnectFromHost();//无参 无返client->disconnectFromHost();//若断开成功,则客户端会自动发射一个disconnected信号//连接到对应的槽函数处理即可//因只需要连接一次,写在构造函数即可
}void Widget::disconnected_slot()
{ui->sendBtn->setEnabled(false);ui->disConnectBtn->setEnabled(false);ui->userNameEdit->setEnabled(true);ui->ipEdit->setEnabled(true);ui->portEdit->setEnabled(true);QMessageBox::information(this, "退出", "断开成功");
}

ui界面

数据库:
配置文件.pro

QT       += core gui 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 += \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

头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QSqlDatabase>    //数据库管理类
#include <QSqlQuery>       //执行sql语句对应的类
#include <QSqlRecord>      //记录类
#include <QMessageBox>     //消息对话框类
#include <QDebug>          //信息调试类QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_inputBtn_clicked();void on_showBtn_clicked();void on_searchBtn_clicked();void on_deleteBtn_clicked();private:Ui::Widget *ui;//定义一个数据库对象QSqlDatabase db;
};
#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);//判断数据库对象是否包含了自己使用的数据库,Student.dbif(!db.contains("Student.db")){//添加数据库// static QSqlDatabase addDatabase(QSqlDriver* driver, const QString& connectionName = QLatin1String(defaultConnection));//参数1:数据库的版本//返回值:添加的数据库db = QSqlDatabase::addDatabase("QSQLITE");   //表明使用的是Sqlite3版本的数据库//给数据库命名db.setDatabaseName("Student.db");}//打开数据库if(!db.open()){QMessageBox::information(this, "提示", "数据库打开失败");}//此时说明数据库已经创建出来并打开了,就可以创建数据表了//创建数据表需要使用sql语句, 需要使用QSQLQuerry对象来完成//准备sql语句
//    QString sql = "create table if not exists myTable("
//            "id integer Primary key autoincrement,"
//            "numb integer,"
//            "name varchar(10),"
//            "sex varchar(4))";QString sql = "create table if not exists myTable("              //创建表的sql语句"id integer primary key autoincrement,"          //id主键,允许自增"numb integer,"                                   //学号,是整形"name varchar(10),"                               //姓名   字符串"score integer,""sex varchar(4))";                                 //性别 字符串//定义语句执行者QSqlQuery queery;//使用querry调用成员函数exec执行sql语句if(!queery.exec(sql)){QMessageBox::information(this, "失败", "表格创建失败");return;}else{QMessageBox::information(this, "成功", "表格创建出成功");}
}Widget::~Widget()
{delete ui;
}//录入按钮对应的槽函数
void Widget::on_inputBtn_clicked()
{//获取ui界面中要存入数据库中的数据int numb_ui = ui->numEdit->text().toUInt();   //获取ui界面的学号QString name_ui = ui->nameEdit_2->text();  //获取ui界面的姓名int score_ui = ui->scoreEdit_3->text().toUInt();  //获取ui界面上的成绩QString sex_ui = ui->sexEdit_4->text();  //获取ui界面上的性别//判断是否有漏填数据if(numb_ui == 0 || name_ui.isEmpty() || score_ui == 0 || sex_ui.isEmpty()){QMessageBox::information(this, "提示", "请将数据填写完整");return;}//准备sql语句QString sql = QString("insert into myTable(numb, name, score, sex)""values(%1, '%2', %3, '%4')").arg(numb_ui).arg(name_ui).arg(score_ui).arg(sex_ui);qDebug() << sql;//定义语句执行者QSqlQuery querry;//调用执行者的exec()函数执行sql语句if(!querry.exec(sql)){QMessageBox::information(this, "失败", "数据插入失败");}else{QMessageBox::information(this, "成功", "数据录入成功");}}//展示按钮对应的槽函数
void Widget::on_showBtn_clicked()
{QString sql = "select * from MyTable";//定义语句执行者QSqlQuery querry;//调用执行者的exec()函数执行sql语句if(!querry.exec(sql)){QMessageBox::information(this, "失败", "查询失败");return;}else{QMessageBox::information(this, "成功", "查询成功");}//此时,将查找到的所有结果。全部都放在querry中了//可以通过next函数不断遍历查询结果int i = 0;   //记录行号while(querry.next()){//遍历的就是任意一组记录querry.record//qDebug() << querry.record();//querry.record().count();  返回当前记录对应数据项的个数//querry.record().count();//要找到每条记录中的每个数据//qDebug() << querry.record().value(2);//querry.record().value(j).toString() //将记录的某一项的转为字符串//将数据库中的表格展示到ui界面for(int j = 0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i, j, new QTableWidgetItem(querry.record().value(j+1).toString()));}i++;   //进行下一行}
}void Widget::on_searchBtn_clicked()
{//获取学号QString name_ui = ui->nameEdit_2->text();int numb_ui = ui->numEdit->text().toUInt();//sql语句QString sql = QString("select * from myTable where numb = %1").arg(numb_ui);//定义语句执行者QSqlQuery querry;//执行者使用exec函数执行sql语句if(!querry.exec(sql)){QMessageBox::information(this , "提示", "查询失败");return;}else{QMessageBox::information(this , "提示", "查询成功");}int i = 0;  //行号while(querry.next()){for(int j=0; j<querry.record().count()-1; j++){ui->tableWidget->setItem(i, j, new QTableWidgetItem(querry.record().value(j+1).toString()));}}
}void Widget::on_deleteBtn_clicked()
{QString name_ui = ui->nameEdit_2->text();//sql语句QString sql = QString("delete from myTable where name = '%1'").arg(name_ui);qDebug() << sql;//定义语句执行者QSqlQuery querry;//querry调用自己成员函数执行sql语句if(!querry.exec(sql)){QMessageBox::information(this, "提示", "删除失败");return;}else{QMessageBox::information(this, "提示", "删除成功");}}

ui界面

相关文章:

qt简易网络聊天室 数据库的练习

qt网络聊天室 服务器&#xff1a; 配置文件.pro QT core gui networkgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c11# The following define makes your compiler emit warnings if you use # any Qt feature that has been marked deprecated (the exac…...

Navicat连接mysql8.0:提示无法加载身份验证插件“caching_sha2_password”

Navicat连接mysql时&#xff0c;提示&#xff1a;Unable to load authentication plugin ‘caching_sha2_password‘. 原因&#xff1a;mysql 8.0 默认使用 caching_sha2_password 身份验证机制。 D:\MySQL8.0\install\bin>mysql -uroot -p123456789 #登录 mysql: [War…...

手写签名到背景上合为1张图

手写签名到背景上合为1张图 package.json中 "signature_pad": "3.0.0-beta.3"<template><div class"home"><canvas id"canvas" width"500" height"300"></canvas><button click"…...

华为认证系统学习大纲及课程

前言 任何学习过程都需要一个科学合理的学习路线&#xff0c;才能够有条不紊的完成我们的学习目标。华为认证网络工程师所需学习的内容纷繁复杂&#xff0c;难度较大&#xff0c;所以今天特别为大家整理了一个全面的华为认证网络工程师学习大纲及课程&#xff0c;帮大家理清思…...

某米ax3000路由器组网解析

我们使用某米k60手机与某米ax3000 wifi6路由器组网&#xff0c;来分析和学习网络速率与瓶颈限制。 某米 AX3000 路由器简介 某米 AX3000 路由器是一款支持 WiFi 6 的双频路由器&#xff0c;它的 MIMO 是 22&#xff0c;也就是两根天线。MIMO 是 Multiple Input Multiple Outpu…...

【leetcode 力扣刷题】数学题之除法:哈希表解决商的循环节➕快速乘求解商

两道和除法相关的力扣题目 166. 分数到小数29. 两数相除快速乘解法一&#xff1a;快速乘变种解法二&#xff1a; 二分查找 快速乘 166. 分数到小数 题目链接&#xff1a;166. 分数到小数 题目内容&#xff1a; 题目是要我们把一个分数变成一个小数&#xff0c;并以字符串的形…...

Union类型和集合的union()方法-set.union()

Union类型和集合的Union 方法 一、Union类型1.Union类型由来2.Union类型的语法3.Union类型的使用4.一些等价写法 二、Set.union()union() 语法示例代码 一、Union类型 1.Union类型由来 Python中的Union类型是 3.10版本引入的新功能之一。它是一种特殊的类型注释&#xff0c;用…...

简明SQL别名指南:掌握AS实现列名更名

在 SQL 查询中&#xff0c;使用 {原始字段名} as {别名} 的语法来为查询结果的列赋予更直观的名称&#xff0c;以提高查询结果的可读性和可理解性。 以下是用到的表。 用AS更名 例如&#xff0c;查询表1的name字段&#xff0c;并将其更名为"名字"&#xff0c;同时查…...

基于量子密钥分发和区块链技术的新一代加密通信系统

量子通信与区块链构建下一代加密通信基础设施 量子技术和区块链技术是国家信息安全和国家数字化转型的重要组成部分&#xff0c;在国家战略中具有重要地位。“十四五”规划纲要将“加快数字发展建设数字中国”作为独立篇章&#xff0c;指出要进一步明确发展云计算、大数据、物联…...

网络安全-子域名收集

本文为作者学习文章&#xff0c;按作者习惯写成&#xff0c;如有错误或需要追加内容请留言&#xff08;不喜勿喷&#xff09; 本文为追加文章&#xff0c;后期慢慢追加 子域名 子域名指二级域名,二级域名是顶级域名(一级域名)的下一级比如mail.heetian.com和bbs.heetian.com…...

go-zero jwt 鉴权快速实战

前面我们分享了 go-zero 的快速实战以及日志组件的剖析&#xff0c;本次我们来实战使用 go-zero jwt 鉴权 本次文章主要是分享关于 go-zero 中 jwt 的使用方式&#xff0c;会以一个 demo 的方式来进行实战&#xff0c;对于使用 goctl 工具以及安装细节就不在赘述&#xff0c;有…...

9.8day58 单调栈

739. 每日温度 - 力扣&#xff08;LeetCode&#xff09; 知识点&#xff1a;1.建栈 2.如果后面要加入的数小于栈顶元素就把数组的下标压进栈里 3.反之 就让该数于栈顶元素进行比较 如果该数大于栈顶元素&#xff08;while&#xff09; 就把栈顶元素下表对应的arr数组的值进行…...

快速完成工信部APP备案流程_以阿里云APP备案为例

阿里云APP备案流程分为6步&#xff0c;APP备案成功后应用可以上架&#xff0c;登录阿里云账号填写APP信息&#xff0c;等待阿里云初审&#xff0c;初审通过后进行工信部短信核验&#xff0c;管局审核通过后APP即可备案成功&#xff0c;最后移动APP应用可以分发平台上架&#xf…...

uniapp中UView中 u-form表单在v-for循环下如何进行表单校验

1、数据data格式 注&#xff1a;rule绑定的tableFromRule中要和表单tableFrom下面放置一个同名数组&#xff0c;确保u-form能找到 tableFrom: {tableData: [//数据详情列表]},tableFromRule: {//校验tableData: [//数据详情列表]},formRules:{localation:[{required: true,mes…...

工作新时代,腾讯轻联塑造高效办公未来

腾讯轻联&#xff1a;开启便捷、高效的集成新纪元 ⭐ 写在前面⭐ 使用模板快速起步⭐ 自定义流程初体验⭐ 无与伦比的集成强者⭐ 写在最后 ⭐ 写在前面 在当今竞争激烈的商业环境中&#xff0c;提高企业的办公效率和工作流程自动化变得至关重要。腾讯轻联&#xff0c;作为新一…...

JavaScript实现广告倒计时和跳过广告

倒计时和跳过广告 最近打开手机上的app&#xff0c;映入眼帘的都是一个几秒的广告&#xff0c;带有倒计时&#xff0c;当然如果不喜欢的话可以点击跳过&#xff0c;跳过广告其实质应该就是关闭广告。以前用JavaScript做过一个定时关闭的广告&#xff0c;于是把代码完善了一下&…...

蚂蚁发布金融大模型:两大应用产品支小宝2.0、支小助将在完成备案后

9月8日&#xff0c;在上海举办的外滩大会上&#xff0c;蚂蚁集团正式发布金融大模型。据了解&#xff0c;蚂蚁金融大 模型基于蚂蚁自研基础大模型&#xff0c;针对金融产业深度定制&#xff0c;底层算力集群达到万卡规模。该大 模型聚焦真实的金融场景需求&#xff0c;在“认知…...

Jenkins 持续集成:Linux 系统 两台机器互相免密登录

背景知识 我们把public key放在远程系统合适的位置&#xff0c;然后从本地开始进行ssh连接。 此时&#xff0c;远程的sshd会产生一个随机数并用我们产生的public key进行加密后发给本地&#xff0c;本地会用private key进行解密并把这个随机数发回给远程系统。 最后&#xf…...

Golang-GJSON 快速而简单的方法来从 json 文档获取值

GJSON 是一个 Go 包&#xff0c;它提供了一种快速而简单的方法来从 json 文档获取值。它具有单行搜索、点符号路径、迭代和解析 json 行等功能。 GJSON 也可用于Python和Rust 入门 安装中 要开始使用GJSON 请安装 Go 并运行 go get &#xff1a; $ go get -u github.com/ti…...

echarts根据x轴数据长度判断是否倾斜展示/柱状图上方显示数字

showChart1() { // 通过id初始化let chart1 echarts.init(document.getElementById(this.idName))var option {// 到容器的距离grid: {top: 18,left: 0,right: 4,bottom: 0,},xAxis: [{type: category,data: this.xData,axisLine: {lineStyle: {color: rgba(255, 255, 255, .…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...