管道缺陷数据库管理系统:工业无损检测数据结构化方案
简介这是一套面向计算机及相关专业如计科、人工智能、通信工程等在校学生与初学者的管道内检测缺陷数据库管理系统完整开发资源解决工业检测数据规范化存储、查询与可视化管理的实际需求适用于课程设计、毕业设计及项目初期演示。资源包含462个文件以44个C#源码文件.cs为核心辅以112个运行依赖DLL、62个配置说明XML、16个XAML界面文件及1个Visual Studio解决方案.sln完整覆盖数据层SQLite、业务逻辑与UI模块压缩包大小83.86MB结构清晰便于学习源码组织与WPFSQLite开发模式。已有87人下载学习资源源自高分毕设答辩均分96分所有代码经实测可运行附带详细文档说明与README指引提供从环境搭建、功能调试到二次开发的完整支撑特别适合缺乏工业数据库项目经验的学习者快速上手并拓展功能。1. 管道内检测缺陷数据库管理系统不是通用DBMS而是专为工业无损检测数据流设计的闭环中枢你手上有几十段管道内窥视频、上百张超声C扫描图、几千条带坐标的缺陷标注记录——但它们散落在Excel、本地文件夹、U盘备份和不同工程师的笔记本里。当质检报告要追溯某段DN300燃气管焊缝的第7次复检数据时你得翻3个文件夹、比对4个命名不一致的CSV、再手动校验坐标系单位是否统一。这不是数据多是数据有但不可索引、不可关联、不可回溯。这个“管道内检测缺陷数据库管理系统”源码包本质是一个轻量级、可离线部署、带空间坐标建模能力的专用数据中枢它把缺陷类型裂纹/腐蚀/未熔合、位置距起始端距离周向角度壁厚方向深度、检测手段内窥镜/超声/漏磁、设备参数探头频率/帧率/分辨率全部结构化绑定让“查缺陷”变成“查关系”——比如“找出所有在流速2m/s工况下、位于弯头后1.5D范围内的未熔合缺陷并导出其原始B扫图像与对应检测报告PDF”。它面向的是现场检测工程师、第三方检测机构的数据管理员、以及需要做缺陷统计分析的工艺改进团队不是DBA或IT运维。系统用C#开发、基于SQLite嵌入式数据库.sln工程可直接用Visual Studio 2019打开编译文档说明覆盖从数据库表结构设计逻辑到缺陷坐标系映射规则的全部细节不依赖云服务、不调用外部API、不强制联网——这是工业现场最刚性的需求。2. 从零跑通系统用VS2022加载sln并初始化内置数据库2.1 环境准备与项目加载确认.NET Framework版本与SQLite驱动兼容性该系统要求目标机器安装 .NET Framework 4.7.2 或更高版本非 .NET Core/.NET 5。若本地已装 Visual Studio 2022需确认已启用“.NET desktop development”工作负载。打开sln前先检查解决方案资源管理器中References下是否存在System.Data.SQLite版本号通常为 1.0.115.5若显示黄色感叹号说明SQLite原生驱动未正确注册。此时不要手动下载DLL而应通过NuGet包管理器还原右键解决方案 → “Restore NuGet Packages”等待完成。若仍失败执行以下命令行强制更新以管理员身份运行开发者命令提示符nuget restore PipelineDefectDB.sln提示该系统未使用Entity Framework Code First所有数据库操作基于SQLiteCommand手写SQL因此无需迁移脚本或上下文类。表结构定义全部固化在DatabaseInitializer.cs中。2.2 数据库初始化理解InitializeDatabase()的三次关键写入逻辑系统首次运行时会自动调用DatabaseInitializer.InitializeDatabase()方法。该方法并非简单建表而是分三阶段写入基础元数据表DefectTypes缺陷类型字典、InspectionMethods检测方法枚举、PipeSegments管段基本信息表空间坐标模型表DefectLocations含SegmentID,AxialDistance_mm,CircumferentialAngle_deg,DepthRatio四字段强制约束DepthRatio在0~1之间关联主表DefectRecords主键RecordID外键指向DefectTypes.ID和DefectLocations.ID并包含RawDataPath文本字段存相对路径。关键点在于RawDataPath存储的是相对于AppData\Local\PipelineDefectDB\RawData\的路径而非绝对路径。这意味着你必须将原始图像/视频文件按约定目录结构存放否则双击记录无法预览。2.3 首次运行验证检查SQLite文件生成位置与初始数据填充编译成功后按F5启动程序会在用户目录下自动生成数据库文件%LOCALAPPDATA%\PipelineDefectDB\PipelineDefects.db用DB Browser for SQLite打开该文件执行以下查询验证初始化结果SELECT COUNT(*) FROM DefectRecords; -- 应返回0空库 SELECT Name FROM DefectTypes; -- 应返回Crack,Corrosion,LackOfFusion,Porosity等预置项若DefectTypes表为空说明DatabaseInitializer未执行——常见原因是App.config中startup节点的supportedRuntime版本号与本地.NET Framework不匹配需手动修改为versionv4.0.30319。3. 缺陷数据录入实战从单张超声图像到结构化记录的完整链路3.1 原始数据预处理统一命名规范与坐标系对齐系统不接受任意格式的图像输入。必须满足三项硬性条件文件名格式[管段编号]_[检测日期]_[检测方法缩写]_[序号].png例如SEG-A07_20231015_UT_023.png图像尺寸必须为 1024×768 像素超声B扫典型分辨率宽高比偏差超过5%将被拒绝坐标系原点左上角为 (0,0)X轴向右Y轴向下OpenCV默认若原始图像为DICOM需用dcm2png工具转换并指定-f yflip参数翻转Y轴。注意PipeSegments表中必须已存在SEG-A07对应的管段记录包含NominalDiameter_mm公称直径、WallThickness_mm壁厚、MaterialGrade材质等级字段否则录入时下拉框无法选择该管段。3.2 手动录入界面操作三个必填区域与一个隐藏校验主界面点击“新增缺陷”按钮后弹出录入窗体分为三区顶部信息区选择管段编号从PipeSegments加载、检测日期DatePicker控件、检测方法下拉框绑定InspectionMethods表中部坐标区输入AxialDistance距管段起点毫米值支持小数、CircumferentialAngle周向角度0~360°输入185.3允许、DepthRatio深度占比0.0~1.0输入0.72表示距内壁72%壁厚处底部缺陷区选择缺陷类型DefectTypes、填写描述最大200字符、点击“浏览”选择已按规范命名的PNG文件。关键隐藏校验当选择UT超声方法时系统会自动检查所选PNG文件的EXIF中是否包含SoftwareUT-Analyzer v3.2字段模拟真实设备水印若不存在则弹出警告“未检测到设备签名建议重新采集”。此校验可关闭但关闭后将失去设备溯源能力。3.3 批量导入脚本用Python解析Excel标注表并生成INSERT语句当已有Excel标注表列名SegmentID,Date,Method,Axial,Angle,DepthRatio,Type,ImagePath时可用以下Python脚本生成批量插入SQLimport pandas as pd import sqlite3 df pd.read_excel(defect_labels.xlsx) conn sqlite3.connect(r%LOCALAPPDATA%\PipelineDefectDB\PipelineDefects.db) for _, row in df.iterrows(): # 构造RawDataPath将ImagePath中的绝对路径转为相对路径 rel_path row[ImagePath].replace(rD:\InspectionData\, ) # 插入DefectLocations loc_id conn.execute( INSERT INTO DefectLocations (SegmentID, AxialDistance_mm, CircumferentialAngle_deg, DepthRatio) VALUES (?, ?, ?, ?) , (row[SegmentID], row[Axial], row[Angle], row[DepthRatio])).lastrowid # 插入DefectRecords conn.execute( INSERT INTO DefectRecords (LocationID, DefectTypeID, InspectionMethodID, RecordDate, Description, RawDataPath) SELECT ?, DT.ID, IM.ID, ?, , ? FROM DefectTypes DT, InspectionMethods IM WHERE DT.Name ? AND IM.Code ? , (loc_id, row[Date], rel_path, row[Type], row[Method])) conn.commit()逻辑说明脚本不直接操作C#对象而是直连SQLite执行SQL避免跨进程序列化开销RawDataPath的路径替换必须严格匹配系统约定的根目录否则预览功能失效Description字段留空因Excel中无此列实际使用时可扩展为从Excel读取Notes列。4. 避坑指南五个让现场工程师当场重启电脑的真实问题4.1 现象双击缺陷记录后图像预览窗口空白控制台无报错原因RawDataPath指向的PNG文件实际不存在或文件被其他程序如Windows照片查看器独占锁住。系统捕获FileNotFoundException后仅静默忽略不抛异常。解决在PreviewForm.cs的LoadImage()方法开头添加日志string fullPath Path.Combine(AppDomain.CurrentDomain.BaseDirectory, RawData, rawPath); Debug.WriteLine($Attempting to load: {fullPath}); // 查看实际拼接路径 if (!File.Exists(fullPath)) { MessageBox.Show($文件不存在{fullPath}); return; }4.2 现象在“缺陷统计”页选择“按周向角度分布”图表X轴刻度全为0原因CircumferentialAngle_deg字段在DefectLocations表中被错误定义为TEXT类型因建表SQL中漏写REAL导致GROUP BY CAST(Angle AS REAL)失败。解决执行SQLite修复语句需先关闭程序ALTER TABLE DefectLocations RENAME TO DefectLocations_old; CREATE TABLE DefectLocations ( ID INTEGER PRIMARY KEY, SegmentID TEXT NOT NULL, AxialDistance_mm REAL NOT NULL, CircumferentialAngle_deg REAL NOT NULL, DepthRatio REAL NOT NULL CHECK(DepthRatio BETWEEN 0 AND 1) ); INSERT INTO DefectLocations SELECT * FROM DefectLocations_old; DROP TABLE DefectLocations_old;4.3 现象导入1000条记录后搜索响应时间从0.2秒升至8秒原因DefectRecords表缺少复合索引WHERE子句常同时过滤SegmentID和RecordDate但当前仅有主键索引。解决在数据库初始化完成后追加索引修改DatabaseInitializer.cs的InitializeDatabase()末尾cmd.CommandText CREATE INDEX IF NOT EXISTS IX_DefectRecords_SegmentDate ON DefectRecords(SegmentID, RecordDate); cmd.ExecuteNonQuery();4.4 现象导出Excel报表时中文字段如缺陷描述显示为方块原因ExportToExcel()方法使用NPOI库但未设置单元格字体为支持中文的字体如微软雅黑。解决在创建HSSFCellStyle后添加字体设置var font workbook.CreateFont(); font.FontName Microsoft YaHei; font.FontHeightInPoints 10; style.SetFont(font);4.5 现象同一管段多次检测的缺陷位置对比时轴向距离数值偏差达±15mm原因不同检测设备的“管段起点”定义不一致有的以法兰面为0点有的以焊缝中心为0点但系统未提供偏移量校准字段。解决在PipeSegments表中新增ReferenceOffset_mm列默认0并在坐标计算逻辑中修正double actualAxial userInputAxial pipeSegment.ReferenceOffset_mm;此字段需在管段录入时由工程师根据现场测量填写是物理世界与数字模型对齐的关键接口。5. 进阶技巧用空间查询定位“高风险重叠缺陷”并生成维修优先级报告5.1 定义“重叠缺陷”的工业逻辑三维空间邻域而非二维像素重合管道缺陷的“重叠”不是图像上两个矩形框相交而是指同一管段内轴向距离差 ≤ 50mm周向角度差 ≤ 30°换算为弧长Δθ × π × D / 180 ≤ 30mm深度位置均在壁厚中层区域DepthRatio∈ [0.4, 0.6]。这四条件必须同时满足才视为“结构应力叠加高风险区”。系统未内置该查询需手写SQL实现。5.2 执行空间邻域查询自连接距离函数计算在SQLite中由于无原生地理函数需用纯数学计算。以下SQL找出所有满足条件的缺陷对去重后SELECT d1.RecordID AS PrimaryID, d2.RecordID AS OverlapID, ROUND(ABS(d1.AxialDistance_mm - d2.AxialDistance_mm), 2) AS AxialDiff_mm, ROUND(MIN(ABS(d1.CircumferentialAngle_deg - d2.CircumferentialAngle_deg), ABS(d1.CircumferentialAngle_deg - d2.CircumferentialAngle_deg 360), ABS(d1.CircumferentialAngle_deg - d2.CircumferentialAngle_deg - 360)), 2) AS AngleDiff_deg, p.NominalDiameter_mm AS PipeDiameter_mm FROM DefectRecords d1 JOIN DefectRecords d2 ON d1.SegmentID d2.SegmentID AND d1.RecordID d2.RecordID JOIN DefectLocations l1 ON d1.LocationID l1.ID JOIN DefectLocations l2 ON d2.LocationID l2.ID JOIN PipeSegments p ON d1.SegmentID p.SegmentID WHERE ABS(l1.AxialDistance_mm - l2.AxialDistance_mm) 50 AND l1.DepthRatio BETWEEN 0.4 AND 0.6 AND l2.DepthRatio BETWEEN 0.4 AND 0.6 AND ( ABS(l1.CircumferentialAngle_deg - l2.CircumferentialAngle_deg) 30 OR ABS(l1.CircumferentialAngle_deg - l2.CircumferentialAngle_deg 360) 30 OR ABS(l1.CircumferentialAngle_deg - l2.CircumferentialAngle_deg - 360) 30 );注意周向角度差需考虑跨0°边界如355°与5°实际只差10°故用三条件OR覆盖所有情况d1.RecordID d2.RecordID避免自匹配和重复对。5.3 生成维修优先级报告按风险因子加权排序将上述查询结果导入临时表RiskPairs再关联缺陷类型权重Crack5,Corrosion3,LackOfFusion4计算综合风险分SELECT p.SegmentID, p.PrimaryID, p.OverlapID, t1.Name AS PrimaryType, t2.Name AS OverlapType, (wt1.Weight wt2.Weight) * (1.0 - (p.AxialDiff_mm / 50.0)) * (1.0 - (p.AngleDiff_deg / 30.0)) AS RiskScore FROM RiskPairs p JOIN DefectRecords r1 ON p.PrimaryID r1.RecordID JOIN DefectRecords r2 ON p.OverlapID r2.RecordID JOIN DefectTypes t1 ON r1.DefectTypeID t1.ID JOIN DefectTypes t2 ON r2.DefectTypeID t2.ID JOIN DefectTypeWeights wt1 ON t1.ID wt1.TypeID JOIN DefectTypeWeights wt2 ON t2.ID wt2.TypeID ORDER BY RiskScore DESC LIMIT 10;该结果可直接导出为PDF报告每条记录附带两缺陷的原始图像缩略图通过RawDataPath拼接路径读取。我坚持在每次交付前用这个查询脚本跑一遍客户最新数据——不是为了炫技而是因为曾亲眼见过某段输油管因两个相距42mm的微裂纹被忽略三个月后发生泄漏。真正的工业软件价值不在界面多炫而在它敢把“可能出事的地方”清清楚楚标出来且标得准。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

微信小程序开发实战:从零构建到云开发上线全流程指南

微信小程序开发实战:从零构建到云开发上线全流程指南

1. 项目整体设计与核心思路拆解1.1 从标题看本质:这是一条完整的微信生态开发链路拿到“基于微信小程序的的设计及实现”这个标题时,我第一反应是——这大概率是某高校的毕业设计、课程设计,或者开发者的练手项目。标题里少了一个关键定语&am…

2026/10/11 16:41:53 阅读更多 →
C++键值对容器选型与性能优化实战:从map到unordered_map

C++键值对容器选型与性能优化实战:从map到unordered_map

1. 从一次性能翻车说起:为什么键值对值得单独拎出来聊前阵子帮一个做实时数据采集的朋友排查问题,他的程序跑着跑着内存就飙到十几个G,最后被系统直接干掉。代码逻辑不复杂,就是不断把采集到的传感器数据塞进一个容器里&#xff0…

2026/10/11 16:42:23 阅读更多 →
计算机组成原理入门:从冯·诺依曼结构到指令周期的核心概念

计算机组成原理入门:从冯·诺依曼结构到指令周期的核心概念

经常有刚学编程的同学问我:我为什么要知道CPU怎么取指令?我写Java不也能出活吗?每当被问到这个问题,我就知道对方还没建立起“计算机系统基础”的整体观。计算机的基本组成与基本概念,不是教科书第一章的过场戏&#x…

2026/10/12 11:55:22 阅读更多 →

最新新闻

JSTL 标签库实战:从脚本片段到标签封装的核心技巧

JSTL 标签库实战:从脚本片段到标签封装的核心技巧

1. 从脚本片段到标签封装&#xff1a;JSTL 到底解决了什么问题很多人第一次接触 JSTL&#xff0c;是在维护一个老项目的时候。打开 JSP 文件&#xff0c;满屏的<% for(...) { %>、<% if(...) { %>和<% request.getAttribute("xxx") %>&#xff0c;…

2026/10/12 17:55:23 阅读更多 →
告别API依赖!GitHub上那些可以完全本地运行的优质开源AI项目盘点:用TaoToken统一Key打通本地与云端

告别API依赖!GitHub上那些可以完全本地运行的优质开源AI项目盘点:用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/12 17:55:23 阅读更多 →
共享单车数据集VOC格式实战:从标注解析到YOLO训练全流程

共享单车数据集VOC格式实战:从标注解析到YOLO训练全流程

简介&#xff1a;这份共享单车数据集采用VOC格式整理&#xff0c;面向从事目标检测算法练习、课程设计或毕业设计的学生与开发者&#xff0c;可用于训练和验证单车识别模型&#xff0c;解决真实街景中共享单车标注样本不足的问题。压缩包共272个文件&#xff0c;包含136张jpg实…

2026/10/12 17:55:23 阅读更多 →
Python机器学习预测电影首周票房实战指南

Python机器学习预测电影首周票房实战指南

简介&#xff1a;这是一套面向计算机专业本科生的机器学习实战项目资源&#xff0c;聚焦电影票房预测这一典型回归建模任务&#xff0c;适用于毕业设计、课程设计及期末大作业场景。资源包含完整可运行的Python源码、清洗后的TMDB 5000电影数据集&#xff08;含credits与movies…

2026/10/12 17:55:23 阅读更多 →
Jupyter Notebook虚拟环境配置指南:Kernel与conda/venv绑定方法

Jupyter Notebook虚拟环境配置指南:Kernel与conda/venv绑定方法

1. 先搞清楚&#xff1a;为什么 Notebook 老是"用错环境"我最初接触这个问题&#xff0c;是因为在同一个项目里同时跑了两个不同版本的深度学习框架&#xff0c;一个依赖 Python 3.8&#xff0c;一个依赖 Python 3.10。Jupyter Notebook 默认启动时用的是系统 PATH 里…

2026/10/12 17:55:23 阅读更多 →
Tesseract OCR中文识别实战:安装、调优与避坑指南

Tesseract OCR中文识别实战:安装、调优与避坑指南

简介&#xff1a;Tesseract OCR 安装包与中文语言包面向需要在本地完成图片文字识别的开发者、测试人员及自动化办公用户&#xff0c;尤其适合用 Python 调用 OCR 引擎处理中文文档、票据或截图的人群。压缩包共 723 个文件&#xff0c;约 36.01MB&#xff0c;以 C 源码&#x…

2026/10/12 17:54:23 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天&#xff0c;画面可以做到绝对的锐利、平滑与无瑕。然而&#xff0c;当一张秋日手账插画或拍立得照片过于“平整无瑕”时&#xff0c;往往会散发出一种冰冷生硬的“数码塑料感&#xff08;Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中&#xff0c;横排&#xff08;Horizontal Layout&#xff09;早已经成为了绝对的主流。然而&#xff0c;当我们翻开泛黄的线装古籍、宋版木刻诗集&#xff0c;或是欣赏一张茶道雅集的手写便签时&#xff0c;那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点&#xff0c;很多人心里都会悄悄亮起一盏警示灯。 在心理学上&#xff0c;这种现象有一个专门的称谓——“周日夜晚焦虑症&#xff08;Sunday Scaries&#xff09;”。明天又是周一&#xff0c;闹钟又要重新在七点响彻卧房&#xff1b;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →