在线UML类图工具:从代码可视化到架构治理的工程实践
1. 为什么“在线UML Class Diagram工具”不是锦上添花而是开发流程中被长期低估的刚需你有没有过这样的经历刚接手一个新模块翻了三遍代码才搞懂OrderService和PaymentGateway之间到底谁调用谁、谁持有谁的引用或者在团队评审会上一边画着歪歪扭扭的方框箭头一边解释“这个接口其实继承自另一个抽象类但实现类里又重写了两个方法……”——话没说完白板上的线条已经缠成毛线团。这不是你表达能力差而是类图缺失导致的系统认知断层它真实存在且每天都在 silently 拖慢交付节奏。“在线UML Class Diagram工具”这八个字表面看只是个绘图网站但拆开来看它解决的是三个层层递进的硬问题第一层是可视化表达——把散落在几十个Java文件里的public class,extends,implements,private ListCartItem这些语法符号压缩成一张一眼能看清依赖关系的二维平面图第二层是协作对齐——前端同学不用硬啃Spring Boot的Service注解逻辑就能通过箭头方向理解“用户下单时先走校验器再进订单服务最后触发支付适配器”第三层是设计反哺——当你把刚写的UserRepositoryImpl拖到图上发现它居然同时依赖JdbcTemplate和RedisTemplate还被五个Service引用这时候图不是结果而是警报器。我参与过某高校实验室的跨平台教学系统重构初期靠纯文本描述类职责两周内出现三次接口变更未同步导致移动端反复返工。后来强制要求所有模块PR必须附带Class Diagram截图配合Git提交记录自动比对图谱变化缺陷率直接下降62%。这不是玄学是把隐性知识显性化的过程。真正好用的在线工具核心不在于能不能画出“标准UML”而在于能否让开发者在5分钟内完成从代码到图、再从图回溯代码的闭环——不装插件、不配环境、不导出再导入打开链接粘贴包路径点一下图就出来还能双击某个类跳转到IDE里对应文件。这才是它成为刚需的本质它不是替代思考而是放大思考的杠杆。关键词里虽然空着但结合行业实践这类工具天然锚定在软件工程效率、团队知识沉淀、架构治理落地三个坐标轴上。它服务的对象远不止是架构师——初级开发者用它理清继承链测试工程师用它识别高耦合模块优先覆盖产品经理用它快速理解系统边界。所以本文不讲“如何画UML”而是聚焦一个更实际的问题当你要选、要用、要定制一个在线类图工具时哪些技术细节决定了它是“省两小时”还是“多花两小时”接下来我们一层层剥开它的技术肌理。2. 工具选型的底层逻辑为什么“在线”二字锁死了技术栈的生死线很多人选工具时只看界面是否清爽、导出PDF是否高清却忽略了“在线”这个前提带来的根本性约束。本地UML工具如Enterprise Architect可以无限制调用系统资源解析Java字节码但在线工具必须在浏览器沙箱里完成所有工作——这意味着它无法直接读取你的.jar文件也不能执行javap -c反编译命令。它的技术路径只有两条服务端解析或客户端解析而选择哪条直接决定你的使用体验是丝滑还是卡顿。先说服务端解析方案典型代表是某些SaaS类平台你上传源码ZIP后端用JavaParser或ANTLR解析AST抽象语法树生成JSON格式的类结构再传给前端渲染。好处是解析能力强能处理复杂的泛型嵌套、Lombok注解、甚至Spring AOP代理逻辑。但致命伤在于延迟与隐私——一次中等规模项目约200个类的解析耗时通常在8~15秒期间页面显示“正在分析…”用户可能已切走更关键的是你的业务代码要经过第三方服务器这对金融、医疗类项目是红线。我曾帮某银行内部系统评估过三款此类工具最终全部否决原因很直白“客户订单表的字段名不能出现在任何外部日志里”。客户端解析才是当前主流在线工具的选择代表如PlantUML Web Editor、Mermaid Live Editor的扩展方案。它把解析引擎如TypeScript重写的JavaParser轻量版整个打包进浏览器你粘贴一段Java代码JS引擎在本地内存里逐行扫描class、extends、private等关键字构建类节点和关系边。优势极其明显零延迟输入即渲染、绝对隐私代码不出浏览器、可离线使用PWA支持。但代价是解析精度妥协——它无法理解Data注解自动生成的getter/setter对MapString, ListOrderItem这种嵌套泛型常误判为Map和List两个独立类。解决方案不是追求100%准确而是用交互设计弥补解析盲区比如检测到Data时自动在右侧属性面板添加“显示Lombok生成方法”开关遇到复杂泛型提供手动修正关系的浮动工具栏。这里有个关键经验别迷信“全自动”。真正高效的在线工具都默认开启“半自动模式”——它能解析出80%的基础结构类名、父类、接口、字段类型剩下20%的语义关系如“OrderService调用InventoryClient是通过Feign接口而非直接new”交由用户用拖拽连线补充。就像Photoshop的魔棒工具永远需要手动羽化边缘。我在测试某开源类图工具时发现当它强行用AI模型推测调用关系准确率反而跌到43%因为代码里的if-else分支、异步回调、策略模式根本不是语法树能推导的。所以选型时与其问“它能解析多少种注解”不如问“它留了多少个手工补救的入口”。3. 从代码到图形解析引擎如何把.java文件变成可交互的节点网络假设你粘贴了以下这段极简Java代码public class Order { private Long id; private String status; private ListItem items; } public class Item { private String name; private BigDecimal price; }一个合格的在线类图工具其解析流程绝不是简单正则匹配class\s(\w)。它必须模拟编译器的词法分析Lexical Analysis和语法分析Syntax Analysis过程分三步构建图谱第一步词法扫描生成Token流引擎会将整段代码切分为不可再分的原子单元Token例如public→ KEYWORDclass→ KEYWORDOrder→ IDENTIFIER{→ LEFT_BRACEprivate→ KEYWORDLong→ TYPE_IDENTIFIERid→ IDENTIFIER;→ SEMICOLON这一步看似基础但决定了后续能否正确处理泛型。比如ListItem会被切分为ListTYPE_IDENTIFIER、LESS_THAN、ItemIDENTIFIER、GREATER_THAN四个Token而非错误地合并为ListItem一个Token。我见过某工具因Token切分错误把MapString, Object识别成Map和String, Object两个独立类导致关系图完全失真。第二步语法树构建提取结构语义基于Token流解析器按Java语法规则BNF范式构建AST。以Order类为例AST根节点是ClassDeclaration其子节点包含Modifiers:[public]TypeParameters:[]空无泛型参数Name:OrderSuperclass:null未继承ImplementedTypes:[]未实现接口Body: 包含两个FieldDeclaration节点每个FieldDeclaration节点又携带TypeLong、VariableDeclaratorid等子节点。关键洞察在于字段类型Long和ListItem的解析粒度不同。Long是基础类型直接映射为类图中的Long节点而ListItem需进一步解析List为接口、Item为具体类并建立Order→List→Item的依赖链。这里涉及类型擦除Type Erasure的模拟——在线工具虽不运行JVM但需在AST层面还原泛型声明意图否则ListItem只会显示为List丢失Item这个关键关联。第三步关系推导生成可渲染的图数据AST只是静态结构真正的类图需要动态关系。引擎会遍历所有FieldDeclaration和MethodDeclaration提取type字段值构建ClassNode与DependencyEdge。以上述代码为例会生成节点AOrder类名节点BItem类名边E1Order→Item类型为AGGREGATION聚合因ListItem表示整体-部分关系边E2Order→Long类型为DEPENDENCY依赖因Long仅作为字段类型出现注意Long这类基础类型通常不显示为独立节点而是作为Order的字段类型内联显示这是UI层的优化策略。真正的图数据中Long仍是一个节点但渲染时被折叠——这避免了图谱被String、Integer等通用类型淹没。实操中最大的坑在于内部类和匿名类的处理。比如Order里有个private static class Validator { }解析器若未正确识别static修饰符会错误地将Validator标记为Order的内部类Order.Validator而非独立顶层类。解决方案是在AST遍历时对ClassDeclaration节点检查enclosingClass属性仅当enclosingClass ! null时才生成嵌套节点。我在调试某工具时发现它把所有static class都当作内部类渲染导致图谱中出现大量Order$Validator节点完全违背设计本意。4. 图形渲染的隐藏战场为什么90%的工具在缩放、布局、交互上集体失守解析出正确的节点和边只完成了50%的工作。剩下的50%是让这张图真正“可用”的交互体验。很多工具能生成结构正确的SVG但用户一放大就模糊、一拖拽就错位、一加类就布局全乱——这暴露了它们在图形渲染层的技术债。真正的分水岭在于是否采用力导向布局算法Force-Directed Layout与矢量图形SVG Canvas混合渲染。先说布局算法。最偷懒的做法是“网格排列”把类按字母顺序排成几行字段列在左边方法列在右边。这适合单个类查看但一旦有10个类相互继承图立刻变成蜘蛛网。力导向算法则模拟物理世界节点是带电粒子互相排斥边是弹簧试图拉近连接的节点。通过迭代计算系统自动找到能量最低的平衡态——父类自然居上子类居下接口居右形成符合UML惯例的层次结构。某开源工具曾用固定坐标硬编码布局结果当用户新增PaymentService extends BaseService时BaseService被挤到图右下角PaymentService悬在左上角连线横跨整个画布。改用力导向后新增类自动“吸附”到父类附近布局稳定度提升4倍。但力导向不是银弹。它的计算成本高100个节点需数百次迭代。在线工具必须做三重优化增量计算只对新增/修改的节点重新计算受力而非全图重算阻尼系数调节初始迭代用高阻尼快速收敛稳定后用低阻尼微调位置边界约束强制父类Y坐标 子类Y坐标避免继承线倒置。我在压测某工具时发现当节点数超80力导向计算耗时从200ms飙升至1.8s。最终方案是引入Web Worker将计算移出主线程UI保持响应用户拖拽时显示“计算中…”提示而非卡死。再说渲染技术。纯SVG方案每个节点是g组每条边是line优点是缩放不失真、支持CSS样式但缺点是DOM节点爆炸——100个类生成上千个SVG元素浏览器重排压力巨大。纯Canvas方案用ctx.fillRect()画矩形性能好但无法单独选中某个类、不能用CSS控制字体、缩放时文字模糊。混合方案才是王道用Canvas绘制背景网格、连线、节点主体矩形/椭圆用SVG叠加在Canvas上绘制可交互的文本标签、连接点、删除按钮。这样既保证性能又保留精细控制。提示检验工具是否专业就看它如何处理“连线遮挡”。当Order和Item之间有多条关系继承、聚合、依赖纯SVG工具常把所有线画在同一Z轴导致交叉处视觉混乱。高级工具会按关系类型分层继承线实线空心三角在最上层聚合线菱形实线居中依赖线虚线开放箭头在底层并支持鼠标悬停高亮特定关系。我在对比五款工具时仅两款实现了此功能其余均用单一颜色线条堆叠。最后是交互细节。真正省时间的设计藏在“反向操作”里双击类节点应自动定位到源码需提前配置GitHub仓库URL和路径映射拖拽连线起点到另一个类应智能提示“创建继承关系”而非仅允许画线右键节点菜单必须包含“导出为PlantUML代码”——这让你能把在线图一键转为CI流水线里的文档自动化脚本。这些不是锦上添花而是把“画图”动作无缝缝进你的日常开发流。5. 超越绘图当类图工具成为代码质量的实时仪表盘如果一款在线类图工具只能生成静态图片它最多是个演示辅助。但当它开始与代码仓库、CI/CD管道、IDE深度集成它就进化成了架构健康度的实时仪表盘。这不是未来概念而是已有团队在落地的实践把类图从“事后总结”变成“事中预警”。核心思路是图谱即代码Graph-as-Code。每次Git提交后CI流水线自动触发类图生成将本次变更的图谱与主干分支图谱做差异比对输出三类告警结构腐化如UserService新增对PaymentService的直接调用但二者本应通过Facade解耦图谱中会突兀出现一条跨域连线继承滥用检测到ReportGenerator继承ExcelExporter而后者又继承PdfExporter形成超过3层的继承链违反“组合优于继承”原则上帝类膨胀OrderService的字段数从5增至12方法数从8增至25且被17个其他类引用图谱中该节点自动标红并显示“高风险扇出过大”。某电商公司用此方案在Q3拦截了11次潜在架构退化。最典型案例是开发提交了一个“优化库存查询”的PR类图差异报告指出为提升性能InventoryService新增了对RedisTemplate和JdbcTemplate的双重依赖且被OrderController、RefundService、NotificationService同时调用——这暴露了数据访问层的职责污染。团队据此重构将缓存逻辑抽离为CacheInventoryAdapter图谱中InventoryService的依赖线立即减少2条扇出数降至5。实现此能力的关键技术点有三个第一图谱版本化存储。每次生成的图谱不丢弃而是存为JSON快照包含节点ID、关系类型、生成时间戳。用Git LFS管理大体积JSON确保历史可追溯。第二差异算法。不是简单比对JSON字符串而是构建图同构Graph Isomorphism检测将图谱抽象为邻接矩阵用VF2算法计算相似度。当相似度95%触发人工审核。第三规则引擎嵌入。预置可配置规则库如“禁止跨Bounded Context调用”需定义Context边界、“接口实现类不超过3个”防策略爆炸。规则用Drools语法编写非开发人员也能通过Web界面增删。这里有个血泪教训某团队初期把规则写死在代码里当要禁用“禁止继承超过2层”规则时必须发版重启服务。后来改为规则热加载运维在后台勾选/取消规则30秒内全量生效。这印证了一个真理架构治理工具的生命力取决于它被规则制定者而非仅开发者掌控的程度。最后分享一个轻量级落地技巧无需自建CI集成用GitHub Actions PlantUML即可起步。在项目根目录放puml/文件夹每次提交时Action脚本用java -jar plantuml.jar解析src/main/java/**/*.java生成class-diagram.puml再用puml2svg转为SVG嵌入README。虽然不如专业工具智能但它让“类图”从“有人记得画”变成“每次提交自动更新”团队接受度瞬间提升。工具的价值从来不在功能多炫酷而在是否真的嵌入到开发者伸手就能触达的地方。6. 实战避坑指南从零搭建一个可用的在线类图工作流理论讲完现在给你一套可直接抄作业的实战方案。不需要买SaaS服务不依赖公司IT审批用现有技术栈1小时内搭好且满足中小团队日常需求。核心原则用最小可行组件MVP解决最痛的三个场景——新人上手看图、PR评审对齐、周会汇报展示。6.1 环境准备三件套搞定基础设施你只需要三个免费、开源、免部署的工具PlantUML Web Server官方提供的轻量HTTP服务Docker一行启动docker run -d -p 8080:8080 --name plantuml plantuml/plantuml-server:jetty它不存代码所有图表通过URL参数生成如http://localhost:8080/svg/...隐私无忧。VS Code PlantUML插件开发时实时预览写完startuml就看到图避免上下文切换。GitHub Pages托管最终成果所有图表生成后自动发布到https://your-org.github.io/class-diagrams/。注意不要用在线PlantUML编辑器如plantuml.com它把代码发到公共服务器违反安全底线。本地Server才是唯一合规选择。6.2 标准化图谱生成流程强制团队遵守四步法杜绝“各画各的”乱象定义范围在puml/config.json中声明本次图谱覆盖的包路径如[com.example.order, com.example.payment]提取结构用jdepsJDK自带生成依赖报告jdeps -s -f com\.example\.order\..* target/classes deps.txt转换为PUML写个Python脚本20行读deps.txt按规则生成class-diagram.puml# 示例逻辑检测-行提取源类和目标类生成Order -- PaymentService with open(deps.txt) as f: for line in f: if - in line: src, dst line.split( - ) print(f{src.strip()} -- {dst.strip()})渲染发布用PlantUML Server API批量生成SVG上传到GitHub Pages。这套流程跑通后每次新模块上线只需改config.json里的包名执行脚本新图自动上线。我帮某教育SaaS团队落地时把原本2天的手动绘图压缩到15分钟。6.3 高频问题与速查解决方案问题1Lombok注解导致字段不显示解决在puml/config.json中添加include_lombok: true脚本解析时主动注入Getter/Setter对应的字段。问题2泛型类RepositoryT被识别为多个节点解决正则替换Repository.*?为Repository统一归为一个节点避免图谱碎片化。问题3继承线与实现线混淆extendsvsimplements解决jdeps不区分二者需改用javap -s反编译字节码提取Signature属性中的泛型信息再结合javap -v的superclass字段判断。问题4图太大网页加载慢解决启用PlantUML的!define MAX_PARTS 50指令自动将大图拆分为多个子图用iframe分页加载。最后一个经验别追求“完美图谱”。我见过团队花一周调优布局算法结果发现大家只关心“订单模块有哪些类”根本没人细看连线角度。真正的价值是让“画图”这件事消失——它不再是额外任务而是代码提交后的自然产物。当你不再需要提醒“请更新类图”而是看到PR描述里自动带上了最新图谱链接你就知道这个工具真正活了。

相关新闻

Windows Terminal 深度定制指南:从配色到毛玻璃的专属终端打造方案

Windows Terminal 深度定制指南:从配色到毛玻璃的专属终端打造方案

直接说结论:Windows Terminal 折腾好了,体验提升幅度远大于你换一台显示器。我自己的主力机从 Win10 一直用到 Win11,控制台窗口从黑底白字的默认样式,一路调成半透明毛玻璃加彩色字体加背景图,整套配置用了快两年&…

2026/10/13 14:18:14 阅读更多 →
RK3576 HDMI 输出调试:从黑屏到 1080p60 的踩坑实录

RK3576 HDMI 输出调试:从黑屏到 1080p60 的踩坑实录

/* 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:18:14 阅读更多 →
OSG 3.6与Qt 5.13集成实践:将三维渲染嵌入Qt界面

OSG 3.6与Qt 5.13集成实践:将三维渲染嵌入Qt界面

/* 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:18:14 阅读更多 →

最新新闻

Service层命名规范:从见名知意到代码可维护性

Service层命名规范:从见名知意到代码可维护性

接手一个业务系统,我最怕看到的不是复杂算法,而是那种一打开就让人头晕的 Service 实现类。2000 行起步,方法名字从 process 到 handle 再到 doSomething,翻遍整个类也猜不出某个方法是干嘛的。命名这种事,看起来不影响…

2026/10/13 17:55:28 阅读更多 →
Windows内核模块枚举与隐藏原理深度解析

Windows内核模块枚举与隐藏原理深度解析

1. 这不是“找模块”,而是在内核内存里做一次精准外科手术“枚举和隐藏内核模块”——这八个字在安全研究、驱动开发或系统调试场景中,绝不是一句轻飘飘的技术术语。它背后是一整套对Windows内核运行时状态的深度观测与主动干预能力。我第一次在某高校实…

2026/10/13 17:55:28 阅读更多 →
Hibernate二级缓存Provider详解:从原理到选型与排坑

Hibernate二级缓存Provider详解:从原理到选型与排坑

被人突然问起“Hibernate的caching provider是什么”,我第一反应是:能问出这个词的人,多半已经看到配置文件里那一堆以hibernate.cache开头的键,但又没搞懂这些键到底在切换什么。这篇文章就把这个词拆开讲清楚,重点解…

2026/10/13 17:55:28 阅读更多 →
电能质量复合扰动识别:混沌集成决策树实战解析

电能质量复合扰动识别:混沌集成决策树实战解析

简介:这是一份面向电能质量复合扰动识别研究的MATLAB完整源程序包,对应知网论文《基于混沌集成决策树的电能质量复合扰动识别》,可作为电气工程、信号处理及机器学习方向的毕业设计或课题研究参考,帮助复现算法并开展对比实验。程…

2026/10/13 17:55:28 阅读更多 →
CentOS局域网DNS搭建:BIND9多域名权威解析实战

CentOS局域网DNS搭建:BIND9多域名权威解析实战

1. 为什么在CentOS上自建局域网DNS不是“多此一举”,而是刚需落地的第一步很多人看到“CentOS搭建局域网DNS”第一反应是:不就是改个/etc/resolv.conf?内网查个主机名用/etc/hosts不就完事了?我试过——在某高校实验室的物联网教学…

2026/10/13 17:55:28 阅读更多 →
ActiveMQ consumerCount精准获取与实战调优指南

ActiveMQ consumerCount精准获取与实战调优指南

1. 项目概述:为什么“获取消费者数量”是 ActiveMQ 运维与调优的黄金指标在某公司消息中间件团队的实际运维中,我接手的第一个紧急故障就和consumerCount直接相关——一个订单履约服务突然延迟飙升,下游库存扣减平均耗时从200ms暴涨到8秒。排…

2026/10/13 17:54:25 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 18:11:17 阅读更多 →