UniEdit电子病历编辑器:结构化XML锚点与ActiveX临床集成方案
简介UniEdit电子病历编辑器是一款面向医疗信息系统开发者的技术组件专为快速集成电子病历编辑功能而设计适用于C/S或B/S架构的HIS、EMR等系统开发解决病历富文本编辑、模板复用、ICD编码嵌入及多页结构化管理等核心需求。资源包共38个文件含18个XML定义页面布局、选项字典、ICD10编码映射等、7个HTML含test.html、UniEditor.html等Web调用示例、4个BAT注册/卸载ActiveX控件脚本、3个DOC控件SDK说明、多页页眉页脚设置等关键文档及1个核心DLLUniEdit.dll整体9.65MB结构清晰开箱即用。已有1175人学习下载。读者可直接获取完整ActiveX控件部署方案、Web端集成范例UniEditorforWeb、ICD10编码字典加载流程、TAB页动态加载逻辑及常见IE部署问题排查要点如消息框不弹出原因说明是医疗软件二次开发中少有的兼顾技术深度与落地细节的实用型资源。1. UniEdit电子病历编辑器不是又一个富文本框而是临床文档闭环里被长期忽略的“结构化锚点”你有没有遇到过这种场景某医院信息科同事发来一份病历模板 Word 文件要求“快速对接到HIS系统里”结果发现里面混着手写体扫描图、嵌套表格、带条件跳转的下拉项、需要签名留痕的段落还有必须按《电子病历系统功能应用水平分级评价标准》第4.2.3条校验的时限字段这时候扔个 CKEditor 或 Quill 进去十有八九会翻车——它们能渲染文字但管不了“主诉必须在入院8小时内录入”这种业务规则。UniEdit 就是为这类真实临床文档流设计的它本质是一个深度定制的 ActiveX 控件把病历的“可编辑性”和“结构化语义”焊死在一起。它不追求通用富文本的炫技效果而是用 DOM 级别控制XML Schema 绑定本地策略引擎在 IE/Edge Legacy 环境下实现“所见即合规”。适合正在做老系统升级、区域医疗平台集成、或需要满足等保2.0三级中“电子病历操作留痕”要求的开发团队。如果你还在用 document.execCommand 拼病历编辑功能UniEdit 是少有的、能让你少写3000行校验逻辑的现成方案。2. 为什么选 ActiveX 而非 WebAssembly 或 Web Components历史包袱与临床环境的硬约束2.1 临床终端的真实生态不是所有电脑都装 Chrome某三甲医院信息科提供的终端统计显示其住院部医生工作站中仍有67%的机器运行 Windows 7 IE11因 PACS 影像插件强依赖 ActiveX且政策规定该类终端三年内不得强制升级操作系统。这意味着WebAssembly 方案需额外部署 WASM 运行时而医院终端无管理员权限安装Web Components 在 IE11 中需 polyfill但 polyfill 体积超 800KB加载延迟导致医生点击“新建病历”后等待超 4 秒投诉率上升23%UniEdit 的 ActiveX 控件体积仅 1.2MB首次安装后所有页面复用且支持静默注册通过组策略推送.inf文件。提示这不是技术倒退而是对临床工作流连续性的尊重。当医生在抢救室争分夺秒时1秒加载延迟可能影响决策节奏。2.2 ActiveX 的结构化能力远超contenteditable的 DOM 控制粒度UniEdit 的核心优势在于它把每个病历元素映射为可编程的 XML 节点而非纯 HTML 字符串。例如一个“诊断结论”区块在 DOM 中实际表现为Diagnosis iddiag_001 statusdraft timestamp2023-09-15T14:22:03 ICDCode valueI10 verifiedtrue/ Description原发性高血压/Description ConfidenceLevel value95/ /Diagnosis而传统富文本编辑器只生成p原发性高血压/p。这种差异直接决定后续能力自动校验控件内置 XSD Schema 引擎当医生删除ICDCode节点时立即触发onStructureViolation事件并高亮提示智能填充点击“高血压”关键词自动弹出 ICD-10 编码建议列表数据源来自本地缓存的 2023 版临床术语库审计追踪每次修改ConfidenceLevel值自动生成AuditTrail userDOC007 actionmodify fieldConfidenceLevel old85 new95/节点。这种能力无法通过前端 JS 模拟——因为浏览器 DOM 不允许对contenteditable区域内的 XML 结构做原子级锁定。2.3 部署模型控件注册与策略下发的双通道机制UniEdit 不是单个 DLL 文件而是一套组件包包含UniEdit.ocx主控件需管理员权限注册UniEditPolicy.xsd结构化规则定义文件如“手术记录必须含麻醉方式字段”UniEditTermDB.xml本地术语库支持增量更新UniEditLog.dll轻量日志模块绕过 Windows 事件查看器直写加密二进制日志。部署时采用“一次注册、多策略下发”模式通过域控组策略推送regsvr32 /s UniEdit.ocx将UniEditPolicy.xsd放入网络共享路径\\HIS-SERVER\policies\current\客户端启动时自动拉取最新策略若离线则使用本地缓存版本。这种设计让某省区域医疗平台在 237 家基层医院快速落地——无需逐台安装策略变更 2 小时内全网生效。3. 快速集成从零开始嵌入 HIS 页面的四步实操3.1 第一步HTML 页面基础结构与 ActiveX 注册检测在 HIS 系统的病历编辑页如edit_admission.jsp中插入以下代码。注意必须用 IE 兼容模式声明且禁用 XSS 过滤器临床系统通常已关闭!DOCTYPE html html xmlnshttp://www.w3.org/1999/xhtml head meta http-equivX-UA-Compatible contentIEEmulateIE11 / title入院记录编辑/title /head body !-- UniEdit 容器 -- div iduniEditContainer stylewidth:100%;height:600px;border:1px solid #ccc;/div !-- 加载脚本 -- script typetext/javascript function checkUniEdit() { try { var obj new ActiveXObject(UniEdit.Editor); return true; } catch (e) { return false; } } if (!checkUniEdit()) { alert(UniEdit 控件未安装请联系信息科获取安装包); // 此处可跳转到内部下载页如 /download/UniEditSetup.msi } /script /body /html参数说明X-UA-Compatible声明强制 IE11 使用 Trident 渲染引擎避免 Edge 模式下 ActiveX 失效ActiveXObject实例化是唯一可靠的控件存在检测方式navigator.plugins列表在 IE 中不可靠。3.2 第二步初始化控件并绑定结构化模板UniEdit 不接受纯 HTML 初始化必须传入 XML Schema 定义的模板。以下代码将加载admission_template.xsd并渲染// 初始化 UniEdit 实例 var uniEditor new ActiveXObject(UniEdit.Editor); // 设置容器 uniEditor.Container document.getElementById(uniEditContainer); // 加载结构化模板注意路径必须是绝对 URL相对路径会失败 uniEditor.LoadTemplate(https://hissvr/internal/templates/admission_template.xsd); // 启用自动保存每30秒触发 onAutoSave 事件 uniEditor.AutoSaveInterval 30; // 绑定数据源从 HIS 接口获取的 JSONUniEdit 自动转换为 XML var patientData { patientId: PT2023001, admitDate: 2023-09-15, chiefComplaint: 头痛伴呕吐2天 }; uniEditor.BindData(patientData); // 显示编辑器 uniEditor.Show();关键参数LoadTemplate()必须传入HTTP(S) 协议的绝对路径file://协议在 IE 安全区限制下会报错BindData()接收标准 JSONUniEdit 内部通过 XSLT 转换为符合 Schema 的 XML无需前端手动拼 XMLAutoSaveInterval单位为秒设为 0 表示禁用自动保存需手动调Save()。3.3 第三步监听关键事件并处理业务逻辑UniEdit 提供 12 个核心事件临床系统最常需重写的有三个// 1. 字段值变更时触发如修改诊断描述 uniEditor.onFieldChange function(fieldName, newValue, oldValue) { if (fieldName diagnosisDesc) { // 调用术语服务推荐 ICD 编码 fetch(/api/term/suggest?keyword encodeURIComponent(newValue)) .then(r r.json()) .then(data { uniEditor.SetSuggestionList(ICDCode, data.codes); // 弹出编码建议 }); } }; // 2. 用户点击保存按钮时此时数据已结构化校验通过 uniEditor.onSave function() { // 获取结构化 XML 数据非 HTML var xmlData uniEditor.GetXmlData(); // 发送到 HIS 后端注意必须用 POSTGET 有长度限制 fetch(/api/record/save, { method: POST, headers: { Content-Type: application/xml }, body: xmlData }).then(r { if (r.ok) alert(病历保存成功); }); }; // 3. 校验失败时如必填字段为空 uniEditor.onValidationFailed function(errors) { // errors 是数组每项含 {field: admitDate, message: 入院时间不能为空} var msg 以下字段未填写完整\n; errors.forEach(e msg • e.message \n); alert(msg); };逻辑说明GetXmlData()返回的是严格符合 XSD 的 XML 字符串可直接存入数据库 XML 字段或转为 HL7 CDA 文档SetSuggestionList()是 UniEdit 特有 API用于在光标位置弹出术语建议浮层比前端 JS 实现更稳定避免与编辑器焦点冲突。3.4 第四步导出与打印绕过浏览器打印的格式灾难临床打印要求“所见即所得”但浏览器打印会丢失 ActiveX 控件渲染的特殊字体如手写体签名、页眉页脚位置偏移。UniEdit 提供原生打印接口// 打印当前病历调用 Windows GDI 直接输出 uniEditor.Print(); // 导出为 PDF需服务器端 PDF 引擎配合 uniEditor.ExportToPdf(https://hissvr/api/pdf/generate, { title: 入院记录, footer: XX医院电子病历系统 - 机密等级内部 }); // 导出为 CDA 文档符合 HL7 CDA R2 标准 uniEditor.ExportToCda(https://hissvr/api/cda/export);参数说明ExportToPdf()的第一个参数是后端 PDF 生成服务地址UniEdit 将结构化 XML 发送过去由服务端用 iTextSharp 渲染为 PDFExportToCda()自动生成符合《电子病历共享文档规范》的 XML 文档含数字签名节点。4. 避坑生产环境踩过的五个血泪问题与解法4.1 现象IE11 下控件显示为白块F12 控制台无报错原因Windows 组策略中启用了“禁止运行未签名的 ActiveX 控件”而 UniEdit.ocx 的数字签名证书未被医院内网根证书信任。解决从 UniEdit 安装包中提取UniEdit.cer证书在域控服务器上通过“组策略管理”→“计算机配置”→“安全设置”→“公钥策略”→“受信任的根证书颁发机构”导入该证书强制客户端组策略更新gpupdate /force。4.2 现象调用BindData()后部分字段不显示但GetXmlData()能取到值原因JSON 数据中的字段名与 XSD 中定义的element name大小写不一致如 XSD 定义AdmitDate但 JSON 传入admitDate。解决UniEdit 默认区分大小写需在初始化后显式关闭uniEditor.CaseSensitiveBinding false; // 必须在 LoadTemplate() 后、BindData() 前设置4.3 现象onSave事件中GetXmlData()返回空字符串原因控件尚未完成内部 XML 构建常见于Show()后立即调用Save()异步渲染未完成。解决监听onReady事件确保控件就绪uniEditor.onReady function() { console.log(UniEdit 已就绪可安全调用 Save()); // 此处放保存逻辑 }; uniEditor.Show(); // onReady 在 Show() 内部触发4.4 现象导出 PDF 时中文乱码显示为方框原因UniEdit 默认使用 Windows 系统字体但 PDF 生成服务如 iTextSharp未嵌入中文字体。解决在 PDF 服务端配置字体提供器// C# 示例iTextSharp 中注册思源黑体 FontProvider.Register(C:/fonts/NotoSansCJKsc-Regular.otf);同时在 UniEdit 初始化时指定字体uniEditor.DefaultFont Noto Sans CJK SC; // 必须与服务端注册名称一致4.5 现象多人同时编辑同一份病历时onFieldChange触发频率异常高原因UniEdit 的实时协同基于轮询默认 2 秒当 50 用户同时打开页面HIS 后端接口被高频请求压垮。解决动态调整轮询间隔并启用服务端变更通知// 启用 WebSocket 通知需 HIS 后端支持 uniEditor.EnableRealTimeSync true; uniEditor.WebSocketUrl wss://hissvr/ws/record; // 若不支持 WebSocket则降级为长轮询间隔拉长至 10 秒 uniEditor.PollingInterval 10;5. 进阶技巧用 XSLT 动态生成病历模板让模板管理脱离代码发布5.1 为什么硬编码模板是运维噩梦某三甲医院曾因“门诊病历新增过敏史字段”需求被迫停服 4 小时开发需修改 XSD 文件 → 重新编译 UniEdit 插件 → 全院推送新 OCX → 测试所有终端兼容性。而用 XSLT 动态生成只需改一个 XML 文件5 分钟内全网生效。5.2 XSLT 模板生成原理从配置 XML 到可执行 XSDUniEdit 支持加载.xsl文件将业务配置 XML 转换为最终 XSD。例如template_config.xml定义TemplateConfig Section name基本信息 requiredtrue Field name姓名 typetext maxLength20 requiredtrue/ Field name年龄 typenumber min0 max120/ /Section Section name诊断 requiredfalse Field nameICD编码 typecode termSourceICD10/ Field name诊断描述 typetextarea rows3/ /Section /TemplateConfig对应config_to_xsd.xsl转换脚本精简版xsl:stylesheet version1.0 xmlns:xslhttp://www.w3.org/1999/XSL/Transform xsl:output methodxml indentyes/ xsl:template match/ xs:schema xmlns:xshttp://www.w3.org/2001/XMLSchema xs:element nameMedicalRecord xs:complexType xs:sequence xsl:for-each select//Section xs:element name{name} minOccurs{if(requiredtrue) then 1 else 0} xs:complexType xs:sequence xsl:for-each selectField xs:element name{name} xs:simpleType xs:restriction basexs:string xsl:if testmaxLength xs:maxLength value{maxLength}/ /xsl:if xsl:if testmin xs:minInclusive value{min}/ /xsl:if /xs:restriction /xs:simpleType /xs:element /xsl:for-each /xs:sequence /xs:complexType /xs:element /xsl:for-each /xs:sequence /xs:complexType /xs:element /xs:schema /xsl:template /xsl:stylesheet5.3 运行时动态加载流程HIS 后端提供/api/template/config接口返回template_config.xml前端用XMLHttpRequest获取配置用浏览器内置 XSLTProcessor 执行转换function loadDynamicTemplate() { var xhr new XMLHttpRequest(); xhr.open(GET, /api/template/config, false); xhr.send(); var configXml xhr.responseXML; // 加载 XSLT 转换器 var xslXhr new XMLHttpRequest(); xslXhr.open(GET, /xsl/config_to_xsd.xsl, false); xslXhr.send(); var xslDoc xslXhr.responseXML; // 执行转换 var xsltProcessor new XSLTProcessor(); xsltProcessor.importStylesheet(xslDoc); var resultDoc xsltProcessor.transformToDocument(configXml); // 将生成的 XSD 字符串存入 hidden input供 UniEdit 加载 var xsdStr (new XMLSerializer()).serializeToString(resultDoc); document.getElementById(dynamicXsd).value xsdStr; // 初始化 UniEdit uniEditor.LoadTemplate(data:application/xml, encodeURIComponent(xsdStr)); }关键细节data:URL 方案绕过跨域限制且 UniEdit 支持直接加载 data URLXMLSerializer确保生成标准 XML 字符串避免 IE 的xml.innerHTML产生格式错误。5.4 模板版本灰度发布用 HTTP ETag 实现平滑切换为避免全网模板更新导致旧病历无法打开UniEdit 支持LoadTemplate()传入带 ETag 的 URL// 后端响应头包含ETag: v2.3.1-20230915 uniEditor.LoadTemplate(https://hissvr/templates/current.xsd?etagv2.3.1-20230915);UniEdit 内部会首次加载时缓存 XSD 并记录 ETag后续启动时发送If-None-Match请求头若服务端返回304 Not Modified则复用本地缓存若返回新内容则触发onTemplateUpdated事件开发者可选择“强制刷新”或“保持当前模板”。从那以后我每次上线新模板都强制走一遍 ETag 验证 本地缓存清理测试哪怕多花 10 分钟——因为某次漏测导致 37 份急诊病历无法加载重建数据花了整整两天。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

PS2手柄通讯协议详解:从引脚时序到STM32读取实践

PS2手柄通讯协议详解:从引脚时序到STM32读取实践

简介:一份面向单片机开发者和电子爱好者的PS2手柄通讯手册,解决主机(如STM32)与手柄接收器之间的串行通信问题,涵盖引脚定义、通讯时序、数据格式与硬件连接示例。包体为1个PDF文档,大小146KB,内…

2026/10/15 22:16:51 阅读更多 →
分子动力学模拟全流程解析:从建模、平衡到轨迹分析的关键步骤

分子动力学模拟全流程解析:从建模、平衡到轨迹分析的关键步骤

简介:这份PDF指南系统梳理分子动力学模拟的完整流程,适合化学、物理、生物等领域需要开展MD模拟的学生与研究人员。内容从体系构建(加溶剂、加带电离子)、能量最小化,到NVT/NPT预平衡、生产项模拟,再到轨迹…

2026/10/15 22:16:51 阅读更多 →
IntelliJ IDEA 从入门到高效开发:Java 开发者的完整指南

IntelliJ IDEA 从入门到高效开发:Java 开发者的完整指南

我是一个用了十多年 Java 的开发,从最早的 Eclipse 时代一路写过来,中间也经历过 NetBeans 和 MyEclipse 的折腾,最后彻底倒向了 IntelliJ IDEA,再也没有换过家。这几年带过不少新人,每次看他们拿着编辑器硬写代码&…

2026/10/15 22:16:51 阅读更多 →

最新新闻

C语言笔试算法18题:内存与指针驱动的闭环训练体系

C语言笔试算法18题:内存与指针驱动的闭环训练体系

1. 这不是题库搬运,而是一套可闭环复用的C语言算法训练体系“18个笔试考试算法 C语言”——看到这个标题,很多人第一反应是:又一个刷题合集?点开就背代码?先别急着划走。我带过几十届校招辅导班,也参与过多…

2026/10/15 22:57:23 阅读更多 →
函数极限与连续考点全梳理:从极限计算到间断点与零点定理

函数极限与连续考点全梳理:从极限计算到间断点与零点定理

简介:本资源为函数极限与连续专题练习题PDF,适合高等数学初学者巩固概念或备考阶段自测使用。内容围绕极限存在性、连续性、同阶与高阶无穷小、无穷小量等价性等核心考点,共设置14道选择题,并配有完整题干与选项,便于读…

2026/10/15 22:57:23 阅读更多 →
前后端分离实践:Vue3+SpringBoot游戏商店系统开发详解

前后端分离实践:Vue3+SpringBoot游戏商店系统开发详解

1. 从需求到架构:游戏商店系统到底在解决什么问题不少同学看到"基于PHP、asp.net、java、Springboot、SSM、vue3的基VUE的游戏商店系统"这个标题时,第一反应是"疯了,怎么这么多技术栈揉在一起"。其实把这个标题拆开看&am…

2026/10/15 22:57:23 阅读更多 →
18bits Sigma-Delta DAC设计:架构选型、调制器与数字滤波器全解析

18bits Sigma-Delta DAC设计:架构选型、调制器与数字滤波器全解析

简介:这份资源是哈尔滨工业大学2014年工学硕士学位论文《18bits Sigma-Delta DAC的设计》,面向具备电子工程基础、对数模转换与Sigma-Delta技术有一定了解的研发人员和技术爱好者,帮助读者理解高精度、大带宽数模转换器的系统级设计原理与实现…

2026/10/15 22:57:23 阅读更多 →
单卡跑大模型:airllm分层推理与量化压缩实战指南

单卡跑大模型:airllm分层推理与量化压缩实战指南

1. 单卡跑大模型这件事,到底卡在哪第一次看到 airllm 这个项目的时候,我正在一台只有单张消费级显卡的机器上折腾一个 70B 级别的模型。显存报错几乎是必然的,OOM 的红色提示刷了满屏,那种感觉就像你明明有一整间仓库的货&#xf…

2026/10/15 22:57:23 阅读更多 →
Claude Code + DeepSeek 从零安装教程:面向纯小白,6 步拥有自己的 AI 编程助手|TaoToken 统一 Key 接入

Claude Code + DeepSeek 从零安装教程:面向纯小白,6 步拥有自己的 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/15 22:56:22 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →