LuatOS:Air8101 Suntime APP开发指南——从 AirUI 界面到 TaoToken 统一 Key 接入
1. 从 AirUI 界面到云端调用Suntime APP 的最小闭环长什么样LuatOS 是合宙面向嵌入式设备推出的轻量级操作系统Air8101 是搭载这套系统的硬件引擎而 AirUI 则是跑在 LuatOS 上的轻量化图形框架。把这三者串起来你就能在一块 480×800 的嵌入式屏幕上做出带交互的 APP。Suntime 就是这样一个例子它查询日出日落时间展示白昼时长、黄昏结束、正午参考还能倒计时距离日落还有多久。但真正让这个 APP 从“能看”变成“能用”的是它背后的网络请求能力。嵌入式设备本地算天文算法当然可以可一旦你要接入大模型做自然语言交互、要拉取实时天气、要做云端配置下发就必须有一个稳定的 API 通道。TaoToken 在这里扮演的角色就是给 Air8101 这类设备提供一个统一的 Key 和 API 入口让你不用在每台设备上分别管理不同厂商的密钥。这篇文章适合谁如果你正在用 LuatOS AirUI 做嵌入式界面开发已经跑通了本地 UI 但卡在“怎么让设备调用云端服务”这一步那接下来的内容就是为你准备的。我会从 AirUI 页面配置讲到 TaoToken 的接入参数再到真机日志验证把整条链路拆开揉碎。先说清楚整体架构。Suntime APP 运行在 Air8101 上AirUI 负责渲染界面和处理触摸事件LuatOS 的 httpplus 扩展库负责发起 HTTPS 请求。请求的目标不是某个具体厂商的接口而是 TaoToken 的统一 API 地址。你在 TaoToken 控制台创建一个 Key这个 Key 可以调用多个模型设备端只需要记住一个 Base URL 和一个 Key换模型只改 Model ID 就行。这个设计对嵌入式设备特别友好。Air8101 的内存和存储都有限你不可能在设备上存一堆不同厂商的 SDK 和密钥。统一 Key 意味着固件里只需要写一套请求逻辑模型切换在云端完成。我实测下来从 AirUI 界面点击按钮到收到云端响应整个链路在正常 WiFi 环境下延迟可以控制在可接受范围内。接下来我会先讲 AirUI 页面怎么搭、事件怎么绑然后讲 TaoToken 的 Key 怎么拿、API 怎么调最后给出一套可复制的配置片段和排错清单。你不需要先看完所有内容再动手可以边看边在模拟器上试。2. AirUI 页面搭建与事件绑定Suntime 界面从零到可交互AirUI 的页面开发方式和传统嵌入式 GUI 不太一样。它借鉴了 Web 开发的思路用 Lua 脚本描述界面结构用事件回调处理交互。对于 Suntime 这种信息展示型 APP核心页面就三个区域顶部城市选择、中部日出日落时间卡片、底部倒计时和辅助信息。先看页面配置文件的结构。在 Suntime 的 user 目录下你会有一个 suntime_win.lua 文件它负责创建窗口和布局。AirUI 的布局系统基于容器和控件的嵌套每个控件有自己的坐标、尺寸和样式属性。480×800 的分辨率下我建议把页面分成纵向三段顶部 120px 放城市选择和刷新按钮中间 400px 放日出日落主卡片底部剩余空间放白昼时长、黄昏结束、正午参考三个小卡片。事件绑定的关键在于 AirUI 的事件分发机制。每个可交互控件都可以注册回调函数比如按钮的点击事件、列表的滑动事件。Suntime 里最重要的交互是“切换城市”和“手动刷新”。切换城市可以用一个下拉列表或者左右滑动切换手动刷新就是一个按钮。回调函数里不要直接写网络请求而是发一个消息给业务逻辑层这样界面和逻辑解耦调试起来方便。这里给一个可复制的 AirUI 页面配置片段你可以直接放到 suntime_win.lua 里改local win {} local layout { type linear, orient vertical, width 480, height 800, children { { type linear, orient horizontal, height 120, children { { type label, id city_label, text 北京, width 200 }, { type button, id refresh_btn, text 刷新, width 100 } } }, { type container, id sun_card, height 400, children { { type image, id sunrise_icon, src /luadb/sunrise.png }, { type label, id sunrise_time, text --:-- }, { type image, id sunset_icon, src /luadb/sunset.png }, { type label, id sunset_time, text --:-- } } }, { type linear, orient horizontal, height 200, children { { type label, id daylight_label, text 白昼时长 }, { type label, id dusk_label, text 黄昏结束 }, { type label, id noon_label, text 正午参考 } } } } }事件绑定的代码长这样local function on_refresh_click() sys.publish(SUNTIME_REFRESH_REQ) end local function on_city_change(city) sys.publish(SUNTIME_CITY_CHANGED, city) end win.bind function() local refresh_btn airui.find(refresh_btn) refresh_btn.on(click, on_refresh_click) local city_list airui.find(city_list) city_list.on(select, on_city_change) end这里有个坑要注意AirUI 的控件查找是在窗口创建完成后才能进行的所以 bind 函数要在窗口 open 之后调用。我试过在窗口创建前就 find 控件结果返回 nil日志里也不报错排查了半天才发现是时序问题。图片资源的路径也有讲究。AirUI 里引用 res 目录下的图片要用/luadb/xxx.png的格式而不是直接写文件名。这是因为 LuatOS 的沙箱机制会对路径做映射/luadb/开头的路径会被自动映射到 APP 自己的 res 目录。如果你写错了路径日志里会出现lv_image_set_src: failed to get image info的警告图片就是显示不出来。界面搭好之后下一步就是让界面能拿到数据。数据从哪来本地天文算法可以算个大概但如果你要接入云端服务就需要 TaoToken 的统一 Key 和 API 通道。下一节讲怎么拿 Key、怎么配参数。3. TaoToken 统一 Key 接入从控制台到 Air8101 的完整配置TaoToken 的核心价值在于“统一”。你不需要为每个模型单独申请密钥也不需要记住不同厂商的 API 地址格式。一个 Key一个 Base URL换模型只改 Model ID。这对嵌入式设备来说意味着固件里只需要写一套请求逻辑。先拿 Key。打开 TaoToken 官网注册登录后进入控制台在 API Keys 页面创建一个新的 Key。创建的时候可以给 Key 起个名字比如 “air8101-suntime”方便后续管理。Key 创建后会显示一次复制保存好页面上不会再显示完整 Key。如果你要管理多个设备的 Key可以在控制台里给每个设备单独创建这样某个设备 Key 泄露了可以单独吊销不影响其他设备。拿到 Key 之后你需要知道 API 的 Base URL。TaoToken 的 API 地址是https://taotoken.net/api注意这个地址不带任何路径后缀具体的接口路径在请求时拼接。比如对话接口是/v1/chat/completions模型列表接口是/v1/models。在 Air8101 上配置这些参数我建议放在一个单独的 config.lua 文件里不要硬编码在业务逻辑中。这样换环境或者换 Key 的时候只改一个文件。配置片段如下-- config.lua local config { api_base https://taotoken.net/api, api_key sk-你的Key, model_id claude-3-5-sonnet, timeout 15000, retry_count 2 } return config如果你用的是 Claude Code 或者类似的编码工具来辅助开发TaoToken 也提供了对应的接入方式。在 Claude Code 的 settings 里你可以把 Base URL 指向 TaoToken 的 API 地址Key 填 TaoToken 的 KeyModel ID 填你想用的模型。这样你在本地用 Claude Code 写代码的时候请求会走 TaoToken 的通道。对于 Cline 或者 MCP 类的工具配置方式类似。在 Cline 的 MCP 配置里你需要填三个东西Base URL、API Key、Model ID。Base URL 就是https://taotoken.net/apiAPI Key 是你创建的那个Model ID 根据你要用的模型填。Codex 的 auth.json 里也是同样的三件套格式如下{ base_url: https://taotoken.net/api, api_key: sk-你的Key, model: claude-3-5-sonnet }回到 Air8101 这边。LuatOS 的 httpplus 扩展库支持 HTTPS 请求但你需要确保固件里包含了这个库。前面提到的默认出厂软件里已经包含了 httpplus所以一般情况下不用额外添加。如果你的固件版本比较老可以在 libs 目录下放一份 httpplus.lua。请求的封装我建议单独写一个模块比如api_client.lua对外暴露一个request(messages, callback)函数。内部处理拼接 URL、设置 Header、发送请求、解析响应、错误重试。这样业务层只需要关心“我要问什么”和“拿到结果后做什么”。Header 里最关键的是Authorization: Bearer 你的Key和Content-Type: application/json。少了 Authorization 会返回 401少了 Content-Type 可能返回 400。这两个错误在日志里都能看到后面排错章节会详细讲。配置完成后先别急着在真机上跑。在 PC 模拟器上验证一遍请求链路确认能拿到响应再烧录到 Air8101。模拟器上的日志输出更完整排查问题更方便。4. 验证请求与真机日志从模拟器到 Air8101 的成功结果配置写好了接下来要验证整条链路能不能跑通。我建议分两步走先在 PC 模拟器上验证网络请求再在 Air8101 真机上验证完整流程。模拟器上的验证核心是看日志。LuatOS 模拟器启动后你可以在命令行窗口看到实时日志输出。当你点击 Suntime 的刷新按钮时应该能看到类似这样的日志序列I/user.suntime 发起请求: https://taotoken.net/api/v1/chat/completions I/user.suntime 请求体: {model:claude-3-5-sonnet,messages:[{role:user,content:查询北京日出日落时间}]} I/user.suntime 响应状态: 200 I/user.suntime 响应内容: {choices:[{message:{content:...}}]}如果看到响应状态: 200并且后面有内容说明请求成功了。这时候你可以把响应内容解析出来更新到界面上。解析 JSON 用 LuatOS 的 json 库json.decode(response_body)就能拿到 table。真机上的验证稍微复杂一点。你需要把 APP 代码复制到模拟器目录或者烧录到 Air8101。烧录的方式参考 LuatOS 的官方文档这里不展开。真机运行后日志会通过串口输出你可以用串口工具查看。真机日志里最关键的是看有没有W/airui开头的警告和E/开头的错误。一个成功的真机日志片段长这样I/user.[/app_store/Suntime/] main SUNTIME 001.999.000 I/user.[/app_store/Suntime/] require enter: suntime_win I/user.[/app_store/Suntime/] exwin.open window opened, ID: 3 I/user.suntime 网络请求开始 I/user.suntime HTTP 200 OK I/user.suntime 日出时间: 05:42 日落时间: 18:57看到最后一行说明数据已经从云端拿到并更新到界面了。这时候你再看屏幕日出日落时间应该已经显示出来了。如果请求失败日志里会有对应的错误码。401 表示 Key 无效或没传403 表示 Key 权限不够429 表示请求太频繁500 表示服务端问题。这些错误码对应的排查方法在下一节详细讲。验证的时候还有一个细节Air8101 的 WiFi 连接状态。如果设备没连上 WiFi请求会直接失败日志里可能只显示network not ready或者类似的提示。所以在发请求之前先确认 WiFi 已经连上。你可以在代码里加一个检查if not socket.isReady() then return end避免在没网的时候发请求。模拟器上验证通过后真机上一般不会有大问题。但真机环境更复杂WiFi 信号强度、内存占用、固件版本都可能影响结果。如果真机上失败先看日志再对照下一节的排查清单。5. 常见错误排查401、local proxy failed、reading choices 与 OAuth 报错嵌入式开发最耗时的环节就是排错。我把 Suntime 开发过程中遇到的和可能遇到的错误整理成了一份清单你可以对照日志快速定位。401 Unauthorized这是最常见的错误。日志里会显示HTTP 401或者invalid api key。原因通常有三个Key 没填、Key 填错了、Key 被吊销了。检查 config.lua 里的 api_key 字段确认没有多余的空格或换行。如果你是从控制台复制的 Key注意不要复制到前后空格。另外确认 Header 里的格式是Bearer sk-xxxBearer 和 Key 之间有一个空格。local proxy failed这个错误通常出现在模拟器上日志里会显示local proxy failed或者connect timeout。原因是模拟器所在的电脑网络环境有问题或者防火墙拦截了请求。检查电脑能不能正常访问https://taotoken.net/api可以用浏览器打开这个地址看看有没有响应。如果浏览器能打开但模拟器不行检查模拟器的网络配置确保它走的是系统代理。reading choices 报错这个错误说明请求发出去了响应也回来了但解析响应的时候找不到choices字段。日志里会显示attempt to index nil value或者choices is nil。原因可能是响应格式和你预期的不一样比如你请求的是模型列表接口返回的是data字段而不是choices。检查你的请求 URL 和请求体确认调的是对话接口而不是其他接口。另外如果响应是错误信息比如{error: model not found}也不会有 choices 字段。先打印完整的响应内容看看服务端到底返回了什么。OAuth 相关报错如果你在 Claude Code 或者类似工具里配置了 TaoToken可能会遇到 OAuth 报错。日志里会显示OAuth token invalid或者authentication failed。这是因为某些工具默认走 OAuth 流程而 TaoToken 用的是 API Key 认证。你需要在工具的配置里明确指定用 API Key而不是 OAuth。具体来说在 Claude Code 的 settings 里把认证方式改成 API Key填上 TaoToken 的 Key。图片不显示这个在前面提过日志里会出现lv_image_set_src: failed to get image info。检查图片路径是不是/luadb/xxx.png格式检查图片文件是不是真的在 res 目录下检查图片名称有没有中文或特殊字符。AirUI 对图片格式有要求建议用 PNG 格式背景透明。APP 打不开或闪退日志里会显示open app failed或者require error。检查 main.lua 是否存在检查 require 的模块名和文件名是否一致检查 user 目录下有没有语法错误的 Lua 文件。Lua 是解释型语言语法错误会在运行时才暴露所以日志里的错误行号很重要。请求超时日志里显示timeout或者request timeout。Air8101 的网络环境可能不稳定建议在 config 里设置合理的超时时间比如 15000 毫秒。同时加上重试逻辑失败后自动重试 1-2 次。重试的时候注意不要立即重试加一个短暂的延迟比如 500 毫秒。排查的时候有一个通用技巧先看日志的最后几行错误通常在那里。然后从错误往上找看请求发出前的日志确认参数是否正确。如果日志不够详细可以在关键位置加log.info输出中间变量。LuatOS 的日志系统很灵活你可以用不同的 tag 区分模块方便过滤。6. 从 Suntime 到更多可能统一 Key 在嵌入式场景的实用技巧Suntime 跑通之后你手里就有了一套可复用的模式AirUI 做界面LuatOS 做逻辑TaoToken 做云端通道。这套模式可以迁移到很多嵌入式场景。比如你想做一个智能家居中控屏界面上有灯光控制、温度显示、场景切换。本地控制走 GPIO 和继电器云端交互走 TaoToken。用户说“把客厅灯调暗一点”设备把这句话发给云端模型模型返回控制指令设备解析后执行。整个过程不需要在设备上跑大模型只需要一个 HTTP 请求。再比如户外设备的数据上报和远程配置。设备定时把传感器数据发到云端云端分析后返回配置参数。TaoToken 的统一 Key 让你可以在云端切换不同的分析模型设备端完全无感。实用技巧方面我总结了几条。第一Key 不要硬编码在业务逻辑里放在单独的 config 文件方便替换。第二请求封装成模块业务层只调接口不关心底层实现。第三日志要打全请求 URL、请求体、响应状态、响应内容都打出来排错的时候能省很多时间。第四超时和重试要有嵌入式网络环境不稳定没有重试机制很容易失败。第五模型 ID 做成可配置的方便在不同模型之间切换测试。如果你要长期做嵌入式 AI 应用开发可以考虑 TaoToken 的 Coding Plan。它提供更稳定的调用额度和更灵活的模型切换适合需要频繁调用云端服务的场景。具体可以看 Coding Plan 页面。最后说一个我踩过的坑Air8101 的内存有限解析大响应的时候要注意。如果响应内容超过几 KB建议分段解析或者只取需要的字段。LuatOS 的 json 库会把整个响应加载到内存响应太大的话可能触发内存不足。我试过请求一个长文本响应结果设备直接重启了。后来改成只请求需要的字段问题就解决了。整条链路跑通后你会发现嵌入式 AI 应用的门槛比想象中低。AirUI 负责好看LuatOS 负责好用TaoToken 负责聪明。三者结合一块小小的 Air8101 就能做出有云端智能的 APP。

相关新闻

openrig 实战:用 tmux 与 Node.js 编排 Claude Code 和 Codex 多会话

openrig 实战:用 tmux 与 Node.js 编排 Claude Code 和 Codex 多会话

1. openrig 到底想解决什么问题第一次看到 openrig 这个名字,很多人会以为是某个硬件机架项目,或者是一个跟摄影器材相关的工具。但结合它周边的关键词——Claude Code、Codex、Node.js、tmux——基本可以判断,这是一个围绕 AI 编程助手做环境…

2026/10/4 21:08:14 阅读更多 →
AI工程实战:从环境搭建到部署监控的零基础完整指南

AI工程实战:从环境搭建到部署监控的零基础完整指南

1. AI工程不是调包,是从零开始建立一整套工程思路起这个项目名的时候,我脑子里想到的是另一件事:AI工程这个词,这几年出现的频率越来越高,但真正能说清楚“AI工程到底在干什么”的人,其实不多。你问一个刚入…

2026/10/4 21:08:14 阅读更多 →
从零手搓AI工程:避开调包陷阱,掌握核心优化与部署

从零手搓AI工程:避开调包陷阱,掌握核心优化与部署

1. 从零手搓AI工程:为什么我不建议你直接调包很多人一提到“AI工程”,第一反应就是pip install transformers,然后写三行代码调用一个预训练模型,跑通了就觉得自己入门了。我刚开始也是这么想的,直到有一次线上推理服务…

2026/10/4 21:08:14 阅读更多 →

最新新闻

基于CNN与OpenCV SSD的人脸情绪识别系统实战:从毕设压缩包到实时推理

基于CNN与OpenCV SSD的人脸情绪识别系统实战:从毕设压缩包到实时推理

简介:这份资源是面向深度学习入门者、毕业设计与课程设计学生的完整人脸情绪识别项目包,围绕卷积神经网络与实时目标检测两条技术路线展开,解决从人脸定位到表情分类的落地问题。压缩包共11个文件、约11.89MB,包含Python源码、模型…

2026/10/4 21:54:04 阅读更多 →
端侧视觉AI工程实战:浏览器中部署神经网络的四大核心层

端侧视觉AI工程实战:浏览器中部署神经网络的四大核心层

1. 这不是“跑个demo”,而是把AI模型塞进浏览器标签页的硬核工程现场“把神经网络塞进一个浏览器标签页”——这句话听起来像极了程序员圈里那种带点戏谑的夸张修辞。但如果你真去翻过TensorFlow.js的GitHub issue、看过ONNX Runtime Web的性能调优文档、或者亲手在…

2026/10/4 21:54:04 阅读更多 →
DeepAgents+MCP+A2A+Skills:工业级Agent集群落地范式

DeepAgents+MCP+A2A+Skills:工业级Agent集群落地范式

1. 这不是又一个“Agent玩具”:为什么DeepAgentsMCPA2ASkills的组合突然成为工业级Agent集群的分水岭你可能已经看过太多“5分钟用LangChain搭个聊天机器人”的教程,也刷到过无数标着“下一代AI Agent”的宣传页——但它们大多止步于单点Demo&#xff1a…

2026/10/4 21:54:04 阅读更多 →
LeGO-LOAM在KITTI数据集上的完整部署与调优指南

LeGO-LOAM在KITTI数据集上的完整部署与调优指南

1. 项目概述:为什么要在KITTI数据集上跑LeGO-LOAM?LeGO-LOAM,全称Lightweight and Ground-Optimized Lidar Odometry and Mapping,是2018年出自密歇根大学团队的一套经典激光SLAM算法。它不是那种“学术玩具”,而是真正…

2026/10/4 21:54:04 阅读更多 →
Matlab中rms函数详解:从有效值计算到性能评价实战

Matlab中rms函数详解:从有效值计算到性能评价实战

开篇直接说重点:rms(均方根)这个函数,几乎是Matlab里被低估得最厉害的函数之一。很多人第一眼以为它只是个统计工具箱里的边角料,实际在做信号质量评估、振动有效值计算、噪声水平度量、模型误差对比这类“结果性能评价…

2026/10/4 21:54:04 阅读更多 →
YOLO监控场景行人检测实战:数据集训练全流程与避坑指南

YOLO监控场景行人检测实战:数据集训练全流程与避坑指南

简介:面向街道监控场景的行人检测数据集,共包含1200张监控视角抓拍图片,标注类别为person,最大特点是已按YOLO系列要求生成txt标签,可直接用于YOLOv3至YOLOv10等全系列算法训练。资源包内总计2000个文件,由…

2026/10/4 21:53:04 阅读更多 →

日新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/4 1:00:58 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/4 1:00:58 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/4 1:00:58 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/4 1:00:58 阅读更多 →

月新闻

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