Qt C++图书管理系统:面向对象课程设计实战指南
如果你是一名计算机专业的学生正在为《面向对象程序设计》或《C课程设计》寻找一个既有技术深度、又能完整展示项目能力的选题那么一个功能完备的“图书管理系统”无疑是绝佳选择。它涵盖了从数据建模、UI交互到文件持久化的核心技能但网上很多示例要么过于简陋要么代码混乱难以作为高质量的课设或大作业提交。今天要拆解的这个基于Qt C 的图书管理系统就是一个可以直接用于课设、甚至能帮你拿到高分的实战项目。它不仅仅是一个简单的增删改查CRUD演示而是融合了面向对象设计思想、Qt Widgets图形界面开发、JSON数据持久化以及模块化工程结构的完整解决方案。本文将带你从零开始深入理解其架构设计并手把手教你如何运行、扩展它同时避开那些新手最容易踩的“坑”。读完本文你将能获得一个可直接运行、结构清晰的高质量Qt C项目源码。理解如何将图书管理的业务逻辑如借阅、归还、查询抽象为C类。掌握使用Qt的Model/View框架来高效管理表格数据。学会使用JSON格式进行数据的本地化存储与读取。了解一个合格课设项目的代码规范、模块划分和扩展思路。1. 项目核心价值不止于“交作业”为什么这个项目值得你花时间研究因为它解决了一个关键矛盾课程设计要求体现综合能力但学生往往时间有限难以从零构建一个既美观又健壮的系统。这个项目的核心价值在于架构清晰严格遵循了数据层、逻辑层、表现层分离的思想。Book、User等是纯粹的数据模型BookManager、BorrowRecordManager等是处理业务逻辑的“管理员”而Qt的界面只负责显示和接收用户操作。这种架构让代码易于理解和维护。技术栈实用使用了Qt的核心机制如信号与槽Signals Slots实现对象间通信Model/View解耦数据与UI这些都是企业级Qt开发的基石而非玩具代码。数据持久化方案合理采用JSON作为存储格式相比纯文本或二进制文件它结构清晰、可读性好且Qt原生支持QJsonDocument等类进行解析避免了引入第三方库的复杂度。可扩展性强系统设计了Administrator和Reader两种用户角色并预留了接口。你可以很容易地添加新角色如Librarian、新的图书属性如ISBN、出版社或新的业务规则如预约功能、逾期罚款。简单说它为你提供了一个高起点的模板。你不需要从画按钮开始而是可以直接在一個设计良好的框架上进行功能深化和界面美化这能极大提升你的开发效率和项目质量。2. 环境准备搭建你的Qt C开发舞台在深入代码之前我们必须确保环境就绪。一个配置正确的开发环境是后续一切工作的基础。2.1 所需工具与版本Qt: 推荐使用Qt 5.15.x或Qt 6.2及以上版本。这两个版本长期支持LTS稳定且社区资源丰富。本项目基于Qt Widgets模块上述版本均完美支持。C编译器:Windows: 安装Qt时勾选MinGW或MSVC套件。MinGW更轻量MSVC与Visual Studio集成更好。macOS: 使用Xcode附带的Clang。Linux: 使用系统自带的GCC。集成开发环境IDE:Qt Creator是官方IDE与Qt框架无缝集成强烈推荐。你也可以使用Visual Studio并安装Qt VS Tools插件。版本控制可选但强烈推荐:Git。用于管理你的代码版本方便回退和对比。2.2 Qt安装与项目配置要点下载与安装: 前往Qt官网下载在线安装器。安装时务必勾选与你编译器对应的Qt套件以及Qt Creator。创建项目:在Qt Creator中选择文件-新建文件或项目-Application-Qt Widgets Application。给项目命名如LibraryManagementSystem并选择好编译套件Kit。在类信息页面基类选择QMainWindow这将生成一个带菜单栏、工具栏和状态栏的主窗口非常适合管理系统类应用。项目文件.pro理解: Qt使用.pro文件来管理项目配置。一个典型的.pro文件如下QT core gui greaterThan(QT_MAJOR_VERSION, 4): QT widgets CONFIG c11 SOURCES \ main.cpp \ mainwindow.cpp \ book.cpp \ bookmanager.cpp HEADERS \ mainwindow.h \ book.h \ bookmanager.h FORMS \ mainwindow.uiQT core gui widgets: 声明项目依赖的Qt模块。CONFIG c11: 指定使用C11标准。SOURCES/HEADERS/FORMS: 分别列出了项目的源文件、头文件和UI设计文件。当你新增类时需要手动在这里添加。3. 核心类设计与数据模型系统的“骨架”任何管理系统的核心都是数据。我们先抛开界面看看数据是如何被定义的。3.1 实体类Book与UserBook和User是系统最基本的实体类它们只负责保存数据属性不包含业务逻辑。Book类 (book.h / book.cpp)// book.h #ifndef BOOK_H #define BOOK_H #include QString class Book { public: Book(); Book(int id, const QString title, const QString author, const QString isbn, int totalCount, int availableCount); // Getter 和 Setter 方法 int getId() const; void setId(int id); QString getTitle() const; void setTitle(const QString title); // ... 其他属性的Getter/Setter // 转换为JSON对象用于存储 QJsonObject toJson() const; // 从JSON对象解析用于加载 static Book fromJson(const QJsonObject json); private: int m_id; // 图书ID唯一标识 QString m_title; // 书名 QString m_author; // 作者 QString m_isbn; // ISBN号 int m_totalCount; // 总数量 int m_availableCount; // 可借数量 }; #endif // BOOK_H关键点使用了QString而非std::string这是为了与Qt框架其他部分无缝协作。toJson和fromJson静态方法实现了对象与JSON格式的双向转换这是数据持久化的关键。User类 (user.h / user.cpp)用户类类似但需要区分角色。// user.h #ifndef USER_H #define USER_H #include QString class User { public: enum Role { Reader, Administrator }; User(); User(int id, const QString username, const QString password, Role role); // 验证密码 bool verifyPassword(const QString inputPassword) const; // 角色判断 bool isAdministrator() const { return m_role Administrator; } bool isReader() const { return m_role Reader; } // ... 其他Getter/Setter和JSON方法 private: int m_id; QString m_username; QString m_passwordHash; // 实际存储时应为哈希值而非明文 Role m_role; }; #endif // USER_H安全提醒在实际项目中密码绝不能明文存储。这里为了简化可能存储的是明文或简单哈希。在你的课设报告中需要指出这一点并说明改进方案如使用QCryptographicHash生成SHA256哈希。3.2 管理类BookManager与BorrowRecordManager管理类封装了对实体集合的增删改查和业务逻辑是系统的“大脑”。BookManager类 (bookmanager.h / bookmanager.cpp)// bookmanager.h #ifndef BOOKMANAGER_H #define BOOKMANAGER_H #include QObject #include QList #include QJsonArray #include book.h class BookManager : public QObject { Q_OBJECT // 支持信号与槽 public: explicit BookManager(QObject *parent nullptr); // 核心CRUD操作 bool addBook(const Book book); bool deleteBook(int bookId); bool updateBook(const Book book); Book* findBookById(int bookId); QListBook getAllBooks() const; // 查询功能 QListBook findBooksByTitle(const QString keyword) const; QListBook findBooksByAuthor(const QString keyword) const; // 借阅与归还业务逻辑 bool borrowBook(int bookId, int userId); bool returnBook(int bookId, int userId); // 数据持久化 bool loadFromFile(const QString filePath); bool saveToFile(const QString filePath) const; signals: // 当图书数据发生变化时发出信号通知UI更新 void dataChanged(); private: QListBook m_books; // 内存中的图书列表 int m_nextId 1; // 用于生成下一个图书ID }; #endif // BOOKMANAGER_H设计精髓继承QObject并使用Q_OBJECT宏这使得BookManager可以发射dataChanged信号。当图书数据被修改后发出此信号UI层如一个显示图书列表的表格接收到信号后自动刷新实现了数据与UI的解耦。业务逻辑集中borrowBook和returnBook方法内部会检查图书库存(availableCount)并更新相关数据。所有规则都在这里处理界面只是调用它。文件操作loadFromFile和saveToFile使用QJsonDocument来读写JSON文件。4. 使用Model/View框架构建UI高效的数据展示Qt的Model/View框架是处理表格、列表数据的利器。它比传统的QTableWidget性能更好、更灵活。我们将为图书列表创建一个自定义Model。BookTableModel类 (booktablemodel.h / booktablemodel.cpp)// booktablemodel.h #ifndef BOOKTABLEMODEL_H #define BOOKTABLEMODEL_H #include QAbstractTableModel #include QList #include book.h class BookTableModel : public QAbstractTableModel { Q_OBJECT public: explicit BookTableModel(QObject *parent nullptr); // 必须重写的虚函数 int rowCount(const QModelIndex parent QModelIndex()) const override; int columnCount(const QModelIndex parent QModelIndex()) const override; QVariant data(const QModelIndex index, int role Qt::DisplayRole) const override; QVariant headerData(int section, Qt::Orientation orientation, int role Qt::DisplayRole) const override; // 允许编辑 bool setData(const QModelIndex index, const QVariant value, int role Qt::EditRole) override; Qt::ItemFlags flags(const QModelIndex index) const override; // 自定义方法用BookManager的数据填充Model void setBookList(const QListBook books); Book getBookAt(int row) const; private: QListBook m_books; QStringList m_headers {ID, 书名, 作者, ISBN, 总数, 可借}; }; #endif // BOOKTABLEMODEL_H在.cpp文件中实现关键方法// booktablemodel.cpp QVariant BookTableModel::data(const QModelIndex index, int role) const { if (!index.isValid() || index.row() m_books.size()) return QVariant(); const Book book m_books.at(index.row()); int column index.column(); if (role Qt::DisplayRole || role Qt::EditRole) { switch (column) { case 0: return book.getId(); case 1: return book.getTitle(); case 2: return book.getAuthor(); case 3: return book.getIsbn(); case 4: return book.getTotalCount(); case 5: return book.getAvailableCount(); default: return QVariant(); } } // 还可以处理其他角色如Qt::TextAlignmentRole设置对齐方式 return QVariant(); }在主窗口中使用Model// mainwindow.cpp 片段 #include booktablemodel.h #include bookmanager.h MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) , m_bookManager(new BookManager(this)) , m_bookModel(new BookTableModel(this)) { ui-setupUi(this); // 将Model设置给TableView ui-tableViewBooks-setModel(m_bookModel); // 加载数据 m_bookManager-loadFromFile(books.json); // 更新Model m_bookModel-setBookList(m_bookManager-getAllBooks()); // 连接信号当BookManager数据变化时更新Model和View connect(m_bookManager, BookManager::dataChanged, this, [this](){ m_bookModel-setBookList(m_bookManager-getAllBooks()); }); }这样只要BookManager的数据发生变化并发出dataChanged信号表格视图就会自动更新。5. 实现核心功能从登录到借阅的完整流程5.1 用户登录与权限控制登录界面通常是一个独立的对话框(QDialog)。登录成功后根据用户角色显示不同的主界面功能。// loginDialog.cpp 中的登录按钮点击槽函数 void LoginDialog::on_loginButton_clicked() { QString username ui-lineEditUsername-text(); QString password ui-lineEditPassword-text(); // 1. 验证用户这里应调用UserManager User* user m_userManager-authenticate(username, password); if (user nullptr) { QMessageBox::warning(this, 登录失败, 用户名或密码错误); return; } // 2. 登录成功传递用户信息并关闭对话框 m_currentUser user; // 保存当前用户指针 accept(); // 关闭对话框并返回 QDialog::Accepted } // main.cpp int main(int argc, char *argv[]) { QApplication a(argc, argv); LoginDialog loginDialog; if (loginDialog.exec() ! QDialog::Accepted) { return 0; // 登录取消退出程序 } // 获取登录成功的用户 User* loggedInUser loginDialog.getCurrentUser(); MainWindow w; // 将用户信息传递给主窗口主窗口根据角色启用/禁用菜单项 w.setCurrentUser(loggedInUser); w.show(); return a.exec(); }在主窗口MainWindow中根据用户角色控制界面void MainWindow::setCurrentUser(User* user) { m_currentUser user; bool isAdmin (user user-isAdministrator()); // 例如只有管理员能看到“用户管理”菜单 ui-menuUserManagement-setEnabled(isAdmin); // 只有管理员能使用“删除图书”按钮 ui-actionDeleteBook-setEnabled(isAdmin); // 读者只能看到借阅和归还功能 ui-actionBorrowBook-setEnabled(true); ui-actionReturnBook-setEnabled(true); }5.2 图书借阅与归还业务逻辑这是系统的核心业务。逻辑集中在BookManager中界面只是触发它。// bookmanager.cpp bool BookManager::borrowBook(int bookId, int userId) { Book* book findBookById(bookId); if (!book) { qDebug() 图书不存在ID: bookId; return false; } if (book-getAvailableCount() 0) { qDebug() 图书库存不足书名: book-getTitle(); return false; } // 1. 更新图书可借数量 book-setAvailableCount(book-getAvailableCount() - 1); // 2. 创建借阅记录 (需要BorrowRecordManager) BorrowRecord record; record.setId(generateNextRecordId()); record.setBookId(bookId); record.setUserId(userId); record.setBorrowDate(QDate::currentDate()); record.setDueDate(QDate::currentDate().addDays(30)); // 假设借期30天 record.setStatus(BorrowRecord::Borrowed); m_borrowRecordManager-addRecord(record); // 假设有BorrowRecordManager实例 // 3. 发出数据变化信号触发UI更新 emit dataChanged(); return true; } bool BookManager::returnBook(int bookId, int userId) { // 1. 查找未归还的借阅记录 BorrowRecord* record m_borrowRecordManager-findActiveRecord(bookId, userId); if (!record) { qDebug() 未找到该用户的借阅记录; return false; } // 2. 更新记录状态和归还日期 record-setReturnDate(QDate::currentDate()); record-setStatus(BorrowRecord::Returned); // 可以在这里计算是否逾期并处理罚款逻辑 // 3. 更新图书可借数量 Book* book findBookById(bookId); if (book) { book-setAvailableCount(book-getAvailableCount() 1); } // 4. 发出信号 emit dataChanged(); return true; }6. 数据持久化使用JSON保存一切我们将所有数据图书、用户、借阅记录保存到不同的JSON文件中。// bookmanager.cpp - 保存到文件 bool BookManager::saveToFile(const QString filePath) const { QJsonArray bookArray; for (const Book book : m_books) { bookArray.append(book.toJson()); } QJsonObject rootObject; rootObject[books] bookArray; rootObject[nextId] m_nextId; // 保存下一个可用的ID QJsonDocument doc(rootObject); QFile file(filePath); if (!file.open(QIODevice::WriteOnly)) { qWarning() 无法打开文件进行写入: filePath; return false; } file.write(doc.toJson(QJsonDocument::Indented)); // Indented格式便于阅读 file.close(); return true; } // 从文件加载 bool BookManager::loadFromFile(const QString filePath) { QFile file(filePath); if (!file.open(QIODevice::ReadOnly)) { qWarning() 无法打开文件进行读取将使用空数据: filePath; return false; // 或初始化一个空列表 } QByteArray data file.readAll(); file.close(); QJsonParseError parseError; QJsonDocument doc QJsonDocument::fromJson(data, parseError); if (parseError.error ! QJsonParseError::NoError) { qWarning() JSON解析错误: parseError.errorString(); return false; } QJsonObject rootObject doc.object(); m_books.clear(); QJsonArray bookArray rootObject[books].toArray(); for (const QJsonValue value : bookArray) { Book book Book::fromJson(value.toObject()); m_books.append(book); } m_nextId rootObject[nextId].toInt(1); // 如果不存在默认为1 emit dataChanged(); // 加载完成后通知UI return true; }JSON文件示例 (books.json):{ books: [ { id: 1, title: C Primer, author: Stanley B. Lippman, isbn: 978-7-121-15535-2, totalCount: 5, availableCount: 3 }, { id: 2, title: Qt 5.9 C开发指南, author: 王维波, isbn: 978-7-115-48590-3, totalCount: 10, availableCount: 8 } ], nextId: 3 }7. 项目运行与效果验证编译与运行在Qt Creator中点击左下角的绿色运行按钮或按CtrlR。确保没有编译错误。首次运行由于数据文件不存在系统可能会初始化空数据。你可以在mainwindow.cpp的构造函数中调用m_bookManager-loadFromFile(“books.json”)如果文件不存在则创建一些默认测试数据并保存。功能验证清单登录使用管理员账号如 admin/123456和读者账号登录观察菜单和按钮的权限变化。图书管理点击“添加图书”填写信息后保存。检查表格是否实时更新并查看books.json文件内容。选中一行图书点击“修改图书”更改信息后保存验证修改是否生效。选中一行图书点击“删除图书”确认删除并刷新。借阅与归还以读者身份登录选中一本availableCount 0的图书点击“借阅”。观察该图书的可借数量是否减1并检查borrow_records.json是否新增记录。在“我的借阅”界面找到刚才借阅的记录点击“归还”。验证图书可借数量是否恢复借阅记录状态是否更新。查询在搜索框中输入书名或作者关键字检查表格是否正确过滤显示。8. 常见问题与排查思路问题现象可能原因排查方式解决方案编译错误找不到头文件1. 头文件路径未包含。2..pro文件中未添加头文件。1. 检查#include路径是否正确。2. 检查.pro文件的HEADERS部分。1. 使用相对路径或正确配置包含目录。2. 在.pro中添加HEADERS yourheader.h。程序运行时崩溃特别是操作数据后1. 空指针访问。2. 容器如QList越界。3. JSON解析失败。1. 在调试模式下运行查看崩溃堆栈。2. 在可能出错的代码前后添加qDebug()输出。3. 检查JSON文件格式是否正确。1. 对所有指针进行判空if(ptr)。2. 访问容器元素前检查索引有效性。3. 使用QJsonParseError捕获JSON错误。表格TableView不显示数据1. Model未设置给View。2. Model的rowCount()返回0。3. Model数据更新后未发出信号。1. 检查ui-tableView-setModel(model)是否执行。2. 调试rowCount()函数。3. 检查数据更新后是否调用了beginResetModel/endResetModel或发射了dataChanged。1. 确保在设置UI后正确关联Model和View。2. 确保Model内部的数据列表m_books不为空。3. 数据变化后调用layoutChanged()或发射自定义信号让View更新。修改数据后文件未保存1.saveToFile未被调用。2. 文件路径不可写。3. 程序异常退出。1. 在修改数据的函数末尾添加saveToFile调用。2. 检查file.open()的返回值。3. 添加程序关闭事件closeEvent的保存逻辑。1. 在addBook,deleteBook等函数末尾调用保存。2. 使用QFileInfo检查路径权限。3. 重写主窗口的closeEvent在关闭前保存所有数据。登录后权限控制不生效1. 用户角色信息未正确传递。2. 界面控件启用/禁用逻辑有误。1. 登录成功后打印或调试用户角色信息。2. 检查setCurrentUser函数是否被正确调用。1. 确保登录对话框将有效的User对象传递给主窗口。2. 在主窗口初始化或用户切换时重新执行权限控制逻辑。9. 最佳实践与项目扩展建议9.1 代码组织与工程规范分层清晰坚持数据模型类、业务管理类、界面类分离。不要将业务逻辑写在界面按钮的槽函数里。命名规范类名使用PascalCase如BookManager变量和函数使用camelCase如getBookById成员变量可加m_前缀如m_books。资源管理将图片、图标、翻译文件等放入Qt的资源系统.qrc文件中避免使用绝对路径。国际化如果课设有要求可以使用tr()包裹所有用户可见的字符串为多语言支持做准备。9.2 功能扩展方向提升课设档次高级查询与过滤实现组合查询按书名作者或使用QSortFilterProxyModel为表格添加实时过滤功能。数据统计与报表使用QtCharts模块绘制图表展示图书借阅排行榜、月度借阅趋势等。网络通信进阶将数据层改为客户端通过HTTP请求与一个简单的服务器可用Python Flask/ FastAPI编写交互实现C/S架构。数据库集成将JSON持久化替换为SQLite数据库。使用Qt的QSqlDatabase和QSqlQuery类学习SQL操作。这比文件更专业。样式美化使用Qt样式表QSS为界面换肤打造更现代化的外观。单元测试使用Qt Test框架为BookManager等核心类编写单元测试体现工程素养。9.3 项目报告与答辩准备UML图用StarUML或Draw.io绘制类图展示Book, User, Manager等类的关系和时序图展示“借阅图书”等关键流程的交互。模块说明在报告中对数据持久化模块、用户权限模块、核心业务模块进行专门阐述。难点与解决方案重点阐述你如何解决Model/View数据同步、JSON数据序列化或权限控制等具体技术问题。运行演示准备一个流畅的演示流程从登录、不同角色操作到数据验证。这个Qt C图书管理系统项目为你提供了一个坚实的起点。它已经实现了核心功能和一个良好的架构。你的任务不再是“从零创造”而是“深度理解和优化”。通过研究这份代码动手添加新功能并解决遇到的问题你不仅能完成一份出色的课设作业更能切实掌握用C和Qt解决实际问题的工程化思维。建议你立即下载源码导入Qt Creator从第一个编译按钮开始踏上这段充满收获的学习之旅。

相关新闻

Ruby on Rails全栈开发:从MVC架构到实战博客系统

Ruby on Rails全栈开发:从MVC架构到实战博客系统

1. Rails框架概述:全栈开发的瑞士军刀Ruby on Rails(简称Rails)是一个基于Ruby语言的开源全栈Web应用框架,自2004年诞生以来已经发展成为最受欢迎的Web开发工具之一。我第一次接触Rails是在2012年为一个创业项目构建MVP&#xff0…

2026/10/14 15:10:44 阅读更多 →
QML 文字入场动画:逐字弹出、逐字飞入、3D 飞入

QML 文字入场动画:逐字弹出、逐字飞入、3D 飞入

目录Demo 1 逐字弹出演示代码关键逻辑解析Demo 2 逐字飞入演示代码关键逻辑解析Demo 3 飞入文字演示代码关键逻辑解析运行验证扩展复用方向在上篇文章中介绍的入场效果主要依赖整体文字的位移、缩放和旋转。这篇继续往"逐字控制"和"空间纵深"方向扩展&…

2026/10/11 8:14:28 阅读更多 →
AM275x CBASS寄存器配置:QoS、防火墙与错误处理实战指南

AM275x CBASS寄存器配置:QoS、防火墙与错误处理实战指南

1. 项目概述:深入AM275x的CBASS寄存器世界在嵌入式系统开发,尤其是基于复杂SoC(片上系统)的设计中,我们常常会面对一个既基础又核心的挑战:如何与硬件进行高效、精确且安全的对话。这种对话的媒介&#xff…

2026/10/8 15:49:13 阅读更多 →

最新新闻

OpenClaw接入DeepSeek与百炼:密钥验证与网络调试全记录

OpenClaw接入DeepSeek与百炼:密钥验证与网络调试全记录

前段时间我把工作流里的模型接入层整理了一遍,顺手给 OpenClaw 配上了 DeepSeek 和百炼大模型两个入口。原本以为就是填两个 Base URL、粘两串 API Key 的事,结果从密钥验证到网络连通,前后折腾了小半天,踩了不少隐蔽的坑。这篇文…

2026/10/15 23:48:01 阅读更多 →
NOI入门题‘观星’:方向标准化与遮挡判定的几何模拟

NOI入门题‘观星’:方向标准化与遮挡判定的几何模拟

1. 项目概述:一道入门组题目的真实分量“观星”这道题,标题里带着点诗意,但实际是NOI Online #3入门组里一道典型的模拟几何思维边界处理综合题。它不考高深算法,不堆数据结构,却像一块试金石——能筛出真正理解“问题…

2026/10/15 23:48:01 阅读更多 →
2026年Java面试26个核心考点:从原理到实战的完整追问指南

2026年Java面试26个核心考点:从原理到实战的完整追问指南

最近后台收到一堆同学的面试复盘,印象最深的一条是:面某中厂后端,三轮面试没有一轮直接问“HashMap原理背一遍”,而是从“线上偶发死锁怎么排查”聊起,顺藤摸瓜把线程状态、锁升级、字节码甚至操作系统调度全串了一遍。…

2026/10/15 23:48:01 阅读更多 →
Viap 应用迁移工具发布签名与完整性校验:GitHub Release + Minisign 全流程拆解

Viap 应用迁移工具发布签名与完整性校验:GitHub Release + Minisign 全流程拆解

【免费下载链接】viap Windows application management and data migration tool. 项目地址: https://gitcode.com/gh_mirrors/vi/viap 点击查看 免费下载 Viap 是一款 Windows 应用管理与数据迁移工具(Tauri React Rust 构建)。它通过 Gi…

2026/10/15 23:48:01 阅读更多 →
Windows下KuiklyUI鸿蒙跨平台开发:工具链配置与编译脚本实战

Windows下KuiklyUI鸿蒙跨平台开发:工具链配置与编译脚本实战

在Windows上做鸿蒙跨平台开发,很多人习惯先把IDE打开,把模板工程跑起来再说。真到了团队协作和持续出包的阶段,就会发现环境配置和编译脚本这件事,比写UI代码更早变成拦路虎。KuiklyUI要解决的是跨端UI复用,但Windows下…

2026/10/15 23:48:01 阅读更多 →
CCNA必学:交换机MAC地址静态绑定与端口安全实战指南

CCNA必学:交换机MAC地址静态绑定与端口安全实战指南

1. 从一个真实故障说起:为什么MAC地址绑定不是选修课刚入行那会儿,我在一个中小型企业的网络改造项目里踩过一个经典的坑。当时办公区一台接入层交换机下面挂了二十多台设备,某天开始间歇性断网,用户反馈时好时坏,重启…

2026/10/15 23:47:01 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →