OctoPrint JavaScript 客户端库 printer 组件完全指南:通过 `OctoPrint.printer` 掌控你的 3D 打印机
物联网后端【免费下载链接】OctoPrintOctoPrint is the snappy web interface for your 3D printer!项目地址https://gitcode.com/gh_mirrors/oc/OctoPrint点击查看免费下载导读本文聚焦 OctoPrint JavaScript 客户端库JS Client Library中的printer组件——它是浏览器端控制打印机硬件的一站式接口。围绕 docs/jsclientlib/printer.rst 中定义的 20 余个方法你将从零掌握如何查询打印机完整状态、读写喷头/热床/腔室温度、控制打印头移动与归位、挤出耗材以及管理打印机内部存储如 SD 卡。读完本文你将能够基于全局OctoPrint.printer实例或自建的多服务器客户端编写出可落地的浏览器端打印机控制代码并理解每个方法背后的 REST API 端点、权限要求与 Promise 语义。背景printer 组件与 REST API 的对应关系printer组件是OctoPrintClient的注册组件之一其实现位于 src/octoprint/static/js/app/client/printer.js通过OctoPrintClient.registerComponent(printer, OctoPrintPrinterClient)挂载到客户端原型上。组件内部预定义了与服务器端 REST API 一一对应的资源地址常量URL 路径用途urlapi/printer获取完整打印机状态printheadUrlapi/printer/printhead打印头命令jog / home / feedratetoolUrlapi/printer/tool工具喷头命令与温度查询bedUrlapi/printer/bed热床命令与温度查询chamberUrlapi/printer/chamber加热腔室命令与温度查询storageUrlapi/printer/storage内部存储初始化/释放/状态查询errorUrlapi/printer/error最近一次错误信息这些路由的服务器端实现在 src/octoprint/server/api/printer.py 中查询类端点GET要求STATUS权限命令类端点POST要求CONTROL权限。其中/printer/sd作为/printer/storage的向后兼容别名保留见 printer.py。必须先理解的 Promise 语义原文档开头有一条贯穿全局的重要说明所有与打印机交互的方法凡是会向打印机发送命令的方法其返回的 jQuery Promise 只会在“服务器已把命令加入队列”时 resolve而不是在命令真正发送给打印机或被打印机处理时 resolve。原因在 docs/api/printer.rst 中有详细解释OctoPrint 内部基于 Flask/WSGI其 Web 服务器是单线程同步模型无法在 REST 请求中非阻塞地等待打印机的串口响应同时大量固件存在难以追踪命令输出的缺陷无法可靠地将输出与命令对应。因此你需要通过 SockJS 推送socket组件订阅打印机状态变化而不是依赖命令调用的返回值。查询打印机状态getFullState 与 flags 参数getFullState(flags, opts)OctoPrintClient.printer.getFullState(flags, opts)检索打印机完整状态包括温度信息、SD/存储状态与一般打印机状态。flags对象支持以下属性history布尔值是否包含温度历史记录true包含默认不包含limit整数包含多少条历史记录条目exclude字符串逗号分隔的要从返回结果中排除的字段。从源码看printer.js客户端会把这些 flags 拼装成查询字符串historytruelimitnexclude...。值得注意的是exclude中的sd会被自动映射为storage这是对 2.0.0 起存储概念重命名的兼容处理。服务端exclude参数的有效取值是temperature、storage、state见 docs/api/printer.rst。// 获取完整状态附带最近 2 条温度历史 OctoPrint.printer.getFullState({history: true, limit: 2}) .done(function(response) { var tool0 response.temperature.tool0; var bed response.temperature.bed; var storageReady response.storage.ready; var stateText response.state.text; });getFullState对应的 HTTP 请求是GET /api/printer成功返回200与 Full State Response包含temperature、storage、state三个可选字段打印机不可操作时返回409见 docs/api/printer.rst。getToolState / getBedState / getChamberState这三个方法分别查询喷头、热床、加热腔室的当前温度信息actual / target / offset并可选附带温度历史。三者的flags参数语义一致history布尔值是否包含温度历史默认不包含limit整数包含多少条历史记录。// 查询喷头温度 最近 5 条历史 OctoPrint.printer.getToolState({history: true, limit: 5}) .done(function(response) { console.log(response.tool0.actual, response.tool0.target); }); // 查询热床状态不要求历史 OctoPrint.printer.getBedState(); // 查询加热腔室状态 OctoPrint.printer.getChamberState();它们分别对应GET /api/printer/tool、GET /api/printer/bed、GET /api/printer/chamber。需要特别注意的是如果当前选择的打印机配置文件中没有配置热床或加热腔室对应的 bed/chamber 查询会返回409见 docs/api/printer.rst 与 docs/api/printer.rst。若需要同时获取喷头与热床温度直接使用getFullState更高效。控制打印头jog、home 与进给速率jog(amounts, opts)OctoPrintClient.printer.jog(amounts, opts)按指定距离相对移动打印头。amounts是一个键值对对象键为要移动的轴x、y、z值为移动距离mm可为负。// X 轴移动 10mm OctoPrint.printer.jog({x: 10.0}); // Y 轴移动 -5mmZ 轴移动 0.2mm OctoPrint.printer.jog({y: -5.0, z: 0.2});从源码看printer.jsjog内部还会额外支持absolute布尔值决定是相对移动还是绝对坐标移动与speedmm/min 的移动速度两个可选属性最终通过issuePrintheadCommand(jog, payload, opts)发送 POST 请求。服务端在 printer.py 中校验每个轴的值必须是数字否则返回400。home(axes, opts)OctoPrintClient.printer.home(axes, opts)对指定的轴执行归位操作。axes是字符串数组合法值为x、y、z中的一个或多个。// 归位 X 和 Y 轴 OctoPrint.printer.home([x, y]); // 归位 Z 轴 OctoPrint.printer.home([z]);服务端会逐个校验轴名是否合法printer.py非法轴名返回400。setFeedrate(factor, opts)OctoPrintClient.printer.setFeedrate(factor, opts)设置进给速率feedrate倍率。factor是大于 0 的整数表示新的进给速率百分比。REST API 文档说明取值范围为50~200整数或0.5~2.0浮点之间见 docs/api/printer.rst。源码中未提供factor时会默认回退为100printer.js。// 将进给速率设为 105% OctoPrint.printer.setFeedrate(105);setFlowrate(factor, opts)OctoPrintClient.printer.setFlowrate(factor, opts)设置当前挤出速率flowrate倍率。factor同样是大于 0 的整数百分比REST API 文档规定的合法范围为75~125整数或0.75~1.25浮点见 docs/api/printer.rst。与setFeedrate不同flowrate属于工具命令走的是api/printer/tool端点。// 将挤出速率设为 95% OctoPrint.printer.setFlowrate(95);一个容易混淆的细节feedrate只影响轴移动速度对应 G 代码的G1 F...而flowrate影响挤出量比例二者应用场景不同。此外jog、home命令只能在打印机处于可操作状态且未在打印时发送否则服务端返回409feedrate是唯一例外它甚至在打印中也可使用见 printer.py。控制喷头温度与挤出setTool* 系列与 selectTool/extrudesetToolTargetTemperatures(targets, opts)OctoPrintClient.printer.setToolTargetTemperatures(targets, opts)为打印机的挤出机设置目标温度。targets是一个对象键为工具标识符tool表示当前激活的挤出机tool{n}表示索引为 n 的挤出机n 从 0 开始值为目标温度。// 第一个喷头设为 220°C第二个喷头设为 205°C OctoPrint.printer.setToolTargetTemperatures({tool0: 220, tool1: 205}); // 只设置当前激活喷头到 220°C OctoPrint.printer.setToolTargetTemperatures({tool: 220});目标温度设为0会关闭对应加热器。此方法对应target工具命令见 docs/api/printer.rst。setToolTemperatureOffsets(offsets, opts)OctoPrintClient.printer.setToolTemperatureOffsets(offsets, opts)为打印机的挤出机设置温度偏移量。offsets同样是“工具标识符 → 偏移值”的对象。偏移量会叠加在读取到的实际温度上例如喷头测得的 actual 值会加上该偏移。// 第一个喷头偏移 10°C第二个喷头偏移 -5°C OctoPrint.printer.setToolTemperatureOffsets({tool0: 10, tool1: -5});selectTool(tool, opts) 与 extrude(amount, opts)selectTool选择当前激活的挤出机tool参数格式为tool{n}。extrude在当前选中的挤出机上挤出正数或回抽负数指定毫米数的耗材。二者组合使用即可实现“换工具 挤出/回抽”的完整操作// 选择第二个工具挤出 5mm 耗材再切回第一个工具 OctoPrint.printer.selectTool(tool1) .done(function(response) { OctoPrint.printer.extrude(5.0) .done(function(response) { OctoPrint.printer.selectTool(tool0); }); }); // 挤出 5mm 后再回抽 2mm OctoPrint.printer.extrude(5.0) .done(function(response) { OctoPrint.printer.extrude(-2.0); });注意extrude命令还支持可选的speed参数挤出速度mm/min未提供时使用打印机配置文件中 E 轴的最大速度select与extrude只能在打印机可操作且未在打印时发送见 docs/api/printer.rst。控制热床与加热腔室bed / chamber 命令setBedTargetTemperature(target, opts)为打印机的热床设置目标温度前提是当前打印机配置文件配置了热床。target为浮点目标温度0关闭加热器。// 热床设为 90°C OctoPrint.printer.setBedTargetTemperature(90.0);setBedTemperatureOffset(offset, opts)为热床设置温度偏移。// 热床温度偏移设为 -5°C OctoPrint.printer.setBedTemperatureOffset(-5);setChamberTargetTemperature(target, opts) 与 setChamberTemperatureOffset(offset, opts)与热床对应这两组方法操作加热腔室如果当前打印机配置文件配置了腔室// 腔室设为 50°C OctoPrint.printer.setChamberTargetTemperature(50.0); // 腔室温度偏移设为 -5°C OctoPrint.printer.setChamberTemperatureOffset(-5);bed / chamber 的target与offset命令对应POST /api/printer/bed、POST /api/printer/chamber都要求打印机可操作若所选打印机配置文件未配置热床/腔室则返回409数值非法或超出支持范围返回400见 docs/api/printer.rst 与 docs/api/printer.rst。管理内部存储getStorageState / initStorage / releaseStorage自 2.0.0 起原先的 SD 卡概念被推广为“打印机内部存储”internal storage客户端组件也随之更新getStorageState(opts)查询打印机内部存储的当前就绪状态ready: true/false对应GET /api/printer/storageinitStorage(opts)指示打印机初始化并挂载内部存储如存在对应init命令若 OctoPrint 在连接打印机时检测到可用存储如 SD 卡会自动尝试初始化一般无需手动调用releaseStorage(opts)指示打印机卸载内部存储如存在且允许对应release命令执行后存储将不可用。// 查询存储状态 OctoPrint.printer.getStorageState() .done(function(response) { console.log(response.ready); // true / false }); // 初始化挂载内部存储 OctoPrint.printer.initStorage(); // 释放卸载内部存储 OctoPrint.printer.releaseStorage();服务端实现见 printer.pyinit调用printer.mount_storage()release调用printer.unmount_storage()refresh则强制刷新文件列表。存储支持可通过feature.sdSupport设置项关闭关闭后访问存储端点返回404。此外refresh命令刷新内部存储文件列表在客户端层面已被弃用改由OctoPrintClient.files.listForLocation完成。已弃用的 SD 方法原文档明确标注了四个2.0.0起弃用、计划在3.0.0移除的方法使用它们会在控制台输出警告OctoPrintClient.deprecated包装器见 base.js弃用方法替代方法getSdStategetStorageStateinitSdinitStoragerefreshSdfiles.listForLocationreleaseSdreleaseStorage// 不要这样写已弃用 OctoPrint.printer.initSd(); // 请这样写 OctoPrint.printer.initStorage();补充getErrorInfo 与底层实现原理除原文档列出的方法外printer 组件还提供了getErrorInfo(opts)printer.js对应GET /api/printer/error返回最近一次错误的信息error、reason、consequence、faq、logs等字段见 docs/api/printer.rst可用于在界面上展示故障详情。issueCommand 与组件注册机制所有命令方法最终都汇入OctoPrintClient.prototype.issueCommand(url, command, payload, opts)base.js它把command字段与payload合并为 JSON通过postJson发送 POST 请求。例如setToolTargetTemperatures({tool0: 220})实际发出的请求体是{ command: target, targets: {tool0: 220} }请求头方面base.js若配置了options.apikey则发送X-Api-Key否则在浏览器上下文中为非 GET/HEAD/OPTIONS 请求附加 CSRF token 头X-CSRF-Token还可通过options.locale与options.apiVersion分别携带X-Locale与X-OctoPrint-Api-Version。统一命令约束所有命令类方法共享以下服务端约束printer.py成功执行返回204 No Content与空响应体打印机不可操作未连接/未就绪时返回409jog、home、select、extrude在打印进行中发送会返回409参数非法非数字的轴值、非法轴名、越界的倍率因子、非tool{n}格式的工具标识符返回400命令端点需要CONTROL权限状态查询端点需要STATUS权限。实战一个完整的浏览器端温度控制场景将本文内容组合起来即可在页面脚本中实现一个完整的“预热 → 打印头就位 → 挤出测试 → 清理”流程// 1. 设置喷头与热床目标温度并读取完整状态 OctoPrint.printer.setToolTargetTemperatures({tool0: 220}); OctoPrint.printer.setBedTargetTemperature(60.0); OctoPrint.printer.getFullState({history: true, limit: 5}) .done(function(state) { console.log(当前状态:, state.state.text); console.log(tool0:, state.temperature.tool0); console.log(bed:, state.temperature.bed); console.log(存储就绪:, state.storage.ready); }); // 2. 归位 X/Y 轴随后将打印头移动到 (10, 10, 0.2) OctoPrint.printer.home([x, y]) .done(function() { OctoPrint.printer.jog({x: 10.0, y: 10.0, z: 0.2}); }); // 3. 挤出测试挤出 5mm 后回抽 2mm OctoPrint.printer.extrude(5.0) .done(function() { OctoPrint.printer.extrude(-2.0); }); // 4. 打印结束后清理关闭加热并卸载存储 OctoPrint.printer.setToolTargetTemperatures({tool0: 0}); OctoPrint.printer.setBedTargetTemperature(0); OctoPrint.printer.releaseStorage();需要再次强调的是上述每个.done()回调都只代表命令已被服务器成功入队实际执行结果如温度是否达到目标、打印头是否到位需要结合socket组件的推送事件如temperature、stateChanged等来观察这也是 OctoPrint 客户端设计的核心约定。延伸阅读REST API 完整规范含数据模型、请求/响应示例docs/api/printer.rst客户端组件实现源码src/octoprint/static/js/app/client/printer.js基础客户端issueCommand、认证头、组件注册src/octoprint/static/js/app/client/base.js服务器端端点实现src/octoprint/server/api/printer.pyJS 客户端库总览与嵌入方式docs/jsclientlib/index.rst打印机状态推送与实时更新docs/jsclientlib/socket.rst赞分享物联网后端【免费下载链接】OctoPrintOctoPrint is the snappy web interface for your 3D printer!项目地址https://gitcode.com/gh_mirrors/oc/OctoPrint点击查看免费下载相关推荐CANN/GE获取模型输出维度aclmdlGetCurOutputDimsa nameZH CN_TOPIC_0000001265400378 /a 产品支持情况a name人工智能深度学习模型编译模型优化编译器Ascend酷安UWP客户端终极上手实战Windows电脑完整畅玩酷安社区的避坑指南酷安UWP客户端终极上手实战Windows电脑完整畅玩酷安社区的避坑指南 酷安是中文互联网里最活跃的数码社区之一可惜它长期长在手机上。想在工作间隙用电脑物联网后端如何快速构建现代化的Redis管理工具Medis完整开发指南如何快速构建现代化的Redis管理工具Medis完整开发指南 想要打造一个美观、高效且跨平台的Redis管理工具吗Medis for Windows正是这样上一篇【免费下载】 Avogadro 项目安装与使用教程下一篇VUX 虚拟组件Virtual Component原理与实战编译期按需内联的免 import 组件机制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Union Alpha限免实测:从zcode配置到机械臂操控全流程

Union Alpha限免实测:从zcode配置到机械臂操控全流程

最近圈子里被一个叫Union Alpha的模型刷屏了,宣传口径特别直接:性能逼近Astra,限免一周。我一开始以为又是哪个实验室放出来的营销烟雾弹,结果测了三天发现这玩意儿确实有点东西,尤其是在工具调用和视觉控制这块&#…

2026/9/25 6:52:20 阅读更多 →
ab173懒人网站:零配置JSON格式化急救工具

ab173懒人网站:零配置JSON格式化急救工具

1. ab173懒人网站到底是什么:不是工具,而是“JSON急救包”很多人第一次在搜索引擎里敲下“ab173 懒人网站”,点进去看到那个极简的白色界面——顶部一行输入框、中间一个大按钮“格式化”,底下直接输出带缩进和颜色的JSON——第一…

2026/9/25 6:51:20 阅读更多 →
CLI Agent 工具链实战:OpenRouter + MCP 协议 + 本地执行入口

CLI Agent 工具链实战:OpenRouter + MCP 协议 + 本地执行入口

1. 从 "treg" 这个标题说起:一个被低估的 CLI Agent 工具链入口第一次看到 "treg" 这个词,大概率会一脸懵——它不像codex、claude那样自带品牌辨识度,也不像mcp那样有明确的协议含义。但如果你最近在折腾 AI Agent 的 C…

2026/9/25 6:51:20 阅读更多 →

最新新闻

Linux服务器SSH连接与GPU开发环境实操指南

Linux服务器SSH连接与GPU开发环境实操指南

1. 项目概述:这不是“连服务器”,而是重建你和算力之间的信任链 “手把手教你如何连上实验室的服务器”——这句话在研究生新生群里刷屏的频率,几乎和开学季的快递单号一样高。但真正点开教程的人,十有八九卡在第二步&#xff1a…

2026/9/25 9:40:41 阅读更多 →
智谱GLM开源霸榜与OCR、Agent落地实战:模型部署、离线OCR及开发路线全解析

智谱GLM开源霸榜与OCR、Agent落地实战:模型部署、离线OCR及开发路线全解析

1. 从一份月报里拆出来的四条技术主线月初刷到"将门月报"这个栏目的时候,我第一反应是:这类月报信息密度高,但大多数人扫一眼标题就划走了,真正有价值的东西全埋在细节里。这次标题里塞了四个关键词——智谱开源多个GLM…

2026/9/25 9:40:41 阅读更多 →
Atlas 300V 24G部署YOLO全流程实战:从推理加速卡到模型落地

Atlas 300V 24G部署YOLO全流程实战:从推理加速卡到模型落地

最近后台收到好几个问题,都是类似的:atlas部署yolo到底怎么搞?还有朋友直接拿热搜词来问,atlas 300V 24G 是运算加速卡吗?这里先给个明确结论——它是,而且是很典型的AI推理加速卡。但它是“加速卡”不代表…

2026/9/25 9:40:41 阅读更多 →
Atlas 300V 24G推理加速卡部署YOLOv5完整指南

Atlas 300V 24G推理加速卡部署YOLOv5完整指南

前两天有朋友问我:Atlas 300V 24G这卡是不是运算加速卡?能不能直接拿来部署YOLO?我一开始觉得这问题挺基础,但聊下来发现,很多刚接触昇腾生态的朋友对这块卡的定位其实不太清楚。它既不是普通显卡,也不是用…

2026/9/25 9:40:41 阅读更多 →
DeepSeek完全指南:从V3/R1模型分工到API接入与本地部署

DeepSeek完全指南:从V3/R1模型分工到API接入与本地部署

1. 为什么“免费AI之王”这个说法值得认真对待第一次看到“DeepSeek完全指南:免费AI之王,你只用了10%的功能”这个标题,我的反应是:又一个标题党。但真正把DeepSeek的网页端、App端、API端都摸了一遍之后,我收回这个判…

2026/9/25 9:40:40 阅读更多 →
Atlas 300V 24G部署YOLO全流程:从硬件认知到AscendCL推理优化

Atlas 300V 24G部署YOLO全流程:从硬件认知到AscendCL推理优化

1. 先回答那个热搜问题:300V 24G 到底是不是“运算加速卡”你会搜到“atlas 300v 24g 是运算加速卡吗”,说明很多人第一次拿到这张卡时都有同样的困惑。直接给结论:它是运算加速卡,但和大多数人脑子里的“GPU 运算卡”不是一回事。…

2026/9/25 9:39:40 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →