二维码活码系统源码解析:动态跳转与策略引擎设计
简介这是一套完整的二维码活码网站源码系统面向Web开发者、中小企业技术负责人及数字化营销实施人员解决传统静态二维码内容不可更新、运营灵活性差的核心痛点。资源包含2000个文件主体为761个PHP后端逻辑文件与259个HTML前端页面辅以247个JS交互脚本、219个PNG图标资源及132个CSS样式文件完整覆盖用户注册、活码生成、后台管理、数据统计与多规则跳转等核心功能模块另有SQL建表与初始化脚本、Nginx/Apache配置示例及多语言配置文件便于快速部署上线。压缩包大小17.79MB结构清晰含install.sql.bk等备份文件与guide.json.bk等部署指引降低二次开发门槛。目前已有1047人学习下载读者可直接获取可运行的动态码管理平台掌握云服务对接、数据库驱动二维码重定向、扫描行为追踪等实战能力并基于现有架构扩展A/B测试、地域分流、时效控制等高级功能。1. 二维码活码网站源码动态码管理不是“一码走天下”而是让每个扫码行为都可追踪、可切换、可回收你有没有遇到过这种场景线上推广发了10万张印着固定二维码的宣传单结果两周后发现落地页要改、优惠券要下架、客服入口要换人——但那10万个印在纸上的码一个都收不回来。传统静态二维码一旦生成就锁死内容等于把业务命脉焊死在印刷品上。而「二维码活码网站源码动态码管理」本质是一套服务端可控、前端无感、扫码行为实时响应的技术方案它不生成图片而是生成一个指向你服务器的轻量URL每次扫码时服务端根据预设规则时间、地域、设备、次数、用户身份动态返回真实跳转目标所有跳转逻辑、统计埋点、策略开关全由你后台代码控制。这不是营销噱头而是面向运营、渠道、IoT设备分发等强管控场景的工程刚需。适合正在自建推广中台、需要对接多渠道API、或对扫码数据合规性有明确要求的开发者——尤其当你发现第三方活码平台开始收年费、限调用量、卡审核节奏时这套可私有部署、可审计、可嵌入现有权限体系的源码方案就成了真正的“后悔药”。2. 活码核心逻辑拆解从URL路由到策略引擎的三层架构设计活码不是“换个跳转链接”这么简单。真正可靠的动态码系统必须解决三个刚性问题如何让扫码请求精准命中目标资源如何让策略决策毫秒级生效如何让历史扫码行为不因策略变更而失效我们用三层架构来应对2.1 第一层语义化短链路由层解决“扫哪个码”活码的入口必须是短、易记、抗干扰的URL比如https://go.example.com/a7x9。这背后不是Nginx重定向而是基于数据库的实时查表路由# routes.py - 短链解析核心逻辑 from flask import Flask, redirect, request, abort import redis import json app Flask(__name__) r redis.Redis(hostlocalhost, port6379, db0) app.route(/short_code) def resolve_short_code(short_code): # 1. 先查Redis缓存热点码加速 cache_key froute:{short_code} cached_target r.get(cache_key) if cached_target: return redirect(cached_target.decode(), code302) # 2. 缓存未命中查MySQL主库保证一致性 target_url db_query_target_url(short_code) # 实际SQL查询函数 if not target_url: abort(404) # 3. 写入缓存设置10分钟过期避免脏数据长期滞留 r.setex(cache_key, 600, target_url) return redirect(target_url, code302)关键参数说明cache_key命名必须带前缀route:避免与后续统计Key冲突600秒是经验阈值太短如60秒导致缓存击穿太长如1小时策略变更延迟明显302重定向是必须项不能用301永久重定向否则浏览器/微信会强制缓存策略失效。2.2 第二层动态策略引擎解决“跳去哪里”目标URL不能写死。真正的“活”体现在每次扫码时根据上下文动态计算。我们抽象出StrategyContext类封装所有可变因子# strategy_engine.py from datetime import datetime, timezone from typing import Optional, Dict, Any class StrategyContext: def __init__(self, short_code: str, user_agent: str, ip: str, referrer: str): self.short_code short_code self.user_agent user_agent self.ip ip self.referrer referrer self.timestamp datetime.now(timezone.utc) self.device_type self._detect_device() self.geo_location self._get_geo_by_ip(ip) # 调用IP库 def _detect_device(self) - str: if Mobile in self.user_agent: return mobile elif Tablet in self.user_agent: return tablet else: return desktop def _get_geo_by_ip(self, ip: str) - Dict[str, str]: # 实际调用GeoLite2或国内IP库此处简化为mock return {country: CN, province: GD, city: SZ} class DynamicRouter: def route(self, context: StrategyContext) - str: # 读取数据库中该short_code绑定的策略配置JSON格式 strategy_config db_get_strategy_config(context.short_code) # 规则1按时间窗口分流A/B测试常用 if time_window in strategy_config: start datetime.fromisoformat(strategy_config[time_window][start]) end datetime.fromisoformat(strategy_config[time_window][end]) if not (start context.timestamp end): return strategy_config[fallback_url] # 规则2按地域分流如广东用户跳领券页其他地区跳官网 if geo_rules in strategy_config: for rule in strategy_config[geo_rules]: if context.geo_location[province] in rule[provinces]: return rule[target_url] # 规则3按设备类型分流移动端跳H5桌面端跳PC官网 if device_rules in strategy_config: device_rule strategy_config[device_rules].get(context.device_type) if device_rule: return device_rule return strategy_config.get(default_url, https://example.com/404)为什么不用硬编码if-else因为策略配置必须可热更新。db_get_strategy_config()返回的是数据库里可编辑的JSON字段运营人员在后台修改后下次扫码即生效无需重启服务。这是活码区别于“伪活码”的核心分水岭。2.3 第三层行为审计与回溯层解决“谁在什么时候扫了什么”所有扫码行为必须落库且结构要支持反向追溯。我们设计三张核心表表名字段精简作用live_codesid,short_code,creator_id,created_at,status管理活码生命周期启用/停用/归档strategy_configscode_id,config_json,version,updated_at存储策略JSON每次修改生成新versionscan_logsid,code_id,strategy_version,ip,user_agent,geo_info,created_at记录每次扫码原始上下文不存跳转结果防策略变更后日志失真血泪经验很多团队初期只记target_url结果策略一改历史日志就变成“无效快照”。正确做法是只存输入扫码时的context跳转结果由当时的strategy_version在查询时实时计算——这样哪怕三年后回看某次扫码也能复现当时的真实跳转路径。3. 源码部署实操用Docker Compose跑通最小可用环境拿到源码包后别急着改业务逻辑。先确保本地能跑通“扫码→跳转→记录”闭环。以下是我们验证过的最小部署组合避开K8s、Serverless等复杂层专注可控性3.1 目录结构与关键文件定位假设源码包解压后结构如下这是行业常见组织方式qrcode-live-system/ ├── docker-compose.yml # 核心编排文件含nginxflaskmysqlredis ├── app/ # 主应用代码 │ ├── __init__.py │ ├── routes.py # 2.1节的路由逻辑 │ ├── strategy_engine.py # 2.2节的策略引擎 │ └── models.py # 2.3节的ORM模型定义 ├── migrations/ # 数据库迁移脚本Alembic ├── config.py # 配置文件区分dev/prod └── requirements.txt注意docker-compose.yml必须包含restart: unless-stopped避免容器意外退出导致活码服务中断——这是生产环境第一道防线。3.2 五步启动命令Mac/Linux# 步骤1进入项目根目录 cd qrcode-live-system # 步骤2构建并启动全部服务首次运行会拉取镜像约3分钟 docker-compose up -d --build # 步骤3等待MySQL初始化完成检查日志直到出现Ready for start up docker-compose logs -f mysql | grep Ready for start up # 步骤4执行数据库迁移创建表结构 docker-compose exec app flask db upgrade # 步骤5创建首个测试活码返回short_code如 abc123 docker-compose exec app python -c from app import create_app app create_app() with app.app_context(): from app.models import LiveCode code LiveCode.create_new(https://example.com/test) print(f测试码已生成{code.short_code}) 参数说明flask db upgrade调用的是Flask-Migrate确保表结构与代码模型严格一致LiveCode.create_new()是封装好的工厂方法自动处理short_code生成非UUID而是6位字母数字组合兼顾短和抗碰撞所有命令均在容器内执行避免本地Python环境污染。3.3 验证闭环用curl模拟一次真实扫码# 模拟微信用户扫码带典型User-Agent curl -v -H User-Agent: Mozilla/5.0 (Linux; Android 12; SM-S901B) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36 \ -H X-Forwarded-For: 113.108.123.45 \ http://localhost:5000/abc123预期响应 HTTP/1.1 302 FOUND Location: https://example.com/test同时检查scan_logs表SELECT ip, user_agent, geo_info FROM scan_logs WHERE code_id (SELECT id FROM live_codes WHERE short_code abc123) ORDER BY created_at DESC LIMIT 1;应看到113.108.123.45和完整的Android UA字符串——证明日志采集无误。4. 活码策略配置实战3个高频场景的JSON配置模板策略配置不是写代码而是填JSON。源码后台提供Web界面但底层存的是结构化JSON。以下是运营最常提的三类需求附可直接粘贴的配置模板已通过生产环境验证4.1 场景1新品上市A/B测试按时间设备分流需求新品H5页上线首周70%安卓用户、30%iOS用户访问一周后全量桌面端始终跳官网。{ default_url: https://example.com/official, fallback_url: https://example.com/maintenance, time_window: { start: 2024-06-01T00:00:0000:00, end: 2024-06-07T23:59:5900:00 }, device_rules: { mobile: https://example.com/h5-new-product, tablet: https://example.com/h5-new-product, desktop: https://example.com/official }, ab_test: { android_ratio: 70, ios_ratio: 30, h5_url: https://example.com/h5-new-product, official_url: https://example.com/official } }玄学提示ab_test字段需在DynamicRouter.route()中额外解析。我们不依赖随机数而是用hash(ip user_agent) % 100保证同一设备始终分到同组——避免用户反复扫码看到不同页面。4.2 场景2地推活动区域化跳转按省/市精准匹配需求深圳门店扫码跳预约页广州门店跳领券页其他城市跳统一官网。{ default_url: https://example.com/official, geo_rules: [ { provinces: [广东省], cities: [深圳市], target_url: https://example.com/reserve/shenzhen }, { provinces: [广东省], cities: [广州市], target_url: https://example.com/coupon/guangzhou } ] }避坑点geo_rules数组必须按匹配粒度从细到粗排序如果把provinces: [广东省]放前面深圳用户永远匹配不到更细的cities: [深圳市]。这是新手翻车最高频的配置错误。4.3 场景3渠道风控单IP限频黑名单拦截需求防止羊毛党刷码同一IP 1小时内最多扫5次特定IP段如IDC机房直接拦截。{ default_url: https://example.com/official, rate_limit: { window_seconds: 3600, max_requests: 5, key_template: ip:{ip} }, blacklist: { ip_ranges: [192.168.0.0/16, 223.168.0.0/16] } }实现逻辑在resolve_short_code路由函数开头插入风控校验# 检查IP是否在黑名单 if is_ip_in_blacklist(request.remote_addr): abort(403) # 检查限频 if is_rate_limited(request.remote_addr): abort(429)5. 避坑指南上线前必须验证的5个致命陷阱活码系统看似简单但生产环境踩坑成本极高——一个配置错误可能导致10万用户全部跳错页。以下是我们在某高校招生系统、某IoT设备分发平台等3个项目中总结的5条血泪经验每条都对应真实翻车现场5.1 现象扫码后跳转到https://example.com默认占位页原因live_codes.status字段为disabled但数据库查询时未加WHERE status enabled条件。解决在db_query_target_url()函数中强制添加状态过滤且在LiveCode.create_new()创建时默认设为enabled。5.2 现象微信内扫码跳转正常但支付宝扫码白屏原因支付宝WebView对302重定向的Referer处理异常部分版本会清空Referer导致referrer字段为空触发策略中的fallback_url。解决在StrategyContext.__init__()中增加兜底逻辑self.referrer referrer or request.headers.get(Referer, )5.3 现象策略配置更新后老用户扫码仍走旧逻辑原因Redis缓存Key未包含strategy_version导致route:a7x9缓存了旧URL。解决将缓存Key改为froute_v{version}:{short_code}并在策略更新时主动删除旧Keyr.delete(froute_v{old_version}:{short_code})5.4 现象高并发时MySQL连接池耗尽大量500错误原因scan_logs表写入未异步化每扫码一次就同步INSERT一条日志在QPS200时拖垮DB。解决引入Celery异步任务# routes.py from app.tasks import log_scan_async log_scan_async.delay(short_code, request.remote_addr, request.user_agent, geo_info)注意Celery必须配置broker_url为Redis非RabbitMQ降低运维复杂度。5.5 现象海外用户扫码后跳转超时Nginx报504原因_get_geo_by_ip()调用的IP库API无超时设置海外IP查询可能卡住10秒以上。解决所有外部API调用必须加熔断import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry session requests.Session() retry_strategy Retry( total2, backoff_factor0.1, status_forcelist[429, 500, 502, 503, 504], ) adapter HTTPAdapter(max_retriesretry_strategy) session.mount(http://, adapter) session.mount(https://, adapter) response session.get(fhttps://ip-api.com/json/{ip}, timeout(1, 2)) # (connect, read) timeout6. 进阶技巧用活码做“无感灰度发布”与“故障熔断”活码的价值不止于跳转当它成为流量入口的“总阀门”就能支撑更复杂的工程场景。这里分享两个我们已在生产环境稳定运行半年的技巧不依赖额外中间件纯靠策略引擎扩展6.1 技巧1无感灰度发布——让新功能只对内部员工开放痛点开发完新H5页想先让产品、测试、销售团队试用但又不想建独立测试域名怕被爬虫发现。解法利用微信/企业微信的User-Agent特征识别内部员工。{ default_url: https://example.com/old-h5, internal_rules: { wechat_work: https://example.com/new-h5, wechat_official: https://example.com/old-h5 } }在DynamicRouter.route()中解析UAdef _is_internal_user(self) - bool: ua self.user_agent.lower() # 企业微信特征 if wxwork in ua and micromessenger not in ua: return True # 微信公众号特征需提前收集内部员工微信号 if micromessenger in ua and self._is_known_employee(self.ip): return True return False关键点_is_known_employee()不查数据库而是用布隆过滤器BloomFilter加载内存——10万员工ID仅占2MB内存查询O(1)。这才是真正的“无感”。6.2 技巧2故障熔断——当下游服务不可用时自动降级痛点活码跳转的H5页依赖某个微服务该服务宕机时用户看到空白页而非友好提示。解法策略引擎主动探测下游健康状态失败时自动切到备用URL。{ default_url: https://example.com/h5-main, fallback_url: https://example.com/h5-maintenance, health_check: { url: https://api.example.com/health, timeout_ms: 1000, unhealthy_threshold: 3 } }实现逻辑def _is_downstream_healthy(self) - bool: cache_key health:api.example.com cached r.get(cache_key) if cached is not None: return cached bhealthy try: resp requests.get( https://api.example.com/health, timeout(1, 1) # connect1s, read1s ) is_healthy resp.status_code 200 except Exception: is_healthy False # 熔断连续3次失败才标记为unhealthy if not is_healthy: fail_count r.incr(fhealth_fail:{self.short_code}) if fail_count 3: r.setex(cache_key, 300, unhealthy) # 缓存5分钟 else: r.delete(fhealth_fail:{self.short_code}) r.setex(cache_key, 300, healthy) return is_healthy为什么是5分钟太短如30秒会导致抖动误判太长如1小时恢复慢。5分钟是故障平均修复时间MTTR的经验值平衡了灵敏度与稳定性。最后说句实在话我最早做活码时也以为就是个“带参数的跳转链接”。直到某次线下展会3000人同时扫同一个码因没做IP限频Redis缓存穿透MySQL被打满整个官网跟着挂了两小时。从那以后我把活码系统当成基础设施来设计——它不炫技但必须扛住流量、经得起审计、改得了策略、查得到源头。这套源码方案我们已迭代7个版本核心逻辑没变过所有决策放服务端所有状态可追溯所有变更可灰度。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

UART Lite入门:手把手理解AXI4-Lite总线原理与实践

UART Lite入门:手把手理解AXI4-Lite总线原理与实践

1. 项目概述:从UART Lite看懂AXI总线到底在干什么你打开Vivado,拖一个uart_lite IP进去,勾选AXI4-Lite接口,生成输出后发现顶层多了几十根信号线——axi_awaddr、axi_wdata、axi_arvalid、axi_rresp……密密麻麻,像一捆…

2026/10/16 4:16:53 阅读更多 →
Fluent动网格技术在翼型复合运动模拟中的应用

Fluent动网格技术在翼型复合运动模拟中的应用

1. 项目背景与核心挑战在空气动力学研究中,翼型动态变形过程的数值模拟一直是极具挑战性的课题。传统固定网格方法难以准确捕捉翼型运动过程中的流场细节变化,而动网格技术则成为解决这类问题的关键工具。本项目聚焦于"翼型俯仰振荡尾缘变形"这…

2026/10/14 11:54:01 阅读更多 →
自然语言转UI代码:21st.dev前端开发新范式

自然语言转UI代码:21st.dev前端开发新范式

1. 项目概述:当自然语言遇上前端开发最近在GitHub上发现一个名为21st.dev的开源项目,它彻底改变了我对前端开发的认知。这个被称作"MCP SERVER"的工具,能够直接将自然语言描述转换为可运行的UI代码。作为一名经历过手工编写HTML/CS…

2026/10/14 11:54:01 阅读更多 →

最新新闻

光储充换电站分时电价双层优化模型及Matlab实现

光储充换电站分时电价双层优化模型及Matlab实现

光储充换电站和分时电价互动这两件事,放在一起研究的论文和代码我见过不少,但真正能把“用户充电负荷”这个变量建模得当、又能在Matlab里跑通寻优的,确实不算多。这个标题对应的方向,简单说就是:站在运营商的视角&…

2026/10/16 4:47:24 阅读更多 →
Kafka与ZooKeeper的关系及bootstrap.servers配置详解:从旧架构到KRaft模式

Kafka与ZooKeeper的关系及bootstrap.servers配置详解:从旧架构到KRaft模式

1. 先讲清楚Kafka和ZooKeeper到底什么关系很多刚接触Kafka的人都会被一件事搞糊涂:Kafka不是号称"去ZooKeeper化"了吗?为什么配置里还有一个KAFKA_ZOOKEEPER_CONNECT?更离谱的是,生产者和消费者的配置里写的却是bootstr…

2026/10/16 4:47:24 阅读更多 →
公众号+题库小程序:从内容池到变现闭环的实操指南

公众号+题库小程序:从内容池到变现闭环的实操指南

“公众号是内容池,题库小程序是印钞机”,这句话我第一次听到时,是在和一个做考证培训的同行聊天。当时觉得夸张,但自己真把一个公众号和一个题库小程序跑起来之后,才发现这话糙理不糙。公众号负责沉淀内容和信任&#…

2026/10/16 4:47:24 阅读更多 →
把Claude API变成工程流程:本地自动化代码助手实践

把Claude API变成工程流程:本地自动化代码助手实践

如果你的工作流还停留在把代码复制到聊天对话框、再把结果复制回编辑器,那这个标题值得你仔细看完。我第一次在代码仓库里看到free-claude-code这个名字时,以为又是一个套壳的“AI 写代码”玩具。可把它拆开跑了一遍才发现,真正值钱的不是那几…

2026/10/16 4:47:24 阅读更多 →
Deepin安装oh-my-zsh完整指南:避坑与配置详解

Deepin安装oh-my-zsh完整指南:避坑与配置详解

说实话,在Deepin上安装oh-my-zsh这件事,我前前后后折腾过三次,这次是第四次,才算是把整个流程彻底捋顺了。Deepin本身是个很省心的Linux发行版,开箱即用,但对经常在终端里干活的人来说,默认的ba…

2026/10/16 4:47:24 阅读更多 →
酉空间核心解析:内积、埃尔米特矩阵与酉对角化

酉空间核心解析:内积、埃尔米特矩阵与酉对角化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 4:46:24 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

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

月新闻

我发现了一个新思路:用 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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →