Java原生Web酒店系统:Servlet+JDBC全流程实战
简介这是一份面向Java初学者与Web开发入门者的实战项目源码聚焦酒店在线预订业务场景帮助学习者系统掌握Java Web全栈开发核心技能。资源包含41个文件主体为34个Java类涵盖Controller、Service、DAO及实体类辅以4个properties配置文件数据库与应用参数、2个Markdown说明文档含环境搭建与运行指南及1个XML配置文件如Spring或MyBatis配置整体仅83KB轻量易读结构清晰便于逐模块分析。目前已有75人学习下载适合用于课堂实训、课程设计或自学进阶。读者可完整获得基于MVC架构的可运行系统深入理解Servlet/JSP请求流程、JDBC/MyBatis数据库操作、用户登录与订单管理等业务逻辑实现并参考其中Spring整合、前端交互及基础安全控制等工程化实践快速构建Java Web项目开发能力。1. 这不是又一个“Hello World”酒店系统它真能跑通用户注册→查房→下单→支付全流程且所有模块都暴露在源码里你见过太多标着“Java酒店系统”的压缩包点开后只有三个JSP页面加一个空的db.sql连登录校验都是if(admin.equals(pwd))硬编码。这次不一样——java酒店预订系统.zip是我去年帮某高校实训班拆解过的真实可运行项目不是教学Demo而是从数据库建表语句、Servlet跳转链路、订单状态机流转到前端AJAX异步刷新房间余量全部闭环。它不依赖Spring Boot自动配置黑盒用的是原生ServletJDBCJSP组合但关键业务逻辑比如并发预订时房间锁机制、订单超时自动取消全写在OrderService.java和RoomLockManager.java里没有藏在框架注解后面。适合两类人刚学完JDBC想看“SQL怎么真正嵌进业务流”的新手以及想逆向学习传统Java Web分层设计、避开Spring全家桶干扰的熟手。注意它没上Redis缓存没做分布式事务但正因如此你能看清每一行connection.prepareStatement()背后的数据一致性取舍。2. 从解压到启动三步验证是否拿到完整源码绕过90%初学者卡死的Tomcat部署坑2.1 解压后第一眼必须确认的四个文件夹与两个关键配置文件拿到java酒店预订系统.zip后别急着导入IDE。先解压用文件管理器直接看根目录结构。合格的源码包必须包含以下5个实体缺一不可否则是残缺版路径必须存在作用说明/src/✅Java源码根目录里面应有com.hotel.dao/com.hotel.service/com.hotel.servlet/三层包结构/WebContent/✅Web资源根目录含/WEB-INF/web.xmlServlet配置中枢和/js//css/前端资源/lib/✅所有jar包必须在此重点检查mysql-connector-java-5.1.47.jarJDBC驱动、jstl-1.2.jarJSP标签库、servlet-api.jarTomcat依赖开发时需设为Provided/sql/✅数据库脚本目录必须有hotel_db.sql建库建表语句和init_data.sql初始化酒店/房型数据/README.md⚠️非强制但强烈建议存在若无则需手动补全数据库连接参数提示如果解压后看到pom.xml或build.gradle说明你拿错了包——这个项目不基于Maven是纯Eclipse Dynamic Web Project结构。强行用IDEA Maven导入会报web.xml not found这是第一个信号。2.2 数据库初始化用hotel_db.sql建库时必须改的三处硬编码打开/sql/hotel_db.sql你会看到类似这样的建库语句CREATE DATABASE IF NOT EXISTS hotel_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; USE hotel_db;这里藏着三个必须手动修改的点数据库名不能是hotel_db你的MySQL可能已存在同名库或权限不足。改成hotel_demo_2024这类唯一名称字符集必须显式指定utf8mb4很多教程还写utf8但MySQL 5.7中utf8实际是utf8mb3不支持emoji会导致JSP提交带表情的用户昵称时报错Incorrect string valueUSE hotel_db;后的建表语句前必须加SET FOREIGN_KEY_CHECKS0;否则room_type表外键引用hotel_info时若建表顺序错乱会报Cannot add or update a child row。执行完建库脚本后立即执行/sql/init_data.sql。注意该脚本里INSERT INTO room_info的status字段值是available可用或booked已订不要手动生成测试数据——项目订单模块的库存扣减逻辑严格依赖此初始状态乱插数据会导致后续“查到有房却预订失败”。2.3 Tomcat部署为什么你总在localhost:8080/hotel看到404把整个/WebContent/目录不是zip包复制到Tomcat的webapps/下重命名为hotel。启动Tomcat后访问http://localhost:8080/hotel仍404问题大概率出在web.xml的welcome-file-list配置。打开/WebContent/WEB-INF/web.xml找到welcome-file-list welcome-fileindex.jsp/welcome-file /welcome-file-list必须确认index.jsp真实存在于/WebContent/根目录下。常见错误是有人把index.jsp放在/WebContent/pages/子目录却忘了同步修改web.xml里的路径。正确写法应为welcome-file-list welcome-filepages/index.jsp/welcome-file /welcome-file-list此外检查servlet-mapping是否覆盖了关键路径servlet-mapping servlet-nameLoginServlet/servlet-name url-pattern/login/url-pattern /servlet-mapping这意味着用户点击登录按钮时表单action/login才能被正确路由。如果url-pattern写成/servlet/login而前端HTML里是actionlogin就会404。3. 核心业务链路拆解从用户搜索房间到生成订单代码级追踪每一步数据流向3.1 搜索功能SearchServlet如何把日期参数转成SQL查询条件用户在首页输入入住/离店日期点击搜索后请求发往SearchServlet。看其doPost方法核心逻辑// SearchServlet.java String checkIn request.getParameter(checkIn); // 格式2024-05-01 String checkOut request.getParameter(checkOut); SimpleDateFormat sdf new SimpleDateFormat(yyyy-MM-dd); Date inDate sdf.parse(checkIn); Date outDate sdf.parse(checkOut); // 关键计算入住天数用于价格计算 long diffInMillies outDate.getTime() - inDate.getTime(); int days (int) (diffInMillies / (1000 * 60 * 60 * 24)); // 构造SQL查出所有在该时段内available的房间 String sql SELECT r.*, rt.price FROM room_info r JOIN room_type rt ON r.type_id rt.id WHERE r.status available AND r.id NOT IN ( SELECT room_id FROM order_info WHERE check_in ? AND check_out ? ) ; PreparedStatement ps conn.prepareStatement(sql); ps.setString(1, checkOut); // 注意这里是反向判断查订单表中与用户时段有交集的房间 ps.setString(2, checkIn);逻辑说明不是简单查statusavailable而是用子查询排除已被其他订单占用的房间。check_in ? AND check_out ?确保只要订单时段与用户搜索时段有重叠哪怕只重叠1天该房间就不显示days变量虽未在此处使用但会被传入JSP在room_list.jsp中计算总价% room.getPrice() * days %参数安全用PreparedStatement而非字符串拼接避免SQL注入。若你看到WHERE check_in checkIn这种写法说明源码有严重漏洞。3.2 预订提交OrderServlet里的双重校验与数据库事务控制用户选中房间点击“立即预订”触发OrderServlet。其doPost方法包含两个关键校验层第一层应用层校验快速失败// 检查房间当前状态是否仍为available防止页面缓存导致重复提交 String roomSql SELECT status FROM room_info WHERE id ?; PreparedStatement roomPs conn.prepareStatement(roomSql); roomPs.setInt(1, roomId); ResultSet rs roomPs.executeQuery(); if (!rs.next() || !available.equals(rs.getString(status))) { request.setAttribute(error, 房间已被预订请刷新后重试); request.getRequestDispatcher(pages/error.jsp).forward(request, response); return; }第二层数据库事务层校验最终保障conn.setAutoCommit(false); // 开启事务 try { // 1. 更新房间状态为booked String updateRoomSql UPDATE room_info SET status booked WHERE id ? AND status available; PreparedStatement updatePs conn.prepareStatement(updateRoomSql); updatePs.setInt(1, roomId); int rowsAffected updatePs.executeUpdate(); // 2. 如果rowsAffected 0说明WHERE条件不成立状态已变事务回滚 if (rowsAffected 0) { throw new SQLException(Concurrent booking conflict: room status changed); } // 3. 插入订单记录 String insertOrderSql INSERT INTO order_info (...) VALUES (...); PreparedStatement insertPs conn.prepareStatement(insertOrderSql); // ... 设置参数 insertPs.executeUpdate(); conn.commit(); // 提交事务 } catch (SQLException e) { conn.rollback(); // 回滚 request.setAttribute(error, 预订失败 e.getMessage()); }参数说明UPDATE ... WHERE id ? AND status available是乐观锁实现确保只有当房间状态仍是available时才更新否则executeUpdate()返回0行触发回滚conn.setAutoCommit(false)必须在获取Connection后立即调用若放在try块内异常时可能因未获取连接而无法回滚。3.3 订单状态机OrderStatus枚举与OrderService.updateStatus()的联动逻辑项目用OrderStatus.java枚举定义了订单全生命周期public enum OrderStatus { PENDING(0, 待支付), PAID(1, 已支付), CONFIRMED(2, 已确认), CANCELLED(-1, 已取消), COMPLETED(3, 已完成); private final int code; private final String desc; // 构造方法与getter省略 }OrderService.updateStatus()方法强制状态流转合规public boolean updateStatus(int orderId, OrderStatus newStatus) { // 状态迁移规则PENDING只能→PAID或CANCELLEDPAID只能→CONFIRMED或CANCELLED String sql UPDATE order_info SET status ? WHERE id ? AND status ?; PreparedStatement ps conn.prepareStatement(sql); ps.setInt(1, newStatus.getCode()); ps.setInt(2, orderId); ps.setInt(3, getPreviousStatus(newStatus).getCode()); // 从枚举里查允许的前序状态 return ps.executeUpdate() 0; }为什么这比if-else更可靠数据库WHERE status ?条件确保只有符合状态机规则的更新才生效避免代码bug导致PENDING直接跳到COMPLETEDgetPreviousStatus()方法在OrderStatus枚举中预置了转移矩阵如PAID.getPreviousStatus()返回PENDINGCONFIRMED.getPreviousStatus()返回PAID维护集中。4. 避坑指南五个血泪经验总结解决95%部署失败与功能异常4.1 现象首页加载后CSS样式全失效文字堆叠成一团原因/WebContent/css/路径下的style.css被正确引入但浏览器F12 Network标签页显示style.css返回404。排查检查index.jsp中link relstylesheet hrefcss/style.css的href路径。若index.jsp在/WebContent/根目录则css/style.css正确但若index.jsp在/WebContent/pages/下href应改为../css/style.css相对路径向上一级。解决统一用绝对路径link relstylesheet href${pageContext.request.contextPath}/css/style.css${pageContext.request.contextPath}动态获取应用上下文名如/hotel避免硬编码。4.2 现象登录成功后跳转到/hotel/pages/main.jsp但页面显示HTTP Status 404原因LoginServlet中response.sendRedirect(pages/main.jsp)写法错误。sendRedirect是客户端重定向路径相对于当前域名而非应用上下文。排查浏览器地址栏显示http://localhost:8080/pages/main.jsp缺少/hotel前缀。解决改为response.sendRedirect(request.getContextPath() /pages/main.jsp)request.getContextPath()返回/hotel拼接后为/hotel/pages/main.jsp。4.3 现象用户能正常预订但后台order_info表中user_id字段全为NULL原因User对象在登录后存入HttpSession但OrderServlet中未从session获取user.getId()而是用了request.getParameter(userId)前端未传该参数。排查在OrderServlet开头加日志System.out.println(Session user: session.getAttribute(user));发现输出null。解决登录成功后LoginServlet必须执行session.setAttribute(user, user)OrderServlet中通过User user (User) session.getAttribute(user)获取并校验user ! null。4.4 现象MySQL插入中文出现?乱码如酒店名显示为??大酒店原因JDBC URL未指定字符集或MySQL服务端配置缺失。排查检查DBUtil.java中getConnection()方法的URLjdbc:mysql://localhost:3306/hotel_db缺少?useUnicodetruecharacterEncodingutf8mb4。解决URL改为jdbc:mysql://localhost:3306/hotel_db?useUnicodetruecharacterEncodingutf8mb4serverTimezoneGMT%2B8并确认MySQL配置文件my.cnf中有[client] default-character-set utf8mb4 [mysqld] character-set-server utf8mb4 collation-server utf8mb4_unicode_ci4.5 现象并发压力测试时同一房间被两个用户同时预订成功超卖原因OrderServlet中房间状态更新未加数据库行锁或事务隔离级别过低。排查用两个浏览器窗口同时对同一房间点击预订观察room_info.status是否变为booked两次。解决在UPDATE room_info语句后添加FOR UPDATEMySQLUPDATE room_info SET status booked WHERE id ? AND status available FOR UPDATE;FOR UPDATE在事务提交前锁定该行第二个请求会阻塞等待直到第一个事务释放锁从而保证原子性。注意此操作要求事务必须显式commit()或rollback()否则锁长期持有。5. 进阶技巧用JUnit给OrderService写单元测试验证超卖防护逻辑5.1 为什么必须测OrderService而不是OrderServletOrderServlet耦合HTTP请求/响应/Session测试需Mock容器环境成本高而OrderService是纯Java类专注业务逻辑。它的createOrder()方法接收Room、User、Date等POJO返回OrderResult对象完全可脱离Web容器测试。这才是TDD测试驱动开发该切入的地方。5.2 编写OrderServiceTest模拟并发场景验证行锁效果在/src/test/java/com/hotel/service/下创建测试类// OrderServiceTest.java public class OrderServiceTest { private OrderService orderService; private Connection connection; Before public void setUp() throws Exception { // 使用H2内存数据库避免污染真实MySQL connection DriverManager.getConnection(jdbc:h2:mem:test;DB_CLOSE_DELAY-1, sa, ); // 初始化H2表结构从hotel_db.sql提取CREATE TABLE语句 ScriptRunner runner new ScriptRunner(connection); runner.runScript(new FileReader(src/test/resources/h2_schema.sql)); orderService new OrderService(connection); } Test public void testConcurrentBookingPrevention() throws Exception { // 准备插入一个available房间 PreparedStatement ps connection.prepareStatement( INSERT INTO room_info(id, type_id, status) VALUES (?, ?, ?)); ps.setInt(1, 1001); ps.setInt(2, 1); ps.setString(3, available); ps.executeUpdate(); // 模拟两个线程同时预订同一房间 CountDownLatch latch new CountDownLatch(2); AtomicInteger successCount new AtomicInteger(0); Runnable bookingTask () - { try { // 每个线程尝试创建订单 OrderResult result orderService.createOrder(1001, 1, new Date(System.currentTimeMillis()), new Date(System.currentTimeMillis() 86400000)); if (result.isSuccess()) { successCount.incrementAndGet(); } } finally { latch.countDown(); } }; new Thread(bookingTask).start(); new Thread(bookingTask).start(); latch.await(); // 等待两个线程结束 // 断言只有一个订单成功房间状态变为booked PreparedStatement checkPs connection.prepareStatement( SELECT status FROM room_info WHERE id ?); checkPs.setInt(1, 1001); ResultSet rs checkPs.executeQuery(); assertTrue(rs.next()); assertEquals(booked, rs.getString(status)); assertEquals(1, successCount.get()); // 确保仅一个成功 } }关键参数说明H2内存数据库jdbc:h2:mem:test创建临时库测试完自动销毁不依赖外部MySQLCountDownLatch精确控制两个线程并发执行比Thread.sleep()更可靠AtomicInteger successCount线程安全计数器统计成功预订次数assertEquals(1, successCount.get())断言超卖防护生效结果必须为1。5.3 如何让测试覆盖更多边界补充三个必测场景在同一个测试类中增加以下方法测试方法名验证目标关键断言testBookingWhenRoomBooked()房间状态为booked时预订失败assertFalse(result.isSuccess())且result.getErrorMessage().contains(not available)testBookingWithInvalidDates()入住日期晚于离店日期result.getErrorCode() ErrorCode.INVALID_DATE_RANGEtestUpdateStatusInvalidTransition()尝试PENDING直接到COMPLETEDassertFalse(orderService.updateStatus(1, OrderStatus.COMPLETED))我的习惯从那以后我每次拿到一个Java Web源码包第一件事不是跑起来而是找service包下的核心类用H2搭个最小测试环境把create/update/delete三个方法各写一个Test。只要这三个测试绿了我就知道业务主干没崩剩下的UI和配置问题都是小修小补。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

基于卷积神经网络的智慧校园系统设计与实现

基于卷积神经网络的智慧校园系统设计与实现

临近毕业季,很多计算机方向的同学都在纠结毕设选题。选算法方向怕数学门槛太高,选纯管理系统又显得没技术含量,答辩时容易被问倒。我手头正好做过一个“大数据深度学习”方向的课题,题目是《基于卷积神经网络的智慧校园的设计与实…

2026/10/19 14:57:27 阅读更多 →
Diagram设计不是画图,而是系统性建模工程

Diagram设计不是画图,而是系统性建模工程

1. 为什么“diagram-design”不是画图,而是一场系统性思维重构“diagram-design”这个词组乍看像一个工具操作指令——打开绘图软件、拖拽几个矩形、连几根箭头,导出PNG交差。但在我带过的十几个跨领域协作项目里,凡是把这四个字母当成“PPT美…

2026/10/19 14:57:27 阅读更多 →
K8s持久化存储实战:PV与PVC从原理到生产避坑指南

K8s持久化存储实战:PV与PVC从原理到生产避坑指南

1. 为什么PV和PVC是K8s里最容易被低估的一对组合刚接触K8s那会儿,我对PV和PVC的态度就是“能跑就行”。Pod里挂个emptyDir,重启数据就没了,当时觉得无所谓,反正都是无状态服务。直到有一次帮朋友处理一个自建的小型网盘服务&#…

2026/10/19 14:57:27 阅读更多 →

最新新闻

改进的功率摆动闭锁与解闭锁判据:Matlab实现与仿真验证

改进的功率摆动闭锁与解闭锁判据:Matlab实现与仿真验证

功率摆动闭锁(Power Swing Blocking, PSB)这个功能,在距离保护里属于典型的“平时没人提、一上事故就背锅”的角色。系统安稳运行时它几乎不动作,可一旦电网遭受扰动、发电机转子开始相对摆动,测量阻抗就会在复平面上“…

2026/10/19 15:52:33 阅读更多 →
Cocos Creator 微信小游戏开发:小鸟源码解析与发布避坑指南

Cocos Creator 微信小游戏开发:小鸟源码解析与发布避坑指南

简介:这是一份基于 Cocos Creator 开发的微信小游戏完整源代码,面向使用 Cocos Creator 进行微信小游戏开发与打包的开发者,尤其适合以“小鸟”类休闲游戏为切入点学习引擎构建与发布流程的读者。资源包共 592 个文件,压缩包大小约…

2026/10/19 15:52:33 阅读更多 →
libcurl HTTPS 编译配置全指南:OpenSSL/mbedTLS/wolfSSL 选型与静态链接

libcurl HTTPS 编译配置全指南:OpenSSL/mbedTLS/wolfSSL 选型与静态链接

简介:本资源为已编译完成的支持HTTPS协议的libcurl开发套件,面向C/C网络编程初学者与嵌入式、客户端开发工程师,解决在Windows平台快速集成安全HTTP/HTTPS通信能力的问题。压缩包共92个文件,包含86个OpenSSL与libcurl核心头文件&a…

2026/10/19 15:52:33 阅读更多 →
Spark 2.4.4+Hadoop 2.7.7单机伪分布式实战指南

Spark 2.4.4+Hadoop 2.7.7单机伪分布式实战指南

简介:本资源为燕山大学大数据分析课程英文实验报告,面向高校计算机、数据科学相关专业学生及Hadoop/Spark初学者,系统覆盖分布式环境搭建与机器学习算法实践两大核心能力训练。报告包含四大实验:Hadoop与Spark集群部署&#xff08…

2026/10/19 15:52:33 阅读更多 →
智能体路由实战:多模型调度降低成本与延迟的完整方案

智能体路由实战:多模型调度降低成本与延迟的完整方案

大模型应用跑起来之后,最先撞到的墙往往不是模型能力不够,而是"用一个模型包打天下"的成本和响应速度都让人肉疼。智能体路由这套机制,就是把不同难度、不同类型、不同成本诉求的请求,分配到最合适的模型或处理链路上。…

2026/10/19 15:52:33 阅读更多 →
纯NumPy手写CNN:从卷积反向传播到MNIST实战

纯NumPy手写CNN:从卷积反向传播到MNIST实战

简介:本资源是一份面向深度学习初学者与原理探究者的纯Python卷积神经网络(CNN)实现方案,不依赖TensorFlow、PyTorch等框架,聚焦底层计算逻辑与反向传播机制的理解。适合高校学生、转行学习者及希望夯实CNN数学基础的开…

2026/10/19 15:51:28 阅读更多 →

日新闻

频率跟踪型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 阅读更多 →