多前置仓模式下生鲜电商系统设计:库存、路由与履约实战
做生鲜电商的人应该都有体会一个仓管不住谈一百个仓就是灾难。万象生鲜系统走的是多前置仓模式核心就是把库存压到离用户足够近的位置用密度换时效。听起来不复杂但真正落地时需要面对的是库存碎片化、订单路由、履约调度、损耗控制这一整套连锁问题。这篇文章就围绕万象生鲜系统的多前置仓模式聊一聊整套体系是怎么设计的、核心机制在哪、以及我在实际推进过程中踩过的坑。不管你是做即时零售、生鲜电商还是做本地生活服务这套思路应该都有参考价值。1. 多前置仓不是把单仓复制N份而是重新设计“仓”这个单元先说清楚前置仓的本质。它和中心仓最大的区别在于中心仓是成本中心前置仓是体验中心。中心仓离用户几百公里靠干线物流和次日达维持规模效应前置仓离用户只有三公里靠的是骑手二轮车十五分钟内把一袋菜送到门口。多前置仓模式的出发点很简单一个仓覆盖不了整个城市。1.1 前置仓的覆盖半径决定了“多”是必然前置仓的履约时效和仓的覆盖半径强相关。以万象生鲜的实践来看一个标准前置仓的配送覆盖半径大概在3公里左右超过这个距离骑行时长就会突破30分钟用户体验断崖式下滑。30分钟达和45分钟达看起来只差15分钟但在消费者心智里是完全不同的两个产品。所以一个百万级人口的城市按照网格化划分至少要部署几十个前置仓才能做到全城覆盖。这也是模式被称为“多前置仓”而不是“前置仓”的原因——系统设计的对象永远不是单个仓而是几十个仓组成的仓网。但多仓带来的直接问题就是库存分散。同样一个商品可能需要同时备货在20个仓里而每个仓的动销速度不一样。有的仓一天能卖两百份盒装草莓有的仓一周才卖二十份。如果按同一个标准补货要么滞销损耗要么频繁缺货两头的成本都在往上走。1.2 单仓模型下的核心参数要设计多仓体系得先定义清楚“一个仓”长什么样。万象生鲜在早期阶段做了大量模拟测算最终沉淀出来的单仓标准模型大致如下参数项标准值说明仓面积300-500平米含常温区、冷藏区、冷冻区分隔SKU数3000-5000覆盖生鲜、标品、日百不做大而全日订单峰值800-1500单超过则触发分流和爆单保护客单价60-80元太低了覆盖不住履约成本库存周转天数1.5-2.5天生鲜品类周转必须快慢一天损耗就上来了平均拣货时长3-5分钟/单拣货超过8分钟直接影响发车节奏这个模型的意义不在于数据本身而在于它把“仓”变成系统里可计算、可衡量的单元。有了这些基线参数后面算路由、算补货、算人员排班才有依据。1.3 单位经济模型什么时候多仓能赚钱很多人觉得前置仓是烧钱模式其实关键在于单仓能不能打平。这里有一个粗略的保本公式可以分享单仓月保本订单量 固定成本 /客单价 × 毛利率 - 单均履约成本 - 单均损耗成本举个例子。假设一个前置仓月固定成本房租、人力、设备摊销是12万客单价70元毛利率25%单均履约成本8元单均损耗成本3元。那一单的边际贡献就是70×25% - 8 - 3 6.5元。保本订单量就是120000 / 6.5 ≈ 18462单按30天算日均约615单。如果日均只能跑到400单那就意味着每个月要亏三万多。这也是为什么很多团队在前置仓扩张时先把单仓模型跑通再复制——模型没通之前仓越多亏得越狠。万象生鲜的做法是“先验证3个仓模型跑正之后再加到30个仓”这句话我在内部反复强调过。2. 仓网视角下的库存建模SKU、批次与同步机制多仓模式下最头疼的不是仓库管理本身而是库存分散之后系统如何在几十个仓之间维持一个全局一致的库存视图。我就见过不少团队单仓系统做得很好一扩展到多仓库存就开始乱。2.1 库存的三层结构销售层、仓内层、差异层万象生鲜的库存系统拆成了三层来建设。第一层是销售层库存前台可见的可售库存用户在下单页看到的库存数字、加购时校验的库存都是这一层。第二层是仓内实物库存后台仓储实际有的货是拣货员扫码、盘点、出入库时操作的数据。第三层是差异流水专门记录两层之间因为超卖、串码、丢件等原因产生的不一致。为什么要单独拆出差异层因为线上线下库存不一致是常态关键是要快速发现差异并处理。系统每天跑对账任务把销售层的扣减流水和仓内的出入库流水做比对差异量超过阈值就自动生成盘点工单。这里最容易犯的错误是直接拿销售层库存去驱动补货等到实际拣货发现没货了才知道账面和实物早就对不上了。2.2 锁库与时点选择下单即锁还是支付即锁多仓模式下一个订单在创建、支付、拣货三个阶段都有可能发生库存变化。万象生鲜采用的核心策略是“支付即锁库、拣货实扣”。具体来说用户下单但没有支付此时不锁定库存只是预占一个购物车额度支付成功瞬间系统立即锁定对应仓的库存拣货人员每扫一个条码库存真正扣减一次同时释放锁定量。这个方案的优点是锁库时间短库存周转效率高缺点是一旦支付后缺货需要走售后退款流程对用户体验有伤害。我也见过很多团队用“下单即锁”的策略好处是超卖概率低但问题在于未支付订单的锁库会造成大量无效占用在爆款秒杀场景下尤其明显——100个人下单只有30个人支付库存却被锁了100份等真正要买的用户来就显示缺货了。这中间的取舍很看业务场景万象生鲜用了折中方案锁库有效期10分钟超时未支付自动释放。2.3 批次、效期与生鲜的特殊性生鲜库存比标品多一个维度——效期。同样一箱牛奶A批次还有20天效期B批次还有5天效期对系统来说这是两个完全不同的库存单元。万象生鲜的库存单位落在“SKU仓库批次”这个粒度上。每一批收货都会生成独立批次号包括收货时间、生产日期、保质期、供应商信息。拣货时系统会强制按效期排序FEFOFirst Expired First Out优先拣临期批次。这个机制损耗控制影响极大。生鲜品类最容易出现的问题是先进先出FIFO做得好但效期控制做得不好——早进来的货先卖但临期的货不一定先卖。FEFO才是生鲜库存管理的正解。我们在某批次生鲜商品上专门压过这个问题把临期商品在效期还剩1天时自动转成促销价系统每天凌晨跑一次临期清单损耗率降了大概两三个百分点。3. 订单路由你这个单为什么会被分到那个仓多仓模式下用户下一单系统要决定由哪个仓来履约。这个决策看起来简单——找最近的仓嘛——但实际上是一个典型的多目标优化问题而且每天要处理几十万次响应必须在100毫秒内完成。3.1 路由决策的核心变量万象生鲜的订单路由模块综合了以下几个维度的得分来决定履约仓维度权重说明距离与骑行时长40%预估骑手从仓到用户的时间这是体验底线仓内实时负载25%仓内排队订单数、拣货人力是否充足目标商品在仓库存25%是否全量满足缺货会导致拆单或换仓动线与路径成本10%骑手当前所在位置、顺路订单情况路由不是单看距离。很多时候A仓虽然最近但正在爆单拣货排队的订单超过200单而B仓距离多1公里但订单量只有A仓的一半。这时路由会果断选择B仓宁可骑手多跑1公里也不能让用户在A仓等拣货等20分钟。3.2 一个典型的打分计算实例假设用户下单买一盒草莓和一袋吐司系统需要从两个仓中选一个A仓距离2.0km预计骑行8分钟仓内当前排队待拣120单草莓库存充足吐司充足B仓距离1.2km预计骑行5分钟仓内当前排队待拣240单草莓库存充足吐司缺货库存为0。如果只按距离B仓完胜。但B仓缺货会导致订单无法一次性履约需要拆成两个包裹履约成本翻倍B仓的240单排队轮到这单的预计时间接近15分钟。万象生鲜的打分逻辑大致是时长得分1/预计送达分钟数库存得分全满足得满分缺任一SKU得低分排队负载得分1/(1排队单量/峰值容量)。加权之后A仓总分反而高于B仓。实际系统计算会更复杂但这个例子能说明路由模块的思考方式——不是找“最近的仓”而是找“最优履约的仓”。3.3 路由和锁库的先后顺序这里有个容易被忽略的坑路由决策需要依赖库存数据但锁库操作又会影响其他订单的库存判断。如果把“先锁库再路由”会导致所有库存被锁定其他订单查询时大量缺货如果“先路由再锁库”又可能出现路由决策完成时库存已经被别的订单抢走导致履约失败。万象生鲜的做法是路由阶段使用“准实时库存快照”不需要精确到每一件只判断“有”或“无”以及大致库存水位等路由结果确定后再执行精确锁库。如果锁库失败库存刚好被抢光则触发一次重路由最多尝试三轮。三巡内找不到全量满足的仓订单进入分拆或缺货下架流程。4. 履约链路从拣货波次到骑手调度路由决策完成、库存锁定成功之后真正拼细节的履约阶段才开始。多前置仓模式下的履约链路直接影响恶化指标里最重要的两个履约时效和生鲜损耗。4.1 拣货环节摘果式还是播种式前置仓的单量密度大而且一张订单里通常有10-20个SKU这就决定了拣货方式不能简单照搬传统仓储的做法。万象生鲜在一个测试仓里做过对照实验摘果式拣货一人推着一辆车按单拣完一个订单再拣下一单在单量爬高时效率明显下降拣货员来回走动的路径变长高峰期平均拣货时长拉到7分钟以上。后来换成波次播种式把10-15个订单合成一个波次拣货员按波次一次性把全部商品拣到周转筐再到播种墙按订单分播拣货效率提升了约35%高峰期拣货时长压缩到4分钟以内。这个切换也带来了库存扣减逻辑的变化。摘果式是拣完即扣播种式是按波次集中扣减——系统需要在每个SKU被扫入周转筐时就把波次内的对应数量批量预占分播完成后再确认实扣。这里稍有不慎就会出现“波次拣完但播种时发现少货”的情况所以万象生鲜在播种墙每个格口加了灯控提示按灯号投放错了会亮红灯拦截。4.2 复核与打包损耗控制的第二道防线拣货、分播之后还有一道复核关。复核不光是确认数量对不对核心是多做三件事第一效期校验。系统将批次的临期提醒直接推到复核PDA上如果拣到的商品离过期不足24小时复核员会拦截并重新换取新鲜批次。第二温层检核。冻品和冷藏品必须放入对应的保温袋或冰袋箱中扫码复核时PDA会强制确认温区类型防止常温商品和冷藏商品混装导致化冻。第三异常登记。任何被丢弃或替换的商品都要扫码记录这部分差异数据会回流到库存系统成为损耗率分析的一部分。打包环节看似不起眼但影响的是客诉里常见的那一类——“菜是好的但到了手里不新鲜了”。我们把叶菜类、冻品类、鲜活类分别用三色袋套打包配送交接时骑手拿到的不是一袋乱塞的商品而是按温层分好的几个包送到用户手上时冷热分开顾客体验会好很多。4.3 骑手调度ETA预估与超时熔断骑手调度是多仓履约里最抽象也最难做好的部分。传统外卖平台是“商家出餐-骑手取餐-送用户”一单一送前置仓是“仓库批量出单-骑手一次接多单-按路径串送”更接近小型的路径规划问题。万象生鲜的调度模块核心逻辑是把仓内已复核、待取货的订单按照用户位置做聚类尽量让一个骑手一次带走的订单都在一条顺路动线上。系统会给每个骑手计算ETA预计到达时间订单从“待取货”状态转为“配送中”之后每2分钟刷新一次位置和剩余时长。如果某个订单ETA超过承诺时效的70%系统会触发超时预警仓长可以主动改派给附近空闲骑手或者联系用户说明情况。这里有一个我们踩过的坑早期版本把ETA只建立在直线距离上忽略了红绿灯、小区门禁、电梯等待等现实因素导致预估误差很大。后来引入历史骑手轨迹数据按时间片早中晚高峰/平峰和区域老小区/新小区/写字楼建立独立ETA模型超速率才降下来。如果你也在做类似系统建议ETA别用全局统一公式一定要做区域化、时段化的细分。5. 踩坑实录爆单、库存漂移与极端天气最后分享一下多前置仓模式运行过程中遇到的高频问题。这些问题不是偶发事故而是模式本身的副作用系统设计必须提前埋好应对方案。5.1 爆单保护限流、削峰、熔断一个城市几十个仓同时在线最怕的是全城爆单——比如突发极端天气、大促、或者某个爆款短视频带火了某个商品。所有仓的订单量瞬间翻三倍如果系统不做保护订单全接仓库堆满了排队的拣货任务骑手全部在路上打转结果就是大面积超时、客诉暴涨。万象生鲜的爆单保护策略分三层。第一层是预流控根据各仓当前负载和拣货人力动态设定同时可接收的订单并发数。超出的订单进入排队页面前端提示“当前下单高峰发货略有延迟”。第二层是渠道削峰在App端限制促销活动力度比如原本满99减30改成满199减50把瞬时峰值拉平。第三层是熔断兜底当仓内排队超过安全水位自动关停该仓的下单入口哪怕牺牲一小部分单量也要保住已在途订单的履约。5.2 库存漂移的根因与治理“库存漂移”是多仓系统最折磨人的问题指系统记录在案的库存和仓库实物库存之间的偏差随着时间不断累积越来越对不上。我们在跑了一段时间后发现根因主要有三类第一拣货途中取消。用户下单锁库存拣货员都拿到了拣货任务又取消支付但下发到仓内的拣货任务没有同步取消货被拣出来了系统库存没释放。第二损耗未及时登记。比如水果磕碰、酸奶过期被丢弃仓库现场如果只在交接单上记录忘了扫PDA同步系统账面库存就虚高了。第三批次串号。效期相同或外观接近的商品收货时被混放在同一库位出库扫码扫成了同SKU的不同批次导致批次库存错乱。治理方案没有捷径就是每天强制对账加每周全量盘点。万象生鲜的SOP是每日凌晨跑一次系统差异报表差异超过千分之三的SKU当天生成抽盘任务每周六做一次重点品类全盘点每月做一次全仓全盘点。一开始觉得很重但跑顺之后库存准确率稳定在99.7%以上反而省了很多补货超量、缺货客诉的麻烦。5.3 极端天气下的履约策略极端天气是生鲜前置仓绕不开的场景。大暴雨、台风、高温这类天气下订单量反而会涨——大家都想躲在屋里等送货上门但骑手配送难度大增。我们在连续经历两次暴雨季之后形成了一套应对SOP。第一步提前调拨天气预报发布暴雨预警后提前一天把重点品类的库存从大仓调往前置仓尤其像蔬菜、速食、矿泉水这类避灾物资加量到日常的1.5倍。第二步动态调整履约半径天气恶劣时把部分仓的配送范围从3公里收缩到2公里减少骑手长距离暴露风险。第三步履约时效弹性允许用户在选择配送时段时看到“受天气影响配送时长可能延长”的提示把承诺时效从30分钟调整为60分钟降低超时客诉。这一套下来极端天气的超时率反而比平时还要低因为预期管理做得好用户心理门槛不一样。5.4 复盘机制用数据驱动仓网持续优化多仓系统上线三个月后我给团队定了一条规矩每周一上午必须看仓网健康度大盘。核心指标是四个订单满足率下单即有货可发的比例、库存周转天数、损耗率、30分钟履约达成率。这四个指标不是孤立的。满足率低了可能是补货不足也可能只是路由策略太保守导致某些仓的库存被低估损耗率高了要去反查是不是某个仓的FEFO执行出了问题。每周复盘时我们会对排名最差的一个仓做一次“仓级归因”——直接从订单明细、拣货日志、盘点记录里拉数据找到指标波动的直接原因再决定是调补货参数、改路由权重、还是优化仓内动线。说实话这套复盘机制是整个多前置仓体系里投入产出比最高的部分。系统再复杂最终还是要回到每一个仓、每一个SKU、每一单的颗粒度上去看问题才能持续变好。多前置仓模式的系统建设没有那种“搭好框架就完事”的时刻。它更像是在不断做微调调路由权重、调补货系数、调拣货波次大小、调ETA模型。每一次调整背后都有真实订单数据支撑。我在实际操作中的经验是别急着追求复杂算法先把链路里每个环节的关键指标定义清楚把数据埋点做准很多事情会自己浮出水面。

相关新闻

LingBot-World 2.0源码结构全解读:wan目录如何把Wan2.2改造成因果世界模型

LingBot-World 2.0源码结构全解读:wan目录如何把Wan2.2改造成因果世界模型

【免费下载链接】lingbot-world-v2 Infinite Worlds with Versatile Interactions 项目地址: https://gitcode.com/gh_mirrors/li/lingbot-world-v2 点击查看 免费下载 LingBot-World 2.0(LingBot-World-Infinity) 是一款可无限交互的世界模…

2026/10/11 20:36:23 阅读更多 →
个人微信API接口开发教程:如何将微信消息转发给自己的Python程序?

个人微信API接口开发教程:如何将微信消息转发给自己的Python程序?

微信消息转发到Python程序,核心是把微信消息从客户端转到服务端处理。转发不是"复制粘贴"那么简单,要解决消息捕获、格式解析、程序对接、实时性保证四个问题。教程按步骤讲——先配置回调,再解析消息,再对接Python程序…

2026/10/11 20:36:23 阅读更多 →
EMS物料追溯怎样落到项目记录

EMS物料追溯怎样落到项目记录

EMS项目的物料追溯需要连接哪些信息? 物料追溯需要把设计清单、采购与接收记录、投料状态及交付产品关联起来,而不只是保存一份采购单。记录应能够说明某种物料依据哪个版本、经何种确认进入了哪一批产品。具体追溯深度由项目要求确定,文件数…

2026/10/11 20:36:23 阅读更多 →

最新新闻

同城家政服务平台搭建,多商户派单方案详解

同城家政服务平台搭建,多商户派单方案详解

同城家政服务平台搭建:多商户入驻与智能派单方案详解同城家政行业早已从单一门店自营模式,转向多商户平台化联营发展。平台整合全城多家家政公司、个体服务商、持证服务师傅,统一承接用户订单,通过智能调度完成订单分发与履约。相…

2026/10/11 23:39:46 阅读更多 →
PDF加密权限解除实战:用qpdf免费命令行一键解锁

PDF加密权限解除实战:用qpdf免费命令行一键解锁

上周同事甩过来一个PDF,说打印店打不了,让我帮忙看看。我一看,文件本身没坏,是加了权限限制——允许查看,但打印和复制都被锁了。这种问题我一年能遇到几十次:文档在手机上看一点毛病没有,真要用…

2026/10/11 23:39:46 阅读更多 →
大数据缓存实战:Redis与Alluxio定位配置与踩坑

大数据缓存实战:Redis与Alluxio定位配置与踩坑

干大数据这行的人,迟早会被一个词拦住:慢。任务跑得慢、查询出得慢、报表刷得慢,追根问底,大多不是因为计算引擎不给力,而是存储访问拖了后腿。我在几个大数据平台的项目里折腾过缓存方案,常用的两样是Redi…

2026/10/11 23:39:46 阅读更多 →
基于蝴蝶优化算法的IEEE30节点无功优化Matlab实现与参数调优

基于蝴蝶优化算法的IEEE30节点无功优化Matlab实现与参数调优

1. 从"网损"到算法:先搞懂无功优化到底在优化什么说到电力系统优化调度,"有功优化"大家都很熟——机组出多少钱、发多少有功,直接影响运行成本。但大部分人第一次接触"无功优化"时都会有一个疑问:无…

2026/10/11 23:39:46 阅读更多 →
四月修复版H5农场养殖鸡蛋理财鸡源码部署与支付对接避坑指南

四月修复版H5农场养殖鸡蛋理财鸡源码部署与支付对接避坑指南

简介:最新修复版H5农场牧场养殖理财鸡游戏运营源码,定位为可直接运营的网站游戏项目,适合有建站基础、希望搭建休闲理财类H5游戏的个人或团队二次开发。资源包共2271个文件,约88.4MB,主体由HTML页面、JavaScript逻辑、…

2026/10/11 23:39:46 阅读更多 →
改进版Q-learning实战:Double Q、n步回报与经验回放

改进版Q-learning实战:Double Q、n步回报与经验回放

简介:基于Q-learning的改进版强化学习算法项目,聚焦路径规划场景,面向MATLAB用户及强化学习入门者。项目针对经典Q-learning收敛慢的问题,融合学习率衰减、动态ε-greedy探索、经验回放、目标网络与双线性更新等改进策略&#xff…

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

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →