Vibe Coding三分钟搭建SpringBoot服务:AI编程实战指南
1. 先搞清楚 Vibe Coding 到底能帮你省掉哪些 SpringBoot 的初始化麻烦如果你正在学 SpringBoot或者经常需要快速启动一个后端服务原型那 Vibe Coding 这个 AI 编程工具值得你花几分钟了解一下。它解决的核心问题很直接跳过繁琐的 SpringBoot 项目初始化、依赖配置和基础代码编写直接用自然语言描述需求让 AI 生成一个可运行的服务骨架。很多人一听“AI 生成代码”就觉得是噱头或者担心生成的代码质量不行、跑不起来。我实测下来Vibe Coding尤其在结合 Claude 等大模型时最实用的场景恰恰就是 SpringBoot 这类有固定范式、大量样板代码的 Web 服务开发。它帮你省掉的不是核心业务逻辑而是那些你每次新建项目都要重复做的“体力活”创建 Maven/Gradle 项目、配置pom.xml、写application.yml、建立基础包结构、编写简单的 Controller/Service/Dao 层模板甚至连接数据库的配置。所以这篇文章不是教你从零手写 SpringBoot而是告诉你如何用 Vibe Coding 把项目搭建和环境配置的时间从半小时压缩到三分钟。重点不是“AI 多智能”而是“你的启动效率能提升多少”。适合两类人一是 SpringBoot 新手想快速看到项目跑起来的样子理解各层关系二是需要频繁验证想法、搭建 Demo 的开发者不想在重复配置上浪费时间。它的关键价值在于“氛围编程”Vibe Coding 的本意你不需要精确地写出每一条 Maven 依赖的groupId和artifactId也不需要记住RestController和GetMapping的具体写法你只需要用大白话告诉 AI“创建一个 SpringBoot 项目用 MySQL 数据库实现一个用户信息的增删改查接口。” 剩下的交给工具去生成和组装。2. 环境准备你的电脑需要装好哪些东西才能跑起来在开始“三分钟搭建”之前得先确保你的本地环境是齐备的。Vibe Coding 本身是一个编程范式或工具链它通常需要依托一个具体的 AI 辅助编程工具来实现比如 Cursor、Claude Code或者是 IDE 里的 AI 插件。这里我不会推荐任何特定品牌但会告诉你通用的环境 checklist。首先基础开发环境必须到位Java JDKSpringBoot 2.x 通常需要 JDK 8 或以上SpringBoot 3.x 则需要 JDK 17 或以上。建议安装 JDK 17兼容性更好。在终端输入java -version确认。Maven 或 Gradle项目管理工具。SpringBoot 项目默认用 Maven 的比较多。在终端输入mvn -v确认。IDEIntelliJ IDEA社区版或旗舰版或 VS Code。这是你编写和运行代码的主战场。确保 IDE 已经安装好并且能正常打开 Java 项目。MySQL或其他数据库如果你描述的需求里包含数据库本地需要安装并启动 MySQL 服务。用mysql -u root -p能连上就行。也可以用 Docker 快速启动一个或者先用内存数据库 H2 来测试。其次AI 编程工具的配置这是 Vibe Coding 能工作的核心。你需要一个能理解你自然语言需求并生成代码的 AI 助手。工具选择目前主流的有两类。一类是独立的 AI 编程工具如 Cursor它内置了代码生成和编辑能力另一类是 IDE 插件如一些 IDE 的 AI 辅助插件它们集成在你熟悉的开发环境里。选择你用得顺手的一个。模型接入大多数这类工具需要你配置大模型的 API 密钥例如 OpenAI 的 GPT-4或 Anthropic 的 Claude。你需要有一个可用的 API 账号并在工具的设置里填入密钥。注意这部分涉及服务调用请确保你使用的是合规、正规的 API 服务渠道。项目上下文设置好的 AI 编程工具能理解整个项目的结构。你需要确保工具拥有当前项目的读写权限并且能索引项目文件这样它生成的代码才能符合现有规范。我个人的习惯是在开始一个全新的 Vibe Coding 会话前先手动创建一个最最基础的 Spring Initializr 项目或者甚至是一个空文件夹然后让 AI 在这个“画布”上作画。这比让 AI 从零创建整个项目目录更可控也更容易排查问题。3. 实操三步走从一句话需求到可运行的服务下面我们走一遍最核心的流程。假设我们的需求是“创建一个 SpringBoot 2.7.18 项目使用 MyBatis-Plus 操作 MySQL 数据库提供一个用户User的 RESTful API包含基本的增删改查功能。”3.1 第一步用自然语言提出清晰、具体的需求不要一上来就说“做个用户系统”。给 AI 的指令需要足够具体包含技术栈和关键组件。一个好的指令应该包括项目类型和版本SpringBoot 2.7.18构建工具Maven核心框架MyBatis-Plus这暗示了需要数据库数据库MySQL需要在指令中说明AI 才会帮你加依赖和配置核心功能User 的 RESTful CRUD API可选补充是否需要分页查询字段有哪些id, name, email在你的 AI 编程工具里新建一个文件比如README.md或一个临时文件或者直接使用它的聊天/命令面板输入上述需求。指令可以这样组织“请帮我初始化一个 SpringBoot 2.7.18 的 Maven 项目。技术栈需要包含Web、MySQL Driver、Lombok、以及 MyBatis-Plus。项目需要实现一个 User 实体类的 RESTful CRUD 接口实体字段包括 id (Long), username (String), email (String)。请生成完整的项目结构包括 pom.xml、application.yml、实体类、Mapper 接口、Service 层和 Controller 层。”3.2 第二步审查并调整 AI 生成的代码AI 工具会开始生成代码。它可能会先创建pom.xml然后依次创建application.yml、User.java、UserMapper.java、UserService.java、UserController.java等。这时候千万不要直接运行一定要先审查一遍。审查的重点顺序如下pom.xml检查 SpringBoot 父版本、依赖项是否齐全且版本兼容。特别是 MyBatis-Plus 的版本是否与 SpringBoot 2.7.18 匹配。AI 有时会使用最新版可能导致冲突。!-- 示例片段注意版本号 -- parent groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-parent/artifactId version2.7.18/version !-- 确认版本 -- /parent dependencies dependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version !-- 确认这个版本是否兼容 2.7.18 -- /dependency !-- 其他依赖... -- /dependenciesapplication.yml检查数据库连接配置。AI 生成的通常是示例配置你需要把url、username、password改成你自己本地 MySQL 的信息。同时检查 MyBatis-Plus 的配置如 mapper-locations是否正确。spring: datasource: url: jdbc:mysql://localhost:3306/your_database_name?useSSLfalseserverTimezoneUTC username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver mybatis-plus: mapper-locations: classpath:mapper/*.xml configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 方便查看SQL实体类和 Mapper检查User实体类的注解是否正确如TableName,Data。检查UserMapper接口是否继承了BaseMapperUser。Service 和 Controller检查UserService是否正确地注入了UserMapperCRUD 方法是否调用正确。检查UserController的注解RestController,RequestMapping(“/api/user”)和方法上的GetMapping,PostMapping等。如果发现错误比如依赖版本不对、注解缺失、方法名错误可以直接在 AI 工具里指出“这里的GetMapping路径不对应该是/list”或者“MyBatis-Plus 版本请换成 3.5.3.1”让 AI 进行修正。这就是“氛围编程”的交互过程。3.3 第三步运行与验证代码审查调整完毕后就可以运行了。找到项目的入口类通常叫Application.java或YourProjectNameApplication.java里面应该有SpringBootApplication注解和main方法。在 IDE 中直接运行这个main方法。观察控制台日志。关键验证点启动成功控制台没有报错最后出现类似 “Started Application in 5.123 seconds” 的日志。数据库连接检查日志中是否有连接 MySQL 成功的提示或者 MyBatis-Plus 输出 “Loading classcom.mysql.cj.jdbc.Driver. This is deprecated.” 之类的信息这表示驱动加载了。Mapper 扫描MyBatis-Plus 通常会输出 “Mapped “xxxMapper” to MapperProxy” 的日志。接口暴露SpringBoot 会输出 “Mapped “{[/api/user/list],methods[GET]}” 等信息表明 Controller 的接口已经被映射。启动成功后用 Postman、curl 或者浏览器测试接口GET http://localhost:8080/api/user/list(查询列表)POST http://localhost:8080/api/user(新增用户Body 传 JSON)GET http://localhost:8080/api/user/{id}(根据ID查询)PUT http://localhost:8080/api/user(修改)DELETE http://localhost:8080/api/user/{id}(删除)如果都能返回预期的响应成功或失败那么一个完整的 SpringBoot 服务就在几分钟内搭建完成了。4. 深入细节Vibe Coding 生成代码的常见问题与调优用 AI 生成代码速度快是快但如果不理解它生成的代码或者遇到问题不会排查那就只是“看起来很美”。下面我拆解几个最容易出问题的环节。4.1 依赖管理与版本冲突这是新手用 Vibe Coding 踩坑最多的地方。AI 可能基于过时的知识库或者使用了最新但不兼容的依赖版本。问题表现项目启动失败控制台报错ClassNotFoundException,NoSuchMethodError, 或关于 Bean 创建、自动配置的错误。排查顺序锁定pom.xml首先仔细核对 AI 生成的pom.xml。将 SpringBootparent版本、所有starter依赖如spring-boot-starter-web,mybatis-plus-boot-starter的版本明确写出来不要使用version变量除非你很清楚自己在做什么。检查版本兼容性去 MyBatis-Plus 等第三方组件的官方文档查看其版本与 SpringBoot 版本的对应关系。例如MyBatis-Plus 3.5.3.x 通常兼容 SpringBoot 2.7.x。使用 Maven 命令排查在项目根目录下运行mvn dependency:tree。这个命令会打印出完整的依赖树你可以清晰地看到每个依赖的版本以及是否有重复引入、版本冲突。如果发现冲突可以在pom.xml中用exclusions标签排除掉不需要的传递依赖。经验建议对于 SpringBoot 项目我建议在给 AI 的指令里直接指定核心依赖的版本号。例如“使用spring-boot-starter-parent2.7.18 和mybatis-plus-boot-starter3.5.3.1”。这能极大减少版本问题的发生。4.2 数据库配置与实体映射AI 生成的数据库配置和实体类代码有时会忽略一些细节。常见坑点时区问题MySQL 连接 URL 里没加serverTimezoneUTC或Asia/Shanghai导致插入时间字段报错。SSL 警告本地开发环境可以加上useSSLfalse来禁用 SSL避免警告日志。字段映射实体类字段名是userName但数据库表字段是user_name。AI 可能不会自动添加TableField(value “user_name”)注解导致查询不到数据。你需要检查并补充。主键策略AI 可能在实体类id字段上生成TableId(type IdType.AUTO)这依赖于数据库自增。如果你的表设计不是自增或者用的是雪花算法需要修改为IdType.ASSIGN_IDMyBatis-Plus 默认。验证方法启动项目后先别急着调接口。直接打开数据库客户端手动插入一条数据。然后调用GET /list接口看能否查询出来。如果查不出来首先看控制台 MyBatis-Plus 打印的 SQL 语句核对表名、字段名是否和数据库一致。4.3 接口规范与异常处理AI 生成的 Controller 通常只实现了最基本的成功返回。但在实际项目中我们还需要统一的响应格式和异常处理。AI 生成的代码可能长这样PostMapping public boolean save(RequestBody User user) { return userService.save(user); }你需要考虑补充统一响应体定义一个如ResultT的类包含code、msg、data字段。让所有接口都返回Result。全局异常处理使用ControllerAdvice和ExceptionHandler来捕获和处理Exception、BusinessException等并返回格式统一的错误信息。参数校验在User实体字段上添加NotBlank、Email等校验注解并在 Controller 方法参数上添加Valid。这些属于“锦上添花”但很重要的部分。你可以在 AI 生成基础 CRUD 后再给它一个指令“请为这个项目的所有 Controller 接口添加统一的Result包装返回并添加一个全局异常处理类。” AI 通常也能很好地完成这部分代码的补充。5. 从 Demo 到生产Vibe Coding 的边界与进阶用法三分钟搭好一个能跑的 SpringBoot 服务证明了 Vibe Coding 在快速原型构建上的效率。但如果你想把它用于更严肃的项目或者处理更复杂的业务逻辑就需要了解它的边界。5.1 Vibe Coding 擅长什么生成样板代码Controller-Service-Mapper 三层架构、实体类、配置文件。这是它最强的地方。实现简单业务逻辑基于单表的增删改查、条件查询、分页查询。只要你能用语言描述清楚查询条件如“根据用户名模糊查询并分页”AI 基本都能生成正确的 MyBatis-Plus 查询条件构造器代码。添加通用组件你可以让它“集成 Swagger 文档”、“添加 Spring Security 基础配置”、“配置 Redis 缓存模板”。对于这种有大量标准写法的配置AI 的准确率很高。代码解释与重构你可以把一段复杂的业务代码丢给它问“这段代码是什么意思”或者“如何优化这段代码” 它能给出不错的解释和重构建议。5.2 Vibe Coding 不擅长或需要谨慎使用什么复杂的业务算法和流程涉及大量状态判断、循环嵌套、外部系统调用、分布式事务的业务核心逻辑。AI 生成的代码可能逻辑正确但缺乏对业务上下文的理解容易产生隐蔽的 Bug。这部分代码必须由开发者仔细审查和测试。高度定制化的架构设计比如复杂的微服务拆分、特定的消息队列消费模式、自定义的分布式锁实现。AI 只能生成通用模式无法替代架构师的设计。性能优化AI 不会主动为你考虑 SQL 性能如 N1 问题、缓存穿透、锁粒度等问题。它生成的代码是功能性的不是最优的。安全性AI 不会自动帮你防范 SQL 注入虽然 MyBatis-Plus 本身能避免大部分、XSS 攻击、CSRF 攻击等。你需要自己确保安全措施到位。5.3 进阶用法与 Spec Coding 结合“Vibe Coding”氛围编程强调用自然语言驱动而 “Spec Coding”规范编程则强调用更精确的规格说明如测试用例、接口文档来驱动。在实际开发中你可以结合两者用 Vibe Coding 快速搭建框架像前面一样快速生成项目骨架和基础 CRUD。用 Spec Coding 细化复杂功能对于某个复杂的业务接口不要只对 AI 说“实现一个下单功能”。而是先自己或与 AI 协作写出这个接口的详细规格输入参数JSON 结构、每个字段的含义和校验规则。处理步骤1.校验库存2.扣减库存3.创建订单4.发送消息…。输出结果成功/失败的响应格式。甚至可以先写出这个接口的单元测试用例Given-When-Then 格式。将这个详细的规格说明交给 AI让它生成实现代码。这样生成的代码其可靠性和符合预期的程度会高得多。我的工作流通常是Vibe Coding 开道快速把项目跑起来看到雏形。然后切换到“开发者模式”仔细审查和补充 AI 生成的每一行代码特别是业务逻辑部分。对于复杂模块则采用 Spec Coding 的思路先定好详细的“契约”再让 AI 辅助实现。这样既利用了 AI 的效率又保证了代码的质量和可控性。最后记住一点Vibe Coding 是一个强大的“副驾驶”能极大提升你启动和编码的速度但它不能替代你对技术栈原理的理解、对业务逻辑的把握以及作为一名工程师的调试和解决问题的能力。把它当作一个超级智能的代码补全和脚手架生成工具而不是一个全自动的开发机器人。当你清楚它的能力边界并学会如何给它清晰的指令时它才能真正成为你的生产力倍增器。

相关新闻

5分钟掌握ipatool:命令行下载iOS应用IPA文件的终极指南

5分钟掌握ipatool:命令行下载iOS应用IPA文件的终极指南

5分钟掌握ipatool:命令行下载iOS应用IPA文件的终极指南 【免费下载链接】ipatool Command-line tool that allows searching and downloading app packages (known as ipa files) from the iOS App Store 项目地址: https://gitcode.com/GitHub_Trending/ip/ipato…

2026/10/11 11:15:36 阅读更多 →
InSPyReNet实战应用:如何用这个AI工具创建专业级图像编辑软件

InSPyReNet实战应用:如何用这个AI工具创建专业级图像编辑软件

InSPyReNet实战应用:如何用这个AI工具创建专业级图像编辑软件 【免费下载链接】InSPyReNet Official PyTorch implementation of Revisiting Image Pyramid Structure for High Resolution Salient Object Detection (ACCV 2022) 项目地址: https://gitcode.com/g…

2026/10/12 11:11:58 阅读更多 →
C++实现自适应嵌套克伦肖-柯蒂斯数值积分器:原理、设计与优化

C++实现自适应嵌套克伦肖-柯蒂斯数值积分器:原理、设计与优化

1. 项目概述:从数值积分到克伦肖-柯蒂斯规则 在科学计算和工程仿真领域,我们经常需要计算一个函数的定积分。对于简单的解析函数,我们可以用牛顿-莱布尼茨公式求出精确解。但现实世界中的问题往往没那么友好:被积函数可能没有初等…

2026/10/10 0:12:49 阅读更多 →

最新新闻

大一新生年入百万?拆解流量造神背后的真实玩法与路径

大一新生年入百万?拆解流量造神背后的真实玩法与路径

大一新生,年入100万,别人都叫他“天才小火炬”。这种标题这两年刷到过不止一次,第一反应基本都是“又一个流量造神”。但把这些案例里的账号内容、产品路径、粉丝互动记录翻了很多遍之后,有一个结论我越来越确定:这里面…

2026/10/12 13:02:11 阅读更多 →
召合消除算法求解:从状态编码到A*搜索的工程实践

召合消除算法求解:从状态编码到A*搜索的工程实践

1. 从“消消乐”到算法题:召合消除问题的本质拆解第一次看到“召合消除”这个词,很多人会愣一下——这到底是个什么玩意儿?其实说白了,它就是一类在网格棋盘上通过交换相邻元素、凑齐三个或以上相同元素来触发消除的益智玩法的统称…

2026/10/12 13:02:11 阅读更多 →
Spring Boot接入MCP:让Java服务无缝对接AI应用的实战指南

Spring Boot接入MCP:让Java服务无缝对接AI应用的实战指南

1. 为什么每个Spring Boot开发者都该认真看看MCP 1.1 我遇到的服务接入难题 这两年我陆续接到好几个"把内部服务开放给AI使用"的需求,每次都被折腾得够呛。服务本身不难写,难的是对方AI应用的接入方式千奇百怪:有的要求按插件规范…

2026/10/12 13:02:11 阅读更多 →
C++从零实现分数类:精确四则运算与边界处理

C++从零实现分数类:精确四则运算与边界处理

1. 从整数除法的一个坑说起:为什么需要自己实现分数类很多刚接触C的朋友都写过类似这样的代码:计算1/2 1/3,然后发现结果输出是0。原因很简单,1/2在C里执行的是整数除法,结果是0而不是0.5。就算换成double&#xff0c…

2026/10/12 13:02:11 阅读更多 →
图片翻译六步流程:从OCR识别到译文回填的完整实战指南

图片翻译六步流程:从OCR识别到译文回填的完整实战指南

图片里夹着文字这件事,放在几年前还不太折腾人,大不了照着键盘一个字母一个字母敲。可现在谁手机里没有几十张截图、合同照片、PPT翻拍?尤其做外贸、读论文、追外漫、玩外服游戏的时候,满屏蝌蚪文真是让人头大。你去搜“图片翻译”…

2026/10/12 13:02:10 阅读更多 →
6.4k Stars!用Claude Code写论文的全套流水线,有人打包开源了:TaoToken统一Key接入实操

6.4k Stars!用Claude Code写论文的全套流水线,有人打包开源了: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/12 13:01:10 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →