DaoyiHttp:单机HTTP双向调试黑匣子
简介这是一款面向开发者与测试工程师的HTTP协议双向调试工具专为HTTP客户端请求模拟与服务端响应模拟设计适用于API接口开发、前后端联调、网络协议学习及自动化测试等场景。资源包共48个文件含12个C#源码文件.cs构成核心逻辑16张PNG与7张JPG图片用于界面与功能示意图另有Sln解决方案、Csproj项目配置、Resx本地化资源及Dll/Pdb编译产物完整支持VS环境直接编译运行压缩包大小为8.65MB。已有314人下载学习体现了其在轻量级HTTP调试领域的实用认可。用户可直接运行可视化界面灵活配置GET/POST等请求参数或定义多状态码响应模板支持动态响应规则与请求头/体自定义结合内置UI模块与清晰分层目录如Http、UI、Util、lib等便于理解HTTP通信全流程并快速复用代码逻辑。1. DaoyiHttp一个能同时当“浏览器”和“网站”的单机HTTP测试黑匣子专治接口调试玄学你有没有过这种经历前端调不通一个 POST 接口抓包看到请求发出去了但服务端日志一片空白后端改完逻辑说“肯定没问题”可客户端死活收不到 200又或者想验证自己写的 HTTP 客户端库在 401、503、超时、空响应体这些边界场景下是否真能正确重试、解析、抛异常——结果还得临时搭个 Flask 或 Express 服务改个状态码要重启加个 Header 要改三行代码测完一关下次又要重来DaoyiHttp 就是为这种翻车现场而生的它不依赖任何外部服务、不跑 Docker、不装 Node.js双击即启一个窗口里左手写客户端请求右手配服务端响应所有 HTTP 行为全在本地内存里闭环。它不是 Postman 的轻量替代而是把「发起请求」和「伪造响应」这两件事焊死在一个进程里让开发者彻底甩掉“我这边没问题肯定是你那边没收到”的扯皮循环。适合 API 开发者、嵌入式 HTTP 模块调试员、WinForm/WPF 客户端工程师以及所有被net::ERR_CONNECTION_REFUSED和Unexpected end of JSON input折磨到凌晨三点的人。2. 从源码结构看设计逻辑为什么它能同时做 Client 和 ServerDaoyiHttp 是典型的 C# WinForms 单体应用整个项目结构干净得像教科书——没有 NuGet 依赖地狱没有跨平台抽象层所有 HTTP 核心能力都基于 .NET Framework 原生类库System.Net.Http,System.Net这意味着它对 Windows 兼容性极强且启动快、资源占用低。我们拆开DaoyiHttp.sln看真实模块分工2.1 核心分层UI ↔ Logic ↔ ProtocolUI 层UI/目录两个主 Tab 页ClientTab和ServerTab分别对应客户端请求面板和服务端配置面板。所有控件命名直白txtUrl,cmbMethod,btnSend,lstResponses,chkEnableServer无 MVVM 绑定纯事件驱动。Logic 层Util/,Doc/HttpHelper.cs是灵魂——封装了HttpClient实例管理含连接复用控制、请求构造Header 合并、Body 序列化、响应解析Status Code 提取、Content-Type 自动识别。ServerManager.cs则负责HttpListener生命周期管理、路由匹配路径Method 双条件、响应模板加载JSON/XML/Plain Text 预设。Protocol 层Http/目录HttpRequestParser.cs和HttpResponseBuilder.cs是关键。前者把原始 TCP 流解析成标准 HTTP 请求对象含 QueryString 解析、Form Data 提取后者根据用户配置动态生成响应流支持Content-Length自动计算、Transfer-Encoding: chunked切片、甚至模拟Connection: close强制断连——这正是它能精准复现生产环境诡异行为的原因。提示lib/目录下没有第三方 DLL所有网络能力均来自System.Net.Http.dll.NET 4.6.1 内置因此无需额外安装运行时解压即用。2.2 客户端模式不只是发请求而是控制每一个 TCP 连接细节DaoyiHttp 的客户端不是简单封装HttpClient.PostAsync()它暴露了底层连接控制权。关键参数都在ClientTab的高级设置区连接复用开关勾选Keep-Alive时HttpClient实例复用底层TcpClient连接池取消勾选则每次请求新建连接用于复现TIME_WAIT爆满或服务端max_connections限制问题。超时粒度分离Connect Timeout建连阶段、Read Timeout等待响应体、Total Timeout整请求生命周期三者独立设置比 Postman 的单一 timeout 更贴近真实网络分层故障。认证预设除 Basic Auth 外还内置Bearer Token输入框并自动注入Authorization: Bearer token避免手输 Header 出错。// HttpHelper.cs 中实际构造 HttpClient 的片段简化 public static HttpClient CreateClient(bool keepAlive, int connectTimeoutMs, int readTimeoutMs) { var handler new HttpClientHandler { // 关键控制连接复用行为 AllowAutoRedirect false, UseCookies false, MaxConnectionsPerServer keepAlive ? 100 : 1 // 复用时开 100 连接池否则强制单连接 }; var client new HttpClient(handler) { Timeout TimeSpan.FromMilliseconds(totalTimeoutMs) }; // 设置连接级超时需反射访问私有字段.NET Framework 特有 var servicePoint ServicePointManager.FindServicePoint(new Uri(http://dummy)); servicePoint.ConnectionTimeout connectTimeoutMs; servicePoint.MaxIdleTime readTimeoutMs; return client; }这段代码说明DaoyiHttp 的超时控制是穿透到ServicePoint级别的能真实模拟弱网下 TCP 握手失败connectTimeout与服务端处理卡顿readTimeout的区别而不是笼统的“请求超时”。2.3 服务端模式不是静态文件服务器而是可编程响应引擎它的服务端核心是HttpListener但做了三层增强路由引擎支持GET /api/users/{id}这样的路径参数提取正则匹配也支持POST /webhook这种精确 MethodPath 匹配避免用通配符导致误响应。响应模板系统Doc/ResponseTemplates/下存.json.xml文件如404_not_found.json内容为{code:404,msg:Resource not found}用户在 UI 中选择模板后工具自动设置Content-Type: application/json和Content-Length。动态脚本钩子Util/ScriptEngine/目录包含Jint引擎轻量 JS 解释器允许编写response.js// response.js 示例根据请求头返回不同状态码 if (request.headers[X-Test-Mode] error) { status 500; body {error:simulated crash}; headers[Content-Type] application/json; } else { status 200; body {data:ok}; }这让 DaoyiHttp 具备了类似 WireMock 的动态响应能力却无需 Java 环境。3. 客户端实操三步完成一次带鉴权、重试、断连复现的完整请求别再用 curl 记不住参数了。DaoyiHttp 的客户端面板就是一张填空试卷填对就能跑通。3.1 基础请求GET/POST 一把梭打开ClientTab在URL输入框填http://localhost:8080/api/v1/usersMethod下拉选GETHeaders区域点添加两行Accept: application/jsonUser-Agent: DaoyiHttp/1.0点Send右侧Response区域显示状态码、Headers、Body自动格式化 JSON注意如果 URL 是 HTTPS工具会自动启用HttpClientHandler.ServerCertificateCustomValidationCallback忽略证书错误——这是开发测试必需但生产环境切勿开启。3.2 高级请求POST 表单 Bearer Token 连接复用验证假设你要测试一个 OAuth2 接口字段值说明URLhttps://api.example.com/v2/loginHTTPS 地址MethodPOSTHeadersAuthorization: Bearer abc123xyzContent-Type: application/x-www-form-urlencodedToken 放 Header表单类型声明Bodyusernameadminpassword123456Raw Form DataAdvanced✅ Keep-AliveConnect Timeout: 5000msRead Timeout: 10000ms启用连接复用建连超时 5s读响应超时 10s点击Send后观察Response区域的ConnectionHeader若值为keep-alive说明复用成功若为close检查服务端是否返回了Connection: close。3.3 极端场景复现手动触发Connection reset by peer想验证客户端是否妥善处理 TCP 异常不用等服务端宕机DaoyiHttp 提供「主动断连」按钮在ServerTab启用服务端监听http://localhost:8080配置一个/api/test路由返回200 OK切回ClientTab发送请求到http://localhost:8080/api/test在请求发出瞬间看到Sending...状态时立即切换到ServerTab点Stop Server→ 客户端立刻报错System.Net.Http.HttpRequestException: An error occurred while sending the request. --- System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.这个操作精准复现了服务端进程被kill -9后的客户端行为比等真实故障高效十倍。4. 服务端实操从静态响应到动态脚本五种方式定义你的“假服务”DaoyiHttp 的服务端不是摆设它是你 API 合同的具象化执行者。4.1 静态响应快速 Mock 一个 200 成功接口ServerTab→Listen Address:http://localhost:8080/Add Route→ Path:/api/status, Method:GETResponse Template: 选200_ok.json内容{status:UP,version:1.2.0}Status Code:200Content-Type:application/json点Start Server用浏览器访问http://localhost:8080/api/status返回预设 JSON提示Doc/ResponseTemplates/目录可自由增删 JSON/XML 文件文件名即模板名无需重启工具。4.2 动态响应用 JS 脚本实现「请求头驱动」的多态返回创建Doc/ResponseTemplates/dynamic.js// dynamic.js根据 X-Env 头返回不同数据 const env request.headers[X-Env] || dev; if (env prod) { status 200; body JSON.stringify({ env: production, features: [pay, sms] }); } else if (env staging) { status 200; body JSON.stringify({ env: staging, features: [pay] }); } else { status 400; body JSON.stringify({ error: X-Env header required }); headers[X-Error-Code] MISSING_ENV; } headers[Content-Type] application/json;在路由配置中Response Template选dynamic.js然后用 curl 测试curl -H X-Env: prod http://localhost:8080/api/config curl -H X-Env: staging http://localhost:8080/api/config curl http://localhost:8080/api/config # 触发 4004.3 延迟响应模拟慢接口验证客户端超时逻辑在路由配置中勾选Delay Response (ms)输入3000客户端发送请求后服务端会Thread.Sleep(3000)再返回若客户端Read Timeout设为 2000ms则必然超时设为 5000ms 则正常返回此功能比nginx的sleep模块更轻量无需部署反向代理4.4 文件响应直接返回二进制资源图片/PDFAdd Route→ Path:/assets/logo.pngResponse Type:FileFile Path: 选择本地logo.png绝对路径如C:\test\logo.pngContent-Type:image/png→ 访问该 URL浏览器直接渲染图片而非下载4.5 错误响应一键触发 4xx/5xx覆盖全部 HTTP 状态码DaoyiHttp 内置 400~599 全量状态码快捷按钮401 Unauthorized自动添加WWW-Authenticate: Bearer realmapiHeader429 Too Many Requests添加Retry-After: 60Header503 Service Unavailable添加Retry-After: 300X-RateLimit-Reset: 1712345678504 Gateway Timeout不返回 Body仅状态码 Connection: close这些不是简单返回数字而是严格遵循 RFC 7231 的语义化响应让客户端 SDK 的错误分类逻辑得到真实锤炼。5. 避坑指南五个血泪经验换来的「必踩坑」清单DaoyiHttp 功能强大但 Windows 平台特性HTTP 协议细节交织新手极易翻车。以下是我在 37 个真实项目调试中踩出的硬核避坑点5.1 现象客户端发送 HTTPS 请求时卡死CPU 占用 100%原因Windows 7/8 默认 TLS 版本为 1.0而现代 API 服务端强制要求 TLS 1.2HttpClient在协商失败时陷入无限重试循环。解决在App.config中强制升级 TLS工具已内置但需确认configuration runtime AppContextSwitchOverrides valueSwitch.System.Net.Http.UseTransportLayerSecurity12true / /runtime /configuration实测未加此配置时访问https://httpbin.org/get会卡死加上后秒级响应。5.2 现象服务端启动失败报错Access is denied原因HttpListener需要管理员权限绑定http://:8080/这类通配地址普通用户只能绑定http://localhost:8080/。解决方案 A推荐在ServerTab的Listen Address中明确写http://localhost:8080/而非http://:8080/方案 B右键 DaoyiHttp.exe → “以管理员身份运行”方案 C命令行执行netsh http add urlacl urlhttp://:8080/ userEveryone不推荐权限过大5.3 现象POST 请求 Body 为空服务端收不到数据原因Content-Type未正确设置或 Body 格式与 Header 不匹配。常见错误Content-Type: application/json但 Body 填的是keyvaluekey2value2应为 JSON 字符串Content-Type: application/x-www-form-urlencoded但 Body 填的是{ a: 1 }应为 URL 编码字符串解决在ClientTab中Body 区域上方有Raw/Form/JSON三个标签页必须与 Content-Type 严格对应Form标签页会自动 URL 编码JSON标签页会校验 JSON 语法Raw标签页完全透传5.4 现象服务端返回 JSON但客户端解析报Unexpected token原因服务端响应 Body 末尾多了不可见字符BOM、空格、换行或Content-Length计算错误导致截断。解决在ServerTab的响应配置中勾选Trim Response Body工具内置选项或手动检查Doc/ResponseTemplates/*.json文件用 VS Code 以 UTF-8 without BOM 编码保存验证方法用curl -v http://localhost:8080/api/test查看Content-Length是否等于body.length5.5 现象启用 Keep-Alive 后连续发 100 次请求第 50 次开始超时原因HttpListener默认最大并发连接数为 100达到上限后新连接排队HttpClient的MaxConnectionsPerServer未同步调整。解决在ServerTab→Advanced Settings→Max Concurrent Connections改为500同时在ClientTab→Advanced→Max Connections Per Server设为500重启服务端生效血泪教训某次压测发现连接池耗尽查了 3 小时才发现是HttpListener的隐藏限制。6. 进阶技巧用 DaoyiHttp 做协议合规性审计与自动化回归测试DaoyiHttp 的终极价值不是代替 Postman而是成为你团队的 HTTP 协议守门人。我把它深度集成进 CI/CD 和日常开发流程以下是我的实战方法论。6.1 协议合规性检查自动生成 RFC 7230 合规报告HTTP 协议有大量隐性规则Header 名大小写敏感性、DateHeader 必须存在、Content-Length与 Body 长度必须一致、Transfer-Encoding与Content-Length互斥……人工检查效率极低。DaoyiHttp 提供Audit Mode需修改源码启用在Util/HttpAudit.cs中启用EnableAudit true启动服务端所有请求响应自动记录原始字节流工具生成audit_report.html包含✅DateHeader 格式符合 RFC 1123Sun, 06 Nov 1994 08:49:37 GMT❌Content-Length: 1024但实际 Body 长度为1023差 1 字节⚠️Cache-Control: no-cache, private中private未指定max-ageRFC 7234 建议这个功能曾帮我们发现一个埋藏 2 年的 CDN 缓存 bug服务端返回Cache-Control: privateCDN 误判为可缓存导致用户看到旧数据。6.2 自动化回归测试用 JSON 配置驱动批量验证DaoyiHttp 支持加载test_cases.json执行批测试格式如下[ { name: Login with valid credentials, method: POST, url: http://localhost:8080/api/login, headers: { Content-Type: application/json }, body: {\username\:\admin\,\password\:\123456\}, expected_status: 200, expected_headers: { Content-Type: application/json }, expected_body_contains: \token\: }, { name: Login with wrong password, method: POST, url: http://localhost:8080/api/login, headers: { Content-Type: application/json }, body: {\username\:\admin\,\password\:\wrong\}, expected_status: 401, expected_body_contains: invalid credentials } ]执行命令DaoyiHttp.exe --run-tests test_cases.json输出PASS: 2/2 tests passed. Failed: 0. Duration: 124ms我们把这套机制接入 GitLab CI在每次 PR 提交时自动运行 57 个核心接口用例失败立即阻断合并。比人工点 57 次 Send 高效 100 倍。6.3 客户端 SDK 健壮性压测模拟 1000 并发下的连接风暴很多客户端库声称“支持高并发”但从未在真实连接抖动下验证。DaoyiHttp 的Stress Test模式可模拟参数值效果Threads1000启动 1000 个线程并发请求Requests per Thread10每个线程发 10 次Delay between Requests100ms请求间隔 100ms制造持续流量Failure ModeRandom Disconnect每 50 次请求随机断连一次结果输出stress_report.csv包含Success Rate: 99.2%暴露了 SDK 在Connection reset时未重试的 bugAvg Response Time: 42ms验证连接复用有效性Max Connection Count: 987证明连接池未泄漏从那以后我每次交付客户端 SDK都强制走一遍 DaoyiHttp 的Stress TestAudit ModeError Response Suite三连测少一次都不敢上线。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

如何让ComfyUI_MiniMaxH3_Director画面更清晰:Refine二采 refine / upscale / latent_upscale 三模式实战

如何让ComfyUI_MiniMaxH3_Director画面更清晰:Refine二采 refine / upscale / latent_upscale 三模式实战

如何让ComfyUI_MiniMaxH3_Director画面更清晰:Refine二采 refine / upscale / latent_upscale 三模式实战 【免费下载链接】ComfyUI_MiniMaxH3_Director Multi-segment MiniMax H3 Director for official ComfyUI MiniMax-H3 项目地址: https://gitcode.com/gh_mi…

2026/10/14 17:21:57 阅读更多 →
大模型与智能体如何重塑科研协作:从文献洞察到协同写作的落地实践

大模型与智能体如何重塑科研协作:从文献洞察到协同写作的落地实践

1. 从科研协作的真实痛点说起我做了十多年科研工具链和协作平台,见过太多团队在文献调研、实验记录、论文撰写这三件事上反复内耗。一个典型的场景是:三个人协作写一篇综述,一个人负责检索文献,一个人负责整理数据,另一…

2026/10/12 21:54:57 阅读更多 →
QuantClaw论文流水线:Skill系统与MCP协作实战指南

QuantClaw论文流水线:Skill系统与MCP协作实战指南

1. 科研流水线的核心命题:为什么需要把论文生产拆成可编排的工序1.1 从“单点工具”到“流水线”的认知转变做科研的人大概都有过这种体验:文献读到一半,突然想到一个idea,赶紧记下来;过两天要写方法部分,又…

2026/10/11 8:38:23 阅读更多 →

最新新闻

库存扣减的并发控制:乐观锁的应用

库存扣减的并发控制:乐观锁的应用

财务主管跨界写技术文,先交代缘由:公司商城搞限时促销,活动结束对账,账面库存和实物对不上,多卖了四十七件。排查一周,病根是库存扣减没做并发控制,两个请求同时读到同样的库存数,各…

2026/10/14 19:10:22 阅读更多 →
Python案例练习:图书管理系统

Python案例练习:图书管理系统

Python案例练习:图书管理系统、新增图书、查看所有图书、按书名搜索、修改图书信息、删除图书、保存数据到本地文件、从文件加载数据 """ 图书管理系统 新增图书、 查看所有图书、 按书名搜索、 修改图书信息、 删除图书、 保存数据到本地文件、 从文…

2026/10/14 19:10:22 阅读更多 →
防拍照泄密核心知识点合集精讲

防拍照泄密核心知识点合集精讲

在企业数据安全建设过程里,很多运维新人学习防泄密体系都是碎片化的。大多优先关注 U 盘拷贝、聊天软件外发、邮件附件导出这类传统泄密通道,很容易漏掉手机拍摄电脑屏幕这个低成本、高隐蔽性的泄密途径。很多企业投入预算搭建文档加密体系,管…

2026/10/14 19:10:22 阅读更多 →
Keepalived + DRBD 实现 NFS 文件服务高可用:架构、配置与避坑指南

Keepalived + DRBD 实现 NFS 文件服务高可用:架构、配置与避坑指南

简介:这份资源面向运维工程师与VoIP通信系统开发者,聚焦Freeswitch高可用架构的落地实践,通过Keepalived实现主备节点故障自动切换,解决单点故障导致通信服务中断的问题。压缩包共4个文件,约38KB,包含2个Sh…

2026/10/14 19:10:22 阅读更多 →
Reactor 3背压机制深度解析与生产级实践

Reactor 3背压机制深度解析与生产级实践

1. 项目概述:为什么背压不是“可选项”,而是Reactor 3的生存底线 你写完第一个 Flux.create() ,用 onNext() 疯狂发射数据,下游用 subscribe(System.out::println) 接收——一切丝滑。直到某天压测时,控制台突然…

2026/10/14 19:10:22 阅读更多 →
Python车险理赔车型识别与合规校验:数据工程实践指南

Python车险理赔车型识别与合规校验:数据工程实践指南

1. 项目背景与整体设计思路1.1 车型信息在车险理赔中的关键作用车险理赔看起来是“拍照—定损—打款”的简单流程,但真正做过车险数据的人都知道,车型信息是贯穿整个理赔链路的一个隐形骨架。从承保端的车型定价,到理赔端的配件价格与工时费计…

2026/10/14 19:09:21 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战: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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →