首页/新闻资讯/正文详情

DeepSeek Harness Desktop架构拆解:共享UI如何实现Web与本地Runtime解耦

发布时间:2026/11/4 13:10:50 来源:云帆数科 栏目:资讯中心
DeepSeek Harness Desktop架构拆解:共享UI如何实现Web与本地Runtime解耦
DeepSeek Harness 这个项目最近在智能体编排圈子里讨论度不低尤其是 Desktop 版本的架构设计被不少人拿来当作“桌面壳怎么接 Web UI”的参考案例。我花了一段时间把它的源码结构和运行链路捋了一遍又实际跑了几轮部署和联调今天这篇不聊配置文件的表面用法直接拆一拆它那套共享 UI 是怎么在 Web 模式和本地 Runtime 之间做到真正解耦的。想自己搭一套多智能体本地编排环境、或者正纠结“同一套界面怎么同时跑在浏览器和桌面窗口里”这种问题的朋友这篇文章应该能给你省不少事。当时我第一次看到这套设计的第一反应是这不就是普通的前后端分离吗但深入跟了一遍它的协议层和运行时适配逻辑之后发现事情没那么简单。它不是简单地把前端静态文件丢给 WebView而是在通信协议、认证链路、引擎适配这几个层面分别做了隔离和桥接才做到“一套 UI两种载体多个 Runtime 位置都通用”。1. 整体架构思路共享 UI 到底在共享什么1.1 共享的核心是“逻辑位置不变的 API”不是代码复用很多团队做桌面版时会走两条路要么直接套 Electron 把 Web 前端塞进去要么用 Qt/C# 重写一套原生界面。DeepSeek Harness Desktop 选了一条看起来“笨”但其实更稳妥的路——它没有把 Web 前端代码和桌面端代码合并维护而是让同一份 Web UI 在浏览器和桌面窗口里跑一模一样的页面连路由都一样。关键在于UI 不关心自己是被哪个进程加载的它只认一个 BASE_URL。浏览器模式下面是http://127.0.0.1:某个端口桌面模式下面是 WebView2 加载同一个http://127.0.0.1:某个端口甚至你在局域网里把端口映射出去用另一台电脑的浏览器打开UI 依然能工作。这套逻辑成立的前提是 UI 和 Runtime 之间只通过 HTTP/WebSocket/SSE 这类协议通信所有状态同步都走接口不做进程内共享内存不依赖文件系统路径。1.2 解耦的分界线画在协议层而不是代码层我在代码里最关注的就是它内部的模块边界。按我拆解过的同类项目来看合理的划分应该是这样三层UI 层纯浏览器端单页应用负责渲染、交互、任务编排的可视化拖拽、日志流展示完全无业务逻辑。网关/API 层负责身份验证、请求转发、事件推送把 UI 的所有请求翻译成 Runtime 能理解的任务指令。Runtime 层真正干活的进程负责任务调度、智能体编排、技能Skill加载、模型推理引擎的启停和通信。这套分层最巧妙的地方是桌面模式下的系统浏览器和 WebView2 窗口之间完全没有共享状态它们能同时打开同一个任务表单、实时看到同一份运行日志靠的全是 Runtime 层的统一状态管理。你在浏览器里发起的任务提交桌面窗口里的日志面板能同步滚动出来这种体验第一次跑通的时候确实有点惊喜。1.3 为什么桌面端选 WebView 而不是原生控件可能有人会问既然已经做到协议解耦桌面端为什么不干脆用原生列表、原生表格来渲染任务数据这里有一个很现实的原因智能体编排场景里的 UI 复杂度远超过普通表单类应用。画布拖拽、多智能体连线、实时日志流滚动、参数配置的动态表单这些组件如果要用原生控件重写一遍工作量几乎是重新做一整个前端项目。而直接用 WebView 加载已有的 Web UI组件复用率接近 100%桌面端的壳只需要负责三件事启动 Runtime 进程、拉起本地服务、把窗口指到对应地址。代价也有最典型的就是本文后面会讲到的 WebView2 Runtime 依赖问题以及前端渲染性能在桌面端的表现波动。但从开发效率和维护成本来看这个取舍非常划算。2. 本地 Runtime 与 UI 的桥接机制深挖2.1 dsh web 命令背后的服务编排逻辑实际使用中接触最多的入口就是dsh web。这条命令做的事看起来只是“启动一个 Web 服务”但它的内部其实完成了一个完整的运行时引导检查本地配置目录确认模型引擎类型、模型路径、推理后端比如 llama-server 这类 OpenAI 兼容服务是否可用。启动 Runtime 主进程初始化智能体注册表和技能Skill加载器。在内网端口上启动 HTTP 服务把这个服务地址连同一次性认证信息一起打印到终端。如果带--open之类的参数还会尝试调用系统浏览器打开 UI。这里有个细节值得学习它把“服务启动”和“前端资源分发”拆成了两个独立的生命周期。前端静态资源可以走内置的静态文件服务也可以走独立的 CDN 或外部托管Runtime 和前端资源之间的耦合度几乎为零。这意味着你可以把同一套 UI 部署到远程服务器本地只跑 Runtime 和模型两者通过网络互联完全不冲突。2.2 认证链路和那个“printed URL”的坑如果你用过dsh web大概率见过这么一行报错dsh web authentication required; reopen the url printed by dsh web.我第一次看到这个报错时有点懵因为地址明明就是终端里打印的那个。后来对比了几次才明白它的认证机制是“一次一码”每次服务启动都会生成一个新的短期 token这个 token 拼接在 URL 里类似http://127.0.0.1:8080/?tokenxxxx。如果你打开的是旧书签、或者终端历史里翻出来的旧地址token 对不上服务端就会拒绝并提示你重新打开最新打印的 URL。排查方向就清楚了重新切到启动dsh web的终端窗口确认当前屏幕上的 URL 和浏览器地址栏一致必要时直接按CtrlC重启服务拿最新链接。这套设计从安全角度看是有道理的——它避免了服务端口暴露后被任意设备直接访问因为本地服务虽然只绑定了 127.0.0.1但如果有其他本机进程发起恶意请求一次性 token 仍能挡住一部分越权操作。实际用下来这种认证方案比“用户名密码写死在配置里”要安全一个量级。2.3 引擎协议层Runtime 怎么跟推理引擎对话标题里特别提到了“本地 Runtime”而本地 Runtime 最核心的活就是跟推理引擎对接。从热词里能看到engine protocol runtime llama-server for这类字眼说明它对接的不只是 DeepSeek 官方 API还支持本地 llama-server 这类 OpenAI 兼容的推理服务。这里的协议层设计思路非常值得借鉴Runtime 不直接绑定某一个推理引擎而是通过一个适配器接口来统一定义“加载模型、发起推理、流式输出、停止生成”这几个基础操作。每个引擎只需要实现这套接口就能接入整个编排系统。启动本地 llama-server 时Runtime 负责探测端口、检查健康状态、识别模型名称然后把连接参数传给上层的智能体调度器。我在实测中发现它这个健康检查逻辑做得很细不是简单 ping 一下端口就完事还会真的请求一次/v1/models来确认模型可用的具体名称避免“端口通了但模型加载失败”这种假健康状态。3. 实操记录搭建与部署的关键步骤3.1 安装版本选择的经验DeepSeek Harness 的版本迭代非常快网上能看到不少0.1.5 安装失败、怎么退回到 v0.1.5-rc.2之类的讨论。我的经验是如果你不是要尝鲜最新功能优先选择文档和社区反馈最多的稳定 RC 版而不是最新版。安装失败大多发生在 Python 依赖解析环节尤其是一些带 C 扩展的包在 Windows 上编译容易出问题。操作上我建议按这四步走先确认本机 Python 版本最好在 3.10 到 3.12 之间太新的版本有些依赖轮子还没跟上。使用虚拟环境安装不要直接全局安装否则卸载和切换版本时会非常痛苦。如果安装过程中某个依赖编译报错优先寻找对应平台的预编译轮子不要死磕源码编译。安装完成后直接跑一次dsh --help做冒烟验证别急着启动完整服务。版本回退这事也简单前提是你当初用了虚拟环境直接删掉旧虚拟环境重新用指定版本号安装即可。没有虚拟环境的话依赖残留很容易让新老版本的文件混在一起出一些特别难查的诡异问题。3.2 Docker Desktop 部署与虚拟化检查在 Windows 上跑 Docker Desktop 是很多人的痛。热词里有virtualization support not detected这个报错是 Windows 下最常见的一道坎。它背后的原因是 Docker Desktop 依赖 Hyper-V 或 WSL2 虚拟化能力而你的机器要么在 BIOS 里关闭了虚拟化要么 Windows 功能里没有启用相关组件。处理路径分三步重启进 BIOS找到 Intel VT-x 或 AMD SVM 相关的选项确认开启。在 Windows“启用或关闭 Windows 功能”里勾选虚拟机平台、Windows 虚拟机监控程序平台必要的话同时启用 WSL2。以管理员身份运行bcdedit /set hypervisorlaunchtype auto然后重启。我遇到过一种特殊情况BIOS 里虚拟化明明开着Windows 功能也启用了但 Docker Desktop 还是报虚拟化检测失败。最后发现是电脑上装了第三方虚拟机软件导致 Hyper-V 被占用或冲突。这种时候要么彻底卸载冲突软件要么改用 Docker Desktop 的 WSL2 后端别在 Hyper-V 一棵树上吊死。容器部署场景下DeepSeek Harness 的 Runtime 跑在容器里UI 通过端口映射对外提供服务。这里有一个小细节容器内启动dsh web时要注意认证 URL 打印出来的是容器内网 IP比如172.17.0.2你在宿主机浏览器里直接打开是访问不了的。正确的做法是用-p 8080:8080做端口映射后访问http://127.0.0.1:8080/?tokenxxx。我第一次没注意这个细节盯着容器里的 URL 折腾了半天。3.3 WebView2 Runtime 缺失问题的处理桌面模式下UI 跑在 WebView2 里Windows 上如果缺少 WebView2 Runtime打开桌面应用时就会直接报错。关于这个热词对应的报错信息最常见的就是Could not find the WebView2 runtime。严格来说Win11 系统通常已经自带而 Win10 或精简版系统经常缺。解决办法是下载 Evergreen Bootstrapper 安装这个版本会持续自动更新适合大多数用户。如果你要部署到离线环境就得下载 Fixed Version 安装包然后把 WebView2 的--webview2-version固定下来避免运行时自动更新导致异常。安装完成后如果还提示缺失大概率是环境变量WEBVIEW2_LOADER_PATH没指对或者应用的 manifest 里声明了特定版本但系统装的是不同版本。我一般会先用 Edge 浏览器打开一个本地 HTML 文件确认 WebView2 基础环境可用再回来排查应用壳的问题。3.4 从 Web 模式切换到桌面模式的参数选择dsh web跑起来的是浏览器模式如果要启用桌面壳模式通常需要额外的启动参数或配置文件。我在实操中验证的工作流程是这样的先用dsh web启动服务确认浏览器能正常打开 UI。再启动桌面版此时桌面窗口会加载同一个本地地址。观察两边各自的日志输出确认没有端口冲突和认证绕过问题。需要注意同时跑 Web 模式和桌面模式时它们共享同一个 Runtime 实例的话只有一份状态存储如果你分别启动两个独立 Runtime它们的任务列表和会话记录是完全隔离的。这个“一个 UI 多 Runtime 并行”的特性其实很有用可以同时开两套不同配置的 Runtime方便对比不同模型参数在同一个 UI 下的表现差异。我试过用浏览器分别连一个本地 llama-server 的 Runtime 和一个远程 API 的 Runtime同一个界面里来回切换对比效果体验相当好。4. 常见问题和排查技巧实录4.1 “authentication required” 问题速查这个问题的本质我在前面已经解析过这里直接给速查表现象直接原因处理方式点击终端里的链接提示认证失效打开的是旧 URL回到终端复制最新打印的完整 URL服务重启后旧页面还在使用token 已轮换重启浏览器标签页重新打开局域网其他设备无法访问服务只绑定了 127.0.0.1按文档开启局域网访问开关并重新生成认证地址自动化脚本调用接口 401未带 token 或 token 过期每次服务启动后动态读取最新 token 注入请求头还有一个细节有些反向代理场景下代理服务器把查询参数里的 token 给吞掉了导致后端收不到认证信息。如果你在 Nginx 后面挂这套服务记得把$query_string完整透传给上游。4.2 UI 界面卡顿的诊断思路热词里出现ui界面卡顿这是桌面应用类项目里最常见的抱怨。结合我自己的实际体会UI 卡顿通常不是界面组件本身的问题而要从三层容器逐层排查硬件加速层如果你在 Web 模式下打开页面时控制台出现a WebGL context could not be created这类错误说明 GPU 加速被禁用了。大多数情况下这不是应用的问题而是浏览器或 WebView2 的硬件加速策略过于保守加上显卡驱动不兼容导致的。可以尝试在 WebView2 的启动参数里强制开启 GPU 渲染或者更新显卡驱动后再测试。数据流层如果日志面板每秒推送大量事件而 UI 没有做节流或虚拟列表渲染线程就容易被打满。这时观察任务运行页是否出现滚动卡顿、输入延迟如果是就要考虑是不是日志量过大导致的。网络层WebView2 或浏览器与 Runtime 之间的连接如果走 WebSocket断线重连会带来短暂的无响应感。检查网络面板里有没有频繁的重新连接记录。拿数据流说我实际遇到过一个情况同一个任务的日志输出非常高频每秒几千行UI 完全处理不过来。后来我在 Runtime 配置里调低了日志推送频率、开启 UI 端的虚拟滚动卡顿立刻消解了。如果你遇到类似问题优先查数据推送频率别急着换电脑。4.3 多智能体编排在共享 UI 下的呈现逻辑热词搜索量很高的deepseek harness 多个智能体 编排值得单独说一说。这套系统最大的卖点之一就是你能在同一套 UI 里看到多个智能体的运行状态和协作关系。它的前端画布不是简单的静态流程图而是实时状态可视化每个智能体节点会有独立的运行状态标识正在执行任务的节点会有高亮和参数展示智能体之间的消息传递通过连线动画直观呈现。这背后依赖的是 Runtime 通过 WebSocket 推送的实时状态事件流UI 端的事件总线接收到节点状态变更后只更新画布上对应的局部区域而不是整张画布重新渲染。这个局部更新的细节保证了多智能体同时奔跑时画布还能保持流畅。我之前用三个智能体配合跑一个调研类任务分别是信息收集、内容分析、报告生成。浏览器标签页切到后台时任务依然会持续推进重新切回来看画布能一眼看出哪个智能体卡在工具调用上、哪个已经进入报告生成阶段。这种体验对排查复杂编排任务的问题帮助极大。4.4 卸载、回退和版本管理的避坑提醒关于卸载如果当初用了虚拟环境直接删目录即可。如果混装了Windows 上建议先卸载主程序再手动清掉用户目录下的.harness或类似配置目录避免下次安装时读到残留配置导致异常。版本管理上我强烈建议固定版本而不是跟着最新版走。我第一次折腾回退到v0.1.5-rc.2时因为没有记录之前安装时的依赖锁定文件重装后几个依赖包版本被自动解析成最新版结果运行时报类型错误。后来我学乖了拿到一个能稳定跑起来的版本之后立刻用命令把当前依赖列表导出锁存之后不管是重装还是回退都根据这个文件来还原环境。这个习惯后来帮我省了大量调试时间。另外提一句热词里频繁出现 Redis Desktop ManagerClaude Desktop 这类工具它们和 DeepSeek Harness Desktop 虽然都叫 Desktop但定位完全不同。前者是运维工具后者是 AI 编排应用。如果你想参考架构设计最值得对照的是微软开源的各类 WebView2 混合应用实践以及采用“远程 UI 本地 Runtime”思路的本地 AI 工具箱项目这种组合正在成为一种新的工具形态。我个人判断未来这类“UI 与 Runtime 彻底解耦”的桌面工具会越来越多因为用户既想要 Web 端的便利访问又想要桌面端的本地数据掌控感只有把这两层彻底拆开才能同时满足两个看似矛盾的需求。我自己的实际体会是碰到这种多端共存的工具第一反应不要急着去看界面效果先把它运行时暴露出来的端口协议、认证机制和引擎适配这三条线摸清楚后面不管是排查问题还是二次开发都会顺很多。最后分享一个小技巧把dsh web打印的原始 URL 存成环境变量再写一个简单的启动脚本每次启动后自动打开最新地址能完美绕开那个认证链接过期问题。后续想扩展的话也可以在这个共享 UI 的基础上接入更多自定义技能整套机制比我最初预期的要抗折腾得多。

相关推荐

思源宋体网页排版终极配置:加载优化与子集化实战
思源宋体网页排版终极配置:加载优化与子集化实战

1. 为什么思源宋体突然成了网页排版的“新刚需”? 最近在好几个前端项目复盘会上,团队都绕不开一个名字: Source Han Serif 思源宋体 。不是那种“听说很火就试试”的跟风,而是实实在在卡在交付节点上——某高校人文学院官网改版… · 2026/11/4 13:09:50

安卓智能语音对话机器人源码:唤醒识别到串口动作链路
安卓智能语音对话机器人源码:唤醒识别到串口动作链路

简介:智能语音对话机器人是一套面向安卓开发者与语音交互爱好者的完整项目源码,围绕语音识别、对话理解与机器人大脑接口展开,可用于学习如何把语音输入转为文本、再由自然语言处理生成应答,并驱动提醒、音乐、天气等日常功能。压… · 2026/11/4 13:09:50

Unity远距离贴图闪烁根因与Mipmap精准调优指南
Unity远距离贴图闪烁根因与Mipmap精准调优指南

1. 为什么远距离贴图闪烁不是“玄学”,而是Mipmap在敲门Unity里那个让人抓狂的场景——远处的墙面、地面、建筑表面突然像接触不良的旧电视一样“滋啦滋啦”闪动,颜色跳变、纹理撕裂、细节忽隐忽现,尤其在镜头缓慢平移或轻微晃动时最为明显。… · 2026/11/4 13:09:50

Jev不是便宜版GPT:一次生产环境模型切换的踩坑复盘
Jev不是便宜版GPT:一次生产环境模型切换的踩坑复盘

上周办公室有个同事跑来问我:你那个对话服务每个月账单不低吧,为什么不换 Jev?外面都在传它是“便宜版 GPT”,接口兼容、价格便宜一个量级,改个 base_url 就能切过去。 我没直接接话,因为这话让我想起了两… · 2026/11/4 13:51:55

Intel算力引擎+WorkBuddy:35B大模型本地部署与端云混合实战
Intel算力引擎+WorkBuddy:35B大模型本地部署与端云混合实战

1. 端侧算力爆发前夜:为什么35B大模型开始往本地跑过去一年我身边不少做AI应用的朋友都在干同一件事:把原本跑在云端的模型往本地搬。原因很直接,云端API按token计费,长期用下来成本压不住,而且数据出本地这件事在很多… · 2026/11/4 13:51:55

建筑翻模自动化:从CAD图纸与点云到可算量BIM构件
建筑翻模自动化:从CAD图纸与点云到可算量BIM构件

简介:翻模大师(建筑)是一款面向建筑设计、施工与BIM从业者的软件工具资源,聚焦建筑信息模型的创建、编辑和管理,帮助设计师、工程师及施工团队在方案设计、施工准备和项目协作中提高沟通效率。压缩包为rar格式&#xf… · 2026/11/4 13:51:55

大数据处理技术:从分布式计算到实时架构实践
大数据处理技术:从分布式计算到实时架构实践

1. 数据洪流时代的挑战与机遇 每天产生的数据量已经超过了过去五千年的总和。从社交媒体上的点赞记录到工业传感器采集的温度读数,从金融交易流水到基因测序结果,数据正以每秒数百万条的速度在全球网络中奔涌。我曾在某次项目复盘会上看到一组令人震撼的… · 2026/11/4 13:51:55

Intel算力引擎+WorkBuddy:本地部署35B大模型与端云混合实战
Intel算力引擎+WorkBuddy:本地部署35B大模型与端云混合实战

1. 端侧算力爆发前夜:为什么35B大模型开始往本地跑这两年我身边做AI应用的朋友都有一个共识:模型能力不是瓶颈,推理成本和数据隐私才是。云端API调用看起来方便,但一旦你的业务量上来,token费用会像温水煮青蛙一样吃掉… · 2026/11/4 13:51:55

Nginx安全配置:如何将运行用户从root切换为nginx
Nginx安全配置:如何将运行用户从root切换为nginx

1. 项目概述 在服务器运维工作中,Nginx作为一款高性能的Web服务器和反向代理服务器,其安全配置至关重要。默认情况下,Nginx会以root用户身份运行主进程,这存在潜在的安全风险。本文将详细介绍如何将Nginx的工作进程切换为nginx用户… · 2026/11/4 13:50:54

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

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

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

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

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

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

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码