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

qt 操作多个sqlite文件

qt 操作多个sqlite文件

  • Chapter1 qt 操作多个sqlite文件
    • 1. 引入必要的头文件
    • 2. 创建并连接多个SQLite数据库
    • 3. 代码说明
    • 4. 注意事项
  • Chapter2 qt 多线程操作sqlite多文件
    • 1. 引入必要的头文件
    • 2. 创建数据库操作的工作线程类
    • 3. 在主线程中创建并启动多个工作线程
    • 4. 代码说明
    • 5. 运行结果
    • 6. 注意事项
  • Chapter3 QSqlQuery增删改查操作
    • 1.插入一条记录(增)
    • 2.查询字段(查)
    • 3.删除字段(删)
    • 4.更新字段(改)
  • Chapter4 深入解析 Qt 中的 bindValue 方法
    • 引言
    • 1. bindValue 方法简介
    • 2. 基本语法
    • 3. 参数化查询的优势
    • 4. 使用 bindValue 方法
    • 5. 示例代码
    • 6. 处理查询结果
    • 7. 示例代码
    • 8. 错误处理
    • 9. 事务处理


Chapter1 qt 操作多个sqlite文件

在Qt中操作多个SQLite数据库文件可以通过创建多个QSqlDatabase对象来实现。每个QSqlDatabase对象代表一个独立的数据库连接。以下是一个简单的示例,展示如何在Qt中操作多个SQLite数据库文件。

1. 引入必要的头文件

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>

2. 创建并连接多个SQLite数据库

int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 创建并连接第一个SQLite数据库QSqlDatabase db1 = QSqlDatabase::addDatabase("QSQLITE", "connection1");db1.setDatabaseName("database1.db");if (!db1.open()) {qDebug() << "Error: Could not open database1.db";return -1;}// 创建并连接第二个SQLite数据库QSqlDatabase db2 = QSqlDatabase::addDatabase("QSQLITE", "connection2");db2.setDatabaseName("database2.db");if (!db2.open()) {qDebug() << "Error: Could not open database2.db";return -1;}// 在第一个数据库中执行查询QSqlQuery query1(db1);if (!query1.exec("CREATE TABLE IF NOT EXISTS table1 (id INTEGER PRIMARY KEY, name TEXT)")) {qDebug() << "Error: Could not create table in database1.db" << query1.lastError();}// 在第二个数据库中执行查询QSqlQuery query2(db2);if (!query2.exec("CREATE TABLE IF NOT EXISTS table2 (id INTEGER PRIMARY KEY, value INTEGER)")) {qDebug() << "Error: Could not create table in database2.db" << query2.lastError();}// 插入数据到第一个数据库if (!query1.exec("INSERT INTO table1 (name) VALUES ('Alice')")) {qDebug() << "Error: Could not insert data into database1.db" << query1.lastError();}// 插入数据到第二个数据库if (!query2.exec("INSERT INTO table2 (value) VALUES (100)")) {qDebug() << "Error: Could not insert data into database2.db" << query2.lastError();}// 关闭数据库连接db1.close();db2.close();return a.exec();
}

3. 代码说明

QSqlDatabase::addDatabase(“QSQLITE”, “connection1”): 创建一个名为connection1的数据库连接。"QSQLITE"表示使用SQLite数据库驱动。

db1.setDatabaseName(“database1.db”): 设置数据库文件的名称。如果文件不存在,SQLite会自动创建它。

db1.open(): 打开数据库连接。如果打开失败,返回false。

QSqlQuery query1(db1): 创建一个与db1关联的查询对象。所有通过query1执行的SQL语句都会在db1中执行。

query1.exec(“CREATE TABLE …”): 执行SQL语句。如果执行失败,可以通过query1.lastError()获取错误信息。

db1.close(): 关闭数据库连接。

4. 注意事项

连接名称: 每个数据库连接必须有一个唯一的名称(如"connection1"和"connection2")。如果不指定名称,Qt会使用默认连接。

资源管理: 确保在使用完数据库后关闭连接,以释放资源。

错误处理: 在实际应用中,应该对每个数据库操作进行错误处理,以确保程序的健壮性。

通过这种方式,你可以在Qt中同时操作多个SQLite数据库文件。

Chapter2 qt 多线程操作sqlite多文件

在Qt中使用多线程操作多个SQLite数据库文件时,需要注意SQLite的线程安全性以及Qt的多线程机制。SQLite默认支持多线程操作,但需要确保每个线程使用独立的数据库连接,以避免竞争条件。

以下是一个示例,展示如何在Qt中使用多线程操作多个SQLite数据库文件。

1. 引入必要的头文件

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QThread>
#include <QDebug>
#include <QList>
#include <QMutex>

2. 创建数据库操作的工作线程类

每个线程负责操作一个独立的SQLite数据库文件。

class DatabaseWorker : public QObject
{Q_OBJECTpublic:DatabaseWorker(const QString &connectionName, const QString &databaseName, QObject *parent = nullptr): QObject(parent), m_connectionName(connectionName), m_databaseName(databaseName) {}public slots:void process(){// 创建数据库连接QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", m_connectionName);db.setDatabaseName(m_databaseName);if (!db.open()) {qDebug() << "Error: Could not open database" << m_databaseName << "in thread" << QThread::currentThread();emit finished();return;}// 执行数据库操作QSqlQuery query(db);if (!query.exec("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, value TEXT)")) {qDebug() << "Error: Could not create table in" << m_databaseName << query.lastError();}for (int i = 0; i < 10; ++i) {if (!query.exec(QString("INSERT INTO test (value) VALUES ('%1')").arg(QString::number(i)))) {qDebug() << "Error: Could not insert data into" << m_databaseName << query.lastError();}}qDebug() << "Database" << m_databaseName << "processed in thread" << QThread::currentThread();// 关闭数据库连接db.close();emit finished();}signals:void finished();private:QString m_connectionName;QString m_databaseName;
};

3. 在主线程中创建并启动多个工作线程

int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 定义数据库文件列表QList<QString> databaseFiles = {"database1.db", "database2.db", "database3.db"};// 创建线程和工作者对象QList<QThread*> threads;QList<DatabaseWorker*> workers;for (int i = 0; i < databaseFiles.size(); ++i) {QString connectionName = QString("connection%1").arg(i);QString databaseName = databaseFiles.at(i);// 创建工作线程QThread *thread = new QThread();DatabaseWorker *worker = new DatabaseWorker(connectionName, databaseName);// 将工作者移动到线程中worker->moveToThread(thread);// 连接信号和槽QObject::connect(thread, &QThread::started, worker, &DatabaseWorker::process);QObject::connect(worker, &DatabaseWorker::finished, thread, &QThread::quit);QObject::connect(worker, &DatabaseWorker::finished, worker, &DatabaseWorker::deleteLater);QObject::connect(thread, &QThread::finished, thread, &QThread::deleteLater);// 启动线程thread->start();// 保存线程和工作者对象threads.append(thread);workers.append(worker);}// 等待所有线程完成for (QThread *thread : threads) {thread->wait();}qDebug() << "All databases processed.";return a.exec();
}

4. 代码说明

DatabaseWorker类:

每个DatabaseWorker对象负责操作一个SQLite数据库文件。

使用QSqlDatabase::addDatabase创建独立的数据库连接,并通过moveToThread将工作者对象移动到独立的线程中。

多线程机制:

每个数据库操作在一个独立的线程中执行,避免阻塞主线程。

使用QThread管理线程的生命周期,并通过信号槽机制实现线程间通信。

线程安全性:

SQLite支持多线程操作,但每个线程必须使用独立的数据库连接。

如果多个线程需要访问同一个数据库文件,可以使用QMutex或SQLite的写锁机制来避免竞争条件。

资源管理:

在线程完成任务后,调用quit()和deleteLater()释放线程和工作者对象。

5. 运行结果

程序会创建多个线程,每个线程操作一个独立的SQLite数据库文件。输出示例如下:

复制
Database “database1.db” processed in thread QThread(0x12345678)
Database “database2.db” processed in thread QThread(0x23456789)
Database “database3.db” processed in thread QThread(0x34567890)
All databases processed.

6. 注意事项

SQLite的线程模式:

SQLite默认支持多线程操作,但需要确保每个线程使用独立的连接。

如果需要更高的并发性,可以启用SQLite的WAL模式(Write-Ahead Logging)。

线程数量:

不要创建过多的线程,否则可能会导致性能下降。可以根据实际需求调整线程数量。

错误处理:

在实际应用中,应该对每个数据库操作进行错误处理,以确保程序的健壮性。

通过这种方式,你可以在Qt中高效地使用多线程操作多个SQLite数据库文件。

Chapter3 QSqlQuery增删改查操作

我们需要插入多条数据,此时可以使用 QSqlQuery::exec() 函数一条一条插入数据,但是这里我们选择了另外一种方法:批量执行。首先,我们使用 QSqlQuery::prepare() 函数对这条 SQL 语句进行预处理,问号?相当于占位符,预示着以后我们可以使用实际数据替换这些位置。简单说明一下,预处理是数据库提供的一种特性,它会将 SQL 语句进行编译,性能和安全性都要优于普通的 SQL 处理。在上面的代码中,我们使用一个字符串列表 names 替换掉第一个问号的位置,一个整型列表 ages 替换掉第二个问号的位置,利用 QSqlQuery::addBindValue() 我们将实际数据绑定到这个预处理的 SQL 语句上。需要注意的是,names 和 ages 这两个列表里面的数据需要一一对应。然后我们调用 QSqlQuery::execBatch() 批量执行 SQL,之后结束该对象。这样,插入操作便完成了。

另外说明一点,我们这里使用了 ODBC 风格的?占位符,同样,我们也可以使用 Oracle 风格的占位符:

query.prepare("INSERT INTO student (name, age) VALUES (:name, :age)");

此时,我们就需要使用

query.bindValue(":name", names);
query.bindValue(":age", ages);

进行绑定。Oracle 风格的绑定最大的好处是,绑定的名字和值很清晰,与顺序无关。但是这里需要注意,bindValue() 函数只能绑定一个位置。比如

query.prepare("INSERT INTO test (name1, name2) VALUES (:name, :name)");
// ...
query.bindValue(":name", name);

只能绑定第一个 :name 占位符,不能绑定到第二个。

接下来我们依旧使用同一个查询对象执行一个 SELECT 语句。如果存在查询结果,QSqlQuery::next() 会返回 true,直到到达结果最末,返回 false,说明遍历结束。我们利用这一点,使用 while 循环即可遍历查询结果。使用 QSqlQuery::value() 函数即可按照 SELECT 语句的字段顺序获取到对应的数据库存储的数据。

对于数据库事务的操作,我们可以使用 QSqlDatabase::transaction() 开启事务,QSqlDatabase::commit() 或者 QSqlDatabase::rollback() 结束事务。使用 QSqlDatabase::database() 函数则可以根据名字获取所需要的数据库连接。

bool Widget::saveToDb(double value1, double value2, double value3, double value4)
{// 插入数据到第二个数据库QSqlQuery query2(db2);query2.prepare("INSERT INTO table2 (value1, value2, value3, value4) VALUES (:value1, :value2, :value3, :value4)");query2.bindValue(":value1", value1);query2.bindValue(":value2", value2);query2.bindValue(":value3", value3);query2.bindValue(":value4", value4);if (!query2.exec()) {qDebug() << "Error: Could not insert data into database2.db" << query2.lastError();QMessageBox::information(this, "错误", "插入记录失败: \n" + query2.lastError().text());}QMessageBox::information(this, "提示", "插入完成!");return true;
}void Widget::on_pBtn_insert_clicked()
{double v1 = ui->lineEdit1->text().toDouble();double v2 = ui->lineEdit2->text().toDouble();double v3 = ui->lineEdit3->text().toDouble();double v4 = ui->lineEdit4->text().toDouble();this->saveToDb(v1, v2, v3, v4);
}

1.插入一条记录(增)

QSqlQuery query;
query.prepare("INSERT INTO table_name (column1, column2, column3) VALUES (:value1, :value2, :value3)");
query.bindValue(":value1", value1);
query.bindValue(":value2", value2);
query.bindValue(":value3", value3);
query.exec();

2.查询字段(查)

QSqlQuery query;
query.prepare("SELECT * FROM table_name WHERE column1 = :value1 AND column2 = :value2 AND column3 = :value3");
query.bindValue(":value1", value1);
query.bindValue(":value2", value2);
query.bindValue(":value3", value3);
query.exec();// 处理查询结果
while (query.next()) {// 在这里处理每一行的数据
}

3.删除字段(删)

QSqlQuery query;
query.prepare("DELETE FROM table_name WHERE column1 = :value1 AND column2 = :value2 AND column3 = :value3");
query.bindValue(":value1", value1);
query.bindValue(":value2", value2);
query.bindValue(":value3", value3);
query.exec();

4.更新字段(改)

QSqlQuery query;
query.prepare("UPDATE table_name SET column2 = :value2, column3 = :value3 WHERE column1 = :value1");
query.bindValue(":value1", value1);
query.bindValue(":value2", value2);
query.bindValue(":value3", value3);
query.exec();

Chapter4 深入解析 Qt 中的 bindValue 方法

原文链接:https://blog.csdn.net/festaw/article/details/140503911

引言

在应用程序开发中,数据库交互是常见的需求之一。为了确保应用程序的安全性和数据的准确性,Qt 提供了多种工具和方法来帮助开发者实现这一目标。其中,bindValue 方法是 QSqlQuery 类中一个非常关键的成员函数,用于实现参数化查询。本文将详细介绍 bindValue 方法的基本概念、使用方式以及在实际开发中的应用。

1. bindValue 方法简介

bindValue 方法是 QSqlQuery 类的一个成员函数,用于将实际的数据值绑定到参数化 SQL 语句中的占位符。这种方法可以有效防止 SQL 注入攻击,是一种安全的数据操作实践。

2. 基本语法

bindValue 方法的基本语法如下:

bool QSqlQuery::bindValue(const QString &placeholder, const QVariant &val)

placeholder:SQL 语句中的占位符,通常是一个字符串。
val:要绑定的数据值,类型为 QVariant。

3. 参数化查询的优势

使用参数化查询有以下优势:

安全性:防止 SQL 注入攻击。
灵活性:可以轻松地替换和修改数据值。
性能:数据库可以缓存和重用参数化查询的执行计划。

4. 使用 bindValue 方法

在使用 bindValue 方法之前,通常需要先使用 prepare 方法准备一个参数化的 SQL 语句。以下是使用 bindValue 方法的基本步骤:

准备 SQL 语句:使用 prepare 方法准备 SQL 语句。
绑定值:使用 bindValue 方法将数据值绑定到 SQL 语句的占位符。
执行查询:使用 exec 方法执行 SQL 语句。

5. 示例代码

以下是一个使用 bindValue 方法的示例:

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("example.db");if (!db.open()) {qDebug() << "Error: Unable to open database";return 1;}QSqlQuery query;query.setDatabase(db);// 准备 SQL 语句query.prepare("INSERT INTO people (name, age) VALUES (:name, :age)");// 绑定值query.bindValue(":name", "John Doe");query.bindValue(":age", 30);// 执行查询if (query.exec()) {qDebug() << "Query executed successfully";} else {qDebug() << "Error:" << query.lastError().text();}return a.exec();
}

在这个示例中,我们准备了一个插入语句,并将两个参数 name 和 age 绑定到实际的数据值上。

6. 处理查询结果

对于查询操作,除了执行 SQL 语句外,还需要处理查询结果。以下是处理查询结果的步骤:

执行查询:使用 exec 方法执行 SQL 查询语句。
逐行读取结果:使用 next 方法逐行读取查询结果。
获取字段值:使用 value 方法获取每行的字段值。

7. 示例代码

以下是一个处理查询结果的示例:

#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QDebug>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");db.setDatabaseName("example.db");if (!db.open()) {qDebug() << "Error: Unable to open database";return 1;}QSqlQuery query;query.setDatabase(db);// 创建表query.exec("CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)");// 插入数据query.exec("INSERT INTO people (name, age) VALUES ('John Doe', 30)");// 准备查询query.prepare("SELECT * FROM people WHERE name = :name");// 绑定参数query.bindValue(":name", "John Doe");// 执行查询if (query.exec()) {while (query.next()) {int id = query.value(0).toInt();QString name = query.value(1).toString();int age = query.value(2).toInt();qDebug() << "ID:" << id << "Name:" << name << "Age:" << age;}} else {qDebug() << "Error:" << query.lastError().text();}return a.exec();
}

8. 错误处理

在执行 SQL 语句时,可能会遇到各种错误。QSqlQuery 提供了一些方法来检查和处理这些错误:

if (!query.exec()) {qDebug() << "Error:" << query.lastError().text();
}

9. 事务处理

在处理数据库事务时,bindValue 方法同样可以发挥作用。通过准备和执行 SQL 语句,可以确保事务的一致性和完整性。以下是事务处理的示例:

QSqlQuery query;
query.setDatabase(db);query.startTransaction();
query.exec("INSERT INTO people (name, age) VALUES ('Alice', 25)");
query.exec("INSERT INTO people (name, age) VALUES ('Bob', 35)");
if (!query.commit()) {query.rollback();qDebug() << "Transaction failed:" << query.lastError().text();
}

相关文章:

qt 操作多个sqlite文件

qt 操作多个sqlite文件 Chapter1 qt 操作多个sqlite文件1. 引入必要的头文件2. 创建并连接多个SQLite数据库3. 代码说明4. 注意事项 Chapter2 qt 多线程操作sqlite多文件1. 引入必要的头文件2. 创建数据库操作的工作线程类3. 在主线程中创建并启动多个工作线程4. 代码说明5. 运…...

【每日学点HarmonyOS Next知识】多继承、swiper容器、事件传递、滚动安全区域、提前加载网络图片

1、HarmonyOS ArkTS如何让一个类可以具备其他多个类的能力&#xff1f; ArkTS如何让一个类可以具备其他多个类的能力&#xff0c;类似于多继承。 接口支持多继承。类不支持&#xff0c;其只支持单继承。 &#xff08;报错&#xff1a;Classes can only extend a single class…...

DIY Tomcat:手写一个简易Servlet容器

在Java Web开发领域&#xff0c;Tomcat堪称经典&#xff0c;它作为Servlet容器&#xff0c;承载着无数Web应用的运行。今天&#xff0c;我将带大家一同探索如何手写一个简易的Tomcat&#xff0c;深入理解其底层原理。 一、背景知识 在开始之前&#xff0c;我们需要对几个关键…...

如何在Ubuntu上直接编译Apache Doris

以下是在 Ubuntu 22.04 上直接编译 Apache Doris 的完整流程&#xff0c;综合多个版本和环境的最佳实践&#xff1a; 注意&#xff1a;Ubuntu的数据盘VMware默认是20G&#xff0c;编译不够用&#xff0c;给到50G以上吧 一、环境准备 1. 安装系统依赖 # 基础构建工具链 apt i…...

基于ssm的物资进销存(全套)

现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本货物进销管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&#…...

【CVPR2025】 EVSSM:用状态空间模型高效去模糊

Efficient Visual State Space Model for Image Deblurring 论文信息 题目&#xff1a; Efficient Visual State Space Model for Image Deblurring 用于图像去模糊的高效视觉状态空间模型 源码&#xff1a;https://github.com/kkkls/EVSSM 创新点 提出了高效视觉状态空间模型…...

动态规划--斐波那契类型

目录 前言 1 第N个斐波那契数 2 爬楼梯 3 三步问题 4 使用最小花费爬楼梯 5 解码方法 总结 前言 本篇所讲的几个题目都是与斐波那契数的做法与思路类似的题目&#xff0c;所以直接放在一块解决了。 同时&#xff0c;由于第一次接触动态规划&#xff0c;我们也会讲解一…...

supervisord管理Gunicorn进程,使用Nginx作为反向代理运行flask web项目

1. 安装 Gunicorn 在项目虚拟环境中安装 Gunicorn&#xff1a;2. 基本用法 配置文件 创建一个 Gunicorn 配置文件&#xff08;如 gunicorn_config.py&#xff09;&#xff0c;方便管理复杂配置。 示例 gunicorn_config.py&#xff1a; bind "0.0.0.0:8000" #…...

《Python实战进阶》No16: Plotly 交互式图表制作指南

No16: Plotly 交互式图表制作指南 Plotly是一款用来做数据分析和可视化的在线平台&#xff0c;功能真的是非常强大&#xff0c;它主要有以下特点&#xff1a; 图形多样化&#xff1a;在线绘制多种图形&#xff0c;比如柱状图、饼图、直方图、饼图、气泡图、桑基图、股票图、旭…...

代码随想录算法训练营第22天 | 组合总和 分割回文串

39. 组合总和 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09; 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;带你学透回溯算法-组合总和&#xff08;对应「leetcode」力扣题目&#xff1a;39.组合总和&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_…...

DeepSeek 医疗大模型微调实战讨论版(第一部分)

DeepSeek医疗大模型微调实战指南第一部分 DeepSeek 作为一款具有独特优势的大模型,在医疗领域展现出了巨大的应用潜力。它采用了先进的混合专家架构(MoE),能够根据输入数据的特性选择性激活部分专家,避免了不必要的计算,极大地提高了计算效率和模型精度 。这种架构使得 …...

Linux云计算SRE-第十七周

1. 做三个节点的redis集群。 1、编辑redis节点node0(10.0.0.100)、node1(10.0.0.110)、node2(10.0.0.120)的安装脚本 [rootnode0 ~]# vim install_redis.sh#!/bin/bash # 指定脚本解释器为bashREDIS_VERSIONredis-7.2.7 # 定义Redis的版本号PASSWORD123456 # 设置Redis的访问…...

lvgl在ubuntu中模拟运行

文章目录 前言具体的步骤 前言 lvgl是一个图像UI的开源框架&#xff0c;用于嵌入式的设备之中。 在学习lvgl时&#xff0c;我们最好是现在PC上模拟运行&#xff0c;所以我们学习lvgl的第一步可以说是在我们的电脑上搭建模拟的运行环境。 参考官方的操作 lvgl在ubuntu上模拟运…...

Unity引擎使用HybridCLR(华佗)热更新

大家好&#xff0c;我是阿赵。   阿赵我做手机游戏已经有十几年时间了。记得刚开始从做页游的公司转到去做手游的公司&#xff0c;在面试的时候很重要的一个点&#xff0c;就是会不会用Lua。使用Lua的原因很简单&#xff0c;就是为了热更新。   热更新游戏内容很重要。如果…...

【Linux】权限相关知识点

思考 我们平时使用Linux创建文件或目录时的默认权限是多少&#xff1f; [rootlocalhost test]# mkdir dir [rootlocalhost test]# touch file [rootlocalhost test]# ll total 0 drwxr-xr-x 2 root root 6 Mar 8 15:23 dir #755 -rw-r--r-- 1 root root 0 Mar 8 15:23 f…...

Vue项目通过内嵌iframe访问另一个vue页面,获取token适配后端鉴权(以内嵌若依项目举例)

1. 改造子Vue项目进行适配(ruoyi举例) (1) 在路由文件添加需要被外链的vue页面配置 // 若依项目的话是 router/index.js文件 {path: /contrast,component: () > import(/views/contrast/index),hidden: true },(2) 开放白名单 // 若依项目的话是 permission.js 文件 cons…...

vue3 vite项目安装eslint

npm install eslint -D 安装eslint库 npx eslint --init 初始化配置&#xff0c;按项目实际情况选 自动生成eslint.config.js&#xff0c;可以添加自定义rules 安装ESLint插件 此时打开vue文件就会标红有问题的位置 安装prettier npm install prettier eslint-config-pr…...

Python Flask框架学习汇编

1、入门级&#xff1a; 《Python Flask Web 框架入门》 这篇博文条理清晰&#xff0c;由简入繁&#xff0c;案例丰富&#xff0c;分十五节详细讲解了Flask框架&#xff0c;强烈推荐&#xff01; 《python的简单web框架flask【附例子】》 讲解的特别清楚&#xff0c;每一步都…...

Excel·VBA江西省预算一体化工资表一键处理

每月制作工资表导出为Excel后都需要调整格式&#xff0c;删除0数据的列、对工资表项目进行排序、打印设置等等&#xff0c;有些单位还分有“行政”、“事业”2个工资表就需要操作2次。显然&#xff0c;这种重复操作的问题&#xff0c;可以使用VBA代码解决 目录 代码使用说明1&a…...

【A2DP】SBC 编解码器互操作性要求详解

目录 一、SBC编解码器互操作性概述 二、编解码器特定信息元素(Codec Specific Information Elements) 2.1 采样频率(Sampling Frequency) 2.2 声道模式(Channel Mode) 2.3 块长度(Block Length) 2.4 子带数量(Subbands) 2.5 分配方法(Allocation Method) 2…...

redis数据类型以及底层数据结构

redis数据类型以及底层数据结构 String&#xff1a;字符串类型&#xff0c;底层就是动态字符串&#xff0c;使用sds数据结构 Map:有两种数据结构&#xff1a;1.压缩列表&#xff1a;当hash结构中存储的元素个数小于了512个。并且元 …...

R软件线性模型与lmer混合效应模型对生态学龙类智力测试数据层级结构应用

全文链接&#xff1a;https://tecdat.cn/?p40925 在生态与生物学研究中&#xff0c;数据常呈现复杂结构特征。例如不同种群、采样点或时间序列的观测数据间往往存在相关性&#xff08;点击文末“阅读原文”获取完整代码、数据、文档&#xff09;。 传统线性模型在处理这类非独…...

打造智能聊天体验:前端集成 DeepSeek AI 助你快速上手

DeepSeek AI 聊天助手集成指南 先看完整效果&#xff1a; PixPin_2025-02-19_09-15-59 效果图&#xff1a; 目录 项目概述功能特点环境准备项目结构组件详解 ChatContainerChatInputMessageBubbleTypeWriter 核心代码示例使用指南常见问题 项目概述 基于 Vue 3 TypeScrip…...

C语言-语法

数据类型 字符串 C中字符串拼接不用+号,直接使用空格。 char* str = "hello" "world"; 换行链接,加上\就不会报错 char* longStr = "00000000000000000000000000000\ 00000000000000000000000000000"; typedef C 语言提供了 typedef …...

Unity组件TrailRenderer屏幕滑动拖尾

Unity组件TrailRenderer屏幕滑动拖尾 介绍制作总结 介绍 今天要做一个拖动效果&#xff0c;正好用到了TrailRenderer这个组件&#xff0c;正好分享一下 效果参考如下&#xff1a; 制作 1.创建空物体TrailObject添加组件TrailRenderer 下面的材质可以根据自己想要制作的效果去…...

基于昇腾MindIE与GPUStack的大模型容器化部署从入门到入土

引言 昇腾MindIE作为华为面向大模型推理的高性能引擎&#xff0c;结合GPUStack的集群管理能力&#xff0c;能够实现多机多卡的高效资源调度与模型服务化部署。本文将以DeepSeek R1-32B模型为例&#xff0c;详细解析从环境准备到服务验证的全流程实践&#xff0c;涵盖昇腾NPU驱…...

大模型信息整理

1. Benchmarks Reasoning, conversation, Q&A benchmarks HellaSwagBIG-Bench HardSQuADIFEvalMuSRMMLU-PROMT-BenchDomain-specific benchmarks GPQAMedQAPubMedQAMath benchmarks GSM8KMATHMathEvalSecurity-related benchmarks PyRITPurple Llama CyberSecEval2. 国内外…...

【Tools】Windows下Git 2.48安装教程详解

00. 目录 文章目录 00. 目录01. Git简介02. Git参考资料03. Git安装04. Git测试05. 附录 01. Git简介 Git(读音为/gɪt/。)是一个开源的分布式版本控制系统&#xff0c;可以有效、高速的处理从很小到非常大的项目版本管理。 [1] Git 是 Linus Torvalds 为了帮助管理 Linux 内核…...

【linux网络编程】套接字编程API详细介绍

在C语言中&#xff0c;套接字&#xff08;Socket&#xff09;编程主要用于网络通信&#xff0c;尤其是在基于TCP/IP协议的应用程序开发中。常用的套接字编程API主要基于Berkeley Sockets&#xff08;伯克利套接字&#xff09;接口&#xff0c;这些函数通常在<sys/socket.h&g…...

护网中shiro常问的问题

1. 漏洞原理 Apache Shiro 是一个强大的 Java 安全框架&#xff0c;提供身份验证、授权、加密及会话管理功能。Shiro 使用 rememberMe 机制来存储用户会话信息&#xff0c;该机制依赖于加密后的 Cookie。当攻击者能够控制 Cookie 并且服务器使用了不安全的反序列化机制时&…...