嵌入式养成计划-46----QT--简易版网络聊天室实现--QT如何连接数据库
一百一十九、简易版网络聊天室实现
119.1 QT实现连接TCP协议
119.1.1 基于TCP的通信流程
119.1.2 QT中实现服务器过程
- 使用QTcpServer实例化一个服务器对象
- 设置监听状态,通过listen()函数,可以监听特定的主机,也可以监听所有客户端,端口号可以是系统自动分配的,也可以是指定端口号。
- 如果有客户端发来连接请求,那么服务器就自动发射一个newConnection信号,我们就可以将该信号连接到自定义的槽函数中处理该客户端的操作。
- 此时服务器和客户端已经建起了连接,可以调用nextPandingConnection获取最新连接的客户端套接字,可以将该套接字存放在服务器的客户端容器中。
- 当客户端发来数据时,该客户端就会自动发射一个readyRead信号,我们可以将该信号连接到自定义的槽函数中读取客户端数据。
- 通过read(),readLine(),readAll()读取套接字里的数据,可以通过write()往套接字中写入数据
- 关闭服务器使用close即可
119.1.3 QT中实现客户端过程
- 使用QTcpSocket实例化一个客户端对象
- 将客户端连接到服务器,使用connectToHost, 给定主机地址,端口号
- 如果连接成功,该客户端会自动发射connected信号,我们可以将该信号连接到自定义的槽函数中处理相关逻辑代码。
- 此时,客户端和服务器已经建立了连接,如果服务端发来数据,那么该客户端会自定发射readyRead信号,可以将该信号连接到自定义的槽函数中读取服务端中数据
- 可以使用read() readLine() readAll()读取套接字中数据,使用write往套接字中写入数据
- 客户端断开与服务器的连接,使用disConnectFromHost, 如果断开成功,客户端会自动发射disconnected信号,我们可以将该信号连接到自定义的槽函数中处理相关逻辑代码。
119.2 服务器端
119.2.1 UI 界面
119.2.2 qt_server.h
#ifndef QT_SERVER_H
#define QT_SERVER_H#include <QWidget>
#include <QTcpServer>
#include <QList>
#include <QTcpSocket>
#include <QMessageBox>
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class Qt_Server; }
QT_END_NAMESPACEclass Qt_Server : public QWidget
{Q_OBJECTpublic:Qt_Server(QWidget *parent = nullptr);~Qt_Server();private slots:void on_startBtn_clicked();public slots:// 自定义的 处理连接的槽函数声明void newConnection_slot();// 自定义的 处理接收数据的槽函数声明void readyRead_slot();private:Ui::Qt_Server *ui;QTcpServer *server;QList<QTcpSocket *> socketList;
};
#endif // QT_SERVER_H
119.2.3 qt_server.cpp
#include "qt_server.h"
#include "ui_qt_server.h"Qt_Server::Qt_Server(QWidget *parent): QWidget(parent), ui(new Ui::Qt_Server)
{ui->setupUi(this);// 给服务器指针创建空间server = new QTcpServer(this);
// socketList = new QList<>();
}Qt_Server::~Qt_Server()
{delete ui;
}// 点击启动服务器按钮对应的槽函数实现
void Qt_Server::on_startBtn_clicked()
{if(ui->startBtn->text() == "启动服务器"){// 获取UI界面上输入的端口号quint16 port = ui->portEdit->text().toUInt();// 使服务器进入监听状态,返回值是bool类型if(server->listen(QHostAddress::Any,port)){QMessageBox::information(this,"提示","服务器启动成功");}else{QMessageBox::critical(this,"错误","服务器启动失败");}// 此时服务器已经进入监听状态,如果有客户端发来链接请求,// 则服务器会自动发射一个newConnection信号,需要将该信号连接到自定义的槽函数中处理连接的套接字connect(server, &QTcpServer::newConnection, this, &Qt_Server::newConnection_slot);ui->startBtn->setText("已启动服务器");ui->startBtn->setStyleSheet("background-color:green");}else{server->close();disconnect(server, &QTcpServer::newConnection, this, &Qt_Server::newConnection_slot);ui->startBtn->setStyleSheet("background-color:white");ui->startBtn->setText("启动服务器");}}// 自定义的 处理连接的槽函数声明
void Qt_Server::newConnection_slot()
{qDebug() << "有新客户的连接";// 获取最新连接的客户端套接字,并放入容器中,此时客户端与服务器已经建立起连接QTcpSocket *s = server->nextPendingConnection();socketList.push_back(s);// 如果有客户端发送数据,那么此客户端就会自动发射readyRead信号// 需要将该信号与自定义的处理接收数据的槽函数连接connect(s, &QTcpSocket::readyRead, this, &Qt_Server::readyRead_slot);
}// 自定义的 处理接收数据的槽函数实现
void Qt_Server::readyRead_slot()
{// 移除无效的客户端// 遍历所有的客户端for(int i=0; i<socketList.count(); i++){// 判断每个客户端的状态,返回值是枚举类型// socketList.at(i)->state();if(0 == socketList.at(i)->state()){// 移除当前客户端,通过下标删除socketList.removeAt(i);}}// 遍历容器,找到有需要读取数据的客户端for(int i=0; i<socketList.count(); i++){// 如果当前客户端的 有效字节数 不为0,代表当前客户端有需要读取的数据if(0 != socketList.at(i)->bytesAvailable()){// 读取客户端中的数据QByteArray msg = socketList.at(i)->readAll();// 将读取的数据放到UI界面上ui->listWidget->addItem(QString::fromLocal8Bit(msg));// 将数据发送给所有客户端for (int j=0; j<socketList.count(); j++) {socketList.at(i)->write(msg);}}}
}
119.2.4 main.cpp
#include "qt_server.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Qt_Server w;w.show();return a.exec();
}
119.3 客户端
119.3.1 UI 界面
119.3.2 qt_client.h
#ifndef QT_CLIENT_H
#define QT_CLIENT_H#include <QWidget>
#include <QTcpServer>
#include <QList>
#include <QTcpSocket>
#include <QMessageBox>
#include <QDebug>QT_BEGIN_NAMESPACE
namespace Ui { class Qt_Client; }
QT_END_NAMESPACEclass Qt_Client : public QWidget
{Q_OBJECTpublic:Qt_Client(QWidget *parent = nullptr);~Qt_Client();public slots:void connected_slot();void readyRead_slot();private slots:void on_connectBtn_clicked();void on_msgBtn_clicked();void on_disconnectBtn_clicked();private:Ui::Qt_Client *ui;// 定一个客户端对象QTcpSocket *socket;// 定义一个用户名变量QString uname;
};
#endif // QT_CLIENT_H
119.3.3 qt_client.cpp
#include "qt_client.h"
#include "ui_qt_client.h"Qt_Client::Qt_Client(QWidget *parent): QWidget(parent), ui(new Ui::Qt_Client)
{ui->setupUi(this);// 给客户端对象创建空间socket = new QTcpSocket(this);// 初始化UI界面的组件状态ui->msgEdit->setEnabled(false);ui->msgBtn->setEnabled(false);ui->disconnectBtn->setEnabled(false);}Qt_Client::~Qt_Client()
{delete ui;
}void Qt_Client::connected_slot()
{// 告诉服务器我进来了QString msg = uname + " 来了,快接驾";// 将这个消息发送给服务器socket->write(msg.toLocal8Bit());// 此时说明服务器与客户端已经建立连接// 现在将UI界面的组件状态修改一下ui->msgEdit->setEnabled(true);ui->msgBtn->setEnabled(true);ui->disconnectBtn->setEnabled(true);ui->unameEdit->setEnabled(false);ui->ipEdit->setEnabled(false);ui->portEdit->setEnabled(false);ui->connectBtn->setEnabled(false);// 如果服务器发来数据,客户端会自动发射readyRead信号// 因此需要将readyRead信号连接到自定义的槽函数// 因为只需要连接一次,所以也是该在构造函数中写连接函数connect(socket, &QTcpSocket::readyRead, this, &Qt_Client::readyRead_slot);
}void Qt_Client::readyRead_slot()
{// 走到了这一步,说明服务器给客户端发送了消息,现在需要进行读取QByteArray msg = socket->readAll();// 将这个数据放到UI界面的消息显示框中ui->listWidget->addItem(QString::fromLocal8Bit(msg));
}// 连接服务器按钮 对应的槽函数
void Qt_Client::on_connectBtn_clicked()
{// 获取UI界面的IP和PORT,还有unameQString ip = ui->ipEdit->text();quint16 port = ui->portEdit->text().toUInt();uname = ui->unameEdit->text();// 使客户端连接服务器socket->connectToHost(ip, port);// 判断客户端是否成功连接服务器,成功则客户端会自动发射connected信号// 将该信号连接到自定义的槽函数中// 因为只需要连接一次,所以连接函数应该写在构造函数中connect(socket, &QTcpSocket::connected, this, &Qt_Client::connected_slot);
}void Qt_Client::on_msgBtn_clicked()
{// 获取UI界面上输入的内容QString msg = uname + " : " + ui->msgEdit->toPlainText();// 将消息发送给服务器socket->write(msg.toLocal8Bit());}void Qt_Client::on_disconnectBtn_clicked()
{QString msg = uname + " 走咯,我还会再回来的";// 将消息发送给服务器socket->write(msg.toLocal8Bit());// 断开链接socket->close();disconnect(socket, &QTcpSocket::readyRead, this, &Qt_Client::readyRead_slot);disconnect(socket, &QTcpSocket::connected, this, &Qt_Client::connected_slot);// 更改UI界面的组件状态ui->msgEdit->setEnabled(false);ui->msgBtn->setEnabled(false);ui->disconnectBtn->setEnabled(false);ui->unameEdit->setEnabled(true);ui->ipEdit->setEnabled(true);ui->portEdit->setEnabled(true);ui->connectBtn->setEnabled(true);
}
119.3.4 main.cpp
#include "qt_client.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Qt_Client w;w.show();return a.exec();
}
一百二十、QT连接数据库
120.1 QT将数据库分为三个层次
- 数据库驱动层:QSqlDriver、QSqlDriverCreator、QSqlDriverCreatorBase、QSqlDriverPlugin
- sql接口层:QSqlDatabase、QSqlQuery、QSqlRecord、QSqlError
- 用户接口层:提供一些模型QSqlQueryModel、QSqlTableModel、QSqlRelationalTableModel
120.2 实现数据库操作的相关方法
1. 添加数据库:[static] QSqlDatabase QSqlDatabase::addDatabase(QSqlDriver *driver, const QString &connectionName = QLatin1String(defaultConnection)) QSQLITE SQLite version 3 or above
2. 设置数据库名称:void QSqlDatabase::setDatabaseName(const QString &name)
3. 包含数据库:bool QSqlDatabase::contains(const QString &connectionName = QLatin1String(defaultConnection))
4. 打开数据库:bool QSqlDriver::open(const QString &db)
5. 关闭数据库:void QSqlDatabase::close()
6. 错误信息:QSqlError QSqlDatabase::lastError()7. sql语句执行:构造一个QSqlQuery类对象,调用其成员函数exec,执行sql语句:bool QSqlQuery::exec(const QString &query)
8. bool QSqlQuery::next():遍历查询结果的函数
120.3 示例 :
120.3.1 UI 界面
120.3.2 database.h
#ifndef DATABASE_H
#define DATABASE_H#include <QWidget>
#include <QSqlDatabase> // 数据库管理类
#include <QSqlQuery> // 数据库操作类
#include <QSqlRecord> // 数据库记录类
#include <QSqlError> // 数据库错误类
#include <QMessageBox> // 消息对话框类
#include <QtDebug>QT_BEGIN_NAMESPACE
namespace Ui { class DataBase; }
QT_END_NAMESPACEclass DataBase : public QWidget
{Q_OBJECTpublic:DataBase(QWidget *parent = nullptr);~DataBase();private slots:void on_addBtn_clicked();void on_showAllEdit_clicked();void on_showEdit_clicked();void on_deleteBtn_clicked();void on_deleteAllBtn_clicked();private:Ui::DataBase *ui;// 实例化一个数据库对象QSqlDatabase db;
};
#endif // DATABASE_H
120.3.3 database.cpp
#include "database.h"
#include "ui_database.h"DataBase::DataBase(QWidget *parent): QWidget(parent), ui(new Ui::DataBase)
{ui->setupUi(this);// 判断数据库是否存在if(!db.contains()){// 不存在,则创建数据库db = QSqlDatabase::addDatabase("QSQLITE"); // 表示数据库驱动为sqlite3// 给刚创建的数据库起名db.setDatabaseName("stuInfo.db");// 提示用户:数据库创建成功QMessageBox::information(this,"提示","数据库创建成功");}// 打开数据库if(!db.open()){QMessageBox::critical(this,"错误","数据库无法打开");return;}// 创建数据库表QSqlQuery table;// Sql语句QString sql = "create table if not exists stu_info_table(""id integer primary key autoincrement,""numb integer,""name varchar(20),""sex varchar(4),""score integer);";if(table.exec(sql)){QMessageBox::information(this,"提示","数据库学生表创建成功");}else{QMessageBox::critical(this,"错误","数据库学生表创建失败");}
}DataBase::~DataBase()
{delete ui;
}// 添加
void DataBase::on_addBtn_clicked()
{// 获取UI界面上的信息int num = ui->numEdit->text().toUInt();QString name = ui->nameEdit->text();QString sex = ui->sexEdit->text();int score = ui->scoreEdit->text().toUInt();// 保证用户输入完整信息if(num == 0 || name.isEmpty() || sex.isEmpty() || score == 0){QMessageBox::warning(this,"警告","请完善信息");return;}// 将信息存放到数据库学生表中QSqlQuery query;// SQL语句QString sql = QString("insert into stu_info_table (numb, name, sex, score) ""values(%1,'%2','%3',%4)").arg(num).arg(name).arg(sex).arg(score);// 执行SQL语句if(query.exec(sql)){QMessageBox::information(this,"提示","数据添加成功");}else{QMessageBox::critical(this,"错误","数据添加失败");}DataBase::on_showAllEdit_clicked();
}// 查看所有
void DataBase::on_showAllEdit_clicked()
{ui->tableWidget->clear();// 将信息存放到数据库学生表中QSqlQuery query;// SQL语句QString sql = QString("select * from stu_info_table");// 执行SQL语句if(query.exec(sql)){// 将数据库的内容放到UI界面上int i = 0; // 记录行号// 用next()遍历while (query.next()) {for(int j=0; j<query.record().count(); j++){ui->tableWidget->setItem(i,j,new QTableWidgetItem(query.value(j+1).toString()));}i++;}}
}// 查询某个学生
void DataBase::on_showEdit_clicked()
{QString name = ui->nameEdit_2->text();if(name.isEmpty()){QMessageBox::information(this, "提示", "请输入要查询的学生姓名");return;}ui->tableWidget->clear();QSqlQuery query;QString sql = QString("select * from stu_info_table where name='%1';").arg(name);if(query.exec(sql)){int i=0;while (query.next()) {// qDebug() << i;for(int j=0; j<query.record().count(); j++){ui->tableWidget->setItem(i, j, new QTableWidgetItem(query.value(j+1).toString()));}i++;}}else{QMessageBox::warning(this, "警告", "查询错误");return;}
}void DataBase::on_deleteBtn_clicked()
{QString name = ui->nameEdit_2->text();if(name.isEmpty()){QMessageBox::information(this, "提示", "请输入要删除的学生姓名");return ;}QString sql = QString("delete from stu_info_table where name='%1';").arg(name);QSqlQuery query;if(query.exec(sql)){QMessageBox::information(this, "提示", "删除成功");DataBase::on_showAllEdit_clicked();}else{QMessageBox::warning(this, "警告", "删除失败");DataBase::on_showAllEdit_clicked();}return ;
}void DataBase::on_deleteAllBtn_clicked()
{QString sql = QString("delete from stu_info_table");QSqlQuery query;if(query.exec(sql)){QMessageBox::information(this, "提示", "删除成功");DataBase::on_showAllEdit_clicked();}else{QMessageBox::warning(this, "警告", "删除失败");DataBase::on_showAllEdit_clicked();}ui->tableWidget->clear();return ;
}
120.3.4 main.cpp
#include "database.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);DataBase w;w.show();return a.exec();
}
相关文章:

嵌入式养成计划-46----QT--简易版网络聊天室实现--QT如何连接数据库
一百一十九、简易版网络聊天室实现 119.1 QT实现连接TCP协议 119.1.1 基于TCP的通信流程 119.1.2 QT中实现服务器过程 使用QTcpServer实例化一个服务器对象设置监听状态,通过listen()函数,可以监听特定的主机,也可以监听所有客户端&#x…...

YOLO目标检测——人脸识别数据集【对应voc、coco和yolo三种格式标签】
实际项目应用:安全监控、智能驾驶、人机交互、人脸门禁、人脸支付、人脸搜索数据集说明:人脸识别数据集,真实场景的高质量图片数据,数据场景丰富,含有人脸图片标签说明:使用lableimg标注软件标注࿰…...
mybatis日志不打印的问题
在项目中使用了 spring boot,orm 层集成了 mybatis-plus,按照默认配置后发现之前配置的 sql 日志正常,在这里却不正常,鉴于日志使用的是 logback,想到了打印 sql 的日志级别是 debug,所以,按照这…...
【分布式缓存】关于 Memcached 的几个常见问题
关于 Memcached 的几个常见问题 1.Memcached 是怎么工作的?2.Memcached 最大的优势是什么?3.Memcached 和 MySQL 的 querycache 相比,有什么优缺点?4.Memcached 和服务器的 local cache(比如 PHP 的 APC、mmap 文件等&…...

MySQL 三大日志(bin log、redo log、undo log)
redo log redo log (重做日志) 是 InnoDB 存储引擎独有的,它让 MySQL有了崩溃恢复的能力,是事务中实现 持久化的重要操作 比如 MySQL 实例宕机了,重启时,InnoDB 存储引擎会使用 redo log 恢复数据,保证数据的持久性与…...

asp.net社区医疗辅助诊断网站系统VS开发sqlserver数据库web结构c#编程
一、源码特点 asp.net社区医疗辅助诊断网站系统 是一套完善的web设计管理系统,系统采用mvc模式(BLLDALENTITY)系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver200…...

NLP Bi-Encoder和Re-ranker
Retrieve & Re-Rank https://www.sbert.net/examples/applications/retrieve_rerank/README.html Bi-Encoder vs. Cross-Encoder https://www.sbert.net/examples/applications/cross-encoder/README.html Bi-Encoder会用BERT对输入文本编码,再根据cosine相似度…...

SpringBoot+Mybatis 配置多数据源及事务管理
目录 1.多数据源 2.事务配置 项目搭建参考: 从零开始搭建SpringBoot项目_从0搭建springboot项目-CSDN博客 SpringBoot学习笔记(二) 整合redismybatisDubbo-CSDN博客 1.多数据源 添加依赖 <dependencies><dependency><groupId>org.springframework.boot&…...
华为OD 猴子吃桃(100分)【java】A卷+B卷
华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

切片不够技术来凑
概述 随着数据经度的提升,18级的切片有些场景已经不够用了,但是大部分在线的栅格切片最大级别还是18级,如果地图继续放大,有的框架(leaflet会,openlayers和mapboxGL不会)会存在没有底图的情况。…...

特约|数码转型思考:Web3.0与银行
日前,欧科云链研究院发布重磅报告,引发银行界及金融监管机构广泛关注。通过拆解全球70余家银行的加密布局,报告认为,随着全球采用率的提升与相关技术的成熟,加密资产已成为银行业不容忽视也不能错过的创新领域。 作为…...
MySQL知识详细汇总
存储引擎 MyISAM 不支持事务,不支持外键,支持全文索引,查询、插入效率高InnoDB 支持事务(事务的特性) 原子性:一个事务中所有的操作,要么全部完成,要么全部不完成,不会在…...

【驱动开发】LED灯的亮灭——通过字符设备驱动的分步实现编写LED驱动,实现设备文件和设备的绑定
头文件: #ifndef __HEAD_H__ #define __HEAD_H__typedef struct {unsigned int MODER;unsigned int OTYPER;unsigned int OSPEEDR;unsigned int PUPDR;unsigned int IDR;unsigned int ODR; }gpio_t;//LED灯的寄存器地址 #define LED1_ADDR 0X50006000 #define L…...
华为OD 最小数字(100分)【java】A卷+B卷
华为OD统一考试A卷+B卷 新题库说明 你收到的链接上面会标注A卷还是B卷。目前大部分收到的都是B卷。 B卷对应20022部分考题以及新出的题目,A卷对应的是新出的题目。 我将持续更新最新题目 获取更多免费题目可前往夸克网盘下载,请点击以下链接进入: 我用夸克网盘分享了「华为O…...

大模型、实时需求推动湖仓平台走向开放
大模型、实时需求高涨 AGI 时代,以 ChatGPT、Midjourney 等为代表的大模型迅速应用加速了 AI 普及,越来越多的企业选择搭建自己的 AI 基础设施,训练行业大模型。 另一方面,企业为了在瞬息万变的市场环境中更快的做出商业决策&…...

Linux搭建文件服务器
搭建简单文件服务器 基于centos7.9搭建http文件服务器基于centos7.9搭建nginx文件服务器基于ubuntu2204搭建http文件服务器 IP环境192.168.200.100VMware17 基于centos7.9搭建http文件服务器 安装httpd [rootlocalhost ~]# yum install -y httpd关闭防火墙以及selinux [roo…...

跨境商城源码可以支持多种支付方式吗?
跨境商城源码是一种用于建立跨国界电商平台的程序代码。随着全球电商的繁荣发展,越来越多的商家开始寻找一种既安全可靠,又能满足用户需求的支付方式。那么,跨境商城源码是否能够支持多种支付方式呢?让我们深入探讨一下。 1. 支付宝支付 支付…...

机器学习中的核方法
一、说明 线性模型很棒,因为它们易于理解且易于优化。他们受苦是因为他们只能学习非常简单的决策边界。神经网络可以学习更复杂的决策边界,但失去了线性模型良好的凸性特性。 使线性模型表现出非线性的一种方法是转换输入。例如,通过添加特征…...

搜索问答技术学习:基于知识图谱+基于搜索和机器阅读理解(MRC)
目录 一、问答系统应用分析 二、搜索问答技术与系统 (一)需求和信息分析 问答需求类型 多样的数据源 文本组织形态 (二)主要问答技术介绍 发展和成熟度分析 重点问答技术基础:KBQA和DeepQA KBQA(…...

LeetCode2409——统计共同度过的日子数
博主的解法过于冗长,是一直对着不同的案例debug修改出来的,不建议学习。虽然提交成功了,但是自己最后都不知道写的是啥了哈哈哈。 package keepcoding.leetcode.leetcode2409; /*Alice 和 Bob 计划分别去罗马开会。给你四个字符串 arriveA…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

Mac软件卸载指南,简单易懂!
刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"࿰…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...