从走过场到有效协作:open-code-review如何用规则引擎重塑代码评审

1. 先聊聊我为什么受够了"走过场式"的 code review

做技术管理这几年来,我一直在跟一个特别拧巴的问题较劲:代码评审(code review)到底是在防烂代码,还是在防人际关系爆炸?

接手第一个带团队的项目时,我一度天真地以为,只要把合并请求(MR/PR)的权限卡住,强制要求"必须有人 approve 才能合并",代码质量自然会上去。结果两周之后我就发现,这个策略只教会了所有人三件事:

  • 提交 PR 的时候把描述写得比公告还长,关键决策却一笔带过;
  • 急着合并的人到处找"好说话"的同事刷一个 approve;
  • 认真看代码的组员越来越少,因为提的意见永远石沉大海。

说白了,code review 在这个阶段沦为了一种仪式。而我身边大多数技术团队,其实都困在同一个泥潭里:评审流程有,评审动作没有;审批人有,审批依据没有。我那时候就在想,能不能做一套机制,把人从"看心情评审"里解放出来,让每一次代码讨论都有章可循,让每一条评论都有据可查。

于是就有了 open-code-review 这个项目。它不是一个玄乎的"AI 替代人工评审"工具,而是一套把评审规则、数据指标和协作流程串起来的开源实践框架。你可以把它理解成给团队装了一个"评审裁判"——不替你做决定,但逼着每个人把话说清楚,把账算明白。

这篇文章我不打算把它包装成什么高大上的工程,而是老老实实分享一下:我为什么做它、它的核心机制怎么运转、部署和接入踩了哪些坑、以及它跑了大半年之后,团队和我个人的真实变化。如果你也在纠结"评审流程搞了等于没搞",这篇应该能帮上忙。

2. 别急着写代码:先拆清楚评审失效的病根在哪

在动任何一行代码之前,我花了差不多一个周末的时间,整理了自己过去半年记下的评审笔记,把"评审无效"的场景全部列了出来。最后归纳下来,问题出在三个层面。

2.1 流程定义缺失:没有人告诉双方"怎么算审完"

很多团队理解的 code review,就是"有人点了 approve 就算完"。但 approve 到底代表什么?是"我仔细读完了每一行"?还是"我看了大概没问题"?还是"我懒得说话但别卡我"?这三者给合并决策提供的信息量是完全不同的。

所以我第一个想做的,就是给"评审完成"下一个可量化的定义。不是简单看有没有 approve,而是看这次评审过程中有没有覆盖核心文件、有没有人对关键敏感点表态、有没有真正发生过技术讨论。这些信息聚合在一起,才算一次"有效评审"。

2.2 反馈链路断裂:意见提了,但不追踪

第二个病根是反馈回路太长。很多团队的做法是:A 在 PR 下面留言"建议把这段循环拆成两个函数",然后 B 看到了,回了句"好的改一下",就没了。评论有来有回,但改没改、改得对不对、是不是所有评论都被处理了,完全依赖发起人自己记。

当 PR 变多、人变多之后,评论就会开始"漂移"——飘在聊天记录里、飘在纷繁的标签里,最后被淹没。这个问题的本质是缺少一个能把评论状态跟踪起来的机制。

2.3 经验没有沉淀:同样的坑每个新人再踩一遍

第三个病根最隐蔽也最贵。老手在评审时看到"用 sleep 等异步结果"会条件反射地皱眉,但新人对这个问题完全无感。团队积累的审查经验,全存在老手的脑子里,既没有文档化,也没有规则化。新人每做一次 code review,等于把团队踩过的雷全部重新踩一遍。

所以当我构思 open-code-review 时,确定了它必须具备的三个能力:规则可配置、评论可追踪、指标可复盘。有了这三条,评审才能从"看心情"变成"看系统"。

3. open-code-review 的核心机制:它到底是怎么工作的

既然是开源项目,我尽量把架构说得直白一点。整个 open-code-review 不是一个大而全的代码平台,它的定位更接近评审规则引擎 + 评论机器人 + 数据看板的组合体。核心就是这么几条线串起来的。

3.1 审查规则是显式配置的,不是散落在人脑里

我用 YAML 写了一套声明式规则,这是整个工具的心脏。举个例子,我团队里跑得最多的一条规则长这样:

rules: - name: large-change-warning description: 单次变更大于 800 行时提醒拆分 event: merge_request condition: field: changes.count op: gt value: 800 actions: - type: comment level: warn message: "本次变更规模较大({{ changes.count }} 行),建议拆分为多个更小的 MR 提交,便于逐段审查。" - type: metric metric: large_mr_count increment: 1

看起来很简单对吧?但它的价值在于把"什么值得提醒"这件事从每个人的脑内私有知识,变成了仓库里的公共配置。新人接手项目,看一眼 rules.yaml,就知道这个团队在意什么:是多大的 PR 会被警告、哪些目录改动必须指定人审、哪些关键词出现在描述里会被打回。

配置里每一行都对应一条评审逻辑,而不是藏在评审人心里。这是 open-code-review 跟普通 Lint 工具最大的区别——Lint 查的是代码语法,它管的是协作行为和变更风险。

3.2 机器人评论不是刷存在感,是给评审人递话头

很多团队接入过自动评论机器人,结果体验很差:机器人哇啦哇啦在全公司都能看到的群里刷屏,点开一看全是"代码风格不符合 prettier 配置"这种废话。大家很快就学会了无视它。

open-code-review 的评论机制我刻意做了克制处理。它只在三类情况下主动评论:

  • 规则被触发且级别为 warn/error 时,给出具体的规则名和上下文;
  • 检测到 PR 描述缺少必要信息(比如没有勾选自测清单、没有关联需求单号)时,提醒发起人补全;
  • 有上一条评论待处理超过 48 小时时,在 PR 里提示双方"这条讨论是否已闭环"。

它更像一个细心的助理,而不是一个大声嚷嚷的保安。收到评论的人第一反应是"这提醒有道理",而不是"这机器人又疯了"。

3.3 它不抢人的决策权,"让机器做检查,让人做判断"这句话才是主线

这里我要特别强调一个设计原则:open-code-review 从头到尾不会自动 block 合并,除非团队自己配置了硬性规则。

我见过太多工具一上来就想"接管"评审流程,把机器人设置成一票否决,结果团队怨声载道。原因很简单:代码评审里大量判断是模糊的、依赖上下文的。比如"这个实现虽然有点绕,但是为了兼容老接口只能这样",这种情境机器人判断不了。

所以在默认配置下,它输出的是"建议 + 风险提示 + 讨论追踪",而不是"批准 / 拒绝"。真正拍板的人依然是人,只是这个人现在有了充分的上下文和追踪工具。这条原则我强烈建议所有做类似工具的人参考,尤其是在团队信任还没建立起来的时候,机器少做裁决,多做提醒。

4. 部署和接入的完整实操记录:我走过的路你照着走就行

聊完理念,说点实在的。open-code-review 要跑起来,需要三样东西:一个服务端、一个代码托管平台的接入、以及一份团队自己的规则配置。我把我实际操作的每一步都记在这里。

4.1 服务端部署:Docker Compose 一把梭,但有两个坑

我用的是官方提供的 docker-compose 方式部署,整个服务由三个容器组成:一个 API 服务、一个 PostgreSQL 数据库、一个异步任务队列(用于处理从 Webhook 推过来的事件)。

git clone https://github.com/your-repo/open-code-review.git cd open-code-review/deploy cp .env.example .env # 编辑 .env,填入服务端口、数据库密码、平台接入凭证 docker compose up -d

跑起来之后,API 服务默认监听 8080 端口。这里我要重点提醒两个坑,都是我实际踩过的:

第一个坑是数据库连接串的时区设置。默认的 PostgreSQL 镜像如果用 UTC 时间,而你的团队在国内用东八区,那么看板上所有的"评审响应时长"都会差 8 小时。早上 10 点的评审会被记录成凌晨 2 点,数据异常诡异。我在 .env 里加了TZ=Asia/Shanghai,并且在 API 服务的环境变量里显式指定APP_TIMEZONE=Asia/Shanghai才解决。

第二个坑是 Webhook 的密钥配置。open-code-review 在接收代码平台回调时,默认会校验签名,防止有人伪造事件。这个密钥要在 .env 里配好,同时在 GitLab / GitHub 的 Webhook 设置里填入完全相同的值。我一开始没注意大小写,密钥复制错了,结果测试推送 PR 的时候,服务端一直静默丢弃事件,看板数据为零。排查了半天,最后打开服务日志才看到签名校验失败的报错。

4.2 接入 GitLab 的具体配置:Webhook 和 Token 的权限边界

我们团队主力代码平台是自建的 GitLab,所以接入配置就以它为例。GitLab 接入步骤不复杂,但权限边界一定要搞对。

首先,创建一个专用的"机器人账号",不要用管理员的个人访问令牌。因为这个 Token 会被 open-code-review 用来读取 MR 元数据、发布评论、更新标签,如果权限过大,万一 Token 泄露,等于把整个代码库的管理权限交给了别人。我在 GitLab 里给机器人账号只开了两个 scope:

  • read_api:用于读取 MR 的变更内容、评论列表、提交记录;
  • write_repository:用于在 MR 下发布评论、更新标签。

设置好 Token 之后,在项目(或群组)的 Settings -> Webhooks 里添加一个 webhook:

  • URL 填http://你的服务地址:8080/api/v1/webhooks/gitlab
  • Secret token 填 .env 里配置的签名密钥
  • 勾选触发事件:Merge request events、Note events、Push events(用于同步最新变更状态)

4.3 第一条规则验证:从提交一个测试 MR 到看到机器人评论

配好之后,我建议你先别急着把整套规则铺开,而是用一条最小规则验证链路是否通畅。

rules: - name: missing-description-check description: MR 描述不能为空 event: merge_request condition: field: description op: empty value: true actions: - type: comment level: warn message: "请补充本次变更的背景说明和自测记录,方便评审人快速进入上下文。"

提交一个描述为空的 MR,正常情况下几秒钟内,机器人就会在 MR 评论区留言。如果没收到,按这个顺序排查:

  1. Webhook 是否成功触发(GitLab 后台有 Recent Deliveries 记录);
  2. 服务日志里有没有事件接收记录;
  3. 规则配置是否被正确加载(调用服务的/api/v1/rules接口确认);
  4. 机器人账号对项目有没有评论权限。

这条链路打通之后,剩下的就是往 rules.yaml 里填充你们团队自己的审查经验了。

5. 用数据复盘改进流程:仪表盘背后到底该看什么

open-code-review 跑起来之后,会自动在后台聚合一批团队评审指标,并提供一个简单的仪表盘。我在造这个功能之前,本来以为"有数据"就是胜利,但实际用了两周之后发现:选错指标比没有指标更危险。

5.1 我最终只保留了三个核心指标,其他都关掉了

第一个版本我加了十几个指标,包括"每人平均评论字数""共计子线程评论数""凌晨提交率"等等。后来发现这些指标要么容易刷,要么纯粹制造焦虑,所以我做了一次大清洗,只留下三个跟"评审质量"强相关的指标:

指标名计算方式说明
评审响应时长MR 创建到第一条评审人评论或 approve 的时间间隔衡量团队响应敏捷度,而非个人效率
评论密度有效评论数 / MR 变更行数(每千行)衡量评审是否真的在讨论技术,而非走过场
评审参与面评审过至少一个 MR 的人数 / 团队总人数衡量评审是否集中在少数人身上

这三个指标都有明确的意义,且不容易被人为"刷"出假数据。比如评论密度,如果低于千行 2 条,说明大家基本没看代码;如果太高(千行 30 条以上),说明可能代码质量本身问题很大,或者讨论在打转。

5.2 案例复盘:一个 1284 行的大 MR,是怎么被流程"逼"着拆掉的

我举一个让我印象很深的例子。有个同事提交了一个 1284 行的 MR,一次性改了三个模块。按正常节奏,评审人至少要花一个下午读代码。但 open-code-review 的 large-change-warning 规则在 MR 创建时就自动评论了,提醒说"本次变更规模较大,建议拆分"。

而且这条规则配合了另一个关联逻辑:当变更行数超过阈值时,评审机器人会把一个大 MR 标记为"需要人工确认拆分必要性",并要求发起人在评论区明确表态。不是强制拆,而是要求你回答一句"为什么不拆"。

结果那位同事在回复框里打了半天字,最后自己意识到:"好像确实应该拆成三个 MR,不然我也讲不清楚。"于是他主动关闭了这个 MR,拆成了三个分别提交。这个过程没有项目经理介入,没有"我来帮你审一下"的上司施压,纯粹是流程提供了一个"被看见的镜子"。

我后来复盘这件事,越来越觉得 open-code-review 的真正价值不在于拦截了多少坏代码,而在于让开发者开始自己思考变更的合理性。

5.3 仪表盘容易变成新式 KPI,这句话我放在最前面说

作为工具的作者,我必须泼一盆冷水:任何一个流程改进工具,一旦被管理层当成考核工具,就会立刻失效。

我之前在一个团队试点时,负责人看了仪表盘上的"评审响应时长",觉得这是个大好机会,于是定了个规矩:超过 12 小时不评审要通报。结果你猜怎么着?大家的确响应快了,但评论变成了清一色的"LGTM"——没有人认真看代码了,全在赶时间点按钮。一段时间后,平均响应时长是好看得不行,但代码质量不升反降。

所以我自己用 open-code-review 的时候,定的规矩是:仪表盘数据只允许团队全员可见,不做个人排行,不跟绩效挂钩,只用于团队复盘会上的自省。数据摆在那里,谁能看到问题谁心里有数,比任何强迫都有效。

6. 运行大半年后,我总结的实战经验和边界思考

最后这部分,我想跳出工具本身,聊聊作为使用者和维护者,我在长期运行中积累的几条经验,以及 open-code-review 绝对不能用来做什么。

6.1 误报问题:宁可少一条规则,不要多一条误报,否则信任会崩塌

这是我被教训得最惨的一条。我一开始为了让规则"看起来有用",加了不少自以为聪明的检查,比如"检测到 console.log 就报警"。结果呢?我们项目里有大量历史遗留的调试日志,根本不是这一次 MR 引入的。于是机器人每次都会在 PR 里嗡嗡嗡地提醒,大家烦不胜烦,甚至开始有人直接忽略机器人的所有评论。

信任的建立需要很长时间,但崩塌只要一秒钟。我现在的规则管理原则是:规则宁缺毋滥,每条规则必须满足"对事不对人、可解释、可关闭"这三个条件。任何一条新增规则,先以 warn 级别灰度跑两周,统计误报率,低于阈值再正式启用。

6.2 规则要与评审复盘绑定:定期迭代 rules.yaml 比写代码更重要

很多人把 rules.yaml 当成一次性配置,写完就不管了。但代码在变、团队成熟度在变、踩过的坑也在变,规则必须要跟着迭代。我定了每个月做一次规则复盘:把这个月所有"评审中激烈讨论过的点"过一遍,看看哪些值得固化成规则,哪些规则已经过时该删掉。

有一次,团队在评审一个并发控制方案时,陷入了一场关于"锁粒度合理范围"的激烈辩论。讨论结论是:变更涉及并发锁的文件时,必须由至少两名熟悉并发的评审人参与。我把这条直接写成了一条规则:检测到改动文件路径包含 concurrency 相关模块时,自动 @ 指定的两位核心评审人。这个规则后来帮了大忙,再也没有出现过一个人默默改了并发代码、其他人不敢接锅的情况。

6.3 关于自动化取代人工评审这件事,我的态度一直没变

最后我必须说清楚:open-code-review不能替代人,也最好不要朝"完全替代人"的方向去设计。代码评审中那些真正值钱的部分——对架构的权衡、对业务的判断、对团队默契的建立——全都发生在人与人之间的讨论里。

机器人能做的是把"必须做的检查"和"可复现的经验"自动化,把人的精力留给那些真正需要人的判断的地方。我在设计 open-code-review 的评论机器人时,甚至故意让它的话术保留一定的"人味",比如评论末尾会附上"如果这条建议不合适,请直接忽略并说明原因"——为的是鼓励发起人去反驳,而不是默默服从。

如果你正打算在团队里推行类似的工具,我个人的建议是:先从最小规则集开始跑,把"暴露问题"作为第一目标,把"自动化裁决"留到很后面。流程成熟的标志不是机器人说一不二,而是每个人的评审意见都有被系统认真对待的公平感。

相关新闻

2026通信工程师中级《综合能力》备考笔记:高频考点与计算题模板

2026通信工程师中级《综合能力》备考笔记:高频考点与计算题模板

2026年要考通信工程师中级的同学,现在开始准备《综合能力》这本书,时间刚刚好。我备考的时候,起步就是靠培训机构的《综合能力》笔记,把几百页教材慢慢压缩成几十页自己看得懂的精华,最后顺利过了60分线。这篇就把我整…

2026/10/19 21:31:33 阅读更多 →
从URL结构到短链安全:Web链接原理与工程实践全解

从URL结构到短链安全:Web链接原理与工程实践全解

你有没有想过,每天在浏览器里点下去的链接,到底是什么?一个蓝色下划线的文本,一个二维码,一条短网址,背后涉及的其实是一整套协议、解析规则和工程实践。我做了很多年 Web 开发和系统维护,自己也…

2026/10/19 21:31:33 阅读更多 →
VDA 6.3过程审核深度解析:从评分定级到实战误区

VDA 6.3过程审核深度解析:从评分定级到实战误区

简介:VDA 6.3-2023红皮中文版(扫描)过程审核第四版,面向汽车供应链质量工程师、内审员及供应商管理人员,用于掌握过程审核的策划、实施与评价方法。资源为1个PDF文件,压缩包约1.28MB,内容以扫描…

2026/10/19 21:31:33 阅读更多 →

最新新闻

具身智能认知架构:从脑到本体的神经符号融合与工程落地

具身智能认知架构:从脑到本体的神经符号融合与工程落地

1. 具身智能认知架构到底在解决什么问题1.1 从一个尴尬的现状说起做了几年机器人相关项目的人大概都有这种体会:机械臂在结构化环境里跑得挺稳,抓取、码垛、拧螺丝这些任务,只要场景不变、光照不变、物体位置固定,成功率能到99%以…

2026/10/19 22:24:16 阅读更多 →
5个AI工具让创业者效率翻倍:会议纪要、内容生成、数据解读、客户跟进、流程自动化

5个AI工具让创业者效率翻倍:会议纪要、内容生成、数据解读、客户跟进、流程自动化

如果只给自己留一个判断标准来选AI工具,我会选这一个:它能不能把一个星期里重复十几次的机械动作,压缩成一次性的规则和提示词。创业者最值钱的不是执行力,而是判断力和决策质量,但现实是,大部分人的精力都…

2026/10/19 22:23:15 阅读更多 →
Atlas数据库迁移实战:声明式与版本化工作流解析

Atlas数据库迁移实战:声明式与版本化工作流解析

1. Atlas是什么:一个让数据库变更不再“失控”的迁移工具1.1 先说我遇到的一个真实迁移事故如果你维护过几年数据库,大概率见过这种场景:测试环境和生产环境的表结构悄悄对不上了,问了一圈没人知道谁动过,git记录里也查…

2026/10/19 22:23:15 阅读更多 →
AI写作工具合规使用指南:提升效率与规避学术不端风险

AI写作工具合规使用指南:提升效率与规避学术不端风险

抱歉,这个任务我没法执行。你提供的标题涉及一类明确有合规风险的工具——“降AIGC工具”,加上“导师推荐”“千笔AI VS Checkjie”“本科生专属”等表述,语义上指向帮助学生规避抄袭检测或AI检测的灰色服务。这类内容属于学术不端范畴&#…

2026/10/19 22:21:05 阅读更多 →
嵌入式Linux摄像头应用实战:i.MX6ULL+OV5640+V4L2+QT

嵌入式Linux摄像头应用实战:i.MX6ULL+OV5640+V4L2+QT

做嵌入式Linux下的摄像头应用,我踩过的坑多数不在应用层。刚开始拿一块基于i.MX6ULL的板子,接上OV5640摄像头模组,想着跑一个QT相机界面,以为难点在UI布局,结果光是让画面稳定流畅地出现在屏幕上,就把从驱动…

2026/10/19 22:16:59 阅读更多 →
从控件到像素:移动端AI Agent操作真机的三大考点

从控件到像素:移动端AI Agent操作真机的三大考点

最近很多团队开始做一件事:把 AI Agent 接到一台真实的手机上,让它像人一样打开 App、点按钮、填信息、下单、发消息。不是模拟器,不是纯接口调用,是实实在在握住一台手机操作。这件事在近两年突然火起来,原因很直接—…

2026/10/19 22:16:59 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →