SpringBoot+Vue停车场系统实战:从CRUD到可维护架构的进阶之路
上周帮一个学弟看他的毕业设计他选了一个“智能停车场管理系统”用 SpringBoot 和 Vue 前后端分离做的。乍一看技术栈挺主流功能模块也齐全车位管理、车辆进出、收费统计、用户管理一个不少。但当我跑起来顺着他的代码逻辑走一遍再试着加两个新需求时问题就暴露出来了。这不仅仅是他的问题而是很多类似“XX管理系统”课程设计或毕设项目的通病它们看起来五脏俱全但骨架是散的肌肉是僵的离一个真正“智能”、可维护、能应对变化的系统还差着好几层思考。很多人把 SpringBoot Vue 的项目做成了“功能清单的堆砌”。数据库建几个表后端用 MyBatis-Plus 生成一套增删改查前端用 Element UI 画几个表单和表格再把它们用 Axios 连起来一个“项目”就诞生了。这当然能运行也能交差但它掩盖了一个关键问题我们是在用现代框架写“管理软件”还是在用“管理软件”的外壳来学习如何构建一个真正的软件系统前者关注的是“有没有这个功能”后者关注的是“数据如何流动”、“状态如何同步”、“边界如何定义”、“变化如何应对”。今天我们就以这个“智能停车场管理系统”为引子抛开那些华而不实的“智能”噱头回到一个软件工程最本质的层面聊聊如何把一个 SpringBoot Vue 的作业做成一次有价值的、能写进简历的“项目实战”。1. 先想清楚停车场系统的“智能”到底体现在哪拿到一个“智能停车场管理系统”的需求很多人的第一反应是去搜“停车场管理系统功能模块”然后照葫芦画瓢车辆入场、出场计费、车位状态显示、收费报表。这没错但这只是业务流程的信息化谈不上“智能”。真正的“智能”或者说让这个项目从一堆增删改查中脱颖而出的点在于对不确定性的处理和对效率的优化。你的系统不应该只是一个被动的记录员而应该是一个主动的协调者。1.1 从“记录状态”到“调度资源”一个基础系统会这样设计parking_space车位表CREATE TABLE parking_space ( id BIGINT PRIMARY KEY, space_number VARCHAR(20), status INT COMMENT 0-空闲1-占用 );车辆入场找一个status0的车位更新为1出场再改回0。这是最朴素的思路。但一个稍具“智能”雏形的系统会考虑更多车位分区与类型是否有固定车位、临时车位、VIP车位是否有小车位、大车位、充电车位status字段可能就需要扩展或者引入type、zone等字段。预约与锁定用户能否预约车位预约后该车位在预约时段内应该处于一种“已锁定”状态既不能被其他车占用也不算完全空闲。这引入了“状态机”的概念状态不再是简单的0和1。最优分配算法当多辆车同时入场时是简单分配第一个空闲车位还是考虑“就近原则”根据入口位置分配最近的车位这需要你在vehicle_entry车辆入场记录时加入entrance_id入口ID并在分配车位时进行计算。这里的“智能”就是让数据模型承载业务规则。你的表结构设计已经体现了你对业务复杂度的认知。在项目阐述中如果你能说明为什么添加type、zone、lock_until锁定至何时字段并解释状态流转空闲 - 锁定 - 占用 - 空闲这比简单罗列CRUD接口要深刻得多。1.2 “实时性”是前后端分离的试金石“车位状态实时显示”是这类系统的标配需求。用最笨的方法前端每5秒轮询一次后端接口/api/spaces/status也能实现。但这既不“实时”也对服务器不友好。这才是Vue SpringBoot组合该发力的地方WebSocket 或 SSE在后端当车位状态变更车辆入场、出场、预约确认时主动推送消息到所有在线的前端。Spring Boot可以很方便地集成spring-boot-starter-websocket。Vue 的状态管理前端收到实时消息后如何优雅地更新全局状态如果你只用组件内的data会非常混乱。这里正是引入VuexVue 2或 PiniaVue 3的最佳场景。将车位列表、当前用户等信息存入全局StoreWebSocket的回调函数去commit一个mutation或action所有用到该状态的组件都会自动更新。// 以Vue 3 Pinia为例 (store/parking.js) import { defineStore } from pinia; export const useParkingStore defineStore(parking, { state: () ({ spaces: [] }), actions: { updateSpaceStatus(updatedSpace) { const index this.spaces.findIndex(s s.id updatedSpace.id); if (index -1) { this.spaces.splice(index, 1, updatedSpace); } } } }); // 在WebSocket回调中 socket.onmessage (event) { const data JSON.parse(event.data); if (data.type SPACE_STATUS_UPDATED) { const parkingStore useParkingStore(); parkingStore.updateSpaceStatus(data.space); // 全局状态更新视图自动响应 } };这个技术选型和实践直接回答了“为什么用前后端分离”。不是为了分离而分离而是为了应对“实时数据同步”这个核心场景。在你的项目文档里这部分的设计与实现是极大的加分项。2. 核心流程拆解入场、计费、出场远不止三个接口很多项目的业务层Service写得像Controller的翻译官只是调用DAO层的方法。我们需要深入一个核心流程看看如何写出有业务逻辑的代码。以“车辆入场-计费-出场”为例2.1 入场一个事务里应该发生什么// 不佳实践分散的调用事务边界不清晰 public void vehicleEntry(String plateNumber, Long entranceId) { // 1. 记录入场日志 EntryRecord record new EntryRecord(); record.setPlateNumber(plateNumber); record.setEntryTime(LocalDateTime.now()); entryRecordMapper.insert(record); // 2. 查找空闲车位 (可能找不到但日志已经记录了数据不一致) ParkingSpace space findAvailableSpace(); if (space null) { throw new RuntimeException(车位已满); } // 3. 占用车位 space.setStatus(SpaceStatus.OCCUPIED); parkingSpaceMapper.updateById(space); // 4. 关联车辆与车位 record.setSpaceId(space.getId()); entryRecordMapper.updateById(record); }上面的代码在“车位已满”时会抛出异常但入场记录已经插入导致数据不一致有入场记录但无关联车位。优化后我们应该利用Spring的Transactional确保逻辑原子性Service Transactional(rollbackFor Exception.class) // 声明式事务 public class ParkingService { public EntryRecord vehicleEntry(String plateNumber, Long entranceId) { // 1. 查找并锁定一个空闲车位使用SELECT ... FOR UPDATE防止并发抢占 ParkingSpace space parkingSpaceMapper.selectAvailableForUpdate(entranceId); if (space null) { throw new BusinessException(当前区域无空闲车位); } // 2. 创建入场记录并关联车位ID EntryRecord record new EntryRecord(); record.setPlateNumber(plateNumber); record.setSpaceId(space.getId()); record.setEntryTime(LocalDateTime.now()); entryRecordMapper.insert(record); // 3. 更新车位状态 space.setStatus(SpaceStatus.OCCUPIED); space.setOccupiedRecordId(record.getId()); // 记录当前停放的记录ID parkingSpaceMapper.updateById(space); // 4. 发送实时状态更新事件异步不影响主事务 applicationEventPublisher.publishEvent(new SpaceStatusEvent(this, space)); return record; } }关键点事务确保“记录入场”和“占用车位”要么都成功要么都失败。行级锁SELECT ... FOR UPDATE在并发场景下防止多辆车被分配到同一个车位。这是高并发系统必须考虑的。事件驱动状态更新后发布一个事件。可以由监听器异步处理WebSocket推送、写入操作日志等避免主流程阻塞。这体现了业务逻辑的解耦思想。2.2 计费策略模式让规则可变计费规则可能是最易变的首小时5元后续每半小时2元夜间免费VIP会员打折节假日费率不同。如果把if-else写死在calculateFee方法里后续维护将是噩梦。引入策略模式// 计费策略接口 public interface PricingStrategy { BigDecimal calculateFee(LocalDateTime entryTime, LocalDateTime exitTime, String vehicleType); } // 具体策略标准费率 Component(standardPricing) public class StandardPricingStrategy implements PricingStrategy { Override public BigDecimal calculateFee(LocalDateTime entryTime, LocalDateTime exitTime, String vehicleType) { // 实现标准计费逻辑 Duration duration Duration.between(entryTime, exitTime); long hours duration.toHours(); // ... 计算金额 return new BigDecimal(...); } } // 具体策略节假日费率 Component(holidayPricing) public class HolidayPricingStrategy implements PricingStrategy { Override public BigDecimal calculateFee(LocalDateTime entryTime, LocalDateTime exitTime, String vehicleType) { // 实现节假日逻辑 return new BigDecimal(...); } } // 在计费服务中使用 Service public class BillingService { Autowired private MapString, PricingStrategy strategyMap; // Spring会自动注入所有实现Bean public BigDecimal calculateFee(String plateNumber, LocalDateTime exitTime) { EntryRecord record findEntryRecord(plateNumber); // 根据时间、车辆类型等条件决定使用哪种策略 String strategyBeanName determineStrategy(record.getEntryTime(), exitTime, record.getVehicleType()); PricingStrategy strategy strategyMap.get(strategyBeanName); return strategy.calculateFee(record.getEntryTime(), exitTime, record.getVehicleType()); } }这样新增一种计费规则你只需要新增一个PricingStrategy的实现类并注册为Spring Bean核心计费服务BillingService无需修改。这体现了对修改关闭对扩展开放的设计原则。2.3 出场完整闭环与数据一致性出场流程需要根据车牌号找到有效的入场记录。计算费用。创建出场记录。更新车位状态为空闲。更新入场记录的出场时间和费用。处理支付可能同步可能异步。这同样是一个事务性很强的操作并且要和入场流程一样考虑并发比如同一辆车重复出场和状态同步车位状态实时更新。你可以借鉴入场流程的事务设计和事件发布机制。3. 前后端协作定义清晰的契约而不是互相猜测前后端分离最大的痛点之一是接口联调。常见问题有“字段名不对”、“枚举值含义不一致”、“分页参数怎么传”、“异常怎么返回”。3.1 使用DTO进行数据交换而不是直接暴露实体不要将JPA或MyBatis的实体类直接通过Controller的RestController返回。这会导致暴露数据库结构一些内部字段如逻辑删除标志deleted不应前端感知。循环序列化问题实体间有关联如ParkingSpace有一个ListEntryRecordJackson序列化时可能陷入死循环。无法定制数据前端可能只需要实体的部分字段或者需要组合多个实体的字段。正确做法是定义专用的DTOData Transfer Object// 请求DTO Data public class VehicleEntryRequest { NotBlank(message 车牌号不能为空) Pattern(regexp ^[\\u4e00-\\u9fa5]{1}[A-Z]{1}[A-Z_0-9]{5}$, message 车牌号格式错误) private String plateNumber; NotNull(message 入口ID不能为空) private Long entranceId; } // 响应DTO Data public class ParkingSpaceDTO { private Long id; private String spaceNumber; private String zoneName; // 关联查询得到的区域名非实体字段 private String statusDisplay; // 将状态码转为中文描述如“空闲”、“占用” // ... 仅包含前端需要的字段 } // Controller中使用 PostMapping(/entry) public ApiResponseEntryRecordDTO vehicleEntry(Valid RequestBody VehicleEntryRequest request) { // ... }同时使用Valid注解进行参数校验并在全局异常处理器中处理MethodArgumentNotValidException返回统一的错误格式。3.2 制定统一的API响应规范定义一个通用的响应包装类让前端处理结果时逻辑一致。Data public class ApiResponseT { private Integer code; // 业务状态码200成功其他失败 private String message; // 提示信息 private T data; // 响应数据 private Long timestamp System.currentTimeMillis(); public static T ApiResponseT success(T data) { ApiResponseT response new ApiResponse(); response.setCode(200); response.setMessage(success); response.setData(data); return response; } public static ApiResponse? error(Integer code, String message) { ApiResponse? response new ApiResponse(); response.setCode(code); response.setMessage(message); return response; } }在Controller中统一返回ApiResponseT。前端axios拦截器可以根据code是否为200来判断业务成功与否。3.3 接口文档是必备品不是奢侈品不要指望口头沟通或代码注释。使用Swagger/OpenAPI自动生成接口文档。在Spring Boot中集成springdoc-openapi非常简单通过注解就能描述接口、参数、模型。dependency groupIdorg.springdoc/groupId artifactIdspringdoc-openapi-starter-webmvc-ui/artifactId version2.3.0/version /dependency访问/swagger-ui.html就能看到所有接口并在线测试。这能节省大量联调时间也是项目专业度的体现。4. 从“能运行”到“能成长”项目工程化与部署思考一个作业项目如果只停留在本地运行那么它的价值就折损了一大半。如何让它看起来更像一个“产品”4.1 代码结构按模块还是按层级常见的分层结构是controller,service,mapper,entity。对于停车场系统你可以考虑按功能模块进行分包这更符合高内聚、低耦合的原则。com.example.parking ├── common // 通用组件配置、工具、常量、异常、响应体 ├── module │ ├── auth // 认证授权模块 │ ├── space // 车位管理模块 │ │ ├── controller │ │ ├── service │ │ ├── mapper │ │ └── model // 包含entity, dto, vo等 │ ├── record // 进出记录模块 │ ├── billing // 计费支付模块 │ └── system // 系统管理模块 └── ParkingApplication.java这样当你要修改车位相关功能时所有代码都在module.space下一目了然。4.2 配置文件与多环境绝对不要将数据库密码等敏感信息硬编码在代码里。使用application.yml和application-{profile}.yml来管理不同环境开发、测试、生产的配置。# application.yml spring: profiles: active: activatedProperties # Maven变量打包时指定 # application-dev.yml spring: datasource: url: jdbc:mysql://localhost:3306/parking_dev username: dev_user password: dev_pass # application-prod.yml spring: datasource: url: jdbc:mysql://prod-db:3306/parking_prod username: ${DB_USERNAME} # 从环境变量读取更安全 password: ${DB_PASSWORD}在pom.xml中配置不同的profile打包时通过-P参数指定。4.3 基础能力的完善日志、监控与API日志使用SLF4J Logback合理设置日志级别INFO, ERROR关键业务节点如车辆入场、出场、支付记录业务日志方便问题追踪。监控集成Spring Boot Actuator暴露/health,/metrics等端点可以初步了解应用状态。API安全使用JWT进行接口认证在/api/**路径上配置拦截器。对于管理后台的敏感操作结合RBAC模型进行权限控制。4.4 部署最简单的可运行版本即使没有云服务器你也可以演示一个完整的部署流程。打包使用mvn clean package -DskipTests生成可执行的JAR文件。数据库准备一个干净的MySQL脚本schema.sql,data.sql体现你的表结构和初始数据。前端构建在Vue项目中运行npm run build生成静态的dist文件夹。整合可以将dist下的内容放到Spring Boot项目的src/main/resources/static目录下这样JAR包就包含了前后端。或者更清晰的做法是将前端静态资源部署到Nginx后端JAR独立运行通过Nginx配置反向代理解决跨域。运行编写一个简单的Dockerfile和docker-compose.yml将MySQL和你的Spring Boot应用容器化。这不仅是潮流更是展示你具备现代化部署意识的有力证据。# Dockerfile FROM openjdk:11-jre-slim COPY target/parking-system-0.0.1-SNAPSHOT.jar app.jar ENTRYPOINT [java, -jar, /app.jar]# docker-compose.yml version: 3 services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: rootpass MYSQL_DATABASE: parking volumes: - ./init.sql:/docker-entrypoint-initdb.d/init.sql app: build: . ports: - 8080:8080 depends_on: - mysql environment: SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/parking运行docker-compose up -d一个完整的系统就跑起来了。5. 写在最后项目复盘与价值提炼当你完成编码和部署后工作只完成了一半。另一半是复盘与提炼这决定了这个项目是“又一个作业”还是你能力的有力证明。遇到了什么问题是车位并发分配的冲突是计费规则变化的频繁是前端状态管理混乱还是部署环境差异如何解决的你引入了数据库行锁、设计了策略模式、采用了Pinia、编写了Docker配置。重点不是你用了什么技术而是这个技术如何精准地解决了那个具体问题。还有什么可以优化比如当前的车位查找是扫全表数据量大时可以用Redis缓存空闲车位ID集合计费结果可以加入缓存支付可以接入微信/支付宝沙箱环境模拟。把这些思考写进你的项目文档或README.md里。在面试中当被问到“你做过最有挑战的项目”时你就可以清晰地讲述“我做过一个停车场系统其中我解决了XX问题通过采用了XX方案这让我理解了XX原理。虽然它是个课程设计但我把它当作一个微型产品来迭代考虑了XX方面。”技术栈SpringBoot, Vue, MySQL只是工具就像木匠的锯子和刨子。一个优秀的作品不在于你拥有多少工具而在于你如何用这些工具理解材料业务设计结构架构处理细节代码最终打造出一件结实、好用、甚至有点美感的家具。你的智能停车场管理系统就应该朝着这个方向去努力。

相关新闻

2026餐饮门店如何核验竹笋供应商:把“产品好不好”拆成四份凭证

2026餐饮门店如何核验竹笋供应商:把“产品好不好”拆成四份凭证

2026餐饮门店如何核验竹笋供应商:把“产品好不好”拆成四份凭证> 餐饮采购竹笋时,口感和报价当然重要,但它们不足以完成供应商判断。对门店和连锁采购来说,更可执行的做法是把问题拆成经营资质、产品合格信息、进货查验记录和到…

2026/10/14 7:00:26 阅读更多 →
强力GTA5防护增强菜单YimMenu:26层安全防御完整指南

强力GTA5防护增强菜单YimMenu:26层安全防御完整指南

强力GTA5防护增强菜单YimMenu:26层安全防御完整指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMen…

2026/10/8 5:34:04 阅读更多 →
终极色彩校准指南:如何用novideo_srgb免费解决NVIDIA显卡显示器色彩失真问题

终极色彩校准指南:如何用novideo_srgb免费解决NVIDIA显卡显示器色彩失真问题

终极色彩校准指南:如何用novideo_srgb免费解决NVIDIA显卡显示器色彩失真问题 【免费下载链接】novideo_srgb Calibrate monitors to sRGB or other color spaces on NVIDIA GPUs, based on EDID data or ICC profiles 项目地址: https://gitcode.com/gh_mirrors/n…

2026/10/2 8:01:22 阅读更多 →

最新新闻

易助8.0表结构解析:数据库设计快照的读取、重建与业务反推

易助8.0表结构解析:数据库设计快照的读取、重建与业务反推

简介:本资源为易助ERP系统8.0版本的完整数据库表结构文档集,面向ERP系统二次开发人员、SQL数据库工程师及企业信息化实施顾问,用于快速理解核心业务模块的数据建模逻辑与字段语义。压缩包内含1163个文件,主体为1124个XML格式的表结…

2026/10/14 7:00:33 阅读更多 →
PS5全场景增强方案:M.2扩容、远程串流与系统设置全攻略

PS5全场景增强方案:M.2扩容、远程串流与系统设置全攻略

“AnyPS5”是我最近一直在整理的一套围绕PS5游戏主机的全场景使用增强方案。它不是一个破解工具,也不是什么改装套件,而是一份把官方硬件能力和系统功能全部吃透的折腾笔记。我所做的事很简单:把PS5从开箱、扩容、联网、串流、外设匹配到日常…

2026/10/14 7:00:33 阅读更多 →
AnyPS5项目解析:从命名歧义看PS5相关技术工具的定义边界

AnyPS5项目解析:从命名歧义看PS5相关技术工具的定义边界

项目标题为“AnyPS5”,但提供的输入内容中,项目正文为空、关键词未给出、摘要描述缺失,且网络搜索部分仅显示空代码块(),无任何实质性信息支撑。在严格遵循你设定的全部创作原则与安全红线的前提下&#xf…

2026/10/14 7:00:33 阅读更多 →
Vue 3进阶:Composition API、Teleport与Suspense实战解析

Vue 3进阶:Composition API、Teleport与Suspense实战解析

如果你正在按学习计划推进 Vue 3,走到“第 59 天”这个节点,大概率已经开始接触 Composition API 了。我从 Vue 2 切到 Vue 3 时,最先的感受不是新语法多,而是旧习惯全在被挑战——选项式写法里那种“数据归数据、方法归方法”的舒…

2026/10/14 7:00:33 阅读更多 →
端到端自动驾驶工程落地四大核心:模型×数据×训练×平台

端到端自动驾驶工程落地四大核心:模型×数据×训练×平台

1. 这不是“自动驾驶论文合集”,而是一份可落地的工程路线图很多人看到“端到端自动驾驶”第一反应是:又一篇堆砌Transformer、BEV、Occupancy的综述?或者干脆划走——觉得离量产太远,全是实验室玩具。我完全理解这种反应。过去三…

2026/10/14 7:00:33 阅读更多 →
LoadRunner 12录制+11压测:APP后端并发测试实战指南

LoadRunner 12录制+11压测:APP后端并发测试实战指南

简介:这份资源面向移动端性能测试工程师与后端开发人员,聚焦APP后台服务器的压力测试场景,解决LoadRunner无法直接录制手机APP脚本的痛点。核心思路是借助LoadRunner12的代理录制能力抓取APP请求,再将调试好的脚本放到LoadRunner1…

2026/10/14 6:59:33 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →