JavaEE仓库管理系统源码实战:MyBatis与Oracle整合及答辩避坑指南
简介这份资源面向计算机相关专业学生与JavaEE初学者提供一套基于WEB的仓库管理系统完整设计与实现方案采用B/S架构后端以JavaEE结合MyBatis与Oracle数据库完成业务逻辑与数据存储覆盖入库、出库、商品查看、用户注册及个人信息管理等核心模块适合作为毕业设计参考或课程项目练手。资源包共12个文件包含png项目截图、txt说明文档、mp4项目辅导视频、pptx答辩演示、doc与docx论文及任务书、sql数据库脚本以及zip源码压缩包整体约60.02MB从部署建库到模块演示均有对应材料。已有54人学习下载。读者可借助源码、数据库脚本与论文文档快速搭建运行环境通过两段辅导视频理解数据库创建、项目启动及入库出库等模块的实现思路并参考答辩PPT与任务书梳理设计流程与文档结构减少从零摸索的成本。1. 从一份 JavaEE 仓库管理系统源码包说起它到底能跑通什么如果你正在做课程设计或者毕业设计大概率会遇到这种局面选题定了“基于 WEB 的仓库管理系统”但手上只有一份需求描述不知道从哪下手。这份资源包就是冲着这个场景来的——它包含完整的 JavaEE 源码、Oracle 数据库脚本、论文文档、答辩 PPT、任务书还有一套分模块的辅导视频。技术栈是 MyBatis Oracle JavaEEB/S 架构浏览器直接访问服务端处理业务逻辑和库存数据。它适合两类人一类是需要快速搭出一个能演示、能答辩的完整系统的同学另一类是想拿一个真实项目练手 MyBatis 映射和 Oracle 建表的后端新手。不适合想学微服务、分布式或者前端框架的人这套代码走的是经典 SSM 路线前端偏传统 JSP/HTML 风格。下面我从环境搭建、数据库还原、核心模块代码、常见报错几个角度把这份资源拆开讲清楚。2. 环境搭建与数据库还原从解压到登录页出现2.1 先确认你的 JDK、Tomcat 和 Oracle 版本拿到源码包之后别急着导入 IDE。第一步是确认本机环境能不能撑住这套技术栈。JavaEE 项目对 JDK 版本敏感Oracle 驱动对数据库版本也挑剔。我一般会先跑一遍版本检查避免后面出现“编译通过但启动报 ClassNotFound”的玄学问题。# 检查 JDK 版本建议 1.8Java 8 java -version # 检查 Tomcat 版本建议 8.5 或 9.0 # 进入 Tomcat 目录后执行 catalina version # 检查 Oracle 服务是否启动Windows 服务名通常含 OracleService # Linux 下可以用 lsnrctl status逻辑说明JDK 1.8 是大多数 JavaEE 老项目的安全选择高版本 JDK 可能因为模块化机制导致反射失败。Tomcat 8.5/9.0 对 Servlet 3.1 支持稳定再高版本有时会在 JSP 编译阶段报错。Oracle 的监听器状态决定了 JDBC 能不能连上如果lsnrctl status显示未启动后面所有数据库操作都会卡在连接池初始化。参数说明如果你本机装的是 Oracle 11g 或 12c驱动用ojdbc6.jar或ojdbc8.jar都行但要注意ojdbc6对应 JDK 1.6ojdbc8对应 JDK 1.8。源码包里一般会自带驱动但版本可能偏旧遇到ORA-28040: No matching authentication protocol时换一个匹配数据库版本的驱动就能解决。2.2 还原 biyesheji.sql建表、序列和初始数据数据库脚本是这份资源的核心资产之一。biyesheji.sql里通常包含建表语句、主键序列、索引和几条初始数据。Oracle 和 MySQL 不一样它没有AUTO_INCREMENT主键自增要靠序列加触发器或者代码里手动调序列。还原的时候别直接复制粘贴到客户端里跑先看一眼脚本里有没有DROP TABLE语句避免误删已有数据。-- 以 sqlplus 为例先创建用户如果用系统用户可跳过 -- 假设用 system 用户登录后创建独立表空间和用户 CREATE USER warehouse IDENTIFIED BY warehouse123; GRANT CONNECT, RESOURCE TO warehouse; -- 然后切换到 warehouse 用户执行脚本 -- 在 sqlplus 中执行 /path/to/biyesheji.sql逻辑说明CREATE USER和GRANT是为了让业务数据独立管理避免和系统表混在一起。符号在 sqlplus 里表示执行外部脚本文件路径要写绝对路径或者当前目录下的相对路径。如果脚本里有中文注释导致乱码执行前先设置NLS_LANG环境变量比如AMERICAN_AMERICA.AL32UTF8。参数说明表空间名称和用户名可以按自己习惯改但改完之后要同步修改源码里jdbc.properties或db.properties中的连接串。初始数据里通常有一个管理员账号常见的是admin/123456或者system/123456具体看说明.txt里的备注。如果登录页一直提示密码错误先去数据库里SELECT * FROM 用户表看一眼实际存的是什么。2.3 导入项目并修改数据库连接配置源码包biyesheji.zip解压后一般是一个 Eclipse 或 IDEA 工程目录。导入之后第一件事不是点运行而是找到数据库配置文件。MyBatis 项目通常把连接信息放在jdbc.properties、db.properties或者mybatis-config.xml里。# jdbc.properties 示例 jdbc.driveroracle.jdbc.driver.OracleDriver jdbc.urljdbc:oracle:thin:localhost:1521:orcl jdbc.usernamewarehouse jdbc.passwordwarehouse123逻辑说明jdbc.url里的orcl是 Oracle 的 SID如果你装的是可插拔数据库PDB这里要换成服务名格式变成jdbc:oracle:thin:localhost:1521/服务名。jdbc.username和jdbc.password必须和 2.2 步创建的用户一致。改完配置后在 IDE 里刷新 Maven 依赖如果有 pom.xml然后部署到 Tomcat。参数说明连接池参数一般不用动但如果你本机内存紧张可以把maxActive从 20 调到 10。validationQuery通常设为SELECT 1 FROM DUAL这是 Oracle 的写法别抄 MySQL 的SELECT 1。部署路径建议用/warehouse这种短名访问时直接http://localhost:8080/warehouse就行。3. 入库、出库与商品查看MyBatis 映射和业务逻辑怎么读3.1 入库模块从表单提交到库存表更新入库模块是仓库管理系统的入口业务。用户在页面上填写商品编号、数量、供应商、入库时间提交后后端要做三件事写一条入库记录、更新商品库存数量、可能还要更新库存流水。这套代码用 MyBatis 做持久层SQL 写在 XML 映射文件里和 Java 接口分离。!-- StockInMapper.xml 片段 -- insert idinsertStockIn parameterTypeStockIn INSERT INTO stock_in (in_id, goods_id, quantity, supplier, in_time, operator) VALUES (seq_stock_in.NEXTVAL, #{goodsId}, #{quantity}, #{supplier}, #{inTime}, #{operator}) /insert update idupdateGoodsStock UPDATE goods SET stock stock #{quantity} WHERE goods_id #{goodsId} /update逻辑说明seq_stock_in.NEXTVAL是 Oracle 序列取下一个值保证主键唯一。#{goodsId}是 MyBatis 的占位符会预编译成?防止 SQL 注入。入库和更新库存是两条 SQL通常放在同一个 Service 方法里用 Spring 的Transactional注解保证事务一致性。如果入库成功但库存没变先检查 Service 层有没有加事务注解再看 MyBatis 的SqlSession有没有自动提交。参数说明parameterType写的是实体类全限定名或别名别名一般在mybatis-config.xml里配置。in_time字段如果是DATE类型Java 侧用java.util.Date或java.sql.Timestamp都行但要注意时区问题。operator一般从 Session 里取当前登录用户别从前端传否则容易被篡改。3.2 出库模块库存扣减与负库存校验出库比入库多一层风险库存不够怎么办。这套代码里通常会在 Service 层先查当前库存再判断是否大于等于出库数量最后才执行扣减。如果直接UPDATE goods SET stock stock - #{quantity}而不校验库存会变成负数后面盘点就对不上了。// StockOutService.java 片段 Transactional public void stockOut(StockOut stockOut) { Goods goods goodsMapper.selectById(stockOut.getGoodsId()); if (goods.getStock() stockOut.getQuantity()) { throw new RuntimeException(库存不足当前库存 goods.getStock()); } stockOutMapper.insertStockOut(stockOut); goodsMapper.reduceStock(stockOut.getGoodsId(), stockOut.getQuantity()); }逻辑说明先查后判再更新这是防负库存的标准做法。Transactional保证两条写操作要么都成功要么都回滚。如果并发量高这种“查-判-写”会有竞态条件常见做法是在UPDATE语句里加AND stock #{quantity}然后根据返回的影响行数判断是否成功。这套代码是课程设计级别并发场景不多但知道这个边界对答辩有好处。参数说明RuntimeException抛出后Spring 默认会回滚事务但如果是受检异常Exception就不会自动回滚需要加rollbackFor Exception.class。reduceStock的 SQL 里建议写成UPDATE goods SET stock stock - #{quantity} WHERE goods_id #{goodsId} AND stock #{quantity}这样即使并发也能保证不出现负库存。3.3 商品查看模块分页查询与条件筛选商品查看模块看起来简单但涉及分页和条件筛选时MyBatis 的写法就有讲究了。Oracle 分页不能用LIMIT要用ROWNUM嵌套子查询。这套代码里一般会封装一个PageHelper或者手写分页 SQL。!-- GoodsMapper.xml 分页查询片段 -- select idselectByPage resultTypeGoods SELECT * FROM ( SELECT g.*, ROWNUM rn FROM ( SELECT * FROM goods where if testgoodsName ! null and goodsName ! AND goods_name LIKE % || #{goodsName} || % /if if testcategoryId ! null AND category_id #{categoryId} /if /where ORDER BY goods_id ) g WHERE ROWNUM lt; #{endRow} ) WHERE rn gt; #{startRow} /select逻辑说明Oracle 分页三层嵌套是经典写法。最内层做条件筛选和排序中间层用ROWNUM截断结束行最外层用rn startRow截断起始行。lt;和gt;是 XML 转义直接写和会导致解析错误。where标签会自动处理第一个AND不用手写WHERE 11。参数说明startRow和endRow由 Java 侧计算比如第 2 页每页 10 条startRow 10endRow 20。LIKE % || #{goodsName} || %是 Oracle 的字符串拼接写法MySQL 用CONCAT。如果查询结果为空但数据库里有数据先检查ROWNUM的边界条件是不是写反了。4. 避坑与排查这套源码跑不起来时先看这几条4.1 启动报 ORA-12505 或 ORA-28040现象Tomcat 启动时控制台刷ORA-12505: TNS:listener does not currently know of SID given in connect descriptor或者ORA-28040: No matching authentication protocol。原因ORA-12505是连接串里的 SID 写错了或者 Oracle 监听器没识别到该 SID。ORA-28040是 JDBC 驱动版本和数据库版本不匹配常见于用旧驱动连新数据库。解决先用lsnrctl status确认监听器里注册的 SID 是什么把jdbc.url里的orcl改成实际 SID。如果是 PDB改用服务名格式jdbc:oracle:thin:localhost:1521/服务名。驱动问题就去 Oracle 官网下对应 JDK 版本的ojdbc8.jar替换WEB-INF/lib下的旧驱动。4.2 登录页能打开但提交后 404现象访问http://localhost:8080/warehouse能看到登录页输入账号密码点登录后浏览器报 404。原因表单的action路径和 Controller 的RequestMapping不匹配或者项目部署路径和表单里的相对路径对不上。解决打开浏览器开发者工具看 Network 里登录请求的实际 URL 是什么。然后去 Controller 里核对RequestMapping的值。常见情况是表单写/loginController 写/user/login或者项目部署路径是/warehouse但表单用了绝对路径/login。改成相对路径或者统一加项目名。4.3 中文乱码从数据库到页面全链路排查现象商品名称在数据库里查出来是正常的但页面上显示问号或者方块。原因字符集不统一。Oracle 数据库字符集、JDBC 连接串、Tomcat 的URIEncoding、JSP 页面的pageEncoding任何一环不一致都会乱码。解决先确认数据库字符集SELECT * FROM nls_database_parameters WHERE parameter NLS_CHARACTERSET常见的是AL32UTF8或ZHS16GBK。然后检查jdbc.url有没有加useUnicodetruecharacterEncodingUTF-8。Tomcat 的server.xml里 Connector 加URIEncodingUTF-8。JSP 页面头部加% page contentTypetext/html;charsetUTF-8 pageEncodingUTF-8 %。四处都对齐之后重启 Tomcat。4.4 MyBatis 报 Invalid bound statement现象启动不报错但调用某个 Mapper 方法时抛org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)。原因MyBatis 的 XML 映射文件没有被扫描到或者 XML 里的namespace和 Java 接口全限定名不一致或者方法名对不上。解决先检查mybatis-config.xml里的mapper配置或 Spring 配置里的mapperLocations有没有覆盖到 XML 文件所在目录。然后核对 XML 的namespace是不是接口的全限定名select的id是不是方法名。如果用的是 Maven确认src/main/java下的 XML 有没有被编译到target/classes需要在pom.xml里配resources包含**/*.xml。4.5 视频和文档对不上代码版本现象跟着辅导视频操作但视频里的类名、方法名和源码包里的不一致。原因资源包里的视频可能是早期版本录制的源码后来改过但视频没重录。解决以源码为准视频只用来理解业务流程和部署思路。遇到对不上的地方先在 IDE 里全局搜索视频里提到的关键词找到实际对应的类和方法。论文和任务书里的功能描述通常比代码更稳定可以拿来对照功能清单确保答辩时说的功能代码里都有。5. 从能跑到能讲答辩前把这三个验证点走一遍这套资源包最大的价值不是代码本身而是它附带了一套完整的“交付物”源码、数据库、论文、PPT、任务书、视频。很多人跑通登录页就停了但答辩的时候老师不会只看你能不能登录他会问库存扣减怎么防负数、分页 SQL 为什么这么写、事务边界在哪里。所以最后一章我建议你花两个小时做三个验证。第一个验证手动造一次库存不足的出库操作。去数据库里把某个商品的stock改成 5然后在页面上尝试出库 10 个。观察系统是抛异常、弹提示还是直接扣成负数。如果直接扣成负数说明 Service 层没有校验答辩时被问到就是硬伤。你可以顺着StockOutService的调用链往上找看 Controller 有没有做前置判断或者 Mapper 的UPDATE有没有加stock #{quantity}条件。第二个验证翻一遍biyesheji.sql里的索引和约束。课程设计的数据库脚本通常只建主键不建外键和索引。但仓库管理系统里goods_id、in_time、out_time这些字段查询频率很高没有索引的话数据量一大就慢。你可以用EXPLAIN PLAN FOR看一下分页查询的执行计划如果出现TABLE ACCESS FULL就在goods_name或category_id上加个索引。答辩时如果能说出“我在商品名称上加了索引因为模糊查询走不了索引但分类筛选可以”老师会觉得你确实想过。第三个验证把论文里的功能模块和代码里的 Controller 一一对应。论文里写了“用户注册模块”“个人信息管理模块”代码里就要能找到对应的RegisterController、UserController。如果论文写了但代码没有要么补一个空壳要么在答辩时主动说明“这部分在后续版本规划中”。别等老师翻到那一页再解释。-- 验证库存扣减是否防负数 SELECT goods_id, goods_name, stock FROM goods WHERE goods_id 1001; -- 手动改成 5 UPDATE goods SET stock 5 WHERE goods_id 1001; -- 然后在页面上尝试出库 10 个观察结果 -- 如果 stock 变成 -5说明没有校验逻辑说明这个验证的目的是暴露业务逻辑的薄弱点。课程设计级别的代码往往只关注“能跑”不关注“跑得对”。但答辩时老师恰恰会挑这些边界问。提前发现并补上比被问住强。参数说明goods_id换成你数据库里实际存在的商品编号。测试完记得把库存改回去或者重新执行一遍biyesheji.sql还原初始数据。从那以后我每次拿到这种“源码论文视频”的打包资源都会先跑一遍边界测试再对着论文目录翻代码。因为视频会骗人论文会美化只有数据库里的约束和代码里的if判断不会撒谎。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

泰迪杯B题跨模态图文互检:共享特征空间与对比学习实战

泰迪杯B题跨模态图文互检:共享特征空间与对比学习实战

/* 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 6:26:54 阅读更多 →
让AI模型自己管理聊天记录,会发生什么

让AI模型自己管理聊天记录,会发生什么

你有没有遇到过这种情况:跟一个AI助手聊了很久很久,聊到后来它突然开始前言不搭后语,甚至把你三十句话之前说的重要信息忘得一干二净?这不是AI在犯傻。这是一个结构性的问题,而且这个问题的根源,可能比你想…

2026/10/10 6:26:54 阅读更多 →
Java+JSP+MySQL构建稳定校园宿舍管理系统

Java+JSP+MySQL构建稳定校园宿舍管理系统

简介:这是一套基于Java Web技术栈开发的学生宿舍管理系统实战项目,面向Java初学者、Web开发入门者及高校课程设计学生,解决传统宿舍管理中信息分散、操作低效、人工易错等实际问题。资源采用B/S架构,整合JSP动态页面、Java Servle…

2026/10/10 6:25:54 阅读更多 →

最新新闻

从环境到上线:Vue项目实战与踩坑全指南

从环境到上线:Vue项目实战与踩坑全指南

干 Vue 这些年,见得最多的就是新手把环境配到一半就卡住,然后跑来问“为什么我 npm run dev 直接报错”“为什么 devtools 不显示”。其实 Vue 本身不难,难的是把生态里的一堆配套工具摸清楚,再踩过几个经典的坑。这篇文章我就按实…

2026/10/11 8:52:41 阅读更多 →
弹性扩容实战:流量洪峰下如何弹性伸缩与避坑

弹性扩容实战:流量洪峰下如何弹性伸缩与避坑

“老板,客户那边流量爆了,凌晨三点服务器扛不住,赶紧想想办法!”做云渠道这些年,这种电话我接过不止一次。所谓“业务流量洪峰”从来不是某个固定时刻准时到来,它可能来自一次大促、一场直播、一个热点事件…

2026/10/11 8:52:41 阅读更多 →
天地图403排查实战:Vue3部署与Nginx反代避坑指南

天地图403排查实战:Vue3部署与Nginx反代避坑指南

上周把vue3项目部署到线上服务器,第二天同事就找过来:“地图白屏了,控制台一片403。”我看了一眼浏览器Network面板,天地图的瓦片请求齐刷刷返回403 Forbidden。这个场景我太熟了,本地开发时地图还好好的,一…

2026/10/11 8:52:41 阅读更多 →
OpenClaw开源重制引擎:让经典老游戏在现代系统上重生

OpenClaw开源重制引擎:让经典老游戏在现代系统上重生

作为一个从小在街机厅和奔腾MMX电脑前泡大的老玩家,我太清楚那些经典老游戏如今有多难伺候了。系统不兼容、分辨率撕裂、画面抖得像中风,更别提把手里的手柄映射到一堆莫名其妙DirectDraw错误上。今天要聊的OpenClaw(圈子里的朋友们喜欢叫它“…

2026/10/11 8:52:41 阅读更多 →
Unity C#进阶:从缓存、对象池到事件驱动的性能优化实战

Unity C#进阶:从缓存、对象池到事件驱动的性能优化实战

在 Unity 项目里,“代码能跑”和“代码能撑住项目”是两回事。很多人写了一阵子 C# 脚本,功能都做出来了,但项目一到真机就发热、掉帧,或者场景稍微复杂一点就卡顿。这时候回头看代码,往往能找到一堆Update里反复GetCo…

2026/10/11 8:52:41 阅读更多 →
2026年实时数据同步工具怎么选?GoldenGate、Striim、SeaTunnel、FineDataLink 5.0横评

2026年实时数据同步工具怎么选?GoldenGate、Striim、SeaTunnel、FineDataLink 5.0横评

实时数据同步,是这两年企业数据建设里绕不开的一环。业务对实时性的要求越来越高——库存要实时、订单要实时、设备状态要实时,T1 的离线数仓在很多场景下已经不够用了。于是选型的问题摆在了面前:GoldenGate、Striim、SeaTunnel、FineDataLi…

2026/10/11 8:51:41 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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/10 5:23: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/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/10 10:38:42 阅读更多 →