C++/Qt跨平台云笔记实战:TCP文件存储与C/S架构解析
简介这是一份基于C跨平台的云笔记设计与实现的完整论文PDF面向计算机专业学生、C/Qt开发学习者以及需要搭建C/S架构云笔记项目的开发者。资源针对跨平台云笔记协作问题给出了一套基于C/S架构的完整技术方案选用C语言、TCP协议和Qt框架系统论述了需求建模、用例分析、功能详细设计、系统实现与多平台登录测试等环节。文档详细说明了用户注册登录、笔记在线管理、管理员后台审核、跨平台实时同步等核心功能并展示了如何通过Qt统一底层API实现一套代码多平台编译运行以及采用TCP保证数据传输的可靠顺序性、使用文件方式完成笔记云端存储的具体做法。此外还涉及笔记重命名、删除、违规审查等细节可作为实际开发的直接参考。资源仅有1个PDF文件大小约1.48MB内容结构完整便于阅读。目前已有238人学习适合用于课程设计、毕业设计或跨平台应用开发技术入门。1. 用C搭一个跨平台云笔记这份资源能复现到什么程度一句话先把价值说清这份基于C、Qt和TCP协议的跨平台云笔记项目不是那种只有界面的Demo而是一个真实跑通C/S架构的课程设计源码包把注册登录、新建、修改、重命名、删除笔记和管理员审查这条完整流程都实现了。它吸引我的点是存储层没用数据库而是用纯文件方式——用户文件夹、booklist.txt、book文件夹三层结构数据搬走就能迁移对学习TCP通信和文件存储的同学来说反而更容易看透。适合正在做Qt课程设计的人想补C/S通信实战的人以及后面想扩展成数据库版云笔记的入门者。资源里含客户端与服务端工程源码、测试程序和设计文档下面我把架构选型、关键模块、文件存储细节和踩坑记录逐一展开。2. 架构与技术选型C/S、TCP、Qt三者为什么绑在一起读这个项目的源码之前我建议先把选型逻辑理清楚。很多人拿到代码第一反应是找界面但真正决定这个系统能不能跨平台跑的是通信协议和UI框架这两层地基。2.1 为什么用C/S而不是B/S原项目的业务场景很明确用户在自己电脑上写笔记保存到服务器换一台电脑也能看。这种场景其实B/S也能做但原论文选择C/S架构核心考量是本地编辑体验。Qt是原生编译的桌面框架笔记本地打开编辑区输入响应不依赖浏览器渲染离线时还能保留本地编辑的余地。C/S的另一个好处是服务器只做数据存取和审查不用扛Web页面渲染的负载私有云部署时端口和权限更好控制。我拿到这个资源后第一件事就是看客户端和服务端是不是解耦的。原项目的服务端是独立进程客户端通过TCP发请求服务端处理完写文件两者没有直接函数调用。这种结构的好处是后续想换成数据库存储服务端内部改动不会波及客户端协议。2.2 TCP在文件存储型系统里的角色原项目用TCP而不是UDP是因为笔记内容不允许丢包。你写了一段文字点保存后TCP保证数据按序到达服务器重传机制处理丢包。对于云笔记这种低并发、小数据包的业务TCP的可靠性远比UDP的实时性重要。原项目的请求类型大概是登录、注册、保存、修改、删除这几种每种请求用自定义协议字段区分。实现中需要注意粘包问题后面避坑章节我会单独讲处理方式。2.3 Qt跨平台底层API抽象与代码级兼容Qt的跨平台原理不是把界面写成网页再套壳而是在编译层面对底层API做了抽象。比如文件读写、网络套接字、线程Qt都封装了统一接口Windows上调用WinSockLinux上调用BSD SocketmacOS上调用对应的Cocoa API但上层代码保持一致。原项目的目标是一套代码分别在三台机器上编译Windows、macOS、Ubuntu各出一个运行文件这是一处编译、处处编译的模型。这里有个实际前提Qt版本和编译器要配对。用Qt 5.15的话Windows上配MinGW或MSVCUbuntu上配GCCmacOS上配Clang工程文件需要按平台分别做一次qmake或CMake配置。提示跨平台不是零成本。原项目能一套代码编三个平台是因为它没有用Windows特有的API也没有依赖第三方库。如果添加了某个平台专属库跨平台能力立刻破功。3. 客户端与服务端的骨架实现从Qt界面到TCP收发3.1 客户端三块结构登录、标题栏、编辑区原项目的界面逻辑很清晰左侧是笔记标题列表右侧是笔记编辑区顶部有保存、删除、刷新按钮。用户登录后服务端把该用户booklist.txt里的标题全部返回客户端按行解析填充到列表控件。点击某个标题客户端向服务端请求该篇笔记的内容服务端读取book文件夹里对应标题名的文件把内容返回。我一般会把客户端网络部分单独封装一个类不直接写在窗口类里这样界面重绘时不会阻塞网络接收。下面是最小骨架class NoteClient : public QObject { Q_OBJECT public: explicit NoteClient(QObject *parent nullptr); void connectToServer(const QString host, quint16 port); void sendRequest(int cmd, const QByteArray payload); private: QTcpSocket *socket_; QByteArray buffer_; signals: void responseReady(int cmd, const QByteArray data); };逻辑说明connectToServer负责建立TCP连接对应原项目登录前的前置连接。sendRequest把业务码cmd和正文payload拼成数据包发出。buffer_是接收缓冲区因为TCP是流式协议服务端分多次发送的字节需要在缓冲区里重新按包裁剪。参数说明cmd是自定义协议号比如1表示注册、2表示登录、3表示新建笔记、4表示修改、5表示删除payload是UTF-8编码的JSON或纯文本字段。3.2 数据包协议与粘包处理长度字段放在最前这个项目没有用HTTP而是自定义的TCP协议所以收发双方必须约定包格式。原项目的代码我没有看到统一协议头但合格做法是用“4字节长度 2字节命令 正文”的格式。下面是我在处理粘包时常用的拆包写法QByteArray buffer_; void NoteClient::onReadyRead() { buffer_.append(socket_-readAll()); while (buffer_.size() 6) { int len (unsigned char)buffer_[0] 8 | (unsigned char)buffer_[1]; short cmd (unsigned char)buffer_[2] 8 | (unsigned char)buffer_[3]; (void)cmd; // 实际业务按cmd分发 if (buffer_.size() len 4) return; // 半包等下一次数据 QByteArray payload buffer_.mid(4, len); buffer_.remove(0, len 4); emit responseReady(cmd, payload); } }逻辑说明每次readAll后先检查缓冲区内是否凑够一个完整包——前4字节是长度和命令正文长度与头部声明的len比对不够就等待下一轮数据。这里的关键是把粘包、半包一起处理掉多个包粘在一起时用循环拆包还没收满时直接return。如果你在原项目里看到的是简单readAll然后按行处理那它在多笔记标题返回时会偶尔出问题建议改成这个格式。参数说明len我用两个字节表示最大支持65535字节的正文对普通笔记内容足够cmd用两个字节冗余是为了后续扩展管理员指令。3.3 服务端文件目录booklist.txt、book文件夹、用户表的分工这是整个项目最有特点的地方。原项目不用数据库用三层文件结构noteserveruser.txt所有用户信息每行一个用户名和密码用户文件夹/用户名每个用户一个目录用户文件夹/booklist.txt该用户的笔记标题列表每行一个标题用户文件夹/book/目录下每个笔记一个文本文件文件名与标题一致。这个设计的好处是备份和迁移极其方便整个数据目录拷贝走系统换机器也不受影响。坏处是并发安全要靠代码控制两个用户同时写同一个文件没有数据库的行锁来兜底。服务端核心处理逻辑类似这样void NotesServer::handleSaveNote(const QString user, const QString title, const QByteArray content) { QString userDir QString(data/%1).arg(user); QDir().mkpath(userDir /book); QFile listFile(userDir /booklist.txt); if (!listFile.open(QIODevice::ReadOnly | QIODevice::Text)) return; QSetQString titles; while (!listFile.atEnd()) { titles.insert(QString::fromUtf8(listFile.readLine()).trimmed()); } listFile.close(); titles.insert(title); if (!listFile.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text)) return; for (const auto t : titles) { listFile.write(t.toUtf8() \n); } listFile.close(); QFile noteFile(userDir /book/ title .txt); noteFile.open(QIODevice::WriteOnly | QIODevice::Truncate); noteFile.write(content); }逻辑说明保存笔记时先读booklist.txt收集已有标题依赖QSet去重保证标题不重复然后重写整个列表最后把正文写入book目录下对应的文件。注意这里的重写列表是先读后写两台设备同时访问时有并发风险。参数说明user就是登录用户名也作为文件夹名title直接拼进文件路径因此标题里不能包含/和\这类路径分隔符否则服务端会写错目录。我一般会把标题做一次白名单过滤只允许中英文、数字、下划线和连字符这个限制要写进客户端服务端再校验一次。注意文件名即标题这个设计虽然直观但在Windows下还有长度限制标题超过200个字符时保存会异常后面坑会具体说。4. 五个核心业务模块跑通注册、登录、新建、改名、删除的代码顺序4.1 注册登录的校验流程与服务端写盘顺序注册流程原项目里是客户端把用户名密码发给服务端服务端先读noteserveruser.txt检查用户名是否已存在。这里的关键是写盘顺序必须先检查、再追加否则会出现注册重复用户。文件操作不是原子的两个用户同时注册同一个用户名时需要加锁原项目用简单方式即服务端对写操作串行处理。密码存储原文没提加密课程设计层面大多直接明文存储但如果要部署到真实环境至少要做一次hash再存。登录流程则反向读文件逐行比对用户名和密码匹配后把该用户的booklist.txt内容返回给客户端。bool NotesServer::parseLogin(const QString line, QString user, QString pwd) { int idx line.indexOf(:); if (idx 0) return false; user line.left(idx); pwd line.mid(idx 1).trimmed(); return true; }逻辑说明用户信息文件每行格式是“用户名:密码”解析时以第一个冒号为界。这里有个细节密码本身如果包含冒号会解析错所以注册时应该限制密码中不能出现冒号。参数说明建议用户名限制在16字符内密码8到32字符客户端和服务端双重校验。原项目这个文件是纯文本逐行读所以不能用序号字段删除用户时也要重写整个文件。4.2 新建笔记从编辑区到服务器文件的完整路径新建笔记时用户输入标题编辑区输入正文点保存。客户端把标题和内容打包发给服务端服务端执行保存。这个流程看似简单实际有三个容易乱的点标题去重、空内容处理、标题白名单。先去重新建时服务端检查booklist.txt里有没有同名标题有则提示用户改名而不是静默覆盖。原项目处理方式我补一下逻辑如果标题已存在就做覆盖或报错。我倾向于新建时严格报错修改时才是覆盖。这样能避免用户新建笔记不小心覆盖旧笔记。空内容处理有些课程设计不检查空笔记导致book文件夹里出现0字节文件。建议在服务端判断内容长度为0时仍然写入标题但正文文件写一个占位符例如“空笔记”这样列表点进去不会一片空白。4.3 重命名与修改笔记两处文件要同时改重命名这个功能是原论文里专门提过的细节服务端要改两个地方把booklist.txt里的旧标题替换为新标题再把book文件夹里旧标题文件重命名为新标题文件。顺序上有讲究先改文件系统里的文件名再更新booklist.txt。如果先写列表再重命名文件中间发生崩溃就会出现列表里显示新标题、文件里还是旧名字的状态。QString oldPath QString(%1/book/%2.txt).arg(userDir, oldTitle); QString newPath QString(%1/book/%2.txt).arg(userDir, newTitle); QFile::rename(oldPath, newPath); rewriteTitleInList(userDir, oldTitle, newTitle);逻辑说明rename是Qt的静态方法在Windows和Linux下都能用但要注意Linux下对大小写敏感Windows的NTFS默认不敏感。如果只改标题大小写比如从“note”改成“Note”Windows下rename会直接报错Linux下却成功这是跨平台最容易翻车的一个点。参数说明newTitle必须经过和新建时相同的白名单校验我一般把白名单校验抽成一个公共函数三个业务模块共用。4.4 删除笔记清空内容再移除标题的次序设计删除逻辑原文明确写了先判断book文件夹下是否有对应文章执行删除语句先把笔记内容清空再把标题从文本中去除。这个顺序很关键先删文件内容再删标题万一服务端在两步之间崩溃booklist.txt里有个标题但文件已经空了用户可以看到标题但打不开内容这比文件还在但列表没标题好诊断。bool NotesServer::deleteNote(const QString user, const QString title) { QString filePath QString(%1/book/%2.txt).arg(userDir, title); QFile noteFile(filePath); if (noteFile.exists()) { noteFile.remove(); } return removeTitleFromList(userDir, title); }逻辑说明removeTitleFromList的实现是读booklist.txt过滤掉目标行重写文件。这里注意要处理标题不存在的情况——原项目在删除时做了存在性判断这一层不能省否则客户端误删时服务端静默返回成功用户以为删了其实还在刷新后笔记又回来了看起来就像灵异事件。参数说明这个函数返回bool客户端应根据返回值弹提示删除失败时不要刷新列表避免界面状态与服务器不一致。5. 踩坑与排查三端联调最容易翻车的五个细节5.1 Windows路径分隔符在Linux下失效现象在Windows上开发调试都正常把整个工程拷到Ubuntu下编译发现新建笔记保存不了服务端报文件打开失败。原因Windows用反斜杠分隔路径Linux用正斜杠。代码里如果有人写了data\user1\book\a.txt这种硬编码在Linux下就成了一个带反斜杠的文件名目录根本不存在。解决全项目禁止手写路径分隔符统一用QDir::separator()或直接用/Qt在Windows下也能正确识别正斜杠。我建议直接用正斜杠Qt底层会做转换比调separator少写一堆分支。5.2 booklist.txt多用户并发写冲突现象两个客户端同时登录一个在新建笔记另一个在删除笔记服务端偶尔出现booklist.txt内容丢失只剩一行。原因服务端对文件的写操作不是原子的两个请求同时读旧列表A写入后B用旧数据覆盖A的新标题没了。解决给文件操作加一个互斥锁服务端是单进程只需要QMutex保护。我一般会在服务端类里加一个成员锁所有涉及booklist.txt和book文件夹的操作都走同一个锁。如果以后换成数据库这层锁可以拆掉。5.3 Qt中文乱码与编码统一现象Windows下写的笔记拿到macOS上打开标题正常但正文乱码。原因Windows下Qt默认代码页可能是GBKmacOS和Linux强制UTF-8两边字符串编码不一致。解决所有网络传输和文件读写统一UTF-8。客户端发送前转UTF-8服务端写入前也强制UTF-8。代码里QString::fromUtf8和QByteArray::toUtf8这对着重检查不要依赖QTextCodec的全局默认编码。原项目没有提到这个细节但这几乎是跨平台Qt应用必踩的坑。5.4 TCP粘包、半包与断线重连现象笔记内容一长客户端收到的内容缺尾或者一个包混了两条笔记。原因TCP是字节流没有消息边界。发送端调一次write内核可能拆成多次发送接收端一次readAll可能收到多个业务包。如果客户端直接拿readAll结果当作一条笔记内容数据就错位了。解决按3.2节的协议格式长度字段必须加。断线重连方面Qt的QTcpSocket在网络断开后不会自动重连需要重写connection事件后主动connectToServer。我在这类项目里会让客户端保存最后一次操作数据断线重连成功后自动补发。5.5 管理员二次审查与笔记恢复的边界现象管理员删了一篇违规笔记用户申诉后管理员二次审查发现误判恢复笔记但原笔记内容已经没了。原因原项目管理员删除是直接删文件没有回收站或软删除机制。恢复只能恢复标题内容找不回来。解决最轻量的做法是删除时把笔记文件改名加后缀.deletedbooklist.txt里去掉标题申诉恢复时改回文件名。如果原项目没有这个机制这是你扩展时最值得做的一步耗时半小时但答辩时能讲出一个完整闭环加分明显。6. 从能跑到能演示三端并行测试与一个不起眼的完善技巧6.1 三台终端并行验证的方法原项目测试方式可以直接复用两端不同系统加上服务端启动测试程序重点看服务端能否按顺序处理多个客户端的操作。我一般会先在一台Windows机器上启动服务端再分别开Windows、macOS和Ubuntu三台客户端同时登录并各写一篇笔记然后在服务端日志里检查三个会话的接收顺序。6.2 服务端操作日志输出习惯原项目的测试程序在Debug输出栏跟踪每一步操作这个习惯建议保留到正式代码里所有保存、删除、重命名操作都输出一条带时间戳的日志能省掉大量排查时间。6.3 保存操作先写临时文件再改名我在复现这类项目后学到的最有用的一招笔记正文别直接写最终文件先写到同目录下的临时文件再rename成目标文件名。这样写入中断时最终文件不会损坏最多留下一个临时文件下次启动服务端时清理掉即可。从那以后我每次拿到带文件存储的C/S项目都会先检查有没有这个保护没有就补上。这个改动只有十几行成本但对数据安全的价值很高希望帮到你。本文还有配套的精品资源点击获取

相关新闻

S7-200 PLC与组态王在污水处理控制系统中的设计与应用

S7-200 PLC与组态王在污水处理控制系统中的设计与应用

1. 为什么选择S7-200 PLC与组态王组合来做污水处理控制污水处理控制系统的改造项目,我在几年前就接触过不少。当时市面上有很多方案可选,比如直接用西门子S7-1200加博途、用国产PLC加自有组态软件、或者干脆用DCS系统。但最终我们在一批中小型污水处理站…

2026/10/15 5:31:21 阅读更多 →
DeepSeek实习生日薪5500背后:AI人才定价重构与HR体系突围

DeepSeek实习生日薪5500背后:AI人才定价重构与HR体系突围

清华姚班实习生日薪5500元,按22个工作日折算月薪达到12.1万。这组数字将DeepSeek推上了热搜榜首。外界的第一反应多是震惊与质疑,紧随其后的则是对AI行业薪资泡沫的感慨。然而,停留在对绝对金额的惊叹上,往往会掩盖事件背后更深刻…

2026/10/15 5:31:21 阅读更多 →
mbedtls嵌入式ARM移植实战:从源码到QEMU验证的全流程记录

mbedtls嵌入式ARM移植实战:从源码到QEMU验证的全流程记录

简介:面向ARM嵌入式开发与芯片验证人群的mbedtls移植实操记录,完整演示了从源码仓库获取、工程模板创建,到库目录拷贝、Makefile编译选项修改及自测函数调用的全流程。文档以PDF文件呈现,包内仅1个文件,压缩后约199KB&…

2026/10/15 5:31:21 阅读更多 →

最新新闻

HDFS面试避坑指南:从NameNode内存到DataNode心跳的实战解析

HDFS面试避坑指南:从NameNode内存到DataNode心跳的实战解析

1. 为什么“HDFS面试基础知识点”这个标题背后藏着一场隐性淘汰赛刚带完一批某高校实验室的分布式系统实训,有个细节让我印象深刻:A同学在模拟面试中被问到“HDFS写入流程里,Client和NameNode交互几次?DataNode之间要不要通信&…

2026/10/15 10:13:13 阅读更多 →
近视防控的科学原理与实用方案详解

近视防控的科学原理与实用方案详解

1. 近视防控的底层逻辑与现状分析近视的本质是眼轴过长或角膜曲率过陡导致光线无法准确聚焦在视网膜上。根据2020年国家卫健委发布的数据,我国儿童青少年总体近视率已达52.7%,其中小学生35.6%、初中生71.1%、高中生80.5%。这个数字背后反映的是现代生活方…

2026/10/15 10:13:13 阅读更多 →
H5 Canvas粒子爆炸特效:从零实现到二次开发指南

H5 Canvas粒子爆炸特效:从零实现到二次开发指南

简介:面向网页特效开发者的Canvas粒子爆炸动画示例,基于HTML5 Canvas API实现彩色粒子文字背景,通过JavaScript控制粒子生成、运动与消散,让文字在爆炸与重组中呈现强烈的视觉冲击,适用于个人主页、活动专题页等场景的…

2026/10/15 10:13:13 阅读更多 →
预测市场技术架构与流动性引擎解析

预测市场技术架构与流动性引擎解析

1. 道琼斯视角下的预测市场新范式当传统金融数据巨头开始关注预测市场领域时,这个细分赛道正在发生质的变化。Polymarket作为去中心化预测市场的典型代表,其构建的170工具生态不仅重新定义了信息聚合方式,更在主流化进程中展现出独特的价值捕…

2026/10/15 10:13:13 阅读更多 →
基于机器视觉的智慧阅卷系统测控技术与仪器计算机毕业设计选题机器学习项目

基于机器视觉的智慧阅卷系统测控技术与仪器计算机毕业设计选题机器学习项目

✅源码获取: 🍅--------------------【左上方头像,置顶文章的最上方】联系我们------------------🍅✌网站介绍:✌10年项目辅导经验、专注于计算机技术领域学生项目实战辅导。✌服务范围:大数据、机器学习、…

2026/10/15 10:13:13 阅读更多 →
计算机网络第一章核心:分层抽象与自顶向下设计思维

计算机网络第一章核心:分层抽象与自顶向下设计思维

1. 这不是背诵清单,而是网络思维的起点:为什么第一章必须“自顶向下”重学“计算机网络自顶向下复习重点-第一章”——看到这个标题,很多正在备考的同学第一反应是翻书、划线、默写五层模型。但我在带过十几届网络课程助教、参与过多个中小型…

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

日新闻

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/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →