【Python自动化】安全库存阈值不同?库管/小白1个脚本预警
为什么你需要这个脚本管多品类库存有多痛苦在仓库、仓库管理系统中管理货品时出现令库管烦恼的问题是把所有货品的安全库存阈值即剩下多少件就预警且提示该补货/进货设为统一标准导致销量快的货总是缺货、销量慢的货总是积压这样既降低了仓库空间流转、又出现资金的配置严重失衡。因为每个货品的销量不同安全库存阈值就不同。这个脚本能帮你做什么这怎么办呢没事有Python多货品安全库存预警系统解决。库管输入每个货品的商品名、商品当前库存、商品安全库存阈值就能自动提示该货品是否进货/补货了。Python多货品安全库存预警系统能解决因为库管把所有货品安全库存阈值设置为统一的值导致的上述的后果。对于Python小白来说Python多货品安全库存预警系统运用Python函数的默认参数的语法知识可以通过它来达到熟练掌握、灵活运用Python函数的默认参数的目的。多货品安全库存预警脚本源码运行结果运行Python多货品安全库存预警系统时通过输入商品名、商品当前库存、商品安全库存阈值给出是否需要补货/进货的预警。我在雪糕仓库工作有一定的相关工作经验。我通过运行Python多货品安全库存预警系统给雪糕做库存预警。更新多货品安全库存预警表.xlsx在下面几幅图中在多货品安全库存预警表.xlsx在的情况下会更新该.xlsx表里面增加新输入的商品信息、更新改动的商品信息没有改动的商品信息不变。同时展示输入商品名、商品当前库存、商品安全库存阈值的校验功能。下面两幅图是运行前的图片多商品安全库存预警表.xlsx在了。运行前多货品安全库存预警表.xlsx的内容如下图所示。下面几幅图是在运行的图片。运行时更新的多货品安全库存预警表.xlsx的内容如下图所示。创建多货品安全库存预警表.xlsx以下几幅图中在没有多货品安全库存预警表.xlsx的情况下运行python多货品安全库存预警系统时会新创建一个多商品安全库存预警表.xlsx。如下一幅图这是在运行之前。没有多商品安全库存预警表.xlsx。下面几幅图是在运行的图片。在运行之后已经创建了多货品安全库存预警表.xlsx。创建好的多货品安全库存预警表.xlsx的内容如下图所示。退出python多货品安全库存预警系统如下几幅图展示的是python多货品安全库存预警系统的退出功能。代码详解Python多货品安全库存预警脚本的完整源码如下。如果你们看不懂代码那么没事代码里带注释。该脚本的代码的注释中主要讲解了商品名称、商品当前库存、商品安全库存阈值的输入及其校验比较商品当前库存和安全库存并给出是否需要补货/进货的预警把结果保存在excel表中还重点介绍了在哪里以及如何运用Python函数的默认参数的语法知识。如果你不懂Python函数的默认参数的语法知识请阅读下面一篇文章。Python函数默认参数错PyCharm中新手1招根治这些能保证库管和Python新手能看懂。importopenpyxlfromopenpyxl.stylesimportFont,PatternFill,Alignmentimportos# # 全局配置Excel文件名# EXCEL_FILE多商品安全库存预警表.xlsx# # 功能一库存预警判断# ## 【Python 默认参数 知识点】## 写法def 函数名(参数1, 参数2, 参数3默认值):## 规则# · 参数1、参数2 是必填参数调用时必须给值不给就报错# · 参数3默认值 是默认参数调用时可给可不给# - 给了 → 用你给的值# - 没给 → 自动用等号后面的默认值## 本例warn_threshold15# · 大多数商品安全库存都是15不用每次写# · 少数特殊商品比如贵重品可以自定义如传20## 三种合法调用方式# stock_warning(8, 苹果) → 用默认值15# stock_warning(8, 苹果, 20) → 用自定义值20# stock_warning(8, 苹果, warn_threshold25) → 带名字传更清晰# defstock_warning(stock_num,sku,warn_threshold15):判断库存是否需要补货返回是或否ifstock_numwarn_threshold:# 当前库存 安全阈值print(f{sku}库存{stock_num}低于阈值{warn_threshold}该补货了)return是# 返回是表示需要补货else:print(f{sku}库存{stock_num}正常无需补货。)return否# 返回否表示不需要补货# # 功能二获取用户输入带校验# ## 【又是默认参数】must_be_intFalse## 作用一个函数干两件事靠默认参数区分# · 输入商品名时 → get_input(提示文字)# 只校验非空因为商品名可以是汉字、字母# · 输入库存数量时 → get_input(提示文字, must_be_intTrue)# 额外校验必须是整数库存不能是小数或文字## 返回值# · 正常输入 → 返回输入的内容# · 输入 q 或 Q → 返回 None表示用户想退出# defget_input(prompt,must_be_intFalse):获取用户输入校验后返回。输入q/Q返回None表示退出whileTrue:# 无限循环直到输入合法才跳出textinput(prompt).strip()# input()接收键盘输入strip()去掉首尾空格iftext.lower()q:# .lower()把大写Q转成小写q统一判断returnNone# 返回None外层收到None就知道要退出iftext:# 输入全是空格或直接回车print(输入不能为空请重新输入。)continue# 跳过本次循环重新要求输入ifmust_be_int:# 如果调用时传了 must_be_intTruetry:returnint(text)# 尝试把字符串转成整数成功就返回exceptValueError:# 转失败如输入了abc会抛异常被except捕获print(输入错误请输入整数)continue# 重新要求输入returntext# 不需要校验整数直接返回# # 功能三保存到Excel核心中的核心# ## 核心逻辑一句话有则更新无则新增不动别人## 分两种情况# 1. 文件不存在 → 创建新文件画表头写第一条数据# 2. 文件已存在 → 打开文件找这个商品# · 找到了 → 更新那一行的数据其他商品不动# · 没找到 → 在表格最下面新增一行## 参数说明# sku: 商品名称# stock_num: 当前库存数量# warn_threshold: 安全库存阈值# need_replenish: 是或否来自 stock_warning() 的返回值# defsave_to_excel(sku,stock_num,warn_threshold,need_replenish):把商品库存信息写入Excel有则更新无则新增# 表头文字Excel第一行要显示这些列名headers[商品名称,当前库存,安全库存阈值,是否需要补货/进货]# ---------- 情况1Excel文件已存在 ----------ifos.path.exists(EXCEL_FILE):# os.path.exists() 检查文件是否存在wbopenpyxl.load_workbook(EXCEL_FILE)# 加载已有的Excel文件wswb.active# .active 获取当前正在使用的工作表SheetfoundFalse# 标记是否找到这个商品先假设没找到# 遍历已有数据从第2行开始第1行是表头不用看# ws.max_row 是Excel最后一行的行号forrowinrange(2,ws.max_row1):# ws.cell(row行号, column1) 取第1列商品名称列的单元格# .value 取单元格里的文字ifws.cell(rowrow,column1).valuesku:# 找到同名商品更新这一行4个单元格的数据# enumerate([数据列表], 1) 产生 (列号, 值) 的配对从第1列开始forcol,valinenumerate([sku,stock_num,warn_threshold,need_replenish],1):cellws.cell(rowrow,columncol,valueval)# 写入数据cell.alignmentAlignment(horizontalcenter,verticalcenter)# 水平垂直居中foundTrue# 标记为已找到print(f已更新{sku}的库存信息。)break# 找到了就跳出循环后面不用再找了# 循环结束如果 found 还是 False说明遍历完所有行都没找到这个商品ifnotfound:new_rowws.max_row1# 最后一行的下一行就是新增的位置forcol,valinenumerate([sku,stock_num,warn_threshold,need_replenish],1):cellws.cell(rownew_row,columncol,valueval)cell.alignmentAlignment(horizontalcenter,verticalcenter)print(f已新增{sku}的库存信息。)# ---------- 情况2Excel文件不存在从零创建 ----------else:wbopenpyxl.Workbook()# 创建一个全新的Excel工作簿wswb.active# 获取默认的第一张工作表ws.title多商品安全库存预警表# 给这张表起个名字# 画表头第1行灰色背景 黑色粗体 居中forcol,headerinenumerate(headers,1):cellws.cell(row1,columncol,valueheader)# 写入表头数据cell.fontFont(boldTrue,color000000)# 黑色粗体字cell.fillPatternFill(start_colorD3D3D3,end_colorD3D3D3,fill_typesolid)# 浅灰背景cell.alignmentAlignment(horizontalcenter,verticalcenter)# 写第一条数据第2行同样居中forcol,valinenumerate([sku,stock_num,warn_threshold,need_replenish],1):cellws.cell(row2,columncol,valueval)cell.alignmentAlignment(horizontalcenter,verticalcenter)# 设置列宽让表格好看不拥挤# zip() 把两个列表按位置一对一配对A→25, B→16, C→16, D→25forcol_letter,widthinzip([A,B,C,D],[25,16,16,25]):ws.column_dimensions[col_letter].widthwidthprint(f已创建{EXCEL_FILE}并写入{sku}的信息。)# 不管上面走的是更新还是新增还是创建最后都要保存并关闭wb.save(EXCEL_FILE)# 保存到硬盘wb.close()# 关闭文件释放资源# # 程序入口主循环# ## 流程图# 输入商品名 → 输入库存数 → 输入安全阈值回车默认15→ 判断预警 → 保存Excel# ↑___________________________________________________________↓# 循环继续下一件商品# defmain():# 打印欢迎界面globalwarn_threshold# 定义全局变量warn_thresholdprint(**40)print( 多商品安全库存预警系统 )print(**40)print(提示任意环节输入q或Q即可退出)print(**40)whileTrue:# 无限循环一件接一件录入商品print(\n*40)# 打印一条分隔线让界面清晰# 第1步输入商品名称# get_input 只传一个参数must_be_int 用默认值 False只校验非空skuget_input(请输入商品名称 (q或Q退出): )ifskuisNone:# 用户输入了q返回None退出程序print(拜拜)break# break 跳出while循环程序结束# 第2步输入库存数量# 传 must_be_intTrue强制要求输入整数stock_numget_input(请输入库存数量 (q或Q退出): ,must_be_intTrue)ifstock_numisNone:print(拜拜)break# 第3步输入安全库存阈值# 这里直接用 input()因为要支持直接回车使用默认值whileTrue:warn_inputinput(请输入安全阈值 (q或Q退出, 回车默认15): ).strip()ifwarn_input.lower()q:#用户输入为Q或qbreak# 【默认参数思想的实际运用】# 函数里用 warn_threshold15 做默认参数# 这里用户直接回车程序同样用15作为默认值# 两者思想一致大多数情况用这个数特殊情况再改ifwarn_input:# 用户直接回车输入为空字符串warn_threshold15# 使用默认值15print(使用默认阈值: 15)breakelse:try:warn_thresholdint(warn_input)# 用户输入了自定义阈值exceptValueError:# 输入不是整数如abcprint(输入无效请输入整数。)continuebreakifwarn_input.lower()q:print(拜拜)break# 第4步调用预警判断函数# 把用户输入的库存和阈值传进去得到是或否needstock_warning(stock_num,sku,warn_threshold)# 第5步保存到Excel# 把4个信息全部传给 save_to_excel由它决定是更新还是新增save_to_excel(sku,stock_num,warn_threshold,need)print(f已保存excel文件到:{os.path.abspath(EXCEL_FILE)})# # 程序启动开关# # if __name__ __main__: 是Python的固定写法意思是# 只有当直接运行这个文件时才执行 main() 函数# 如果这个文件被别的文件导入main() 不会自动执行# if__name____main__:main()核心功能讲解Python多货品安全库存预警脚本的核心功能用流程图表示。该流程图的内容用两句话来简要概括那就是输入商品 → 输入库存 → 输入安全库存阈值回车默认15→ 判断预警 → 写入Excel有则更新/无则新增/无文件则创建→ 循环继续下一件。并且整个流程里任意一步输入 q 或 Q都会直接打印拜拜并结束程序。该脚本的流程图如下。▶ 【程序启动】└─ 打印欢迎界面└─ 提示输入 q/Q 可随时退出│▼▶ 【主循环】开始录入第 N 件商品│▼▶ ① 输入商品名称├─ 输入 q/Q ───→ 【退出】打印拜拜├─ 输入为空 ─→ 提示输入不能为空请重新输入返回重输└─ 正常输入 ───→ 保存商品名继续│▼▶ ② 输入当前库存数量├─ 输入 q/Q ────→ 【退出】打印拜拜├─ 输入为空 ─→ 提示输入不能为空请重新输入返回重输├─ 输入非整数 ─→ 提示输入错误请输入整数返回重输└─ 正常整数 ────→ 保存库存数继续│▼▶ ③ 输入安全库存阈值├─ 输入 q/Q ─────→ 【退出】打印拜拜├─ 直接回车空输入→ 自动使用默认值 15├─ 输入非整数 ────→ 提示输入错误请输入整数返回重输└─ 正常整数 ─────→ 保存阈值继续│▼▶ ④ 库存预警判断├─ 当前库存 安全阈值│ ├─ 是 → 打印库存不足该补货了│ │ 返回结果 “是”│ └─ 否 → 打印库存正常无需补货│ │ 返回结果 “否”└─ 返回是/否结果│▼▶ ⑤ 写入 Excel 文件├─ 文件已存在│ ├─ 否 → 【创建新文件】│ │ ├─ 新建工作簿 命名工作表│ │ ├─ 第1行画表头灰底黑体居中│ │ │ 【商品名|当前库存|安全库存阈值|是否需要进货/补货】│ │ ├─ 第2行写入第一条数据│ │ └─ 调整列宽│ └─ 是 → 打开文件逐行查找商品名│ ├─ 找到了│ │ ├─ 是 → 更新该行4个单元格│ │ │ 打印已更新│ │ └─ 否 → 表格底部新增一行│ │ 打印已新增│ └─ 所有数据居中显示├─ 保存到硬盘 → 关闭释放资源└─ 打印文件完整路径│▼▶ ⑥ 一件商品处理完毕└─ 回到主循环顶部继续录入下一件商品重复 ①→②→③→④→⑤Python运行环境安装在运行多货品安全库存预警系统的之前需要做的重要的前置准备是安装和使用Pycharm和Python.exe。如果你们对安装和使用Pycharm和Python.exe一窍不通那么请阅读如下两篇文章。安装Pycharm配置python.exe0基础新手一次成功如何使用PyCharm0基础新手必看七大核心功能越用越有意思这个脚本还能用在哪些场景能用多货品安全库存预警系统的场景中除了在仓库里根据多货品的当前库存、安全库存阈值来判断多货品是否进货/补货的场景外还能用在多品类办公用品/耗材领用预警、多品类实验室工具/仪器管理、多品类小卖部食材管理、多品类小型工厂/作坊的原材料/零件管理等等。切换场景使用多货品安全库存预警系统时不用改代码直接运行使用就可以了。复盘总结本文详细讲解了Python多货品安全库存预警系统的运行结果、源码、核心功能解决了库管的统一设置所有货品安全库存阈值产生的问题同时它运用了Python函数的默认参数供Python小白练手使Python小白熟练掌握、灵活运用Python函数的默认参数。对于库管来说读到这块相信你已经赢了遇到统一设置所有货品安全库存阈值产生的问题后没有解决的库管真的挺棒了对于Python小白来说读到这里相信你已经赢了没有学Python函数的默认参数或只学Python函数的默认参数理论而不去练手的Python小白真的挺了不起完整资源文件下载如果你觉得复制粘贴麻烦想更省事那么我这里有完整的Python多货品安全库存预警系统的源码的.py文件其链接如下点击链接下载且在Pycharm中找到该.py文件运行即可。PythonExcel 多商品安全库存预警系统库管库存管理Python 小白入门毕设课设源码专栏下篇剧透在专栏中下一篇文章讲的是用Python函数的语法知识解决库存管理痛点的干货。如果你觉得我写的文章有帮助、有用或者你喜欢读我写的文章请动一动宝贵的金手指进行点赞、收藏、转发加关注你的支持是我继续创作的动力我会感激不尽关注我我会发布更多安装和使用编程软件、Python及其他编程语言的语法知识、突破Python及其他编程语言的语法知识的痛点、Python及其他编程语言实战的干货。如果你在Python语法、库存管理等方面有疑惑、问题或你对我写的文章有疑问那么欢迎你到评论区留言我看到后会一一回复。

相关新闻

TPC-H 成本不到一分钱:ClickHouse Cloud 对比 Snowflake、Databricks、BigQuery 和 Redshift

TPC-H 成本不到一分钱:ClickHouse Cloud 对比 Snowflake、Databricks、BigQuery 和 Redshift

本文字数:5249;估计阅读时间:14分钟作者:Tom Schreiber, Mark Needham, Alexander Gololobov, Andriy Yakovlev and Robert SchulzeTL;DR 在 TPC-H SF100 标准下,单个 59 核 ClickHouse Cloud 节点在实际运行时间方面&…

2026/10/18 2:47:06 阅读更多 →
链表的实现(单链表、双链表、环形表)【上】超详细!!

链表的实现(单链表、双链表、环形表)【上】超详细!!

链表的相关概念链表在逻辑顺序上是连续的,而在物理存储空间上不一定连续,是一种线性的数据结构,由一系列节点组成,每一个节点包含两部分,一个是数据域:存储实际的数据,另一个是指针域&#xff1…

2026/10/18 10:52:40 阅读更多 →
C++测试框架实战指南:Google Test与Catch2核心对比与应用

C++测试框架实战指南:Google Test与Catch2核心对比与应用

1. 项目概述:为什么C开发者需要一个好用的测试框架? 如果你写过C,尤其是写过稍微有点规模的C项目,大概率经历过这种场景:改了一个看似无关紧要的Bug,结果引发了另一个模块的雪崩式崩溃;或者信心…

2026/10/17 22:29:15 阅读更多 →

最新新闻

Flink核心机制:Window、State与Checkpoint的协同解析

Flink核心机制:Window、State与Checkpoint的协同解析

做流计算这几年,几乎每次面试或者带新人,我都会被问到Flink的Window、State、Checkpoint。很多朋友一开始觉得这三个概念是孤立的:Window是做聚合的,State是存数据的,Checkpoint是容错的。但实际上,这三者在…

2026/10/18 11:34:06 阅读更多 →
基于Spring Boot的私人云网盘系统设计与实战解析

基于Spring Boot的私人云网盘系统设计与实战解析

我最早做这个“基于Spring Boot的私人云网盘系统”,动机非常朴素:公有网盘用久了,总是被各种限制搞得心烦——下载一多就开始限速,稍微私密一点的文件也不敢放。后来索性在团队里自己搭了一个用Spring Boot写的私人云网盘&#xf…

2026/10/18 11:34:06 阅读更多 →
FastAPI集成SQLAlchemy:从CRUD到生产级数据库持久化实践

FastAPI集成SQLAlchemy:从CRUD到生产级数据库持久化实践

终于写到第5部分了。前四部分我们把FastAPI的路由、参数校验、请求体、响应模型、中间件和异常处理都过了一遍,单看接口已经能跑得像模像样。但做过真实项目的人都知道,这还只是“玩具级”的后端。原因很简单:数据一重启就丢,接口…

2026/10/18 11:34:06 阅读更多 →
医疗知识图谱问答系统:实体链接+多跳推理+可解释查询

医疗知识图谱问答系统:实体链接+多跳推理+可解释查询

简介:这是一套基于Python实现的医疗知识图谱自动问答系统源码,面向人工智能、自然语言处理与智慧医疗方向的学习者和开发者,旨在解决医疗领域专业问题的语义理解与精准检索难题。资源包含26个文件,涵盖8个Python核心模块&#xff…

2026/10/18 11:34:06 阅读更多 →
AI抢不走你的饭碗?从恐惧到指挥的实战指南

AI抢不走你的饭碗?从恐惧到指挥的实战指南

我认识张伟,不是那个全国人民都认识的张伟,是我前同事。上个月他给我打电话,语气里全是惊恐:“兄弟,AI要抢我饭碗了,给我出出主意。”事情很老套。他们部门接到新要求,所有项目周报、数据分析、…

2026/10/18 11:34:06 阅读更多 →
从零训练小型语言模型:数据、模型、训练与踩坑全流程

从零训练小型语言模型:数据、模型、训练与踩坑全流程

最近刚把一门深度学习课程的作业一完整跑通,主题是Training,也就是从头训练一个小型语言模型。先说结论:这件事没有想象中那么玄,但也没有网上教程写得那么轻松。你会在数据预处理、模型初始化、训练循环、评测生成这几个环节里反…

2026/10/18 11:33:06 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →