全栈开发Agent Team构建指南:Spring Boot与React实战避坑
1. 从“单兵作战”到“团队协作”为什么你需要一个Agent Team如果你是一名全栈开发者或者正在管理一个全栈开发团队那么“7*24小时”这个前缀对你来说可能既熟悉又充满压力。它意味着项目需要持续交付、快速响应、问题随时修复。传统的“人肉运维”和“随叫随到”模式不仅让开发者疲惫不堪也让项目质量在深夜的紧急修复中摇摇欲坠。最近一个概念在技术圈里被频繁讨论Agent Team。它听起来像是一个由AI驱动的、不知疲倦的虚拟开发团队承诺能实现全天候的自动化开发、测试与部署。结合“全栈开发”和“避坑指南”这两个关键词这显然不是一个空中楼阁的理论探讨而是一个充满诱惑与陷阱的实战领域。我花了相当长的时间尝试构建和磨合这样一个面向全栈开发的Agent Team。从最初的兴奋到中间的无数次“翻车”再到最终找到相对稳定的工作流这个过程远比想象中复杂。市面上关于Agent的讨论很多但大多停留在概念演示或单一工具的使用上。真正要将多个AI Agent组合成一个能协同工作、覆盖前端React、后端Spring Boot、数据库、DevOps流水线的“虚拟团队”你需要跨越的坑多得超乎想象。这不是简单的“调用一下API”而是涉及架构设计、任务拆解、上下文管理、错误处理等一系列工程化挑战。这篇文章就是一份基于我亲身踩坑经历的避坑指南。我不会空谈Agent的美好未来而是聚焦于在Spring Boot React这一经典全栈技术栈下构建一个可用、可控、高效的Agent Team所必须面对的核心难题和解决方案。你会发现很多问题与是否使用AI无关而是软件工程本质问题的放大和重现。2. 理想与现实Agent Team的能力边界与常见误解在开始搭建之前我们必须先泼一盆冷水目前的AI Agent远未达到能替代一个成熟人类全栈开发团队的程度。对它的定位直接决定了后续所有策略的成败。最常见的误解有以下几种也是我最初掉进去的坑误解一Agent是“许愿机”只需描述需求就能得到完整应用。这是最危险的幻想。你告诉Agent“帮我开发一个具备用户注册、登录、发布文章和评论功能的博客系统。” 一个优秀的Agent或许能生成出Spring Boot的Controller、Service、Entity代码和React的组件、页面。但是它几乎无法一次性处理好以下问题数据库迁移脚本的版本管理是使用Flyway还是Liquibase初始脚本的V1__init.sql内容是否准确包含了所有约束和索引API接口的Swagger/OpenAPI文档注解生成的Controller是否包含了完整的Operation、Parameter描述这直接影响前后端联调效率。前端路由配置与状态管理React Router的路径配置是否合理状态是使用Context、Zustand还是Redux ToolkitAgent生成的代码往往是最简单的实现可能直接使用useState导致状态提升混乱。环境配置与敏感信息管理application.properties或application.yml中开发、测试、生产环境的配置如何区分数据库密码、API密钥等敏感信息是否被硬编码避坑心得必须将Agent定位为“超级代码生成器”和“高级自动化脚本”而非“产品经理架构师开发者”。你需要为它提供极其详细、结构化、无歧义的“设计图纸”和“施工规范”。误解二多个Agent简单堆叠就能形成团队协作。你以为部署一个负责后端的Agent、一个负责前端的Agent、一个负责测试的Agent它们就能像人一样开会、讨论、交接工作了现实是如果没有精心设计的通信协议和共享上下文它们会各自为政后端Agent定义API返回{“id”: 1, “title”: “…”}前端Agent可能预期接收{“postId”: 1, “postTitle”: “…”}导致解析失败。信息孤岛Agent A生成的数据库表结构变更Agent B在编写相关业务代码时完全不知情导致运行时错误。循环依赖与死锁Agent A等待Agent B的输出Agent B又需要Agent A的输入如果没有超时和仲裁机制整个流程会卡死。误解三Agent生成代码无需审查可直接部署。这是通往生产事故的捷径。AI生成的代码可能存在安全漏洞SQL注入虽然使用JPA通常能避免但复杂查询时仍需警惕、XSS攻击防护缺失、身份验证与授权逻辑不完整。性能问题N1查询、循环内重复调用远程服务、大对象序列化。不符合团队规范命名风格、日志格式、异常处理方式与团队现有标准不符。我的经验是Agent Team的价值不在于完全自动化而在于将开发者从大量重复、模板化的编码工作中解放出来并充当一个永不疲倦的“初级工程师”或“结对编程伙伴”。它的正确使用姿势是由人类架构师和高级开发者制定精确的规格说明书Spec由Agent Team负责高保真地实现其中大部分内容最后由人类进行关键逻辑审查、安全审计和集成测试。3. 构建基石为全栈Agent Team设计可执行的“工作流”要让Agent Team真正运转起来核心是设计一个清晰、容错、可回溯的工作流。这个工作流就是团队的“宪法”和“操作规程”。以下是我经过多次迭代后总结出的一个核心工作流框架它围绕一个“任务”的生命周期展开。3.1 任务拆解与规格描述Specification这是所有环节中最重要的一步直接决定后续成功率。你不能说“实现用户管理模块”而必须提供机器可读、无二义性的描述。1. 输入模板化我为Agent Team设计了一个标准的任务输入JSON Schema。以“为博客系统添加文章点赞功能”为例{ “task_id”: “FEAT-20240520-001”, “task_type”: “backend_api”, “description”: “在已有的博客系统基础上增加文章点赞功能。用户可以对文章进行点赞或取消点赞。需考虑并发点赞场景。”, “acceptance_criteria”: [ “1. 新增likes表包含id, user_id, post_id, created_at字段user_id和post_id组合唯一约束。”, “2. 在Post实体中增加likeCount字段非冗余计数需实时查询。, “3. 提供RESTful APIPOST /api/posts/{postId}/like (点赞) DELETE /api/posts/{postId}/like (取消点赞) GET /api/posts/{postId}/likes (获取点赞用户列表分页)。, “4. API需使用JWT进行身份验证确保用户只能操作自己的点赞状态。”, “5. 点赞操作需考虑并发使用数据库唯一约束防止重复点赞使用乐观锁或分布式锁处理高并发计数更新可选但需说明方案。”, “6. 为相关API添加Spring Boot的Transactional注解。”, “7. 生成对应的Spring Data JPA Repository接口。”, “8. 更新Swagger文档。” ], “tech_stack_constraints”: { “backend”: {“framework”: “Spring Boot 3.x”, “java_version”: “17”, “persistence”: “Spring Data JPA Hibernate”, “database”: “PostgreSQL 14”}, “frontend”: {“framework”: “React 18”, “state_management”: “Zustand”, “ui_library”: “Ant Design”} }, “context_files”: [“github_link_to_post_entity”, “github_link_to_user_entity”, “github_link_to_existing_api_doc”] }为什么这么设计acceptance_criteria比笼统的描述有效十倍它强制你思考细节。tech_stack_constraints锁死了技术选型避免Agent天马行空。context_files提供了必要的上下文让Agent知道现有系统的结构。2. 规格的“颗粒度”艺术任务拆解多细合适过细如“生成一个带有Id注解的字段”限制了Agent的灵活性过粗则产出不可控。我的原则是以“一个可独立测试的功能单元”为界。上面的“点赞功能”就是一个好例子它包含了数据模型、API、业务逻辑可以单独进行集成测试。3.2 角色分工与上下文传递一个全栈任务通常需要后端、前端、甚至测试Agent协作。我采用“流水线”与“黑板模式”结合的方式。流水线模式适用于有强依赖关系的任务。例如必须先有后端API定义包括详细的请求/响应DTO和API路径前端Agent才能开始工作。我会先启动后端Agent任务类型为backend_api_design要求它输出一份详细的API设计文档甚至是一个OpenAPI 3.0规范的YAML文件。这个文档作为“合同”传递给前端Agent。黑板模式适用于共享上下文。我建立一个中央“上下文存储”可以是一个简单的数据库表、一个共享的JSON文件或利用矢量数据库。当后端Agent生成了Like实体和LikeRepository后它会将关键信息如类名、字段、主键关系写入这个存储。当前端Agent需要构建点赞相关的状态和Service时它可以来查询这些信息确保命名和数据类型的一致性。关键避坑点上下文衰减与版本管理。Agent的上下文窗口有限。当一个任务链很长时后面的Agent可能已经“忘记”了最开始的定义。解决方案是在每个任务产出中强制要求包含对核心概念的摘要并将这些摘要作为下一个任务的显式输入。同时对task_id进行版本管理任何对已生成代码的手动修改都需要同步更新上下文存储避免后续Agent基于过时上下文工作。3.3 执行、验证与集成Agent生成代码不是终点而是起点。必须有一个自动化的验证管道。静态检查生成的代码必须通过预定义的代码风格检查如Checkstyle、Spotless和基础静态分析如SonarQube的简单规则。这一步可以快速发现明显的语法错误和规范违规。编译与单元测试对于Spring Boot后端要求Agent必须同时生成对应核心逻辑的单元测试使用JUnit 5和Mockito。流水线会自动执行mvn clean compile test。如果编译或测试失败任务标记为“失败”产出物进入复审队列而不是手动去调试AI生成的代码。集成测试桩对于前端React代码虽然完整的集成测试需要后端但可以要求Agent生成与API“合同”匹配的Mock Service例如使用MSW – Mock Service Worker并确保组件能在Mock数据下正常渲染。人工审查要点自动化验证通过后才进入人工审查。审查者重点关注安全输入验证、SQL防注入、权限校验。性能数据库查询复杂度、循环逻辑。业务逻辑正确性边界条件处理如取消一个未点赞的文章应返回什么状态码。与现有系统的融合度是否符合项目的异常处理体系、日志规范、监控埋点。这个工作流看似繁琐但一旦固化到CI/CD管道中例如使用Jenkins Pipeline或GitHub Actions就能形成“Spec驱动开发”的高效模式。人类负责思考和设计精确的SpecAgent负责快速实现Spec的“初稿”人类再负责最终的质控和集成。4. 技术栈深水区Spring Boot React场景下的具体陷阱在全栈开发中前后端的交互细节是魔鬼所在。Agent在处理这些细节时极易出错。4.1 后端Spring Boot陷阱不止是CRUD陷阱一DTO、VO、Entity的混乱映射。Agent倾向于为一个User对象生成一套Entity、一套DTO、一套VO然后生成大量的UserMapper映射代码。但这在简单的CRUD中可能过度设计。我的策略是在Spec中明确约定何时需要DTO仅当API请求/响应结构与Entity差异巨大时例如注册请求包含密码但User实体不返回密码。使用什么映射工具明确指定使用MapStruct因为性能好并在pom.xml中提供依赖示例。要求Agent生成的Mapper接口必须带有Mapper(componentModel “spring”)注解。避免循环依赖这是重灾区。例如Post实体中有ListCommentComment实体中又有ManyToOne Post。如果Agent在序列化时处理不当会导致Jackson无限递归。必须在Spec中强调所有双向关联的字段必须在一侧使用JsonIgnore或者使用专用的VO来切断循环。陷阱二事务与并发控制的缺失。就像网络热词中提到的“jmatpro计算应力-应变曲线”会有常见错误一样并发操作也有经典陷阱。以“文章点赞计数”为例一个简单的post.setLikeCount(post.getLikeCount() 1)在高并发下必然出错。必须给Agent的Spec里写明并发场景要求其提供解决方案。是使用数据库的乐观锁Version注解还是使用Redis分布式锁或者是直接使用SQLUPDATE post SET like_count like_count 1 WHERE id ?我通常要求Agent提供至少两种方案并分析优劣由人类选择。陷阱三全局异常处理与响应格式不统一。每个Agent生成的Controller可能会抛出不同的异常返回不同结构的错误响应。必须在项目根目录提供一个强制性的“样板文件”例如GlobalExceptionHandler.java和ApiResponse.java。要求所有Agent生成的代码必须抛出已在Handler中定义的业务异常类型并且Controller的返回值必须统一包装为ApiResponseT。这需要在上下文context_files中提供这些样板文件的链接。4.2 前端React陷阱状态与副作用管理陷阱一滥用useEffect与无限重渲染。这是React新手也是AI Agent的常见问题。Agent可能会为获取点赞数据写出这样的代码// 错误示范 (Agent容易生成) function PostDetail({ postId }) { const [likes, setLikes] useState([]); useEffect(() { fetch(/api/posts/${postId}/likes).then(r r.json()).then(setLikes); }, [postId]); // 看起来没问题 }如果这个组件在父组件中因为其他状态变化频繁重新渲染fetch可能会被多次执行。更佳实践是使用TanStack Query (React Query) 或 SWR 来管理服务端状态。因此在tech_stack_constraints中我会明确指定data_fetching: “tanstack/react-query”并要求Agent使用useQuery钩子。陷阱二状态提升与Prop Drilling灾难。对于点赞状态是放在Post组件内部还是提升到全局状态Agent可能会选择最简单的局部状态。但当需要在用户个人中心展示其点过赞的文章列表时状态同步就成了问题。在Spec中我需要明确状态管理的规则“用户界面级状态”如模态框开关使用局部useState。“跨组件共享的服务端数据状态”如用户信息、文章列表、点赞数据使用Zustand Store或React Query Cache。并要求Agent在生成点赞组件时从指定的Store中读取和更新状态。陷阱三API Service层缺失或混乱。Agent可能将fetch调用直接写在组件或Hook里导致API逻辑分散难以维护和Mock。必须强制要求所有与后端的通信必须通过一个统一的apiClient例如基于axios或fetch封装进行并且每个资源模块如postApi,userApi要有独立的Service文件。在上下文中提供apiClient的基础实现样板。5. 持续运维监控、评估与迭代你的Agent Team将Agent Team投入生产后工作并未结束。你需要像管理一个真实团队一样监控其“工作表现”并持续优化。1. 建立关键指标Metrics任务成功率Spec清晰度直接影响此指标。记录每个任务从创建到最终通过人工审查并入主分支的成功率。分析失败任务的原因是Spec模糊上下文不足还是技术栈冲突。代码审查反馈密度统计人类审查者对Agent生成代码的评论数量/类型。如果某个Agent生成的代码总是在“安全”或“事务”方面被提意见说明需要在这些领域的上下文中提供更详细的规范或示例。返工率Agent生成的代码在合并后因引入Bug而需要修复的比例。这是一个重要的质量指标。2. 构建“经验知识库”将每次成功的任务Spec、生成的代码、审查意见和最终修正方案作为一个“案例”保存下来。这个知识库有两个用途训练上下文未来遇到类似任务时可以将相关案例作为context_files提供给Agent让它学习成功的模式。Spec模板化将常见的功能模块如“增删改查API”、“JWT认证”、“文件上传”抽象成更精细的Spec模板大幅提高后续任务的下达效率和质量。3. 定期“团队复盘”每周或每两周回顾Agent Team的产出。不是看它生成了多少行代码而是看它是否帮助我们更快地响应了需求它是否将我们从繁琐的重复劳动中解放出来让我们能更专注于架构设计和复杂业务逻辑维护由它生成的代码成本是在增加还是减少根据复盘结果调整你的工作流、Spec编写指南和技术栈约束。也许你会发现在某些领域如生成数据库迁移脚本、单元测试Agent的准确率极高可以给予更多信任而在另一些领域如设计核心领域模型则仍需人类主导。构建一个高效的7*24小时全栈开发Agent Team本质上是一场人机协同的工程实践。它要求开发者具备更强的抽象能力、架构设计能力和精准表达需求的能力。这个过程充满挑战但一旦趟过这些坑建立起稳定的流程你将获得一个强大的“力量倍增器”。它不会让你失业但会彻底改变你的工作方式——从代码的“打字员”转变为系统的“导演”和“质检员”。这条路没有银弹唯有清晰的思路、严谨的工程化和持续的迭代才能让Agent真正成为团队中可靠的一员。

相关新闻

Hive SQL与Spark SQL核心差异:架构、性能与实战选型指南

Hive SQL与Spark SQL核心差异:架构、性能与实战选型指南

1. 从一次数据查询的“卡顿”说起:为什么需要了解Hive SQL与Spark SQL那天下午,我正处理一个大约500GB的用户行为日志表,需要按天聚合计算一些核心指标。最初的查询是用Hive SQL写的,在公司的YARN集群上跑了快一个小时&#xff0c…

2026/10/18 13:22:03 阅读更多 →
MobaXterm中文版完整上手指南:从安装到SSH远程管理的实战教程

MobaXterm中文版完整上手指南:从安装到SSH远程管理的实战教程

MobaXterm中文版完整上手指南:从安装到SSH远程管理的实战教程 【免费下载链接】Mobaxterm-Chinese Mobaxterm simplified Chinese version. Mobaxterm 的简体中文版. 项目地址: https://gitcode.com/gh_mirrors/mo/Mobaxterm-Chinese 那天下午,我…

2026/10/18 14:03:04 阅读更多 →
深度强化学习PPO算法:从信赖域思想到工程实现详解

深度强化学习PPO算法:从信赖域思想到工程实现详解

1. 项目概述:从TRPO到PPO的平滑演进 如果你在深度强化学习的实践道路上摸索过一阵子,大概率会和我一样,在尝试实现策略梯度类算法时,被“策略更新步长”这个看似简单实则棘手的问题反复折磨。传统的策略梯度方法(如REI…

2026/10/18 14:03:04 阅读更多 →

最新新闻

AI编程正在重塑程序员职级体系,转型路径与实操指南

AI编程正在重塑程序员职级体系,转型路径与实操指南

2026年刚开始,程序员圈子最热的话题已经不是“哪个语言好”“哪个框架火”,而是“AI编程到底会不会让我失业”。我最近翻了不少技术社区的讨论,发现一个现象越来越明显:代码苦力这回事,正在被AI批量消化。海外头部科技…

2026/10/19 11:26:47 阅读更多 →
大模型应用CI/CD全流程:从训练到灰度发布自动化实践

大模型应用CI/CD全流程:从训练到灰度发布自动化实践

去年我们团队把大模型应用的交付方式从头捋了一遍,最终沉淀出一套内部代号 23.7 的 CI/CD 全流程。这里说的 CI/CD 不再是传统软件里编译、打包、上线那套东西,而是把模型训练、评估、部署自动化全部串起来,让应用可以持续迭代。这套流程跑通…

2026/10/19 11:26:47 阅读更多 →
AI编译器:从赌正确率到确定性校验的工程实践

AI编译器:从赌正确率到确定性校验的工程实践

1. 当"概率正确"成为工程瓶颈:为什么我们需要一个编译器过去两年,我参与过好几个把大模型能力嵌进生产系统的项目。最开始大家都很兴奋,觉得只要提示词写得够好,模型就能稳定输出想要的结果。但真正上线跑一段时间之后&…

2026/10/19 11:26:47 阅读更多 →
三大AI渗透测试开源项目对比:PentAGI、Strix、Decepticon

三大AI渗透测试开源项目对比:PentAGI、Strix、Decepticon

如果说2023年安全圈的兴奋点是AI辅助写利用代码,那2024年真正让我这个老安全人坐不住的,就是AI自主渗透这条路突然被一批开源项目铺开了。PentAGI、Strix、Decepticon这三个项目,我先后在隔离环境里实跑过好几轮,今天想放在一起认…

2026/10/19 11:26:47 阅读更多 →
多智能体项目管理:用契约驱动的自动化流程重构执行层

多智能体项目管理:用契约驱动的自动化流程重构执行层

1. 这不是“AI项目管理”,而是用多智能体把项目管理流程重新拧紧一遍最近在帮某高校实验室重构一个跨学科图像处理Demo的开发流程时,发现一个特别反直觉的现象:团队里最资深的那位导师,反而最常卡在“谁该在什么时候交什么”这种基…

2026/10/19 11:26:47 阅读更多 →
AI应用开发学习路径:从Prompt到RAG的完整项目实战指南

AI应用开发学习路径:从Prompt到RAG的完整项目实战指南

说实话,我见过太多想转行做AI应用开发的人,第一步不是去写代码,而是先花了两周时间收藏了一堆“必学清单”“从入门到精通”的资料,然后越看越焦虑,最后连一个能跑的Demo都没做出来。这个岗位最迷惑人的地方在于&#…

2026/10/19 11:25:45 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →