news 2026/9/3 11:51:14

ToolJet自托管指南:用低代码平台快速搭建内部工具

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ToolJet自托管指南:用低代码平台快速搭建内部工具

这次我们不聊模型,聊一个很能提升内部工具研发效率的开源低代码平台:ToolJet。它解决的问题很具体:日常给业务团队做订单管理、客户查询、审批、报表这类后台系统,需求相似,但每次都要从零写前端页面,再拉接口、调权限,工作量重复。ToolJet 把可视化页面搭建、数据源连接、查询配置、权限控制集中到一个平台上,部署在自己的服务器里,数据链路掌握在自己手上。

ToolJet 的核心价值不只是“拖拽生成表单”这一层,而是把内部系统最常见的数据流链路串起来:页面上的按钮、表格、表单,可以绑定数据库、REST API 或其他数据源,用户在前端操作后,事件驱动查询执行,再刷新组件并回写数据。整个过程可以用少量 JavaScript/Python 胶水逻辑做协调,也可以接外部任务接口做批量处理。

这篇文章会按照自托管工具类项目的完整验证路径来写:先给出核心能力速览架构和环境准备,然后讲 Docker 启动方式,再演示一个“查询数据-表格展示-按钮更新”的典型内部工具搭建思路,之后展开 REST API 接入、批量任务边界、权限模型、日志备份和常见排错。你可以照着把 ToolJet 跑起来,再看它适不适合自己的团队。

1. ToolJet 核心能力速览

能力项说明
项目定位开源低代码内部工具开发平台,用于构建后台、看板、审批、数据管理类应用
开源与托管代码托管在 GitHub 的 ToolJet/ToolJet 仓库,官方同时提供云端托管版
部署方式支持云端 SaaS,也支持 Docker / Docker Compose 等自托管方式
主要功能可视化页面设计、组件库、多数据源连接、查询编辑器、事件处理器、角色权限、发布管理
可连接数据源关系型数据库、NoSQL、Redis 等常见存储,以及 REST API、GraphQL 等接口类型
逻辑扩展支持 JavaScript 表达式、查询结果 Transformer、脚本类查询
硬件要求普通服务器/开发机即可,无 GPU 需求;资源大小按并发与数据量调整
是否支持批量轻量批量任务可以在界面脚本和查询中完成;重型批量建议交给后端 Worker
是否支持 API可以在应用中对外调用 API,也可以把平台作为内部工具承载层使用
适合团队需要快速交付内部系统,且在意数据私有化、权限控制和交付效率的团队

从这张表能看出,ToolJet 的目标不是替代你的核心业务后端,而是把“读数据、展示数据、用户操作、回写数据、权限收敛”这一整套内部系统开发流程标准化。

2. ToolJet 能用来做什么,不能做什么

2.1 适合的场景

ToolJet 最容易落地的场景是内部业务系统。例如运营后台需要展示用户订单列表,字段多、筛选多,业务方经常要改查询维度;用 ToolJet 可以直接连业务数据库,拖一个表格,把筛选条件组件和查询参数绑定,后端不需要额外为这种内部页面写接口。又比如审批系统,需要把工单、状态、流转记录放在一个界面上,非技术同事也能根据权限查看和处理,这类界面用低代码搭建非常合适。

另一个常见场景是接口聚合看板。企业内部经常有多个服务,每个服务有自己的管理页面,登录方式还不一样。你可以把多个 REST API 接到 ToolJet,在一个应用中分别查询、合并数据、统一展示。这样团队不必把权限系统完全打通,也能解决日常“到处切系统看数据”的痛点。

2.2 不适合的场景

ToolJet 并不适合所有界面开发。面向 C 端用户的高并发页面、强运营设计要求、复杂交互动画、离线优先的客户端,这些场景不应该放到低代码平台里做。它也不适合承载核心业务的事务链路,因为复杂的分布式事务、消息中间件深度集成、精细化性能调优,都需要在专门的服务端代码中完成。

批量处理更要注意边界。ToolJet 的脚本运行在浏览器/前端服务上下文中,适合做几百条数据级别的循环请求,不适合直接拿它跑十万级的数据清洗和分发任务。更稳妥的做法是,让 ToolJet 作为任务入口,把需要处理的数据交给后端业务服务,由 Worker 异步消费,ToolJet 负责展示任务状态和结果。

2.3 数据安全与合规边界

使用 ToolJet 连接业务数据库或第三方接口时,需要先确认权限来源。比如连接生产数据库,应使用只读账号或最小权限账号;调用第三方 API,Token 尽量通过环境变量或密钥管理保存,不要直接写死在页面组件里。内部数据通常包含用户隐私或商业敏感信息,上线前要做访问范围和审计策略确认。

3. ToolJet 自托管部署的组件与环境准备

3.1 部署组件认识

ToolJet 自托管不是单个静态文件,它由几个核心部分组成:前端服务用于渲染页面设计器和最终应用;后端服务提供应用保存、用户、权限、数据源配置等能力;元数据库使用 PostgreSQL 保存平台自身的应用定义、用户和数据源加密信息。你还要安装 Docker Compose,用来编排后端服务和依赖的数据库。

如果只是最小测试,可以把 ToolJet 服务和一个 PostgreSQL 容器跑在同一台机器上。生产环境建议把 PostgreSQL 放到独立存储或有自动备份的数据库服务中,并将 ToolJet 服务单独部署,便于扩容。

3.2 环境准备清单

检查项建议说明
服务器/开发机2 核 4G 起步低配置可以完成功能验证,生产按在线用户数扩容
操作系统Linux 为主,Windows/macOS 可做体验Docker 方式跨平台部署差异较小
DockerDocker Engine + Docker Compose 插件用于容器编排
端口规划一个服务端口,如 8081启动前确认端口未被占用
存储磁盘要留有镜像和数据库空间建议单独挂载数据卷
网络能拉取 Docker 镜像,或配置镜像源首次启动需要下载镜像

3.3 自托管的关键配置

ToolJet 部署模板通常会要求一些平台级密钥配置。这些密钥用于加密数据源凭据、生成登录会话等。生产环境不要使用默认值,建议用随机方式生成。可以使用下面的命令生成十六进制安全随机串:

# 生成随机密钥的通用方法,具体变量名以官方部署模板为准 openssl rand -hex 32

注意,密钥一旦生成,平台会用它加密数据源凭据。如果之后更换密钥,之前保存的数据库密码可能无法解密。因此保存密钥时要放入服务器环境变量或密钥管理服务,并做好备份。

4. Docker Compose 方式启动 ToolJet

4.1 准备一个最小部署文件

ToolJet 的官方仓库里提供了完整的部署模板。下面是一个最小化的 Docker Compose 结构示例,用来表达部署关系,不等于官方完整模板。你需要结合官方仓库里的deploy目录来使用。

# 示例文件,完整配置以 ToolJet 官方部署模板为准 services: postgres: image: postgres:15 environment: POSTGRES_DB: tooljet POSTGRES_USER: tooljet POSTGRES_PASSWORD: change_this_password volumes: - tooljet_pg_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U tooljet"] interval: 5s timeout: 5s retries: 10 tooljet: image: tooljet/tooljet:latest ports: - "8081:80" environment: TOOLJET_HOST: http://localhost:8081 # 实际部署时需要设置密钥变量,并以官方模板为准 depends_on: postgres: condition: service_healthy volumes: - tooljet_data:/app/data volumes: tooljet_pg_data: tooljet_data:

这个文件表达了两层意思:PostgreSQL 容器存放 ToolJet 的平台元数据,ToolJet 服务容器通过depends_on等待数据库健康后启动。本地体验时,把 Postgre SQL 的默认账号密码改成自己的即可。

4.2 启动服务

# 在 deploy 模板目录下执行 docker compose up -d

启动后观察日志:

docker compose logs -f

看到服务正常监听后,用 curl 检查首页是否返回 HTTP 状态码:

curl -I http://localhost:8081

如果是 200 或 302 等正常响应,说明服务已经在运行。

4.3 首次访问与管理员初始化

打开浏览器,访问http://localhost:8081。ToolJet 首次访问会引导你创建管理员账号,按页面提示设置即可。创建完成后,不要急着拖组件,先建立一个最小验证目标:连接一个你能访问的 PostgreSQL/MySQL 测试库,或者先接一个公开的 REST API,再确认页面能展示数据。

如果你准备在其他机器上访问,记得配置防火墙放行端口。生产环境建议把 ToolJet 放到反向代理后面,并配置 HTTPS。

5. 用 ToolJet 搭第一个内部工具:查询-展示-更新

5.1 理解 ToolJet 的数据流模型

ToolJet 应用里最核心的是数据流组织方式:数据源负责建立底层连接,查询负责执行一个具体命令,查询返回的结果会成为 UI 组件的数据来源,事件处理器则把按钮点击等用户行为重新绑定到查询执行上。先理解这条链路,再开始搭页面就不会乱。

数据源 -> 查询 -> 查询结果 -> 组件数据 -> 事件 -> 下一轮查询

作为例子,假设你有一个业务数据库orders表,想快速做一个订单查询页。下面 SQL 是示例,需要替换成实际表结构:

SELECT id, customer_name, amount, status, created_at FROM orders ORDER BY created_at DESC LIMIT 100;

5.2 添加数据源和查询

在 ToolJet 页面左侧打开数据源列表,选择目标数据库类型并填写连接信息。连接成功后,新建查询,把上面的 SQL 粘贴进去并保存,点击运行。如果返回数据,说明数据链路已经打通。

查询保存后,ToolJet 会生成一个查询对象。在组件属性中引用这个查询结果即可。不同版本中查询对象写法不完全一样,常见方式是使用{{ queries.查询名.data }}这样的绑定表达式。你可以先运行查询,打开浏览器控制台或组件属性预览,确认返回的数据结构是什么样的,再填到表格组件的 Table Data 属性中。

# 绑定思路示意 Table Data: {{ queries.查询名.data }}

5.3 把查询结果绑定到表格

添加一个 Table 组件,在 Table Data 属性里填入查询结果。如果字段名和表格列对应不上,在表格属性里调整列设置,把列标题、字段 key、宽度和排序方式配置好。

ToolJet 的优势是数据绑定可视化。修改绑定表达式后,页面可以直接预览结果,不用频繁刷新。以订单表为例,表格里会显示每一行订单,用户可以通过搜索框、日期选择器来改变查询参数,再影响表格数据。

5.4 用事件处理器完成交互

低代码应用不能停留在只读表格。最常见的需求是:用户选中某一行,点击“更新状态”按钮,数据写回数据库。实现思路是,添加表单或下拉组件用于输入新状态,把组件值和查询参数绑定;在按钮的 onClick 事件中添加事件处理器,选择一个执行更新操作的查询;查询成功后再触发一次刷新查询,让表格重新加载。

交互链路示例: 选中行 -> 拿到主键 -> 表单填入新状态 -> 点击按钮 -> 执行更新 SQL -> 刷新列表查询

这里要注意,不要把过于复杂的业务判断全部塞进 UI 表达式中。只要更新逻辑和状态流转复杂,应把更新操作改造成对后端业务 API 的调用,ToolJet 只负责收集参数和展示结果。

5.5 发布应用并分配权限

页面初步可用后,在 ToolJet 右上角发布版本。发布后,普通用户只能看到已发布的内容,编辑者可以继续修改新版本。不要把创建好的内部工具长期留在编辑模式,否则协作同事无法使用最新功能。

6. ToolJet 接入 REST API 和第三方服务

6.1 新增 REST API 数据源

ToolJet 的数据源类型中,REST API 是最通用的方式之一。使用前最好先用 curl 等在本地确认接口的鉴权方式和返回格式。下面的命令是通用示例,URL 和 Token 需要替换成你能访问的服务:

# 先确认目标接口连通性 curl -X GET 'https://api.example.com/v1/items' \ -H 'Authorization: Bearer <TOKEN>'

在 ToolJet 中新建 REST API 数据源,填写基地址和默认头信息。不同接口差异很大,建议每个上游服务单独建一个数据源,不要把所有接口都塞进同一个数据源配置里。

6.2 REST API 查询参数配置

接口通常需要动态参数,比如分页页码、搜索关键字、筛选状态。可以把页面组件的值作为绑定表达式放到查询参数中。下面是一个配置意图示意,实际填写位置以 ToolJet 数据源查询编辑器中的字段为准:

URL / 参数配置意图: {{ currentPage }} 来自表格或按钮状态 {{ searchText }} 来自搜索输入框

ToolJet 界面上一般会区分 Query Parameters、Headers、Body。把 Token 这类敏感信息放入数据源层配置,不要在 URL 或页面脚本里暴露完整密钥。

6.3 使用 Transformer 整理接口返回

第三方 API 返回结构往往不是 Table 组件期望的格式。比如接口返回的是{ code: 0, data: { items: [...] } },但表格希望直接得到数组。这时可以使用查询结果 Transformer 做一层映射:

// Transformer 示例,目的是把嵌套数组整理成表格行 // 具体上下文变量名需结合 ToolJet 版本和查询结果结构调整 return result.data.items.map(function (item) { return { id: item.id, title: item.title, createdDate: item.created_at }; });

加入 Transformer 后,查询返回的数据会被二次处理。页面组件无感,仍然绑定查询数据即可。它的作用是隔离上游字段结构和前端展示字段,后续 API 字段变化时,只需要改 Transformer。

7. 在 ToolJet 中处理批量任务

7.1 轻量批量更新场景

ToolJet 内部工具中经常遇到批量更新需求,比如表格里勾选多行,批量把状态改为“已处理”。这类轻量任务可以在前端脚本中循环选中行,逐条调用更新查询。但要注意循环次数过多会导致请求阻塞和页面等待变长,建议只适用于几十到几百条的数量级,并增加失败日志展示。

批量更新更稳妥的方式是使用数据库自身的批量能力,直接用一条 UPDATE 语句更新多个主键:

UPDATE orders SET status = '已处理' WHERE id IN ({{ selectedIds }});

页面脚本负责把表格选中的多个主键整理成合法的 SQL 参数列表。这样事务边界清楚,性能也可控。

7.2 上传文件触发服务端批量处理

如果批量任务需要处理几百份文件或大量数据,不要全部放在 ToolJet 页面上完成。可以在 ToolJet 里做一个上传入口,前端把文件上传到后端业务服务,业务服务落库后创建任务 ID,后台 Worker 消费任务;ToolJet 再通过 REST API 轮询任务状态,把进度和结果展示在页面上。这样可以避免浏览器内存暴涨、请求超时、任务重试无从下手的问题。

架构示例: ToolJet 页面 -> 文件/数据上传 -> 业务服务落库 -> Worker 异步处理 ToolJet 页面 -> 定时/按钮轮询任务状态 -> 展示处理结果

7.3 批量失败重试

使用低代码做批量任务的另一风险是失败不可见。即使数据量不大,也要在页面中增加失败记录区域,例如把处理失败的主键和错误原因写入一个状态字段。后续重试时,只选失败记录重新提交。不要让操作人员误以为页面转圈完成就等于数据全部处理成功。

8. ToolJet 权限、安全与数据合规

8.1 用户、群组与应用权限

ToolJet 支持多用户协作,也会有不同角色和群组概念。管理员可以维护用户和群组,控制哪些用户能创建应用、哪些用户只能查看已发布应用。内部工具上线前,建议先梳理角色矩阵,确定开发者和使用者分开。数据库账号层面不应该让所有使用者都拿到生产库最高权限,ToolJet 的数据源连接应该使用最小权限账号。

8.2 凭据保护与页面脚本

ToolJet 数据源中保存的数据库密码或 API Token,应该由平台加密存储。自托管时,确保平台加密密钥存放在安全位置,不要提交到 Git 仓库。页面脚本中不要硬编码第三方接口密钥,尽量使用环境变量或平台提供的密钥管理能力。页面设计器和已发布应用能访问到的文件、数据范围,也需要用权限最小化原则控制。

8.3 审计与操作留痕

内部工具通常会操作线上数据,因此需要操作留痕。ToolJet 提供审计日志能力,管理员可以在平台上查看关键操作记录。如果 ToolJet 的日志无法满足你的合规要求,可以在业务逻辑层增加“操作流水表”,把谁在什么时间修改了哪条记录记录下来。比如使用 REST API 接口回写数据时,让上游服务负责记录操作来源。

8.4 数据合规提醒

如果数据包含个人用户信息,访问和使用时需要明确授权。你可以在 ToolJet 页面顶部加数据权限说明,或在查询中强制过滤当前用户可见范围。不要让内部工具的权限漏洞成为数据泄露入口。

9. ToolJet 运维观察:资源占用、日志与备份

9.1 观察资源占用

ToolJet 跑起来之后,可以通过 Docker 命令查看资源占用情况。容器名需要按实际环境替换,比如使用docker compose ps查看容器名。容器部署时不要用 Docker Desktop 的虚拟化资源全部默认值,至少留出合理的 CPU 和内存配额。页面加载慢的时候,先看服务端日志和数据库慢查询,而不是盲目给容器加内存。

# 查看容器资源占用,容器名按实际环境替换 docker stats --no-stream

数据库是 ToolJet 自托管最常见的瓶颈。如果平台本身访问很慢,优先检查元数据库所在磁盘和连接数。

9.2 日志排查

查看 ToolJet 服务日志是排错的第一手段:

# 查看所有容器日志,按实际容器名调整 docker compose logs -f

如果日志中出现数据库连接失败、端口绑定失败等关键词,可以优先检查依赖服务是否正常启动。不要把日志直接丢弃,生产环境建议把 Docker 日志接到集中日志平台。

9.3 备份与恢复

自托管 ToolJet 至少要备份两部分:PostgreSQL 元数据目录和应用配置。容器中执行数据库导出时,直接调用pg_dump不是最推荐的方式,但可以快速导出测试环境。更稳妥的方案是定期备份数据库数据卷,并测试恢复流程。

# 示例:进入 PostgreSQL 容器导出数据,注意替换容器名和账号 docker exec <postgres_container> pg_dump -U <user> <dbname> > tooljet_backup.sql

恢复时需要新建同名的数据库并导入 SQL 文件。恢复前务必先保存当前数据库文件,避免覆盖生产数据。

9.4 升级策略

升级 ToolJet 前后都要先备份数据库。拉取新版本镜像后,使用官方推荐的升级流程,不要直接在生产环境删除数据卷。部署升级时先在一个测试环境验证功能和数据源兼容性,再执行生产切换。

10. ToolJet 常见问题与排查方法

问题现象可能原因排查方式解决方案
页面打不开容器未启动、端口映射错误、防火墙拦截检查docker compose ps和端口状态调整端口映射,确认防火墙放行
首次启动数据库连接失败PostgreSQL 未就绪、密码配置不一致查看数据库日志和 ToolJet 日志修改连接配置,等待依赖健康后再启动
数据源连接不上网络不通、IP 白名单、证书/账号问题在数据库或接口所在的网络环境测试连通性调整白名单和账号权限,TLS 配置共同
REST API 调用返回 401Token 过期、Header 未传、密钥变量错误用 curl 单独测试接口更换有效 Token,更新数据源配置
表格不显示数据查询未运行、绑定表达式错误、返回结构不对打开查询结果预览运行查询,调整表格数据绑定和 Transformer
查询执行超时SQL 无索引、数据量太大、接口响应慢查看数据库慢查询日志增加分页、优化 SQL、加索引
保存的数据源密码报错平台加密密钥变化检查是否替换过部署密钥恢复原密钥或重新配置数据源
批量任务长时间不结束前端循环过多、接口串行请求在页面增加进度提示改为后端 Worker 异步处理

这些排查项是自托管低代码平台的通用经验。遇到具体报错时,最优先查看容器日志和数据库状态,不要先怀疑 ToolJet 本身的 bug。

11. ToolJet 使用建议与工程化实践

11.1 先保存一套最小可运行配置

第一次安装成功后,建议把能跑通的数据库连接、查询和页面导出一个最小模板。后续任何二次开发都基于这个模板复制,不要破坏已验证的版本。应用、数据源、页面脚本分目录管理,页面内组件命名使用有意义的英文前缀,例如订单页面表格叫ordersTable,避免页面复杂后完全不可维护。

11.2 查询数据源划分明确

内部工具不要每个查询都单独连一个新数据源。通用业务库做好只读和可写分离,写操作尽量收敛到固定的数据源。非开发人员不需要看到整个服务器的数据源列表,管理员应能按用户配置访问范围。

11.3 页面脚本保持简单和幂等

ToolJet 里的 JavaScript 脚本应该短而清晰。脚本主要做参数组装、数据格式转换和简单校验,不承担核心业务逻辑。所有写操作,尤其是更新生产数据的操作,都应在查询层面校验参数,比如传入主键白名单,限制影响条数。重复点击按钮时,要考虑是否会造成重复提交,建议在提交后禁用按钮并触发查询锁机制。

11.4 发布前进行效果复核

内部工具发布前,至少由另一位同事复核一次页面权限和写入逻辑。不要只在编辑模式点一下“看起来能用”就上线。测试时可以使用测试数据库,避免把测试数据写入生产表。权限审核的原则是:普通用户默认看不到数据源连接信息,只有应用创建者和管理员能维护底层配置。

11.5 团队协作沉淀

ToolJet 的优势之一是能快速交付,但标准化同样重要。建议团队约定组件命名、查询命名、页面布局规范,把常用数据映射整理成团队文档。这样多个内部工具可以共用一套连接方式和查询规范,后续有人离职或换人维护时不会失控。

12. 总结与下一步

ToolJet 最值得尝试的点,是你几乎不需要写完整的前端代码,就能把数据库和 API 拼装成可用的内部工具。最先应该验证的功能不是复杂图表,而是“查询到数据、表格展示、按钮操作、数据刷新”的最小闭环。最容易踩的坑是权限和批量任务边界:数据源凭据管理不规范、批量逻辑全塞在前端脚本里,都会在后期爆发问题。

如果当前团队大量内部需求都停留在“查询一个表、展示一个列表、做一个详情弹窗”的层面,用 ToolJet 自托管是性价比不错的选择。下一步可以把重点放在更高级的方向:接入第三方系统的接口服务、设计按用户过滤数据范围的权限模型、配合后端 Worker 完成异步批量任务,一点一点把内部工具做成标准化基础设施。建议先在小范围试运行,把权限、日志、备份这三件事做好,再逐步扩展使用规模。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 11:48:26

MATLAB数据拟合全流程实战:从polyfit到批量拟合

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

作者头像 李华
网站建设 2026/9/3 11:47:49

AI项目融资新逻辑:从模型能力到盈利产品的工程化落地

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

作者头像 李华
网站建设 2026/9/3 11:46:10

国产四向车品牌真实水准:与进口同台对比的五个维度

十年前采购四向穿梭车&#xff0c;问题是要不要多花一倍钱买进口&#xff1b;今天的问题变成了——国产这么多家里选哪家。这个转变不是营销话术&#xff0c;是实打实的项目堆出来的&#xff1a;国产四向车在冷链、医药、电商这些严苛场景里的交付量&#xff0c;这几年以肉眼可…

作者头像 李华
网站建设 2026/9/3 11:45:20

智慧排水预警监测平台是什么?5 大核心功能与应用价值详解

城市地下排水管网被称为“隐形生命线”&#xff0c;其畅通与否直接关系内涝防治和城市安全运行。每逢汛期&#xff0c;如何在暴雨来临前预判风险、在积水形成前启动处置&#xff0c;是各地必须作答的考题。伴随物联网、大数据、人工智能、数字孪生等技术加速落地&#xff0c;智…

作者头像 李华
网站建设 2026/9/3 11:44:35

Split Dance舞蹈素材拆分实战:从FFmpeg到MediaPipe

《星十六 Split Dance》这个标题单独拿出来看&#xff0c;很难直接判断是一件成片&#xff0c;还是一份待拆的舞蹈素材。我第一次看到类似命名时&#xff0c;第一反应是把 “Split” 当成视频切片里的切割点&#xff0c;“Dance” 当成内容类型。后来实际做了一遍才发现&#x…

作者头像 李华
网站建设 2026/9/3 11:43:18

电赛材料清单深度解析:从器件映射到方案决策的实战指南

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

作者头像 李华