SQLite3 数据库学习(四):Qt 数据库基础操作

参考引用

  • SQLite 权威指南(第二版)
  • SQLite3 入门

1. 创建连接执行 sql 语句

在这里插入图片描述

  • 在 Qt 中使用数据库要在工程文件中添加
    QT += sql
    

1.1 main.cpp

#include "createsqlapp.h"
#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>int main(int argc, char *argv[]) {QApplication a(argc, argv);// 创建一个默认数据库连接,在后期整个 Qt 应用中可使用,通过 Qt 中的接口函数操作数据库// 创建数据库连接句柄QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");// 设置数据库名称,用户名,密码db.setDatabaseName("my.db");// 打开数据库if (!db.open()) {qDebug() << db.lastError().text();  // 输出错误信息}CreateSqlApp w;w.show();return a.exec();
}

1.2 createsqlapp.h

#ifndef CREATESQLAPP_H
#define CREATESQLAPP_H#include <QWidget>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlError>
#include <QString>QT_BEGIN_NAMESPACE
namespace Ui { class CreateSqlApp; }
QT_END_NAMESPACEclass CreateSqlApp : public QWidget {Q_OBJECTpublic:CreateSqlApp(QWidget *parent = nullptr);~CreateSqlApp();private slots:void on_pushButton_clicked();private:Ui::CreateSqlApp *ui;
};
#endif // CREATESQLAPP_H

1.3 createsqlapp.cpp

#include "createsqlapp.h"
#include "ui_createsqlapp.h"CreateSqlApp::CreateSqlApp(QWidget *parent) : QWidget(parent), ui(new Ui::CreateSqlApp) {ui->setupUi(this);// 创建数据库表格QSqlQuery query;  // 自动关联到默认连接名的数据库// 执行创建表格的语句if (!query.exec("create table if not exists student(id int, name text)")) {qDebug() << query.lastError().text();}// 插入语句if (!query.exec("insert into student values(0, 'Tom')")) {qDebug() << query.lastError().text();}
}CreateSqlApp::~CreateSqlApp() {delete ui;
}void CreateSqlApp::on_pushButton_clicked() {QString sql = QString("insert into student values(%1, '%2')").arg(ui->idEdit->text()).arg(ui->nameEdit->text());QSqlQuery query;  // 自动关联到默认连接名的数据库// 执行创建表格的语句if (!query.exec(sql)) {qDebug() << query.lastError().text();}
}

1.4 createsqlapp.ui

在这里插入图片描述

  • 在界面添加数据后点添加数据按钮,查看添加成功数据如下图所示(其中 0 为默认添加)
    • 1 yuexd
    • 2 juzy
      在这里插入图片描述

2. 用户名和密码注册、登录

  • 注册
    在这里插入图片描述

  • 登录
    在这里插入图片描述

2.1 main.cpp

#include "loginsqlite.h"#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>int main(int argc, char *argv[]) {QApplication a(argc, argv);// 创建一个默认数据库连接,在后期整个 Qt 应用中可使用,通过 Qt 中的接口函数操作数据库// 创建数据库连接句柄QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");// 设置数据库名称,用户名,密码db.setDatabaseName("my.db");// 打开数据库if (!db.open()) {qDebug() << db.lastError().text();  // 输出错误信息}// 创建表格QString sql = "create table if not exists user(id integer primary key autoincrement,""username varchar(256) unique, password varchar(256))";// 执行 sql 语句QSqlQuery query;  // 自动关联到默认连接名的数据库if (query.exec(sql)) {qDebug() << query.lastError().text();}loginSqlite w;w.show();return a.exec();
}

2.2 loginsqlite.cpp

#include "loginsqlite.h"
#include "ui_loginsqlite.h"loginSqlite::loginSqlite(QWidget *parent) : QWidget(parent), ui(new Ui::loginSqlite) {ui->setupUi(this);// 从配置文件中提取用户名和密码(再次打开登录界面会默认显示上次登录的用户名和密码)QSettings setting(QSettings::IniFormat, QSettings::SystemScope, "config");QString username = setting.value("username").toString();QString password = setting.value("password").toString();ui->userEdit->setText(username);ui->passEdit->setText(password);
}loginSqlite::~loginSqlite() {delete ui;
}// 查询数据库
void loginSqlite::on_loginBt_clicked() {QString username = ui->userEdit->text();QString password = ui->passEdit->text();// 打包插入的 sql 语句QString sql = QString("select * from user where username='%1' and password='%2'").arg(username).arg(password);// 执行 sql 插入语句QSqlQuery query;if (!query.exec(sql)) {qDebug() << query.lastError().text();return;}// 获取查询的数据if (query.next()) {  // 指向第一个数据// 查到记录qDebug() << "find record";// QSettings 记录用户名密码if (ui->checkBox->isChecked()) {// 打开配置文件 (在 C:\ProgramData 目录下)QSettings setting(QSettings::IniFormat, QSettings::SystemScope, "config.ini");// 把用户名和密码设置到配置文件中setting.setValue("username", username);setting.setValue("password", password);}} else {// 未查到记录qDebug() << "not find record";}QSqlRecord record = query.record();  // 一行数据是一条记录qDebug() << record.value("username").toString();qDebug() << record.value("password").toString();
}// 插入数据
void loginSqlite::on_regBt_clicked() {QString username = ui->userEdit->text();QString password = ui->passEdit->text();// 打包插入的 sql 语句QString sql = QString("insert into user(username, password) values('%1', '%2')").arg(username).arg(password);// 执行 sql 插入语句QSqlQuery query;if (!query.exec(sql)) {qDebug() << query.lastError().text();QMessageBox::information(this, "registe", "registe failed");return;}QMessageBox::information(this, "registe", "registed");
}

2.3 loginsqlite.ui

在这里插入图片描述

2.4 qss 样式

QWidget {background-color: rgb(255, 255, 255);
}QLineEdit {border:1px solid#cccccc;
}QPushButton#loginBt {border:1px solid#3f89ec;background-color: rgb(63, 137, 236);color: rgb(255, 255, 255);
}QPushButton#pssBt {color: rgb(46, 130, 255);
}QPushButton#regBt {color: rgb(46, 130, 255);
}QPushButton#pssBt : hover {color: rgb(46, 100, 200);
}QPushButton#regBt : hover {color: rgb(46, 100, 200);
}QCheckBox {color: rgb(117, 117, 117);
}

3. Qt 连接多个数据库并分别插入数据

在这里插入图片描述

在这里插入图片描述

3.1 main.cpp (.pro 文件中记得添加 sql 模块)

#include "muldatabaseapp.h"#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>int main(int argc, char *argv[]) {QApplication a(argc, argv);// 创建数据库连接句柄 AdbQSqlDatabase Adb = QSqlDatabase::addDatabase("QSQLITE", "Adb");  // (数据库驱动名,连接名)Adb.setDatabaseName("Amy.db");  // 设置数据库名称,用户名,密码if(!Adb.open()) {  // 打开数据库 AdbqDebug() << Adb.lastError().text();  // 输出错误信息}// 创建数据库连接句柄 BdbQSqlDatabase Bdb = QSqlDatabase::addDatabase("QSQLITE", "Bdb");Bdb.setDatabaseName("Bmy.db");if(!Bdb.open()) {qDebug()<<Bdb.lastError().text();}// 给多个数据库创建表格QString sql = "create table if not exists user(id integer primary key autoincrement,""username varchar(256) unique, password varchar(256))";QSqlQuery queryA(Adb);   // 给 A 数据库创建表格queryA.exec(sql);QSqlQuery queryB(Bdb);   // 给 B 数据库创建表格queryB.exec(sql);MulDataBaseApp w;w.show();return a.exec();
}

3.2 muldatabaseapp.h

#ifndef MULDATABASEAPP_H
#define MULDATABASEAPP_H#include <QWidget>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>QT_BEGIN_NAMESPACE
namespace Ui { class MulDataBaseApp; }
QT_END_NAMESPACEclass MulDataBaseApp : public QWidget {Q_OBJECTpublic:MulDataBaseApp(QWidget *parent = nullptr);~MulDataBaseApp();private slots:void on_insertBt_clicked();private:Ui::MulDataBaseApp *ui;
};
#endif // MULDATABASEAPP_H

3.3 muldatabaseapp.cpp

#include "muldatabaseapp.h"
#include "ui_muldatabaseapp.h"MulDataBaseApp::MulDataBaseApp(QWidget *parent) : QWidget(parent), ui(new Ui::MulDataBaseApp) {ui->setupUi(this);
}MulDataBaseApp::~MulDataBaseApp() {delete ui;
}void MulDataBaseApp::on_insertBt_clicked() {QString username = ui->userEdit->text();QString password = ui->passEdit->text();QString sql = QString("insert into user(username, password) values('%1', '%2')").arg(username).arg(password);// 选中 rbA 单选框if (ui->rbA->isChecked()) {QSqlQuery query(QSqlDatabase::database("Adb"));if (!query.exec(sql)) {qDebug() << query.lastError().text();}} else if (ui->rbB->isChecked()) {  // 选中 rbB 单选框QSqlQuery query(QSqlDatabase::database("Bdb"));if (!query.exec(sql)) {qDebug() << query.lastError().text();}}
}

3.4 muldatabaseapp.ui

在这里插入图片描述

4. Qt 数据库增删改查

  • 设计一个存储 QLabel 的样式
    在这里插入图片描述

4.1 main.cpp

#include "labelstylesql.h"#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>int main(int argc, char *argv[]) {QApplication a(argc, argv);// 创建数据库连接句柄QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "db");  // (数据库驱动名,连接名)db.setDatabaseName("my.db");  // 设置数据库名称,用户名,密码if (!db.open()) {qDebug() << db.lastError().text();  // 输出错误信息}// 给数据库创建表格QString sql = "create table if not exists label(id integer primary key autoincrement,""border_size int, border_color varchar(16),""border_radius int, background_color) varchar(16), color varchar(16)";QSqlQuery query(db);query.exec(sql);LabelStyleSql w;w.show();return a.exec();
}

4.2 labelstylesql.h

#ifndef LABELSTYLESQL_H
#define LABELSTYLESQL_H#include <QWidget>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>
#include <QSqlRecord>QT_BEGIN_NAMESPACE
namespace Ui { class LabelStyleSql; }
QT_END_NAMESPACEclass LabelStyleSql : public QWidget {Q_OBJECTpublic:LabelStyleSql(QWidget *parent = nullptr);~LabelStyleSql();private slots:void on_insertBt_clicked();void on_selectBt_clicked();void on_deleteBt_clicked();void on_updateBt_clicked();void on_testBt_clicked();private:Ui::LabelStyleSql *ui;void update_feild(QString key, QString value, int id);
};
#endif // LABELSTYLESQL_H

4.3 labelstylesql.cpp

#include "labelstylesql.h"
#include "ui_labelstylesql.h"LabelStyleSql::LabelStyleSql(QWidget *parent) : QWidget(parent), ui(new Ui::LabelStyleSql) {ui->setupUi(this);
}LabelStyleSql::~LabelStyleSql() {delete ui;
}// 插入(添加)数据
void LabelStyleSql::on_insertBt_clicked() {QString sql = QString("insert into label(border_size, border_color, border_radius, background_color, color) ""values(%1, '%2', %3, '%4', '%5')").arg(ui->bsizeEdit->text()).arg(ui->bcolorEdit->text()).arg(ui->bradiusEdit->text()).arg(ui->backcolorEdit->text()).arg(ui->fontcolorEdit->text());QSqlQuery query;if (!query.exec(sql)) {qDebug() << query.lastError().text();}
}// 查询数据
void LabelStyleSql::on_selectBt_clicked() {QString id = ui->idEdit->text();QString sql = QString("select * from label where id=%1").arg(id);QSqlQuery query;if (!query.exec(sql)) {qDebug() << query.lastError().text();}while (query.next()) {QSqlRecord record = query.record();ui->bsizeEdit->setText(record.value("border_size").toString());ui->bcolorEdit->setText(record.value("border_color").toString());ui->bradiusEdit->setText(record.value("border_radius").toString());ui->backcolorEdit->setText(record.value("background_color").toString());ui->fontcolorEdit->setText(record.value("color").toString());}
}// 删除数据
void LabelStyleSql::on_deleteBt_clicked() {QString id = ui->idEdit->text();QString sql = QString("delete from label where id=%1").arg(id);QSqlQuery query;if (!query.exec(sql)) {qDebug() << query.lastError().text();}
}// 更新数据函数
void LabelStyleSql::update_feild(QString key, QString value, int id) {QString sql = QString("update label set %1='%2' where id=%3").arg(key).arg(value).arg(id);QSqlQuery query;if (!query.exec(sql)) {qDebug() << query.lastError().text();}
}// 更新数据
void LabelStyleSql::on_updateBt_clicked() {QString id = ui->idEdit->text();update_feild("border_size", ui->bsizeEdit->text(), id.toInt());update_feild("border_color", ui->bcolorEdit->text(), id.toInt());
}// 存储 QLabel 标签样式
void LabelStyleSql::on_testBt_clicked() {QString bsize = ui->bsizeEdit->text();QString bcolor = ui->bcolorEdit->text();QString bradius = ui->bradiusEdit->text();QString backcolor = ui->backcolorEdit->text();QString fontcolor = ui->fontcolorEdit->text();QString style = QString("border:%1px solid%2; border-radius:%3px; background-color:%4; color:%5").arg(bsize).arg(bcolor).arg(bradius).arg(backcolor).arg(fontcolor);ui->label->setStyleSheet(style);
}

4.4 labelstylesql.ui

在这里插入图片描述

5. Qt 数据库绑定机制

在这里插入图片描述

在这里插入图片描述

5.1 main.cpp

#include "sqlquerybindapp.h"#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>int main(int argc, char *argv[]) {QApplication a(argc, argv);// 创建数据库连接句柄QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");// 设置数据库名称,用户名,密码db.setDatabaseName("my.db");if (!db.open()) {  // 打开数据库qDebug() << db.lastError().text();  // 输出错误信息}// 创建表格QString sql = "create table if not exists student(id integer primary key autoincrement,""name varchar(256), sex varchar(16))";// 执行 sql 语句QSqlQuery query(db);if (query.exec(sql)) {qDebug() << query.lastError().text();}SqlQueryBindApp w;w.show();return a.exec();
}

5.2 sqlquerybindapp.h

#ifndef SQLQUERYBINDAPP_H
#define SQLQUERYBINDAPP_H#include <QWidget>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>
#include <QVariantList>
#include <QVariant>QT_BEGIN_NAMESPACE
namespace Ui { class SqlQueryBindApp; }
QT_END_NAMESPACEclass SqlQueryBindApp : public QWidget {Q_OBJECTpublic:SqlQueryBindApp(QWidget *parent = nullptr);~SqlQueryBindApp();private slots:void on_bindinsertBt_clicked();void on_bindsBt_clicked();private:Ui::SqlQueryBindApp *ui;
};
#endif // SQLQUERYBINDAPP_H

5.3 sqlquerybindapp.cpp

#include "sqlquerybindapp.h"
#include "ui_sqlquerybindapp.h"SqlQueryBindApp::SqlQueryBindApp(QWidget *parent) : QWidget(parent), ui(new Ui::SqlQueryBindApp) {ui->setupUi(this);
}SqlQueryBindApp::~SqlQueryBindApp() {delete ui;
}// 单个绑定数据
void SqlQueryBindApp::on_bindinsertBt_clicked() {QSqlQuery query;// 准备执行的语句QString sql="insert into student(name , sex) values(:name, :sex)";query.prepare(sql);// 绑定数据(通过位置绑定)query.bindValue(0, ui->nameEdit->text());query.bindValue(1, ui->sexEdit->text());// 执行query.exec();
}// 批量绑定数据
void SqlQueryBindApp::on_bindsBt_clicked() {QSqlQuery query;// 准备执行的语句QString sql="insert into student(name, sex) values(:name, :sex)";query.prepare(sql);// 批量绑定数据QVariantList names;names << "AAA" << "BBB" << "CCC";query.addBindValue(names);  //添加到占位符的第 0  ->:name个位置QVariantList sexs;// 绑定多个数据:如果有多个字段,每个字段绑定数据的个数要一致// 此处第三个数据起到占位作用,目的是数据个数与 names 保持一致sexs << "man" << "women" << QVariant(QVariant::String);query.addBindValue(sexs);// 批量执行query.execBatch();
}

5.4 sqlquerybindapp.ui

在这里插入图片描述

6. Qt 数据库事务机制

bool QSqlDatabase::transaction()  // 开启事务---begin
bool QSqlDatabase::commit()       // 提交事务---commit
bool QSqlDatabase::rollback()     // 事务回滚---rollback
  • 点击开启事务后所有对数据库的操作都在内存中进行,只有点提交事务后才会同步到数据库中
    在这里插入图片描述

  • 即使点击开启事务,在 Qt 中依然可以查询到更改信息(点回滚事务则撤回上一步操作并自动结束本轮事务机制)
    在这里插入图片描述

6.1 main.cpp

#include "sqlquerybindapp.h"#include <QApplication>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>int main(int argc, char *argv[]) {QApplication a(argc, argv);// 创建数据库连接句柄QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");// 设置数据库名称,用户名,密码db.setDatabaseName("my.db");if (!db.open()) {  // 打开数据库qDebug() << db.lastError().text();  // 输出错误信息}// 创建表格QString sql = "create table if not exists student(id integer primary key autoincrement,""name varchar(256), sex varchar(16))";// 执行 sql 语句QSqlQuery query(db);if (query.exec(sql)) {qDebug() << query.lastError().text();}SqlQueryBindApp w;w.show();return a.exec();
}

6.2 transactionapp.h

#ifndef TRANSACTIONAPP_H
#define TRANSACTIONAPP_H#include <QWidget>
#include <QSqlDatabase>
#include <QDebug>
#include <QSqlError>
#include <QString>
#include <QSqlQuery>
#include <QSqlRecord>QT_BEGIN_NAMESPACE
namespace Ui { class transactionApp; }
QT_END_NAMESPACEclass transactionApp : public QWidget {Q_OBJECTpublic:transactionApp(QWidget *parent = nullptr);~transactionApp();private slots:void on_beginBt_clicked();void on_commitBt_clicked();void on_rollbackBt_clicked();void on_insertBt_clicked();void on_selectBt_clicked();private:Ui::transactionApp *ui;
};
#endif // TRANSACTIONAPP_H

6.3 transactionapp.cpp

#include "transactionapp.h"
#include "ui_transactionapp.h"transactionApp::transactionApp(QWidget *parent) : QWidget(parent), ui(new Ui::transactionApp) {ui->setupUi(this);
}transactionApp::~transactionApp() {delete ui;
}void transactionApp::on_beginBt_clicked() {// 开始事务处理if (QSqlDatabase::database().transaction()) {qDebug() << "begin success!";} else {qDebug() << "begin failed!";}
}void transactionApp::on_commitBt_clicked() {// 提交事务处理if (QSqlDatabase::database().commit()) {qDebug() << "commit success!";} else {qDebug() << "commit failed!";}
}void transactionApp::on_rollbackBt_clicked() {// 回滚事务处理if (QSqlDatabase::database().rollback()) {qDebug() << "rollback success!";} else {qDebug() << "rollback failed!";}
}void transactionApp::on_insertBt_clicked() {QSqlQuery query;// 准备执行的语句QString sql = "insert into student(name , sex) values(:name, :sex)";query.prepare(sql);// 绑定数据(通过位置绑定)query.bindValue(0, ui->nameEdit->text());query.bindValue(1, ui->sexEdit->text());// 执行query.exec();
}void transactionApp::on_selectBt_clicked() {QSqlQuery query;// 准备执行的语句QString sql = "select * from student";query.exec(sql);while (query.next()) {qDebug() << query.record().value("name").toString();}
}

6.4 transactionapp.ui

在这里插入图片描述

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

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

相关文章

香港高端人才通行证计划申请(包括条件)你需要知道的这些真相!

香港高端人才通行证计划申请&#xff08;包括条件&#xff09;你需要知道的这些真相&#xff01; 香港高才通计划从刚推出就带着“光速获批“的光环&#xff0c;吸引了大批高学历和高收入人士&#xff0c;后续也因它申请要求简单、明确&#xff0c;获批率高等优势&#xff0c;火…

主机dbeaver访问gitlab容器中的pg

映射5432端口- 5431:5432或者从docker客户端查看 version: 3.6 services:web:image: gitlab/gitlab-ce:latestrestart: alwayshostname: localhostenvironment:GITLAB_OMNIBUS_CONFIG: |external_url http://localhost:8929gitlab_rails[gitlab_shell_ssh_port] 2224ports:- …

【正点原子STM32连载】 第五十七章 DSP FFT实验(Julia分形)实验 摘自【正点原子】APM32F407最小系统板使用指南

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html## 第五…

springboot_项目重启问题

问题描述 在做一个文件上传功能的时候&#xff0c;我获取到类路径&#xff1a; String classPath ClassUtils.getDefaultClassLoader().getResource("").getPath();此方法获取到的路径是&#xff1a;/target/classes我将文件存储到/target/classes/template/中 此…

递归结构体数组链表实现

#ifndef _MODEL_SCHEDULE_H_ #define _MODEL_SCHEDULE_H_#define MODEL_SCHEDULE_IDLE 0x00000000 #define MODEL_SCHEDULE_OCCUPY 0x5A555A55#define MODEL_SCHEDULE_NUM 10typedef struct model_schedule_linked_list_unit {int idleFlag; //资源是否被占用vo…

文心一言 VS 讯飞星火 VS chatgpt (140)-- 算法导论11.4 5题

五、用go语言&#xff0c;考虑一个装载因子为a的开放寻址散列表。找出一个非零的a值&#xff0c;使得一次不成功查找的探查期望数是一次成功查找的探查期望数的 2 倍。这两个探查期望数可以使用定理11.6 和定理 11.8 中给定的上界。 文心一言&#xff0c;代码正常运行&#xf…

springboot宠物领养系统-计算机毕设 附源码 44261

springboot宠物领养系统 摘 要 网络发布信息有其突出的优点&#xff0c;即信息量大&#xff0c;资源丰富&#xff0c;更新速度快等&#xff0c;很符合人们希望以捷、便利的方式获得最多最有效信息的要求。本系统就是一个网上宠物领养系统&#xff0c;为宠物爱好者提供一个信息…

pyqt5 窗口调用网页高德地图kpi,进行实时地图导航

作为主项目功能的一部分&#xff0c;这部分我想单独记录下来 一&#xff0c;注册高德kpi【进行实名认证】 高德开放平台 | 高德地图API (amap.com) 二&#xff0c;申请Key 三&#xff0c;进入路径规划-API文档-开发指南-Web服务 API|高德地图API (amap.com) 找到你需要的路径…

【必读】从零开始,一步步教你安装nginx,搭建个人博客网站!

nginx搭建个人网站 Nginx是一款轻量级Web服务器、反向代理服务器以及电子邮件代理服务器&#xff0c;并且具有高并发连接处理能力和低内存消耗的特点。它也可以用于负载均衡和缓存控制等功能。 功能&#xff1a; 静态网站服务器&#xff1a;Nginx可以用来作为静态网站服务器&am…

员工微信私下收红包,企业如何加强监管

随着智能手机的普及和社交软件的兴起&#xff0c;越来越多的企业和员工开始使用微信等社交应用程序进行日常工作交流和业务协作。然而&#xff0c;与此同时&#xff0c;一些行业的员工在微信上私下收取红包的问题也日益严重&#xff0c;这不仅违反了公司的规定&#xff0c;也损…

Kubernetes+Gitlab+Jenkins+ArgoCD多集群部署

KubernetesGitlabJenkinsArgoCD多集群部署 文章目录 KubernetesGitlabJenkinsArgoCD多集群部署1. KubernetesGitlabJenkinsArgoCD多集群部署2. 添加WebHooks自动触发3. Jenkins-构建-执行Shell4. 制作镜像及修改Yaml文件4.1 Dockerfile4.2 Build-Shell 5.自动部署Demo测试5.1 推…

JSP EL表达式基本使用

今天我们来说EL表达式 这在整个jsp中都是非常重要的一章 因为 如果我们用 <%属性%> 属性为空时 直接就是个 null 这个肯定是不能让用户看到的东西 所以 我们就需要EL表达式 例如 我们jsp代码编写如下 <% page contentType"text/html; charsetUTF-8" page…

LeetCode每日一题(双指针)

最大连续1的个数Ⅲ 使用双指针每次当0的个数达到k&#xff0c;开始反转&#xff0c;返回最大。 class Solution {public int longestOnes(int[] nums, int k) {int ans-1;for(int i0,j0,cnt0;i< nums.length;i){if(nums[i]0)cnt;while(cnt>k){if(nums[j]0)cnt--;j;}ans…

React函数组件渲染两次

渲染两次是因为react默认开启了严格模式 React.StrictMode标签作用&#xff1a; 1、识别不安全的生命周期 2、关于使用过时字符串 ref API 的警告 3、关于使用废弃的 findDOMNode 方法的警告 4、检测意外的副作用 5、检测过时的 context API 注释掉React.StrictMode即为关闭严…

【Windows 常用工具系列 12 -- win11怎么设置不睡眠熄屏 |win11设置永不睡眠的方法】

文章目录 win11 怎么设置不睡眠熄屏 使用笔记本电脑的时候&#xff0c;如果离开电脑时间稍微长一点就会发现息屏了&#xff0c;下面介绍 设置 Win11 永不睡眠息屏的方法&#xff0c;有需要的朋友们快来看看以下详细的教程。 win11 怎么设置不睡眠熄屏 在电脑桌面上&#xff0c…

最快的ebpf开发环境搭建方式

环境搭建 启动容器 sudo docker run --rm -it --privileged \-v /lib/modules:/lib/modules:ro \-v /sys:/sys:ro \-v /usr/src:/usr/src:ro \alpine:3.12 安装依赖 sed -i s/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g /etc/apk/repositoriesapk add bcc-too…

微信怎么设置自动回复?

自动回复的用处 微信自动回复可以提高沟通效率。当你无法立即回复消息时&#xff0c;设置自动回复可以让对方知道你的情况&#xff0c;并且不会因为长时间没有回复而产生误解或不满。 微信自动回复可以节省时间和精力。如果你经常收到类似的询问或回复&#xff0c;通过设置自动…

STM32CubeMX学习笔记(2)--DSP库的使用

1.DSP库简介 STM32的DSP库是为了支持数字信号处理应用而设计的&#xff0c;它包含了一系列优化的数学函数和算法&#xff0c;能够在STM32微控制器上高效地执行数字信号处理任务。 DSP库通常包括以下主要特性&#xff1a; 1.数学函数库&#xff1a; 包括各种基本的数学运算函数…

JS 循环JSON将数据遍历到Table里面

在研发过程中&#xff0c;我们有时候需要在页面弹出框中展示表格数据&#xff0c;这就需要将JSON数据循环&#xff0c;遍历到一个Table里面&#xff0c;具体代码如下&#xff1a; JS&#xff1a; function LoadFun() {$("#detail").html("");var html &q…

LinkedBlockingQueue的drainTo方法

LinkedBlockingQueue是Java中的一个阻塞队列实现&#xff0c;它支持多线程并发操作。drainTo方法是LinkedBlockingQueue提供的一个方法&#xff0c;用于将队列中的元素转移到另一个集合中。 drainTo方法有两个重载方法&#xff0c;分别为&#xff1a; 1. drainTo(Collection&…