Goa 服务设计:传输层映射、错误建模与拦截器实战指南(HTTP / gRPC / JSON-RPC)
后端代码生成API设计微服务【免费下载链接】goaDesign-first Go framework that generates API code, documentation, and clients. Define once in an elegant DSL, deploy as HTTP and gRPC services with zero drift between code and docs.项目地址https://gitcode.com/gh_mirrors/go/goa点击查看免费下载本文以 Goa 服务设计技能包中的核心参考文档skills/goa-service-designer/references/transport-errors-interceptors.md为主干系统讲解如何在 Goa 中规划 HTTP、gRPC 与 JSON-RPC 三种传输的映射规则正确建模错误与安全方案并在类型安全的 Goa 拦截器与通用中间件之间做出正确取舍。读完本文你将能够为既有 Goa 服务修改传输契约、正确使用StreamingResult与ServerSentEvents设计流式接口、按作用域API / Service / Method合理声明错误、理解拦截器端点包装的调用顺序并为生产环境接入可观测性标签。版本提示文中关于 gRPC presence字段存在性与 JSON-RPC 行为描述对应 Goa v3.31 及以后版本。动手修改旧代码前请先核对应用在go.mod中选择的模块版本并查阅仓库根目录的 UPGRADING.md 确认升级差异。1. HTTP 映射把 DSL 里的契约翻译成线路上的请求Goa 的 HTTP DSL 让你在设计中直接声明路由、参数、状态码与请求/响应体生成器据此产出服务端 handler 与客户端调用代码从而保证“设计与代码零漂移”。1.1 路由与资源命名动作action使用资源名词、复数形式保持层次稳定并通过 HTTP 方法表达语义如GET读取、POST创建。稳定的前缀放在 API 级或服务级的HTTP(Path(...))中见 dsl/http.go 的Path定义例如API(calc, func(){ HTTP(func(){ Path(/api) }) })。只有嵌套资源确实更清晰时才使用Parent与CanonicalMethodParent让子服务复用父服务的路径前缀CanonicalMethod默认取名为show的方法路径作为前缀见 dsl/http.go。Files只用于 HTTP 静态文件服务业务端点不要混用。1.2 参数、请求头与 Body 的刻意映射Param、Header、Body三个 DSL 函数把 payload 的属性逐一“落位”路径与查询参数用Param(attr:wireName)冒号左侧是 payload 属性名、右侧是线路上实际的名字属性与线元素同名时可省略冒号部分。文档中的典型写法HTTP(func() { GET(/accounts/{account_id}/items) Param(accountId:account_id) Param(limit) Response(StatusOK) Response(not_found, StatusNotFound) })请求头用Header(attr:Header-Name)。注意属性会继承 payload 中同名属性的描述、类型与校验Pattern、Format等见 dsl/http.go。Body(field)仅在希望请求体就是该字段的原始值时使用未映射到路径、查询、请求头、Cookie 的对象属性默认统一编码进请求体。若省略BodyGoa 会用端点请求/响应类型中未被参数或头占用的属性自动构造 body见 dsl/http.go 的文档说明。1.3 对象 payload 的检查清单文档要求对每个 HTTP 对象 payload 做三查路径中的每一个 token 都必须映射到一个 payload 字段每个非 body 属性都应落到预期的位置路径/查询/头/Cookie显式使用Body(...)时才允许 body 是单一字段的裸值。状态码要刻意选择创建类操作建议用StatusCreated。默认内容协商JSON足以覆盖绝大多数场景只有真实媒体类型需要自定义编解码时才去扩展Consumes/Produces生成器仅内置支持application/json、application/xml、application/gob其余 MIME 需服务代码自备 decoder见 dsl/http.go。面向浏览器的跨域策略统一交给 CORS 插件不要手写跨域中间件。2. 流式传输同一 DSL三种运输语义Goa 的流式 DSL 与传输无关行为由运输层映射决定StreamingPayload/StreamingResult见 dsl/result.go 一带的 Method DSL普通 HTTP 流默认走 WebSocket且 WebSocket 端点使用GET仅服务端向客户端单向推送时才显式添加ServerSentEvents()详见 dsl/sse.gogRPC 流式要看生成的.proto与 server/client 流类型JSON-RPC 只支持一元调用或“单请求 显式 SSE 流”两种形态。以 SSE 为例Goa 支持 API、服务、方法三个级别的ServerSentEvents()声明并提供四个映射函数控制事件行SSEEventData(attr)用结果的某个属性作为事件data字段未指定时整个StreamingResult序列化为 dataSSEEventID(attr)映射结果属性到事件id行SSEEventType(attr)映射到事件event行SSEEventRetry(attr)映射到retry行属性须为 Int/UIntSSERequestID(attr)把 payload 属性映射到Last-Event-ID请求头。Method(stream, func() { Payload(func() { Attribute(id, String) }) StreamingResult(Notification) HTTP(func() { GET(/events) ServerSentEvents(func() { SSERequestID(id) SSEEventID(timestamp) SSEEventData(message) }) // 事件按 id: timestamp\ndata: message\n\n 发送 }) })注意约束带StreamingPayload的方法不能走 SSESSE 只支持服务端到客户端单向流因此 API/服务级声明 SSE 时这类方法会自动回退到 WebSocket见 dsl/sse.go。JSON-RPC 明确拒绝客户端流、双向流、WebSocket 流以及同时声明Result与StreamingResult的方法dsl/jsonrpc.go。无论哪种传输流实现都必须处理流量控制、io.EOF、发送错误、context 取消、超时与资源清理。3. gRPC 映射proto 契约的第一性原则gRPC 映射要点DSL 定义见 dsl/grpc.go对公开或带版本号的 API用Package(svc)设置 protobuf 包名默认取服务名 snake_case见 dsl/grpc.go领域数据留在 message 里metadata/headers/trailers 只承载协议元数据。Metadata(func(){...})把 payload 属性放进请求 metadataTrailers(func(){...})把结果属性放进响应 trailersdsl/grpc.go。安全属性默认自动进入 metadata除非在Message中显式列出大批量或持续变化的数据才用流式已发布的Field编号绝不重编。保持同一最终 message 内字段号唯一含继承字段新增Extend也不得占用已被占用的区间修改共享类型、流方法或自定义 protobuf metadata 后务必检查生成的.proto输出。3.1 必填单值标量保留 protobuf presence这是 v3.31 引入的关键行为变化UPGRADING.md必填的布尔、数字、字符串、枚举、字节切片或别名必须能区分“缺省”与“显式零值”因此生成的 proto3 schema 对这些单值字段使用 presenceGo 侧相应生成指针类型。后果是省略必填布尔是非法输入显式提供false才是合法值。生成的 decoder 在转换为服务值之前完成校验。对客户端而言直接构造 protobuf message 时必须设置新的指针或使用生成的 getter旧客户端无法向新服务端证明自己“显式选择了零值”因为旧 schema 没有记录 presence。默认值规则同理仅当输入缺省时才应用作者声明的默认值显式零值保持显式。4. JSON-RPC 映射让生成代码拥有信封JSON-RPC 在 Goa 中是独立的运输层其设计哲学是“信封归生成代码服务代码只管领域”。4.1 三级配置与请求 ID服务级JSONRPC(func(){...})配置共享的 HTTP POST 端点路由必须定义在服务级JSONRPC内方法级JSONRPC不允许再定义路由见 dsl/http.go 的route实现方法级JSONRPC处理方法特有的行为与错误码映射API 级JSONRPC提供默认错误码映射。生成代码负责 envelope、方法分发、请求 ID、批处理与协议错误。payload 只描述params不要在服务代码里手写运输信封。关于 ID 的关键规则普通生成的客户端调用自带 ID即使 payload 没有ID字段ID必须直接属于 payload而非结果且一个 payload 至多一个 ID 字段传输层把请求 ID 原样复制进每个响应服务结果不能定义或替换响应 IDdsl/jsonrpc.go只有显式Notification()才声明单向调用。无结果并不等于 notificationnotification 不能声明结果、ID 字段或流。4.2 错误码与 SSE 流设计错误用 JSON-RPCResponse码映射标准码常量与数值见 dsl/jsonrpc.goRPCParseError(-32700)、RPCInvalidRequest(-32600)、RPCMethodNotFound(-32601)、RPCInvalidParams(-32602)、RPCInternalError(-32603未映射错误的默认值)。Service(calc, func() { Error(timeout, ErrTimeout, Request timed out) JSONRPC(func() { Response(timeout, func() { Code(5001) }) }) Method(divide, func() { Payload(func() { ID(req_id) Attribute(dividend, Int) Attribute(divisor, Int) Required(dividend, divisor) }) Result(func() { Attribute(result, Float64) }) Error(div_zero, ErrorResult, Division by zero) JSONRPC(func() { Response(div_zero, RPCInvalidParams) }) HTTP(func() { POST(/divide) }) }) })SSE 流式时把StreamingResult与方法级ServerSentEvents()配对并用SSE*系列函数映射事件字段、SSERequestID映射Last-Event-ID请求头。设计校验会拒绝客户端流、双向流、无ServerSentEvents()的服务端流、以及同时定义Result与StreamingResult的方法UPGRADING.md 详述 v3.31 的 JSON-RPC 契约变化。修改自定义客户端的错误解码前务必验证生成错误data的形状——设计错误的名与 body 放在data的{name:..., body:...}结构中。5. 错误建模在最窄的正确作用域声明错误Goa 错误 DSLdsl/error.go要求你回答一个核心问题这个错误能被谁返回5.1 作用域选择API 级Error(...)定义“可复用的潜在错误”一次定义、一次运输映射如统一映射为 400。它不会自动让每个端点都能返回该错误——需要在服务或方法级用Error(name)按名引用引用会继承父级完整定义类型、校验、默认值、Temporary/Timeout/Fault设置见 dsl/error.go 的实现服务级仅当该服务的每个方法都可能返回此错误时方法级仅当该方法独有。不要为了少写声明或让生成的构造器“更好找”就把方法级错误提升到服务级——那会虚假宣传“所有服务方法都能返回它”。5.2 类型与性质标注绝大多数错误用内置ErrorResult即 pkg/error.go 中的ServiceError含Name、ID、Field、Message、Timeout、Temporary、Fault等字段客户端行为不同时用Temporary()、Timeout()、Fault()标注错误性质分别写入goa:error:temporary、goa:error:timeout、goa:error:faultmeta见 dsl/error.go。pkg包相应提供了TemporaryError、PermanentError、TemporaryTimeoutError、Fault等运行时构造器只有客户端需要结构化上下文时才使用自定义错误类型。若同一方法可能返回多个自定义错误必须在类型上包含一个标记Meta(struct:error:name)的字段——由ErrorNameDSL 完成dsl/error.go生成代码据此为不同错误选择不同状态码/错误码。5.3 映射与实现每个暴露的错误都要为每个启用的传输完成映射HTTP(Response(...))、GRPC(Response(...))或对应的JSONRPC(Response(...))实现代码只返回生成的错误构造器或自定义错误 payload绝不自造名称字符串保证名称与生成校验代码一致如MissingField、InvalidRange等常量定义在 dsl/error.go底层原因用Unwrap包装进日志与追踪ServiceError.Unwrap()保留原始err但面向客户端的 message 保持安全通过服务 API 测试错误验证生成的错误名、实际可行的传输状态映射与自定义错误 payload。6. 安全方案声明 ≠ 认证实现安全 DSLdsl/security.go提供BasicAuthSecurity、APIKeySecurity、OAuth2Security、BearerSecurity、JWTSecurity五种方案使用原则在设计中声明方案、所需 scope 与凭据字段并优先 API 级默认值服务或方法级按需覆盖公开方法显式使用NoSecurity()在 payload 中添加匹配的安全字段Username/PasswordBasic、APIKey(attr, scheme, ...)、AccessTokenOAuth2、BearerToken/TokenBearer/JWT这些字段由生成代码计算Authorization头或密钥值通过 HTTP 头/查询参数或 gRPC metadata 映射凭据Param(key:k)、Header(key:Authorization)等显式映射。关键认知与文档一致声明安全方案并不会自动校验 token也不建立资源归属。你需要实现生成的认证回调如BearerAuth(ctx, token, *schemes) (context.Context, error)与应用级授权规则。BearerSecurity 与 JWTSecurity 的差异是语义与生成命名BearerAuthBearerSchemeBearerTokenvsJWTAuthJWTSchemeToken二者在 wire 上都走Authorization: Bearer tokenGoa 不解析也不校验 JWT claimsdsl/security.go。7. 拦截器 vs 中间件类型安全域逻辑与协议基础设施的分工Goa 拦截器与中间件最本质的区别拦截器是生成的端点包装器endpoint wrapper不是传输中间件。7.1 各自的适用域Goa 拦截器类型安全面向领域非边界校验的业务校验boundary validation 交给生成的传输层请求富化request enrichment响应富化response enrichment审计auditing领域级变换。HTTP/gRPC 中间件协议层面日志、追踪、CORS、压缩、请求 ID、限流、panic recovery、wire 级 metadata。7.2 拦截器 DSL 与执行位置用Interceptor(Name, func(){...})定义拦截器dsl/interceptor.go其读取/写入面通过ReadPayload、WritePayload、ReadResult、WriteResult以及流式变体ReadStreamingPayload、WriteStreamingPayload、ReadStreamingResult、WriteStreamingResult声明dsl/interceptor.go然后以ServerInterceptor(...)/ClientInterceptor(...)挂载到 API、服务或方法级。执行位置服务端拦截器在传输解码之后、服务方法之前运行客户端拦截器围绕类型化客户端端点运行在传输编码之前、传输解码之后。实现约束用生成的类型化访问器读写继续传播时恰好调用一次next。排序敏感时查看生成的WrapMethodEndpoint生成逻辑见 codegen/service/interceptors.go按方法生成 endpoint wrapper 节最后一个 wrapper 在请求路径上最先执行——这决定了拦截器“洋葱模型”的里外顺序。8. 可观测性在应用边界接线生产服务应在应用边界而不是业务代码里接入可观测性、健康检查、超时、优雅关闭与配置。Goa 文档推荐 Clue/OpenTelemetry 方案仓库内http/middleware/trace.go中的旧版Trace中间件已标注Deprecated建议改用 OpenTelemetry 生态。生成代码为遥测标签提供稳定来源ServiceKey/MethodKey上下文键在传输代码调用端点前写入服务与方法名定义见 pkg/endpoint.go生成代码示例可见 grpc/codegen/testdata/server_interface_code.go 的ctx context.WithValue(ctx, goa.ServiceKey, ...)gRPC 侧数据模型显式携带ServiceNamegrpc/codegen/service_data.go端点包装器、拦截器元数据与APIVersion同样可作稳定标签源。9. 修改传输/错误/拦截器的最小工作流结合技能包 SKILL.md 的默认工作流修改此类契约时的建议步骤先找到本地设计、生成的 service 契约、实现、生成 wrapper 与受影响消费者核对go.mod中的 Goa 版本与替换项用一两句话陈述意图的契约变更例如“把get_account的错误not_found映射为 404并为流方法启用 SSE”先改设计dsl不要改gen/下生成文件用项目的生成 wrapper 重新生成没有 wrapper 时用go run goa.design/goa/v3/cmd/goa gen design-package-import-path绝不能goa gen ./design确保命令使用应用所选模块版本在gen/之外实现生成的接口只更新受影响的消费者mocks、客户端、文档、示例、API 快照、OpenAPI/protobuf 消费者、命令接线等运行仓库允许的生成、lint、类型检查与测试命令若某命令被禁止或过于宽泛明确说明未运行项一并审查生成与手写 diff每个生成变更都应源于设计变更或有意的工具升级。需要样板文件时用goa example design-package-import-path只创建缺失文件、不更新既有文件不要指望它迁移实现。10. 关联参考本主题的原始参考transport-errors-interceptors.md类型建模、校验、视图与 presencemodeling-and-validation.md生成 diff 分诊与实现更新generated-code-and-implementation.md生成失败与拦截器排序排查troubleshooting.md版本行为差异与升级说明UPGRADING.mdDSL 实现源码dsl/http.go、dsl/grpc.go、dsl/jsonrpc.go、dsl/sse.go、dsl/error.go、dsl/security.go、dsl/interceptor.go拦截器端点包装生成codegen/service/interceptors.go错误运行时类型pkg/error.go赞分享后端代码生成API设计微服务【免费下载链接】goaDesign-first Go framework that generates API code, documentation, and clients. Define once in an elegant DSL, deploy as HTTP and gRPC services with zero drift between code and docs.项目地址https://gitcode.com/gh_mirrors/go/goa点击查看免费下载相关推荐性能实测KVCache-Factory如何让LongBench任务效率提升300%性能实测KVCache Factory如何让LongBench任务效率提升300% KVCache Factory是一款专注于自回归模型KV缓存压缩的开源工Goa 设计优先Design-FirstGo 框架一份契约同时生成 HTTP、gRPC 与 JSON-RPC 服务Goa 设计优先Design FirstGo 框架一份契约同时生成 HTTP、gRPC 与 JSON RPC 服务 Goa 是一个 设计优先design后端代码生成API设计微服务gRPC HTTP 状态码映射指南中间层拦截响应时的错误码转换规则与核心实现解析gRPC HTTP 状态码映射指南中间层拦截响应时的错误码转换规则与核心实现解析 本指南聚焦 gRPC 协议中一份重要但常被误用的约定——当请求经由 HTTP后端RPC框架微服务通信上一篇F3D高性能开源3D可视化引擎的技术解析与应用实践下一篇Clipper2多边形裁剪库告别几何运算难题的终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Moodle部署与教学闭环构建实战指南

Moodle部署与教学闭环构建实战指南

简介:本资源是一份面向教育技术从业者、高校教师及在线课程建设者的Moodle平台实操指南,系统讲解如何在魔灯(Moodle)课程中高效添加与管理各类教学资源。内容覆盖文本页、编写网页、链接到文件或站点、插入标签四大核心资源类型&a…

2026/10/10 1:57:48 阅读更多 →
CCF-CSP真题解答89页DOC:Java解题技巧与评测避坑指南

CCF-CSP真题解答89页DOC:Java解题技巧与评测避坑指南

简介:这份资料面向备战CCF CSP软件能力认证的考生与算法学习者,精选历年认证考试真题并配以详尽解答,共89页,以DOC文档形式呈现,适合从基础巩固到冲刺提分的不同阶段使用。压缩包内仅含1个docx文件,整体约1…

2026/10/10 1:57:48 阅读更多 →
19.【Linux系统编程】线程安全概述

19.【Linux系统编程】线程安全概述

目录1.线程安全和重入问题1.1 相关概念1.2 常见线程安全&不安全情况1.3 常见线程可重入&不可重入情况1.4 结论2. 常见锁的概念2.1 死锁2.2 死锁的四个必要条件2.3 避免死锁2.4 避免死锁算法(不讲)5-4 避免死锁算法(不讲)3. STL,智能指针和线程安全3.1 STL中…

2026/10/10 1:57:48 阅读更多 →

最新新闻

OpenTofu static 密钥提供方源码解析:从示例入手实现自定义 Key Provider

OpenTofu static 密钥提供方源码解析:从示例入手实现自定义 Key Provider

云原生DevOps基础设施 【免费下载链接】opentofu OpenTofu lets you declaratively manage your cloud infrastructure. 项目地址: https://gitcode.com/gh_mirrors/op/opentofu 点击查看 免费下载 OpenTofu 的状态与计划文件加密体系(internal/encrypt…

2026/10/10 2:40:02 阅读更多 →
连续机制演化下的因果表征学习:方法、实验与工程实践

连续机制演化下的因果表征学习:方法、实验与工程实践

因果表征学习这几年是越来越热了,但大部分人做的场景都是静态的:环境固定,机制不变,数据一趟学完。可真实世界里几乎没有一成不变的机制——政策会变、设备会老化、用户偏好会漂移。这类非平稳场景里,很多方法还是沿用…

2026/10/10 2:40:02 阅读更多 →
AI大模型如何抓取和推荐淮安本地商户?GEO技术链路与POI权重算法拆解

AI大模型如何抓取和推荐淮安本地商户?GEO技术链路与POI权重算法拆解

一、技术背景:AI大模型正在重构本地服务流量分发 2026年以来,以豆包、DeepSeek、文心一言、通义千问为代表的生成式AI大模型月活用户突破5.2亿,其中本地生活服务类搜索占比达31%。这标志着本地服务流量分发机制正在发生根本性变革。 传统的流量分发路径是:用户在百度搜索→浏览…

2026/10/10 2:40:02 阅读更多 →
文献管理怎么下手?按检索、归档、标签、调用四个环节把工具配齐

文献管理怎么下手?按检索、归档、标签、调用四个环节把工具配齐

文献管理卡住人的地方,通常不是软件挑得不对,而是顺序没排清。把它拆成检索、归档、标签、调用四段,每段只配一件顺手的工具,链条就通了。知学术AIPaperGPT 把文献检索、自建文献库与大纲写作放在同一条链路上,适合作为…

2026/10/10 2:40:02 阅读更多 →
Spring Boot公司门户网站毕设全解析:从设计到部署避坑指南

Spring Boot公司门户网站毕设全解析:从设计到部署避坑指南

又是一年毕业设计季节,Java方向的选题里,“基于Spring Boot的公司门户网站”绝对算得上一个经典中的经典。这个题目为什么经久不衰?因为它恰到好处地覆盖了Java Web开发的核心链路:后端框架应用、数据库设计、前端页面渲染、权限控…

2026/10/10 2:40:02 阅读更多 →
markdown-it 基准测试样本解析:block-bq-flat.md 与扁平引用块的解析与压测原理

markdown-it 基准测试样本解析:block-bq-flat.md 与扁平引用块的解析与压测原理

开发工具CLI 【免费下载链接】markdown-it Markdown parser, done right. 100% CommonMark support, extensions, syntax plugins & high speed 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-it 点击查看 免费下载 本篇文章围绕 markdown-it 仓库中的…

2026/10/10 2:39:02 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

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/8 15:26:32 阅读更多 →
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/10 1:36:08 阅读更多 →
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/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 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/8 21:13:17 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →