景区旅游小程序源码部署与二次开发全流程指南
简介这份PHP经典源码面向希望学习Web应用开发或搭建景区在线服务平台的开发者以旅游小程序为实战场景覆盖预订、导航、信息查询等核心业务。源码包共1952个文件约27.88MB以1186个PHP文件为主体辅以phpt测试脚本、png图片、json与xml配置、html页面、js脚本以及微信小程序端的wxss、wxml样式与结构文件另有md文档、yml配置和字体资源目录结构完整便于按模块研读。已有668人学习下载。读者可从中理解PHP处理请求、与MySQL交互、构建RESTful API及前后端分离的完整流程学习微信登录支付集成、模板引擎视图分离、SQL注入与XSS防护、密码加密存储、缓存与数据库索引优化等实践并参考错误处理、日志记录、Git版本管理与Nginx部署配置是掌握PHP旅游行业数字化开发的宝贵案例。1. 景区旅游小程序源码拆解从压缩包到可运行环境的完整路径拿到一个景区旅游小程序源码压缩包很多人的第一反应是解压、找入口文件、配数据库、跑起来。但真正做过这类项目的人都知道从压缩包到线上可用中间隔着的不是几步操作而是一堆需要提前想清楚的问题这套源码的技术栈是什么、依赖哪些扩展、数据库结构能不能支撑景区场景、支付和地图接口怎么替换成自己的。景区旅游小程序的核心业务通常围绕门票预订、景点展示、路线推荐、订单管理、核销验票这几块展开PHP 在这个场景里承担的是后端接口和后台管理的角色前端则是微信小程序原生或 uni-app 之类的框架。这套源码适合谁适合手里有景区或旅行社客户、需要快速搭一套预订系统的开发者也适合想拿一个完整业务闭环来练手 PHP 接口开发的人。但要注意源码能跑起来和能上线运营是两回事中间涉及接口替换、安全加固、数据初始化这些必须自己动手的环节。下面按实际落地顺序把每一步拆开讲。2. 环境搭建与源码结构梳理先搞清楚文件在干什么2.1 运行环境的最低配置与扩展依赖拿到源码后不要急着改代码先把运行环境对齐。景区旅游小程序这类 PHP 项目常见做法是基于 ThinkPHP 或 Laravel 框架也有部分老项目用原生 PHP 加自研路由。不管哪种环境配置的逻辑是一样的PHP 版本、数据库版本、缓存服务、伪静态规则这四项对不上后面全是玄学报错。我一般会先看源码根目录有没有composer.json或think文件有的话基本能确定框架和依赖。然后看application或app目录下的模块划分通常会有api、admin、home这几个模块分别对应小程序接口、后台管理、PC 端页面。数据库配置文件一般在config/database.php或.env文件里先把这个文件找出来后面配数据库全靠它。最低配置建议如下这是跑通大部分 PHP 小程序后端的底线组件建议版本说明PHP7.4 或 8.0低于 7.4 很多语法不支持高于 8.1 部分老框架有兼容问题MySQL5.7 或 8.0注意字符集用 utf8mb4景区名称常有生僻字Nginx1.18伪静态规则必须配否则接口 404Redis5.0缓存 session 和热点数据没有也能跑但性能差Composer2.x如果项目有 composer.json必须用它装依赖PHP 扩展方面fileinfo、gd、curl、openssl、mbstring、pdo_mysql这几个是必须开的。gd用于生成海报和缩略图curl用于调微信接口和地图接口openssl用于支付签名。少一个对应功能就报错。配置伪静态时ThinkPHP 的规则是location / { if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s$1 last; } }Laravel 的规则是location / { try_files $uri $uri/ /index.php?$query_string; }不确定框架就看public/index.php里的入口逻辑或者直接访问域名看报错信息里有没有框架名称。2.2 目录结构与核心文件定位解压后先别动代码用tree命令或者文件管理器把目录结构过一遍。典型的景区旅游小程序源码目录大概长这样├── application/ # 应用代码 │ ├── api/ # 小程序接口模块 │ │ ├── controller/ # 控制器 │ │ └── model/ # 模型 │ ├── admin/ # 后台管理模块 │ └── common/ # 公共函数和配置 ├── config/ # 配置文件 ├── public/ # 网站根目录 │ ├── index.php # 入口文件 │ ├── static/ # 静态资源 │ └── uploads/ # 上传文件目录 ├── extend/ # 扩展类库 ├── runtime/ # 运行时缓存 └── vendor/ # Composer 依赖重点看三个地方application/api/controller里有哪些接口、config/database.php里的数据库配置、public/uploads目录的权限。接口列表能告诉你这套源码覆盖了哪些业务比如Ticket.php、Order.php、Scenic.php这些控制器名基本能对应门票、订单、景点。数据库配置里除了账号密码还要注意表前缀后面导数据的时候要对上。runtime目录必须可写否则缓存生成失败会报 500。public/uploads也要可写景区图片和用户头像都往这里存。权限命令chmod -R 755 runtime chmod -R 755 public/uploads chown -R www:www runtime public/uploadswww是 Nginx 运行用户具体看nginx.conf里的user配置。2.3 数据库导入与初始配置数据库这一步最容易翻车。源码包里一般会有一个.sql文件位置不固定可能在根目录也可能在database或install目录下。导入之前先建库CREATE DATABASE scenic_tour DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;然后导入mysql -u root -p scenic_tour scenic_tour.sql导入完成后检查三件事表前缀是否和配置文件一致、管理员账号是否存在、系统配置表里有没有默认数据。管理员账号通常在admin或system_user表里密码是 MD5 或 password_hash 加密的如果不知道默认密码可以自己生成一个替换进去?php // 生成 password_hash 密码用于替换数据库里的管理员密码 $password your_new_password; echo password_hash($password, PASSWORD_DEFAULT);把输出的哈希值复制到数据库对应字段即可。如果是 MD5直接用md5(your_new_password)的结果替换。系统配置表一般叫config或system_config里面存着微信 AppID、AppSecret、地图 Key、短信配置这些。这些值必须换成自己的否则小程序端调接口会报“无效的 appid”或“签名错误”。替换之前先把原来的值备份一下万一要回滚还能找到。3. 核心业务接口调试门票、订单、核销怎么跑通3.1 小程序端接口的鉴权与请求链路景区旅游小程序的接口鉴权通常走微信登录换 token 的流程。小程序端调wx.login()拿到 code传给后端api/user/login接口后端用 code 换 openid 和 session_key然后生成一个自定义 token 返回给小程序。后续请求都在 header 里带这个 token后端中间件校验 token 有效性。这套流程在源码里的实现位置一般在application/api/controller/User.php的login方法以及application/api/middleware/Auth.php中间件。调试的时候先确认这两个文件的存在然后看 token 的生成和校验逻辑。常见做法是用 JWT 或者 Redis 存 tokenJWT 的话看firebase/php-jwt这个依赖有没有装Redis 的话看config/cache.php里的配置。调试登录接口可以用 curl 模拟# 模拟小程序登录code 需要从微信开发者工具里获取 curl -X POST https://your-domain.com/api/user/login \ -H Content-Type: application/json \ -d {code:wx_code_here}返回的 JSON 里应该有token字段。拿到 token 后调其他接口# 用 token 请求景点列表 curl -X GET https://your-domain.com/api/scenic/list \ -H Authorization: Bearer your_token_here如果返回 401检查中间件的 token 解析逻辑如果返回 500看runtime/log下的错误日志通常是数据库字段对不上或者缓存服务没连上。3.2 门票库存与订单状态流转门票预订是景区小程序的核心。库存扣减和订单状态流转这两个逻辑如果写不好超卖和状态错乱是迟早的事。源码里这部分一般在application/api/controller/Order.php和application/api/service/TicketService.php。库存扣减的常见做法有两种数据库乐观锁和 Redis 预扣减。乐观锁的 SQL 大概是这样UPDATE ticket_stock SET stock stock - 1, version version 1 WHERE ticket_id ? AND stock 0 AND version ?;影响行数为 0 就说明库存不足或版本冲突需要重试或直接返回失败。Redis 预扣减则是先把库存加载到 Redis用DECR原子操作扣减扣减成功再异步写数据库。两种方式各有适用场景并发不高用乐观锁就够了秒杀场景必须上 Redis。订单状态一般有待支付、已支付、已核销、已取消、已退款。状态流转的代码要重点看Order.php里的pay、cancel、verify这几个方法。支付回调里要校验签名和订单金额核销接口要校验核销码的有效期和使用次数。这些校验如果缺失就是后面被薅羊毛的入口。调试订单流程时先把支付接口 mock 掉直接改数据库状态来验证后续逻辑。比如把订单状态从待支付改成已支付然后看核销码有没有生成、库存有没有扣减、通知有没有发出去。这样能快速定位问题出在哪一环。3.3 核销端与后台管理的联调核销端一般是景区工作人员用的小程序页面或者 H5 页面输入核销码或扫码调后端api/order/verify接口完成核销。后台管理则是 PC 端用 admin 模块的接口查看订单、管理门票、导出报表。联调的时候注意三个点核销码的生成规则、核销次数限制、核销时间窗口。核销码一般是订单号加随机数或者直接用一个 UUID生成后存在订单表里。核销次数限制是防止一码多用通常一个订单只能核销一次但有些景区支持多次入园这个要看源码里的verify_times字段怎么设计的。核销时间窗口是限制只能在游玩日期当天核销提前或过期都不行。后台管理的接口调试相对简单主要是确认权限控制和数据范围。管理员登录后能看所有订单普通操作员只能看自己景区的订单这个逻辑一般在admin/middleware/Auth.php里通过角色 ID 过滤。如果发现越权访问检查中间件里的数据范围过滤条件是不是漏了。4. 避坑与常见问题排查那些让你加班到凌晨的细节4.1 微信支付回调不生效现象用户支付成功但订单状态还是待支付后台看不到已支付订单。原因微信支付回调地址配置错误或者回调处理逻辑里签名校验失败或者服务器有防火墙拦截了微信的 POST 请求。解决先看微信支付商户平台里的回调地址是不是https://your-domain.com/api/pay/notify然后看 Nginx 日志里有没有微信服务器的 POST 请求记录。如果没有请求记录就是防火墙或安全组的问题。如果有请求但处理失败看runtime/log里的错误信息通常是签名校验的密钥不对或者回调数据解析方式有问题。微信支付 V3 和 V2 的回调格式不一样源码用的是哪个版本要确认清楚。4.2 小程序端图片上传失败现象后台上传景区图片成功但小程序端上传头像或评价图片时报“上传失败”。原因小程序端的上传接口地址没配成 HTTPS或者后端upload接口的域名白名单没加或者public/uploads目录权限不对。解决小程序要求所有请求必须 HTTPS上传接口也不例外。先确认https://your-domain.com/api/upload能正常访问然后在微信开发者工具里看网络请求的报错信息。如果是 403检查 Nginx 有没有限制上传大小如果是 500看 PHP 的upload_max_filesize和post_max_size是不是太小。目录权限问题前面已经讲过chmod 755和chown www:www两步都要做。4.3 数据库导入后中文乱码现象后台能看到景区名称但小程序端显示乱码或者反过来。原因数据库字符集不是 utf8mb4或者连接字符集配置不对或者导入 SQL 时用了错误的字符集。解决先检查数据库和表的字符集SHOW CREATE TABLE scenic_spot;如果字符集是utf8而不是utf8mb4需要改表ALTER TABLE scenic_spot CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;然后检查config/database.php里的charset参数是不是utf8mb4。如果导入时已经乱码只能重新导入导入命令加上字符集参数mysql -u root -p --default-character-setutf8mb4 scenic_tour scenic_tour.sql4.4 定时任务不执行导致订单超时未取消现象用户下单后不支付订单一直停留在待支付状态库存被占用。原因源码里通常有一个定时任务脚本用来扫描超时未支付订单并取消但这个脚本没有配置到 crontab 里。解决找到源码里的定时任务文件一般在application/command或者根目录的crontab文件夹下。ThinkPHP 的话用php think order:cancel这样的命令Laravel 用php artisan order:cancel。然后加到 crontab# 每分钟执行一次取消超时未支付订单 * * * * * cd /path/to/project php think order:cancel /dev/null 21配完后手动跑一次命令确认能正常执行再看日志里有没有报错。4.5 核销码被重复使用现象同一个核销码在多个核销端都能核销成功。原因核销接口没有加锁两个请求同时进来都查到了“未核销”状态然后都执行了更新。解决在核销逻辑里加数据库行锁或者 Redis 分布式锁。行锁的写法SELECT * FROM order WHERE verify_code ? FOR UPDATE;然后在事务里判断状态并更新。Redis 锁的话用SETNX加过期时间拿到锁的请求才能执行核销。源码里如果没有这块逻辑需要自己补上否则景区人多的时候一码多用是必然的。5. 从能跑到能用接口替换、安全加固与二次开发切入点5.1 第三方接口替换清单与操作顺序源码里默认集成的第三方接口上线前必须全部换成自己的。替换顺序建议按依赖关系来先换微信登录和支付再换地图和短信最后换存储和推送。微信登录和支付在config/wechat.php或数据库配置表里替换 AppID、AppSecret、商户号、支付密钥。替换后先用微信开发者工具测试登录再用 1 分钱测试支付。地图接口一般在config/map.php替换 Key 后测试景点定位和路线规划。短信接口在config/sms.php替换后测试验证码发送。存储如果用的是本地存储确认public/uploads目录够大如果用 OSS替换 AccessKey 和 Bucket 信息。替换完一个就测一个不要全换完再测否则出问题不知道是哪个接口的事。5.2 安全加固的四个必做项第一关闭调试模式。config/app.php里的app_debug改成falseapp_trace也关掉。调试模式下报错信息会暴露文件路径和数据库账号这是最常见的低级漏洞。第二后台入口改名。默认的/admin路径改成随机字符串减少被扫描的风险。改完后 Nginx 里加一条重定向规则把旧路径 301 到新路径。第三接口频率限制。登录接口和短信接口必须加频率限制防止被刷。ThinkPHP 可以用think-throttle中间件Laravel 自带throttle中间件。配置示例// ThinkPHP 中间件配置限制每分钟最多 10 次请求 \think\middleware\Throttle::class [ visit_rate 10/m, ],第四SQL 注入和 XSS 过滤。检查所有控制器的查询条件确认用了参数绑定而不是字符串拼接。XSS 过滤在输出到小程序端之前做用htmlspecialchars转义用户输入。5.3 二次开发的三个高价值切入点第一个切入点是预约时段管理。很多景区源码只支持按天预约但实际运营中需要分时段预约比如上午场、下午场。这个功能的改动涉及数据库加字段、接口加参数、小程序端加选择器工作量不大但很实用。第二个切入点是分销裂变。景区门票的分销是一个刚需源码里如果没有分销模块可以基于订单表扩展。核心逻辑是给每个用户生成一个分销码下单时带上分销码支付成功后给分销者返佣。返佣规则可以配置成固定金额或比例。第三个切入点是数据看板。后台默认的报表通常比较简单可以加一个实时看板展示今日订单量、核销率、收入趋势。数据源直接用订单表和核销表聚合前端用 ECharts 渲染。这个功能对景区运营方来说很直观能显著提升后台的可用性。5.4 上线前的检查清单与回滚方案上线前把这几项过一遍调试模式已关闭、第三方接口已替换、管理员密码已改、数据库定时备份已配置、HTTPS 证书已生效、核销接口已加锁、订单超时取消已生效。每项都确认一遍不要跳过。回滚方案也要提前准备。代码用 Git 管理上线前打 tag出问题直接回滚到上一个 tag。数据库每天凌晨自动备份备份文件保留最近 7 天。如果上线后发现严重问题先回滚代码再根据备份恢复数据库。我自己踩过最狠的一次坑是上线后忘了关调试模式结果第二天就被人扫到了数据库账号幸好发现得早没造成损失。从那以后上线检查清单里“关闭调试模式”永远排在第一位。希望这些经验能帮到你少走一些弯路。本文还有配套的精品资源点击获取

相关新闻

让机器人学会设计下一个自己:Physical RSI与AutoResearch方法论拆解

让机器人学会设计下一个自己:Physical RSI与AutoResearch方法论拆解

1. 从RoboDojo榜单说起:一个成立3个月的团队凭什么登顶RoboDojo这个名字,最近在机器人学习圈子里被反复提起。它本质上是一个面向具身智能体的综合评测基准,覆盖抓取、装配、移动操作、多步任务规划等几十类任务,评分维度不只看成…

2026/10/17 5:24:25 阅读更多 →
Claude Code模板全解析:从CLAUDE.md到Hooks的工程化实践

Claude Code模板全解析:从CLAUDE.md到Hooks的工程化实践

claude-code-templates 这个名字,最近在开发者圈子里出现的频次明显高了起来。拆开看其实很直白:一组围绕 Claude Code 这个终端级 AI 编程助手设计的模板方案,涵盖 CLAUDE.md 项目指令文件、斜杠命令、权限策略、hooks 钩子配置等一整套可复…

2026/10/17 5:24:25 阅读更多 →
Vim快速上手指南:从模式到高效编辑的完整攻略

Vim快速上手指南:从模式到高效编辑的完整攻略

说实话,每次有新人问我“如何快速学会vim”,我都有点不知道怎么回答。因为vim这东西,用“学会”这个词其实不太准确,更贴切的说法是“习惯”——它是把你从鼠标和菜单的舒适区里硬拽出来,逼着你的手指和思维重新建立一…

2026/10/17 5:24:25 阅读更多 →

最新新闻

DashPlayer 安装教程:英语学习视频播放器从源码到跑起来的完整指南

DashPlayer 安装教程:英语学习视频播放器从源码到跑起来的完整指南

DashPlayer 安装教程:英语学习视频播放器从源码到跑起来的完整指南 【免费下载链接】DashPlayer 为英语学习者量身打造的视频播放器,助你通过观看视频、沉浸真实语境,轻松提升英语水平。#美剧 #播放器 #听力 项目地址: https://gitcode.com…

2026/10/17 5:56:32 阅读更多 →
POI读取docx异常全解析:从文件结构到实战排查

POI读取docx异常全解析:从文件结构到实战排查

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

2026/10/17 5:56:32 阅读更多 →
DFS与邻接表实战:树形结构遍历与翻转操作详解

DFS与邻接表实战:树形结构遍历与翻转操作详解

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

2026/10/17 5:56:32 阅读更多 →
OpCore Simplify 实操:从硬件报告到 OpenCore EFI 的 6 个步骤

OpCore Simplify 实操:从硬件报告到 OpenCore EFI 的 6 个步骤

OpCore Simplify 实操:从硬件报告到 OpenCore EFI 的 6 个步骤 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 如果你曾在 PC 上装过 macO…

2026/10/17 5:56:32 阅读更多 →
客户档案不用录入:Macro CRM 从团队邮件里自动长出销售管道

客户档案不用录入:Macro CRM 从团队邮件里自动长出销售管道

客户档案不用录入:Macro CRM 从团队邮件里自动长出销售管道 【免费下载链接】macro Macro is a unified workspace for teams: email, chat, docs, tasks, agents, calls, and CRM — -linked together with shared AI memory. 项目地址: https://gitcode.com/Git…

2026/10/17 5:56:32 阅读更多 →
从零搭建Python数据科学环境:Anaconda与虚拟环境配置详解

从零搭建Python数据科学环境:Anaconda与虚拟环境配置详解

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

2026/10/17 5:55:32 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 14:23:36 阅读更多 →