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

QT音乐播放器(1):数据库保存歌曲

实现功能:用数据库保存本地导入和在线搜索的歌曲记录

目录

一. 保存本地添加的歌曲

1. 使用QSettings

(1)在构造函数中,创建对象。

(2)在导入音乐槽函数中,保存新添加的文件路径,保存到Settings

(3)加载保存的播放列表,loadPlaylist()

2. 使用数据库存储

(1)在构造函数中,初始化数据库。

(2)在导入音乐槽函数中,数据库存储

(3)加载播放列表时从数据库读取函数

(4)创建musicDatabase.cpp和musicDatabase.h文件

 (5)创建 playlist.db 文件的方法

(6)在 .qrc 文件中声明 playlist.db

(7)将 .qrc 文件添加到 Qt 项目中

3. 可能出现的问题

二. 保存在线搜索的歌曲

(1)在在线搜索函数的处理数据信息返回函数中保存(在线)歌曲到数据库

(2)实现保存歌曲到数据库的函数

三、运行结果


一. 保存本地添加的歌曲

1. 使用QSettings

使用QSettings保存播放列表路径:记录用户添加的文件路径,每次启动时读取这些路径并重新添加到播放列表。这种方法简单,但需要注意文件路径的有效性,比如文件是否被移动或删除。

(1)在构造函数中,创建对象。

    //构造函数中,创建对象m_settings = new QSettings("TT Music", "MusicPlayer"); loadPlaylist(); // 初始化加载播放列表

(2)在导入音乐槽函数中,保存新添加的文件路径,保存到Settings

// 保存新添加的文件路径,保存到Settingsm_lastPlaylist = strMp3FileList;m_settings->setValue("LastPlaylist", m_lastPlaylist);

(3)加载保存的播放列表,loadPlaylist()

//加载保存的播放列表
void OnlineMusicWidget::loadPlaylist() {// 读取保存的播放列表m_lastPlaylist = m_settings->value("LastPlaylist").toStringList();// 清空当前播放列表p_PlayerList->clear();// 添加文件并更新UIfor (const QString &filePath : m_lastPlaylist) {if (QFile::exists(filePath)) { // 验证文件有效性p_PlayerList->addMedia(QUrl::fromLocalFile(filePath));ui->plainTextEdit_SongList->appendPlainText(QFileInfo(filePath).fileName());} else {qDebug() << "警告:文件" << filePath << "不存在,已跳过";}}// 保持最后添加的文件显示在文本框底部ui->plainTextEdit_SongList->moveCursor(QTextCursor::End);
}

QSettings适合保存应用程序的配置信息,如用户偏好、最后访问的位置等,但不适合保存临时或动态生成的数据,尤其是当这些数据需要持久化存储时。

2. 使用数据库存储

(1)在构造函数中,初始化数据库。

    m_musicDb = new MusicDatabase(this);if (!m_musicDb->initialize()) {qDebug() << "数据库初始化失败!";}

(2)在导入音乐槽函数中,数据库存储

     for (const QString &filePath : strMp3FileList) {// 检查数据库重复(可选)if (m_musicDb->isSongExists(filePath)) {qDebug() << "[数据库] 歌曲已存在,跳过:" << filePath;continue;}elseqDebug() << "不存在:"<<filePath;// 检查播放列表重复(关键)if (isSongInPlaylist(filePath)) {qDebug() << "[播放列表] 歌曲已存在,跳过:" << filePath;continue;}elseqDebug() << "不存在:"<<filePath;// 1. 解析文件名中的歌曲名和歌手QFileInfo fileInfo(filePath);QString fileName = fileInfo.baseName(); // 示例:"富士山下 - 陈奕迅"QStringList parts = fileName.split(" - ");QStringList separators = {" - ","-", "_", "—",""}; // 定义可能的分隔符foreach (const QString &sep, separators) {if (fileName.contains(sep)) {parts = fileName.split(sep);break;}}QString songName = "未知歌曲";QString singer = "未知歌手";if (parts.size() >= 2) {songName = parts[0].trimmed();singer = parts[1].trimmed();} else {songName = fileName; // 无分隔符时直接使用文件名}// 2. 添加到播放列表p_PlayerList->addMedia(QUrl::fromLocalFile(filePath));int musicindex=p_PlayerList->currentIndex();//当前音乐的索引int currentSongid = getCurrentPlayingSongId();// QString strSongId = QString::number(currentSongid); // 直接转换qDebug() << "歌曲------------ID"<<currentSongid;// 3. 保存到数据库(使用解析出的歌曲名和歌手)// MusicDatabase::DatabaseError error = m_musicDb->addSong(filePath);MusicDatabase::DatabaseError error = m_musicDb->saveSongToDatabase(MusicDatabase::Local, musicindex, currentSongid, filePath, songName, singer,"",0);if (error != MusicDatabase::NoError) {qDebug() << "添加(本地)歌曲到数据库失败:" << error;}else{qDebug() << "添加(本地)歌曲到数据库成功";}}emit playlistUpdated(); // 添加歌曲后触发信号}

(3)加载播放列表时从数据库读取函数

void OnlineMusicWidget::loadPlaylistFromDatabase() {qDebug() << "进入 loadPlaylistFromDatabase()";// 检查数据库初始化if (!m_musicDb->initialize()) {qDebug() << "数据库初始化失败:" ;return;}// 从数据库获取播放列表路径QStringList playlist = m_musicDb->loadPlaylist();// p_PlayerList->clear();// 添加调试日志qDebug() << "查询到的歌曲数量:" << playlist.size();// 初始化计数器int newSongsCount = 0;// 遍历数据库中的每首歌曲for (const QString &filePath : playlist) {qDebug() << "加载文件:" << filePath;QString normalizedPath = normalizePath(filePath);// 检查是否已存在if (m_existingPaths.contains(normalizedPath)) {qDebug() << "跳过重复歌曲:" << filePath;continue;}// 新增歌曲:更新计数器和集合newSongsCount++;m_existingPaths.insert(normalizedPath);qDebug() << "新增路径—— :" << normalizedPath;// 添加到播放列表p_PlayerList->addMedia(QUrl::fromLocalFile(filePath));QFileInfo qFileInfo(filePath);// 添加到文本框,带有序号int index = ui->listWidget_SongList->count();ui->listWidget_SongList->addItem(QString("%1. %2").arg(index+1).arg(qFileInfo.fileName()));}// 输出新增歌曲数量qDebug() << "本次新增歌曲数量:" << newSongsCount;qDebug() << "播放列表加载完成";
}

(4)创建musicDatabase.cpp和musicDatabase.h文件

//musicDatabase.cpp
MusicDatabase::MusicDatabase(QObject *parent) : QObject(parent) {// 使用SQLite数据库m_db = QSqlDatabase::addDatabase("QSQLITE");m_db.setDatabaseName("E:/QtProjects/OnlineMusic/playlist.db"); // 使用应用程序资源文件
}//数据库初始化
bool MusicDatabase::initialize() {if (!m_db.open()) {qDebug() << "数据库初始化失败:" << m_db.lastError().text();return false;}// 加载播放列表和收藏列表loadPlaylist();// loadFavorites();// 创建歌曲表(如果不存在)QSqlQuery query;QString createTableSQL ="CREATE TABLE IF NOT EXISTS songs (""id INTEGER PRIMARY KEY AUTOINCREMENT, ""source_type TEXT NOT NULL, ""music_id INTEGER UNIQUE, ""local_filepath TEXT UNIQUE, ""name TEXT NOT NULL, ""singer TEXT NOT NULL, ""album TEXT, ""duration INTEGER, ""is_favorite BOOLEAN DEFAULT 0, ""added_time DATETIME DEFAULT CURRENT_TIMESTAMP"")";if (!query.exec(createTableSQL)) {qDebug() << "创建表失败:" << query.lastError().text();qDebug() << "执行的 SQL:" << createTableSQL; // 打印 SQL 语句return false;}qDebug() << "创建表成功!";return true;
}//将(本地)加载的歌曲保存到数据库(通过路径filePath)
MusicDatabase::DatabaseError MusicDatabase::addSong(const QString &filePath) {if (!QFile::exists(filePath)) {qDebug() << "文件不存在:" << filePath; // 添加调试输出return FileNotFoundError; // 文件不存在}QSqlDatabase db = QSqlDatabase::database();db.transaction();  // 开始事务// 先删除旧记录(如果有)QSqlQuery delQuery;delQuery.prepare("DELETE FROM songs WHERE filepath = :path");delQuery.bindValue(":path", filePath);delQuery.exec();// 插入新记录QSqlQuery insertQuery;insertQuery.prepare("INSERT INTO songs (filepath) VALUES (:path)");insertQuery.bindValue(":path", filePath);// // 检查数据库中是否已存在相同路径QSqlQuery query1;query1.prepare("SELECT COUNT(*) FROM songs WHERE filepath = :path");query1.bindValue(":path", filePath);if (!query1.exec() || !query1.next()) {qDebug() << "查询失败:" << query1.lastError().text();return QueryError;}int count = query1.value(0).toInt();if (count > 0) {db.rollback();  // 回滚事务(可选)qDebug() << "路径已存在,跳过插入";return NoError; // 或自定义重复错误码}//执行插入QSqlQuery query;query.prepare("INSERT INTO songs (filepath) VALUES (:path)");query.bindValue(":path", filePath);if (!query.exec()) {db.rollback();  // 回滚事务qDebug() << "插入失败:" << query.lastError().text();return QueryError;}db.commit();  // 提交事务return NoError;
}QStringList MusicDatabase::loadPlaylist() {QStringList paths;QSqlQuery query;query.prepare("SELECT local_filepath FROM songs WHERE source_type = 'Local'"); // 注意 source_type 值的大小写if (!query.exec()) {qDebug() << "查询失败:" << query.lastError().text();return paths;}while (query.next()) {QString path = query.value("local_filepath").toString();qDebug() << "加载路径:" << path; // 添加调试输出paths.append(path);}return paths;
}

 (5)创建 playlist.db 文件的方法

playlist.db 是 SQLite 数据库文件,用于存储应用程序的本地数据(如歌曲列表、播放记录等)

方法一:手动创建

方法二:通过 Qt 代码动态创建

m_db = QSqlDatabase::addDatabase("QSQLITE");
m_db.setDatabaseName("E:/QtProjects/OnlineMusic/playlist.db");

(6)在 .qrc 文件中声明 playlist.db

  • 右键点击项目 → 添加新文件 → 资源文件 →  resources.qrc
  • 打开生成的 resources.qrc 文件。
  • 点击左侧的 添加现有文件。
  • 选择项目目录下的 playlist.db 文件。
  • 确保 prefix 设置为 /(根路径)。

(7)将 .qrc 文件添加到 Qt 项目中

在 .pro 文件中声明资源文件

RESOURCES += \images.qrc \music.qrc

3. 可能出现的问题

问题1:数据库里保存了之前导入的歌曲,但是程序启动时播放列表里并没有自动显示之前的歌曲,而是需要再次导入歌曲时才会把之前的歌曲全部显示。 

解决方法: 

方法一:在主窗口构造函数中添加自动加载,在窗口初始化阶段调用 loadPlaylistFromDatabase()。

方法一:通过 showEvent 触发加载。重写窗口的 showEvent 方法,在窗口显示时自动加载:

void OnlineMusicWidget::showEvent(QShowEvent *event) {QMainWindow::showEvent(event);loadPlaylistFromDatabase();  //窗口显示时自动加载
}

推荐 showEvent:

1. ​更安全的初始化顺序

  • showEvent 在窗口控件完全初始化(如 ui 指针绑定)后触发,避免在构造函数中因组件未就绪导致的崩溃。

2. 代码可维护性

  • 将数据加载逻辑与 UI 初始化分离,符合单一职责原则。
  • showEvent:专注于窗口显示时的数据加载和 UI 更新。

3. 动态刷新支持

  • 通过 showEvent,可以在窗口重新显示时自动刷新播放列表(例如用户关闭后重新打开窗口)。

​4. 多窗口实例兼容性

  • 如果程序中存在多个 OnlineMusicWidget 实例,showEvent 保证每个窗口独立加载自己的数据。

二. 保存在线搜索的歌曲

(1)在在线搜索函数的处理数据信息返回函数中保存(在线)歌曲到数据库

处理数据信息返回函数:当收到网络回复后,代码解析JSON数据,提取了歌曲的ID、名称、歌手等信息,并将这些信息显示在文本框中,同时将歌曲URL添加到播放列表

MusicDatabase::DatabaseError error = m_musicDb->saveSongToDatabase(MusicDatabase::Online,100, I_MusicID," ",StrMusicName, StrSingerName, "album", 100);if (error != MusicDatabase::NoError) {qDebug() << "添加(在线)歌曲到数据库失败:" << error;}elseqDebug() << "添加(在线)歌曲到数据库成功";

(2)实现保存歌曲到数据库的函数

MusicDatabase::DatabaseError MusicDatabase::saveSongToDatabase(SongSource source,const int id,const int music_id,const QString &filePathOrId,const QString &name,const QString &singer,const QString &album = "",int duration = 0) {QSqlQuery query;QString sql;QVariantList params;// 根据来源类型生成不同的SQL插入语句if (source == Local) {// 本地歌曲(使用文件路径)sql = "INSERT INTO songs (source_type, id, music_id, local_filepath, name, singer, album, duration) ""VALUES (:source_type, :id, :music_id, :local_filepath, :name, :singer, :album, :duration)";query.prepare(sql);query.bindValue(":source_type", "Local");query.bindValue(":local_filepath", filePathOrId); // 文件路径} else {// 在线歌曲(使用在线ID)sql = "INSERT INTO songs (source_type, music_id, name, singer, album, duration) ""VALUES (:source_type, :music_id, :name, :singer, :album, :duration)";query.prepare(sql);query.bindValue(":source_type", "online");query.bindValue(":music_id", filePathOrId.toInt()); // 转换为整数ID}// 绑定公共参数query.bindValue(":name", name);query.bindValue(":singer", singer);query.bindValue(":album", album);query.bindValue(":duration", duration);if (!query.exec()) {QSqlError sqlError = query.lastError();if (sqlError.nativeErrorCode() == "19") { // SQLite 唯一性约束错误码qDebug() << "文件路径已存在:" << filePathOrId;return FileExistsError; // 返回 FileExistsError(值 3)} else {qDebug() << "保存失败:" << sqlError.text();return QueryError; // 其他 SQL 错误}}qDebug() << "保存成功:" << name << "(" << (source == Local ? "本地" : "在线") << ")";return NoError;
}

三、运行结果

相关文章:

QT音乐播放器(1):数据库保存歌曲

实现功能&#xff1a;用数据库保存本地导入和在线搜索的歌曲记录 目录 一. 保存本地添加的歌曲 1. 使用QSettings &#xff08;1&#xff09;在构造函数中&#xff0c;创建对象。 &#xff08;2&#xff09;在导入音乐槽函数中&#xff0c;保存新添加的文件路径&#xff0c…...

Java面试黄金宝典22

1. 树的中序遍历&#xff0c;除了递归和栈还有什么实现方式 定义 Morris 遍历是一种用于二叉树遍历的算法&#xff0c;它利用树中大量空闲的空指针&#xff0c;在不使用额外栈空间和递归的情况下&#xff0c;完成树的遍历。通过建立临时的线索连接&#xff0c;使得可以按照中…...

英伟达GB300新宠:新型LPDDR5X SOCAMM内存

随着人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;和高性能计算&#xff08;HPC&#xff09;应用的快速发展&#xff0c;对于高效能、大容量且低延迟内存的需求日益增长。NVIDIA在其GB系列GPU中引入了不同的内存模块设计&#xff0c;以满足这些严格…...

验证Linux多进程时间片切换的程序

​​ 一、软件需求 在同时运行多个CPU密集型进程时&#xff0c;需采集以下统计信息&#xff1a; 当前运行在逻辑CPU上的进程ID每个进程的运行进度百分比 实验程序设计要求&#xff1a; 1. 命令行参数 参数说明示例值n并发进程数量3total总运行时长&#xff08;毫秒&…...

Linux学习笔记(应用篇四)

基于I.MX6ULL-MINI开发板 输入设备tslib库 输入设备 触摸屏 触摸屏设备是绝对位移设备可以上报绝对位移事件 触摸可分为单触摸和双触摸 BTN_TOUCH &#xff1a;按压触摸屏和松开会触发上报&#xff0c;滑动时不会 单触摸上报事件 ABS_X&#xff1a; X 轴绝对位移坐标值 ABS_Y…...

linux基本命令(1)--linux下的打包命令 -- tar 和gzip

tar 解压 &#xff0c;打包 语法&#xff1a;tar [主选项辅选项] 文件或者目录 使用该命令时&#xff0c;主选项是必须要有的&#xff0c;它告诉tar要做什么事情&#xff0c;辅选项是辅助使用的&#xff0c;可以选用。 主选项&#xff1a; c 创建新的档案文件。如果用户想备…...

【Linux内核系列】:文件ELF格式详解

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; “人生没有白走的路&#xff0c;你踩过的荆棘、蹚过的泥泞&#xff0c;都会在某一刻&#xff0c;变成你脚下的风。” ★★★ 本文前置…...

CubeMx ——新建工程

新建工程 选择芯片 设置主频 选择调试口 选择晶振口 设置 GPIO 输出 工程设置 LED 闪烁 /* USER CODE BEGIN WHILE */while (1){HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_10);HAL_Delay(1000);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */...

使用postcss-px-to-viewport-8-plugin将页面转响应式

使用postcss-px-to-viewport-8-plugin将页面转响应式 背景 公司最近接了个项目&#xff0c;其中要求部分页面在移动端正常显示&#xff0c;第一方案是使用响应式&#xff0c;但是设计稿最后出的和Web端差别较大同时两端的功能不是完全对齐的&#xff0c;所以决定使用两个模块…...

Java---类与对象

类与对象 前言&#xff1a;一、面向对象二、类的定义1.类的定义格式2.访问修饰限定符 三、类的实例化四、this引用1.this引用2.this引用的原因 五、对象的构造和初始化1.初始化对象2.构造方法(1).构造方法的概念&#xff1a;(2).特性&#xff1a;(3).this调用:3.就地初始化4.默…...

告别桌面杂乱与充电焦虑,移速165W百变桌面充电站首发体验

告别桌面杂乱与充电焦虑&#xff0c;移速165W百变桌面充电站首发体验 哈喽小伙伴们好&#xff0c;我是Stark-C~ 先如今&#xff0c;家里的电子产品越来越多&#xff0c;手机、平板、电脑三件套已经是基础配置&#xff0c;还有相机、Switch、智能手表等&#xff0c;这些产品用…...

基于springboot+vue的农产品电商平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

dom0运行android_kernel: do_serror of panic----failed to stop secondary CPUs 0

问题描述&#xff1a; 从日志看出,dom0运行android_kernel&#xff0c;刚开始运行就会crash,引发panic 解决及其原因分析&#xff1a; 最终问题得到解决&#xff0c;发现是前期在调试汇编阶段代码时&#xff0c;增加了汇编打印的指令&#xff0c;注释掉这些指令,问题得到解决。…...

MySQL 语句

MySQL 语句教程博客 MySQL 是目前广泛应用的关系型数据库管理系统&#xff0c;本文将详细介绍 MySQL 中常用的 SQL 语句及其应用&#xff0c;内容主要涵盖以下部分&#xff1a; DDL&#xff08;数据定义语言&#xff09; DML&#xff08;数据操作语言&#xff09; DQL&#…...

MySQL General Log

MySQL General Log MySQL General Log General Log 的开启General Log 的用法log_output 参数 MySQL主从复制&#xff1a;https://blog.csdn.net/a18792721831/article/details/146117935 MySQL Binlog&#xff1a;https://blog.csdn.net/a18792721831/article/details/146606…...

自动关机监控器软件 - 您的电脑节能助手

## 自动关机监控器 - 您的电脑节能助手 自动关机监控器是一款基于Python开发的实用工具&#xff0c;旨在帮助用户节省电力资源并延长电脑使用寿命。该程序通过监控用户的鼠标和键盘活动&#xff0c;在设定的无活动时间后自动关闭计算机&#xff0c;特别适合需要长时间离开电脑但…...

基于改进粒子群算法的多目标分布式电源选址定容规划(附带Matlab代码)

通过分析分布式电源对配电网的影响&#xff0c;以有功功率损耗、电压质量及分布式电源总容量为优化目标&#xff0c;基于模糊理论建立了分布式电源在配电网中选址定容的多目标优化模型&#xff0c;并提出了一种改进粒子群算法进行求解。在算例仿真中&#xff0c;基于IEEE-14标准…...

解锁健康密码:拥抱多元养生新方式

在追求高质量生活的当下&#xff0c;健康养生不再是一句空洞的口号&#xff0c;而是融入到日常生活的方方面面。它不仅关乎我们的身体健康&#xff0c;更与心理状态和生活品质息息相关。下面&#xff0c;就为大家介绍一些实用的养生知识&#xff0c;帮助大家开启健康生活之旅。…...

@Slf4j注解

Slf4j注解是Lombok库提供的一个注解&#xff0c;用于简化日志记录器的创建。使用该注解后&#xff0c;无需手动创建Logger实例&#xff0c;编译器会自动帮你完成这一步。以下是使用Slf4j注解打印日志的步骤和示例&#xff1a; 使用步骤 1. 引入依赖&#xff1a;在项目中引入SL…...

firewall-cmd添加访问规则

若要使用 **firewall-cmd** 允许 192.168.3.0/24 网段访问本地的 8088 端口&#xff0c;你可以按照以下步骤操作。 临时允许访问 如果你仅需临时允许该网段访问 8088 端口&#xff0c;可使用如下命令&#xff1a; firewall-cmd --add-rich-rulerule family"ipv4" …...

【Linux网络与网络编程】02.初识Socket编程

1. 数据传输的目的 前一篇文章中我们讲解了网络传输的流程&#xff0c;那么网络传输的目的是什么呢&#xff1f;难道我们只是将数据从一台主机传输到另一台主机吗&#xff1f; 当然不是的&#xff01;因为数据是给人用的。比如&#xff1a;聊天是人在聊天&#xff0c;下载是人…...

Python库()

1.概念 Matplotlib 库&#xff1a;是一款用于数据可视化的 Python 软件包&#xff0c;支持跨平台运行&#xff0c;它能够根据 NumPy ndarray 数组来绘制 2D 图像&#xff0c;它使用简单、代码清晰易懂 Matplotlib 图形组成&#xff1a; Figure&#xff1a;指整个图形&#xf…...

CVPR-2025 | 南洋理工基于图表示的具身导航统一框架!UniGoal:通用零样本目标导航方法

作者&#xff1a;Hang Yin 1 ^{1} 1, Xiuwei Xu 1 ^{1} 1, Linqing Zhao 1 ^{1} 1, Ziwei Wang 2 ^{2} 2, Jie Zhou 1 ^{1} 1, Jiwen Lu 1 ^{1} 1单位&#xff1a; 1 ^{1} 1南洋理工大学&#xff0c; 2 ^{2} 2清华大学论文标题&#xff1a;UniGoal: Towards Universal Zero-sho…...

Banner区域

div下 justify-content:space-between 左侧测导航left 在这里插入图片描述 在这里插入图片描述...

【C++】C++11介绍列表初始化右值引用和移动语义

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. C11简介2. 统一的列表初始化2.1&#xff5b;&#xff5d;初始化2.2 std::initializer_list 3. 声明3.1 auto3.2 decltype3.3 nullptr 4. 范围for循环4.1 范围for的语法4.2 范围for的使用条件 5. STL中一些变化6. 右…...

基于Spring Boot的高校普法系统的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

算法为舟 思想为楫:AI时代,创作何为?

在科技浪潮汹涌澎湃的当下,AI技术以前所未有的态势席卷各个领域,创作领域亦未能幸免。当生成式AI展现出在剧本撰写、诗歌创作、图像设计等方面的惊人能力时,人类创作者仿佛置身于文明演化的十字路口,迷茫与困惑交织,兴奋与担忧并存。在AI时代,创作究竟该何去何从?这不仅…...

GPT-4o 原生图像生成技术解析:从模型架构到吉卜力梦境的实现

最近不少 AI 爱好者、设计师、Vlogger 在社交平台晒出了 GPT-4o 生成的梦幻图像&#xff0c;尤其是吉卜力风格的作品——柔和光影、日系构图、治愈色彩、富有情感的角色表达&#xff0c;一下子击中了无数人的“童年回忆 审美舒适区”。 &#x1f3a8; 下面是一些 GPT-4o 实际生…...

无线通信技术(二):ITU、3GPP及传统波段对无线频谱的划分

本文介绍国际标准组织ITU、3GPP和传统波段对无线频谱的划分 。 一.ITU波段划分 国际电信联盟&#xff08;ITU&#xff09;将无线电频谱划分为多个频段&#xff0c;并根据频率范围和业务需求分配用途。 ITU对无线频谱的划分 带号频带名称频率范围波长范围波段名称典型应用…...

[Python学习日记-88] 并发编程之多进程 —— 队列与生产者消费者模型

[Python学习日记-88] 并发编程之多进程 —— 队列与生产者消费者模型 简介 队列 一、队列的介绍 二、队列的使用 生产者消费者模型 一、为什么要使用生产者消费者模型 二、什么是生产者消费者模型 三、生产者消费者模型的优势 四、生产者消费者模型的实现 JoinableQ…...

Vue学习笔记集--computed

computed 在 Vue 3 的 Composition API 中&#xff0c;computed 用于定义响应式计算属性 它的核心特性是自动追踪依赖、缓存计算结果&#xff08;依赖未变化时不会重新计算&#xff09; 基本用法 1. 定义只读计算属性 import { ref, computed } from vue;const count ref(…...

python之多线程,多进程理解

目录 一,什么是多线程多进程 1,1 多线程 1.2 多进程 二,多线程 2.1 使用threading模块 三,多进程 3.1 使用multiprocessing模块 3.2 多进程的优势 3.3 进程间的通信 四,如何选择多进程还是多线程 五,异步编程的替代方案(协程) 在开发过程中&#xff0c;提升程序的并…...

3月29日星期六今日早报简报微语报早读

3月29日星期六&#xff0c;农历三月初一&#xff0c;早报#微语早读。 1、全国公立医疗机构自3月31日起全面停止收取门诊预交金&#xff1b; 2、永辉超市“胖东来调改店”已达47家店 一线员工薪酬涨幅50%以上&#xff1b; 3、两孩家庭补10万&#xff0c;三孩家庭补20万&#…...

栈:隐匿于计算机科学长卷的璀璨明珠

目录 &#x1f680;前言&#x1f31f;栈的概念&#x1f914;栈的两种实现形式&#x1f4af;数组栈实现&#x1f4af;链表栈实现 ⚙️数组栈与链表栈对比&#x1f427;递归与栈&#x1f4bb;总结 &#x1f680;前言 大家好&#xff01;我是 EnigmaCoder。 在计算机科学的宏大版图…...

【万字总结】前端全方位性能优化指南(七)——按需加载、虚拟列表、状态管理

现代框架高阶优化——突破复杂场景的性能临界点 当Web应用进入「十万级组件、百万级数据」的复杂场景时,传统优化手段开始触及框架底层瓶颈:Redux的单一Store引发级联渲染风暴、全量加载的首屏资源阻塞关键交互、长列表滚动导致内存飙升直至页面崩溃……这些痛点正在倒逼框架…...

合并石子 | 第十四届蓝桥杯省赛JavaB组

在桌面从左至右横向摆放着 N 堆石子。 每一堆石子都有着相同的颜色&#xff0c;颜色可能是颜色 0&#xff0c;颜色 1 或者颜色 2 中的其中一种。 现在要对石子进行合并&#xff0c;规定每次只能选择位置相邻并且颜色相同的两堆石子进行合并。 合并后新堆的相对位置保持不变&…...

【商城实战(94)】构建高并发的负载均衡与集群架构

【商城实战】专栏重磅来袭&#xff01;这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建&#xff0c;运用 uniapp、Element Plus、SpringBoot 搭建商城框架&#xff0c;到用户、商品、订单等核心模块开发&#xff0c;再到性能优化、安全加固、多端适配&#xf…...

鸿蒙开发:了解Canvas绘制

前言 本文基于Api13 系统的组件无法满足我们的需求&#xff0c;这种情况下就不得不自己自定义组件&#xff0c;除了自定义组合组件&#xff0c;拓展组件&#xff0c;还有一种方式&#xff0c;那就是完全的自绘制组件&#xff0c;这种情况&#xff0c;常见的场景有&#xff0c;比…...

Ubuntu和Windows实现文件互传

1.开启Ubuntu下的FTP服务&#xff1a; &#xff08;1&#xff09;终端输入&#xff1a; sudo apt-get install vsftpd&#xff08;2&#xff09;安装完成后&#xff1a; 终端输入&#xff1a; /etc 是 Linux 系统的全局配置文件目录&#xff0c;存储系统和应用程序的配置信息…...

dav_pg8_vacuum

一、VACUUM基础概念 1.1 VACUUM的作用 在PostgreSQL中&#xff0c;当数据被更新或删除时&#xff0c;系统并不会立即释放物理空间&#xff0c;而是将其标记为 “可重用”。 随着时间推移&#xff0c;表中的死元组&#xff08;已删除或已被新版本覆盖的数据&#xff09;会越来越…...

革新汽车安全通信技术,美格智能全系车载通信模组支持NG-eCall

根据QYR&#xff08;恒州博智&#xff09;的统计及预测&#xff0c;2024年全球汽车无线紧急呼叫&#xff08;eCall&#xff09;设备市场销售额达到了25.17亿美元&#xff0c;预计2031年将达到44.97亿美元&#xff0c;年复合增长率&#xff08;CAGR 2025-2031&#xff09;为8.8%…...

Ubuntu桌面环境下网络设置选项缺失问题解决

一、问题现象 在Ubuntu桌面环境中&#xff0c;网络设置界面中仅显示VPN设置&#xff0c;未显示常规网络配置选项&#xff0c;导致无法通过图形界面修改网络配置。但通过命令行工具可正常设置网络。 二、解决方案 &#xff08;一&#xff09;检查网络设备状态 nmcli d 发现…...

GitHub绑定本地计算机以及仓库创建跟推送指南

GitHub绑定到本地计算机 要在本地计算机上连接到你的GitHub账户&#xff0c;可以通过以下步骤实现&#xff1a; 1. 检查和安装Git 确保你的计算机上已经安装了Git。如果还没有安装&#xff0c;可以从Git官网下载并安装。 2. 配置Git 打开终端&#xff08;macOS或Linux&…...

【数据结构】导航

【数据结构】-CSDN博客 【数据结构】next数组、nextval数组-CSDN博客...

Java内存中的Heap(堆)的作用

Java内存中的Heap&#xff08;堆&#xff09;的作用 在 Java 的内存模型中&#xff0c;Heap&#xff08;堆&#xff09; 是 JVM&#xff08;Java Virtual Machine&#xff09;管理的运行时数据区域之一&#xff0c;主要用于存储程序运行过程中动态分配的对象和数据。它是 Java…...

Python控制结构详解

前言 一、控制结构概述 二、顺序结构 三、选择结构&#xff08;分支结构&#xff09; 1. 单分支 if 2. 双分支 if-else 3. 多分支 if-elif-else 4.实际应用: 四、循环结构 1. for循环 2. while循环 3. 循环控制语句 五、异常处理&#xff08;try-except&#xff09…...

2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

本来想刷省赛题呢&#xff0c;结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但&#xff0c;又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 一、子2023-&#xff…...

JVM介绍

JVM类加载器 栈指令重排序 类的JVM内存分配 堆内存GC模型...

HTML输出流

HTML 输出流 JavaScript 中**「直接写入 HTML 输出流」**的核心是通过 document.write() 方法向浏览器渲染过程中的数据流动态插入内容。以下是详细解释&#xff1a; 一、HTML 输出流的概念 1. 动态渲染过程 HTML 文档的加载是自上而下逐行解析的。当浏览器遇到 <script&…...

Kafka 的高可用性

Kafka 的高可用性主要通过副本机制、ISR&#xff08;In-Sync Replicas&#xff09;列表和控制器 Broker 来实现。这些机制共同确保了 Kafka 集群在部分节点故障时仍然可以正常运行&#xff0c;数据不会丢失&#xff0c;并且服务不会中断。 1. 副本机制 Kafka 的副本机制是其高…...