MySQL+Java仓库管理系统课设毕设实战:从跑通到二次开发
简介这是一套面向计算机、软件工程及相关专业学生的仓库管理系统完整项目源码采用Java语言开发后端数据存储基于MySQL数据库适合用作课程设计、期末大作业或毕业设计的参考方案。项目围绕仓库日常业务展开涵盖药品等物资的入库、出库、库存查询等核心管理功能代码结构清晰便于读者理解Java桌面应用与数据库交互的完整实现思路。压缩包共包含26个文件以java源码、xml配置、fxml界面布局、sql建库脚本及jar依赖为主另有html说明页面整体约960KB体积轻便易于本地部署调试。目前已有342人学习下载可作为动手实践与二次开发的起点。读者可从中获取完整的项目目录结构、数据库建表脚本、界面与逻辑分层代码并在此基础上自行调试、扩展功能是锻炼Java与MySQL综合应用能力的实用素材。1. 从一份课设压缩包说起MySQLJava 仓库管理系统到底能跑出什么很多人拿到「基于MySQLJava的仓库管理系统项目源码数据库课设毕设.zip」这类压缩包第一反应是解压、找 main 方法、点运行然后被一堆红字劝退。它本质上是一套典型 JavaWeb 三层架构的 CRUD 系统MySQL 存物料、库存、出入库流水Java 端用 Servlet 或 Spring Boot 暴露接口前端用 JSP 或模板引擎渲染页面。它解决的不是高并发仓储调度而是把「入库、出库、库存盘点、预警」这条业务链用代码串起来让你能演示、能答辩、能改。适合两类人一是课设毕设需要一份能跑通、能讲清逻辑的底稿二是刚学完 Java 基础、数据库增删改查想找一个完整项目练手的工程师。下面我按「先跑通、再拆解、后避坑」的顺序把这份源码从压缩包变成你手里能改的东西。2. 把压缩包跑起来环境、建库与第一次登录2.1 先确认 JDK、MySQL 与构建工具的版本匹配拿到源码别急着导入 IDE先看压缩包里的pom.xml或lib目录。常见课设项目分两种老式 ServletJSP 用WEB-INF/lib放 jar新式 Spring Boot 用 Maven 管理依赖。判断方法很简单根目录有pom.xml就是 Maven 项目没有就是传统 Web 项目。JDK 建议用 8 或 11MySQL 用 5.7 或 8.0 都行但驱动版本必须对上MySQL 8.0 用mysql-connector-java 8.0.x5.7 用5.1.x混用会报Unknown system variable query_cache_size这类玄学错误。我一般先执行java -version和mysql --version把版本记在便签上后面改配置直接对照。# 检查本机环境输出记下来 java -version javac -version mysql --version mvn -v这三条命令分别确认运行时、编译器、数据库和构建工具。如果mvn不存在传统项目可以跳过Maven 项目必须装。参数上唯一要注意的是JAVA_HOME必须指向 JDK 而不是 JRE否则编译时报No compiler is provided。2.2 导入数据库先建库再导 SQL别直接拖进客户端压缩包里通常有db.sql或warehouse.sql。正确顺序是先手动建一个空库再导入表结构和初始数据。直接拖 SQL 到客户端有时会因为编码问题把中文变成问号。建库时字符集用utf8mb4排序规则用utf8mb4_general_ci兼容性最好。-- 建库字符集必须显式指定 CREATE DATABASE warehouse_db DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_general_ci; -- 切库后导入 sql 文件 USE warehouse_db; SOURCE D:/project/db.sql;SOURCE命令在 MySQL 命令行里执行路径用正斜杠或双反斜杠。导入后执行SHOW TABLES;确认表数量常见有user、goods、stock、in_record、out_record五张左右。如果导入报Specified key was too long说明索引字段太长把VARCHAR(255)改成VARCHAR(191)即可这是 MySQL 5.7 的经典限制。2.3 改配置文件里的数据库连接四要素源码里找db.properties、application.yml或jdbc.properties核心就四项URL、用户名、密码、驱动类。URL 里最容易翻车的是时区和 SSL 参数。MySQL 8.0 必须加serverTimezoneAsia/Shanghai否则报时区错误useSSLfalse避免本地连接时的证书警告。# db.properties 示例按本机改 jdbc.drivercom.mysql.cj.jdbc.Driver jdbc.urljdbc:mysql://localhost:3306/warehouse_db?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/ShanghaiuseSSLfalse jdbc.usernameroot jdbc.password你的密码驱动类com.mysql.cj.jdbc.Driver对应 8.05.7 用com.mysql.jdbc.Driver。改完别急着启动先在 IDE 里跑一个main测试连接或者用mysql -uroot -p手动登一次确认账号密码没记错。很多「启动失败」其实是密码里带了特殊字符没转义。2.4 启动项目并完成第一次登录Maven 项目执行mvn clean package传统项目配置 Tomcat 后部署。启动日志里看到Started Application in x seconds或 Tomcat 的Server startup就算成功。浏览器访问http://localhost:8080/默认账号密码一般在user表里常见是admin/123456。登录失败先查三处数据库连没连上、密码是不是明文存储、拦截器有没有放行登录接口。第一次登录成功后立刻点一遍入库和出库看库存数字有没有联动变化这是验证业务闭环最快的方法。3. 拆开看骨架三层架构与核心表怎么对应3.1 实体类、Mapper、Service、Controller 的职责边界这套系统无论用 Servlet 还是 Spring Boot骨架都是四层。实体类Entity和数据库表一一对应字段名驼峰转下划线Mapper 层写 SQLMyBatis 用接口加 XMLMyBatis-Plus 可以少写很多Service 层放业务规则比如出库前校验库存够不够Controller 层接请求、返响应。课设项目最容易犯的错是把业务逻辑写进 Controller导致后面改一个规则要翻三个文件。我一般先看entity包有几个类再顺着一个业务比如入库从 Controller 追到 Mapper把调用链画在纸上后面改代码就不迷路。// 典型 Controller 片段只做参数接收和转发 PostMapping(/in/add) public Result addInRecord(RequestBody InRecord record) { // 业务校验交给 ServiceController 不写库存判断 return Result.success(inService.addRecord(record)); }这里Result是统一返回包装InRecord是实体。参数说明RequestBody接收 JSON如果前端用表单提交就换成RequestParam。逻辑说明Controller 只负责协议转换库存扣减、流水写入都在 Service 里这样单元测试好写答辩时也能讲清分层。3.2 库存表与流水表的设计为什么不能只存一个库存数仓库管理系统的核心矛盾是「当前库存」和「历史流水」要能对账。常见设计是goods表存物料基础信息stock表存每个物料的当前数量in_record和out_record存每一次变动。只存库存数会导致盘点时查不到差异原因只存流水又每次都要 SUM 计算性能差。所以两者都要有用事务保证同步。-- 库存表与流水表的关键字段 CREATE TABLE stock ( id INT PRIMARY KEY AUTO_INCREMENT, goods_id INT NOT NULL, quantity INT NOT NULL DEFAULT 0, update_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_goods (goods_id) ); CREATE TABLE in_record ( id INT PRIMARY KEY AUTO_INCREMENT, goods_id INT NOT NULL, quantity INT NOT NULL, operator VARCHAR(50), create_time DATETIME DEFAULT CURRENT_TIMESTAMP );stock表对goods_id建唯一索引保证一个物料一条库存记录。in_record不建外键也能跑但建议加索引idx_goods方便按物料查流水。参数上quantity用 INT 够用如果涉及小数重量再换 DECIMAL。逻辑说明入库时先插流水再UPDATE stock SET quantity quantity ?两步放在同一个Transactional里。3.3 用 MyBatis-Plus 根据实体类反推建表 SQL 的省力做法热词里提到「mybatisplus根据java实体类生成创建表的sql语句」这在课设里很实用。MyBatis-Plus 本身不直接生成 DDL但可以借助TableName、TableField注解配合代码生成器或者用 JPA 的ddl-auto思路手动映射。更稳的做法是写一个单元测试用TableInfoHelper拿到实体元数据拼出CREATE TABLE语句。// 读取实体元数据打印建表 SQL 的简化思路 TableInfo tableInfo TableInfoHelper.getTableInfo(Goods.class); String tableName tableInfo.getTableName(); tableInfo.getFieldList().forEach(f - { // 字段名、类型、是否主键都能拿到 System.out.println(f.getColumn() f.getPropertyType()); });这段代码依赖 MyBatis-Plus 的TableInfoHelper需要在实体被扫描后执行。参数说明getFieldList()返回所有映射字段getColumn()是下划线列名。逻辑说明拿到元数据后按数据库类型拼 SQLMySQL 用VARCHAR、INT、DATETIME。注意这只能生成基础结构索引和默认值还得手动补别指望一键完美。4. 增删改查之外库存联动与事务的落地细节4.1 入库、出库、盘点的 Service 层写法库存联动是这套系统的灵魂。入库加库存出库减库存盘点直接改库存并记一条调整流水。三个操作都要先查当前库存再判断是否允许。出库时如果库存不足要抛业务异常不能让它减成负数。Transactional(rollbackFor Exception.class) public void outStock(Integer goodsId, Integer quantity, String operator) { Stock stock stockMapper.selectByGoodsId(goodsId); if (stock null || stock.getQuantity() quantity) { throw new BizException(库存不足当前可用 (stock null ? 0 : stock.getQuantity())); } stock.setQuantity(stock.getQuantity() - quantity); stockMapper.updateById(stock); outRecordMapper.insert(new OutRecord(goodsId, quantity, operator)); }Transactional的rollbackFor Exception.class很关键默认只回滚运行时异常业务异常如果是受检异常就不会回滚。参数说明goodsId和quantity来自前端operator从登录会话里取。逻辑说明先校验再更新更新用updateById带乐观锁更好但课设项目直接更新也能过。出库流水和库存更新必须同事务否则会出现「扣了库存没流水」的对账黑洞。4.2 分页查询与模糊搜索的 SQL 写法物料列表页通常要分页加按名称搜索。MyBatis-Plus 用Page对象传统 MyBatis 用LIMIT。搜索条件用LIKE CONCAT(%, ?, %)别直接拼字符串防注入。!-- MyBatis XML 分页查询 -- select idselectPageByKeyword resultTypeGoods SELECT * FROM goods WHERE name LIKE CONCAT(%, #{keyword}, %) ORDER BY id DESC LIMIT #{offset}, #{pageSize} /selectoffset是(pageNum - 1) * pageSizepageSize一般 10 或 20。参数说明#{keyword}是预编译参数安全。逻辑说明先查总数再查列表前端分页组件需要total字段。如果数据量大LIKE %xx%走不了索引课设数据量小无所谓生产环境要换全文索引或搜索引擎。4.3 用事务和锁避免并发扣库存课设演示时单人操作没问题但答辩老师常问「两个人同时出库怎么办」。答案是加锁。悲观锁用SELECT ... FOR UPDATE乐观锁用版本号字段。MySQL 的 InnoDB 支持行锁但要注意锁的粒度。-- 悲观锁查出库存时锁住这一行 SELECT quantity FROM stock WHERE goods_id ? FOR UPDATE;这条语句必须在事务里执行否则锁立即释放。参数说明goods_id是唯一索引锁的是单行不会锁表。逻辑说明拿到锁后再判断库存、更新、插流水提交事务后锁释放。乐观锁则在stock表加version字段更新时WHERE version ?影响行数为 0 就重试。课设项目用悲观锁足够代码改动小。5. 避坑与排查那些让课设卡三天的常见问题5.1 启动报 404路径、注解扫描与 Tomcat 配置现象项目启动无报错浏览器访问所有接口都是 404。原因通常有三个Controller 不在启动类的扫描包下、web.xml里 Servlet 映射写错、Tomcat 的Application context配成了别的路径。解决先看启动类上的SpringBootApplication或ComponentScan范围确保 Controller 包在下面传统项目检查web.xml的url-patternTomcat 部署时把 context 设为/。我一般先在启动日志里搜Mapped看接口有没有注册上。5.2 中文乱码从数据库到页面的三层编码现象页面输入中文存进数据库变成???或者查出来是乱码。原因数据库字符集、连接 URL 字符集、页面编码三者不一致。解决数据库用utf8mb4URL 加useUnicodetruecharacterEncodingutf8JSP 页面顶部加% page contentTypetext/html;charsetUTF-8 %Spring Boot 在application.yml里配server.servlet.encoding.charsetUTF-8。三层都对齐后基本不会再乱。5.3 库存对不上事务没生效或流水漏写现象出库后库存减了但流水表没记录或者库存没减流水却多了一条。原因Transactional没生效同类内部调用、方法非 public、异常被 catch 没抛或者代码里先插流水后更新库存但中间抛异常没回滚。解决确认事务注解加在 public 方法上且由外部调用把库存更新和流水插入放在同一个方法异常统一往上抛别在 Service 里吞掉。对账时用SUM(in) - SUM(out)和stock.quantity比对差一条都要查。5.4 MySQL 8.0 连接失败驱动、时区与认证插件现象Communications link failure或Public Key Retrieval is not allowed。原因驱动版本旧、时区没配、MySQL 8.0 默认caching_sha2_password认证。解决换mysql-connector-java 8.0.xURL 加serverTimezoneAsia/ShanghaiuseSSLfalseallowPublicKeyRetrievaltrue。如果还不行把用户认证方式改成mysql_native_passwordALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 密码;。这是热词里「docker安装mysql失败」的常见根因之一。5.5 打包后运行报找不到主类Maven 插件配置现象mvn package成功java -jar报no main manifest attribute。原因spring-boot-maven-plugin没配或没执行repackage。解决在pom.xml的build里加插件执行mvn clean package spring-boot:repackage。传统 Web 项目打成 war 放 Tomcat不用java -jar。检查target目录下 jar 大小如果只有几 KB 说明没把依赖打进去。6. 让这份源码真正变成你的二次开发与答辩加分技巧跑通只是起点课设毕设要拿得出手得在源码上留下自己的东西。我一般从三个方向改加一个「库存预警」功能当stock.quantity低于goods.min_stock时在首页标红把出库流程改成「申请-审核-出库」三态用状态字段控制再加一个简单的 ECharts 报表按物料统计月度出入库总量。这三个改动都不大但答辩时能讲出业务价值。验证改动是否正确的习惯是每次改完先跑单元测试没有测试就手动走一遍完整流程从登录到入库到出库到查询看库存数字和流水条数是否一致。数据库改动前先mysqldump备份后悔药永远不嫌多。# 改表结构前备份一条命令的事 mysqldump -uroot -p warehouse_db backup_$(date %Y%m%d).sql这条命令把整个库导出成 SQL 文件文件名带日期。参数说明-u用户名-p回车后输密码warehouse_db是库名。逻辑说明备份后再执行ALTER TABLE或UPDATE出问题直接SOURCE回去。我吃过没备份的亏改错一个字段类型半天数据白录。最后一个技巧是给项目加一个README.md把环境要求、建库步骤、默认账号、启动命令写清楚。别小看这个文件答辩老师翻源码第一眼就看它写得好能省很多解释。把db.sql和配置文件里的密码改成占位符别把自己的真实密码提交上去。这套 MySQLJava 仓库管理系统的骨架不复杂难的是把每个环节的边界摸清楚知道哪里会翻车、怎么修。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

别折腾 OpenClaw/Hermes 了!XLIAgent 双击就用,免费 AI 数字员工 Agent 发布测试版,快来体验属于你的 AI PC

别折腾 OpenClaw/Hermes 了!XLIAgent 双击就用,免费 AI 数字员工 Agent 发布测试版,快来体验属于你的 AI PC

/* 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 21:09:27 阅读更多 →
P4开发环境搭建:bmv2+p4c+protobuf 3.2.0经典组合实战指南

P4开发环境搭建:bmv2+p4c+protobuf 3.2.0经典组合实战指南

简介:这份资源是面向SDN与可编程数据平面学习者的P4开发环境离线安装包,针对P4初学者及需要搭建实验平台的网络研究人员,解决bmv2、p4c等组件版本匹配繁琐、依赖编译易出错的问题。压缩包为gz格式,整体约147.8MB,内含b…

2026/10/10 18:21:15 阅读更多 →
Github 21.2k Star!给 AI Agent 装上互联网能力的开源脚手架 TaoToken 实践

Github 21.2k Star!给 AI Agent 装上互联网能力的开源脚手架 TaoToken 实践

/* 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 11:56:56 阅读更多 →

最新新闻

鸽哒IM源码:生产级私有化即时通讯系统解析

鸽哒IM源码:生产级私有化即时通讯系统解析

简介:这是一套完整的跨平台即时通讯(IM)系统源码,面向中高级Java/Android/iOS开发者及全栈工程师,用于学习和搭建企业级实时通信服务。资源涵盖Web(WebSocketHTML5)、Android(JavaFC…

2026/10/13 21:08:58 阅读更多 →
Python+React低代码平台:元数据驱动的业务系统快速构建方案

Python+React低代码平台:元数据驱动的业务系统快速构建方案

简介:这是一套面向全栈开发初学者与低代码实践者的前后端一体化低代码平台学习资源,聚焦React前端框架与Python后端框架的协同开发模式,帮助非专业开发者快速构建可运行的Web应用,降低传统编码门槛。资源共229个文件,涵…

2026/10/13 21:08:58 阅读更多 →
2020数学建模B题沙漠穿越:Matlab动态规划与剪枝实战解析

2020数学建模B题沙漠穿越:Matlab动态规划与剪枝实战解析

简介:面向备战2020年数学建模B题的参赛者,完整Matlab源代码覆盖四关求解流程,从第一关基础路径规划到第四关随机天气下的最优策略,涉及距离矩阵处理、单目标优化、动态规划、数学期望与随机分布建模等方法。第二关重点解决双地图与…

2026/10/13 21:08:58 阅读更多 →
CEF4Delphi 控件:Delphi 与 JavaScript 双向通信及避坑指南

CEF4Delphi 控件:Delphi 与 JavaScript 双向通信及避坑指南

简介:CEF4Delphi控件是一套面向Delphi开发者的Chromium谷歌内核浏览器集成方案,适合需要在桌面程序中嵌入现代网页渲染能力的开发者,覆盖从Delphi 7到Delphi 10.2的多个版本,作者已亲自测试调试安装正常。资源包共462个文件&#…

2026/10/13 21:08:58 阅读更多 →
数据库大作业图书销售系统:核心是约束设计而不是页面数量

数据库大作业图书销售系统:核心是约束设计而不是页面数量

简介:面向数据库课程大作业的图书销售管理系统数据库设计文档,完整覆盖从问题描述、需求分析、概念模型设计、逻辑模型设计到建立数据库、录入数据及数据库操作的全过程,并配有全局与局部ER图、表结构、外键关系说明,以及实施中遇…

2026/10/13 21:08:58 阅读更多 →
Java 8 Stream 实战指南:从传统循环到声明式流水线

Java 8 Stream 实战指南:从传统循环到声明式流水线

如果你写过几年 Java 业务代码,大概率见过这类场景:一个方法里塞了三四个 for 循环,循环里面套 if,if 里面再往 List 或 Map 里 put 数据,看完要花好几分钟才理清楚这段逻辑到底在干嘛。这种代码不能说错,但…

2026/10/13 21:07:57 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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 阅读更多 →