LayUI后台界面开发实战:模块化加载与表格表单高效实现
简介LayUI 是一款经典且轻量的 Web UI 前端开发框架专为熟悉原生 HTML/CSS/JS 的开发者设计用于快速搭建后台管理系统、企业官网及各类管理面板有效解决组件复用、界面美观与跨屏适配等常见问题。无论是零基础的新手还是追求效率的资深工程师都能通过其模块化规范与简洁 API 降低上手门槛。这份 zip 压缩包体积仅 360KB共含 17 个文件以 4 个 CSS 样式表、1 个 JavaScript 脚本、字体图标文件覆盖 eot、ttf、svg、woff 等格式以及测试页面为主无需复杂构建即可直接引入项目进行预览与二次开发。目前已有 730 人下载学习适合作为前端入门实践与模板参考。资源内提供 LayUI v2.6.8 的完整目录结构涵盖核心样式、模块化组件库、图标字体与示例测试页可快速查看表格、导航、弹窗等组件的真实效果结合描述中提到的响应式布局、浏览器兼容、主题定制与丰富插件生态读者能高效地将这套框架应用于实际开发显著提升前端构建效率。1. 帮你从零搭好后台界面LayUI 为什么还在被很多人用手头要快速出一个内部管理系统的前端界面没有专业前端配合后端同学自己上手用什么最省事我的答案是 LayUI。它不跟你谈虚拟 DOM、响应式数据流那套理念给的是下载即用、引入即渲染的整套后台 UI 组件。绝大多数管理后台的页面长什么样表格加表单加弹层LayUI 正好全覆盖。初次接触框架的人半天就能把登录页加列表页跑通这样的上手速度在如今的前端生态里确实不多见。本文会按真实落地的顺序展开先讲环境和核心机制再拆表格、表单两个高频场景最后是踩坑记录和几个进阶技巧。整篇目标是让你从“听说过”到“能照着搭出一个可用的后台页面”。2. LayUI 框架的核心机制模块化加载为什么是它的命根子2.1 不搞清楚 layui.use后面所有组件都会出问题LayUI 把每个 UI 组件封装成一个模块表格是 table表单是 form弹层是 layer。页面里要用哪个组件得先通过layui.use([table, form], function() { ... })把模块加载进来。很多人第一次写的时候直接在全局写了table.render(...)控制台报错table is not defined就是这个机制没理解。layui.use([table, form], function() { var table layui.table; var form layui.form; table.render({ elem: #dataTable, url: /api/list, cols: [[ { field: id, title: ID }, { field: name, title: 名称 } ]] }); });这段代码有两个关键点一是layui.use的数组参数明确声明需要哪些模块只有声明了才能拿到对应实例二是回调函数里通过layui.table等命名空间获取组件实例这种方式避免了全局变量污染。如果项目里要同时操作多个组件把数组依次写全即可不需要嵌套多个 use。经常有人把layui.use当成类似document.ready的存在其实它管的是模块加载跟 DOM 是否加载完没有必然关系。2.2 先分清 layui.js 和 layui.all.js两种加载方式的差异很多教程直接让你引入一个layui.all.js说这样所有组件都能用。这个说法不准确。layui.js是模块化加载的核心文件按需加载组件代码layui.all.js则是把所有组件一次性打包进去。两者各有适用场景。使用layui.js时页面首次加载更快因为用不到的组件代码不会下载但要确保服务器能正确返回模块文件并且不要随意改动目录结构。使用layui.all.js时虽然无法通过layui.use动态加载不过它确实省事——不用考虑路径问题直接全局就能用。实际项目里如果页面是单页应用且组件使用频繁用 all 版本反而更省心如果项目按页面拆分、每个页面用到的组件少用模块化版本更好。2.3 模块扩展机制把自定义功能挂进 LayUI 体系里后台系统的特殊逻辑很多比如导出报表、批量审核弹窗。LayUI 提供了扩展机制把自己写好的 js 文件定义成一个模块然后在业务代码里通过layui.extend指定别名就能像使用内置组件一样使用它。// 自定义模块文件 myMod.js layui.define(function(exports) { var myMod { hello: function() { layer.msg(自定义模块工作正常); } }; exports(myMod, myMod); }); // 业务页面 layui.config({ base: /js/modules/ }).extend({ myMod: myMod }); layui.use([myMod], function() { var myMod layui.myMod; myMod.hello(); });这个机制的关键在于layui.define和exports的配合前者声明这是一个 LayUI 模块后者把模块内容暴露出去。业务页通过layui.config指定模块基础路径再用extend做别名映射。常见的坑是base路径配置错误导致模块加载 404——建议先打开浏览器开发者工具的 Network 面板看实际请求的路径跟文件真实路径是否一致这是排查这类问题最快的方式。3. 后台表格实战数据渲染、分页和工具栏的完整配置3.1 table.render 的接口对接URL 参数和数据格式约定表格是后台系统出现频率最高的组件。LayUI 表格通过table.render接收数据默认情况下它期望后端接口返回特定格式的数据结构。table.render({ elem: #userTable, url: /api/user/list, page: true, limit: 10, cols: [[ { type: checkbox }, { field: username, title: 用户名, width: 120 }, { field: role, title: 角色, width: 100, templet: function(d) { return d.role admin ? 管理员 : 普通用户; } }, { field: status, title: 状态, width: 80, templet: function(d) { return d.status 1 ? span stylecolor:#5FB878;启用/span : span stylecolor:#FF5722;停用/span; } }, { title: 操作, width: 160, toolbar: #toolbar } ]] });后端返回的数据格式需要是{code:0,msg:,count:100,data:[...]}这种结构其中count是总记录数data是当前页的数据数组。表格会自动把page参数当前页码和limit参数每页条数拼到请求 URL 上。后端如果用的是 Spring 系列的 PageHelper通常需要在 controller 里做一次字段转换把total映射成count。这个数据格式约定是新手最容易忽略的地方——后端返回{code:200, total:100, rows:[...]}再常见不过表格就显示不出数据。3.2 自定义列模板和工具栏不额外引入模板引擎的写法列模板templet是处理显示逻辑的主要手段。除了上面的函数写法它还支持直接书写模板字符串。后端状态下表字段d.status直接暴露通过templet函数渲染成富文本标签这是最常见的做法既不用写template字符串、也不用纠结特殊字符转义问题。var $ layui.jquery; table.on(tool(userTable), function(obj) { var data obj.data; if (obj.event edit) { // 打开编辑弹窗 layer.open({ type: 1, title: 编辑用户, content: buildEditForm(data) }); } else if (obj.event delete) { layer.confirm(确定删除该用户吗, function(index) { // 执行删除接口 $.ajax({ url: /api/user/delete, method: post, data: { id: data.id }, success: function(res) { if (res.code 0) { layer.close(index); table.reload(userTable); } } }); }); } });这里的table.on(tool(userTable))是事件监听userTable对应table.render里elem属性指向的表格的 lay-filter 值。工具栏按钮需要在cols配置的toolbar属性指定的模板里给按钮加上lay-eventedit这样的属性事件回调里才能正确区分操作类型。常见错误是lay-event没加或者写错了名字点了之后完全没反应。3.3 数据表格的常见分页与排序问题接口层要配合什么分页参数默认是page和limit但这只是默认值。后端分页框架如果接受的是pageNum、pageSize可以直接在request配置项里做映射处理。排序开启后点击表头会向后台发送field和order参数这个参数含义也需要知悉。开启排序只需要cols里增加sort: true配置后端通常按ORDER BY field {order}处理。要紧的是两个地方一是limit默认值跟前端page组件里的可选值保持一致二是总条数count不要写死写错。这几个参数对齐之后表格分页基本不出问题。4. 表单与弹窗联动把后台上大多数增删改查交互做顺4.1 form.render 的触发时机动态插入表单后为什么样式会失效后台页面里最常见的操作就是点“新增”按钮弹出表单弹窗填完提交。这里有一个非常容易翻车的地方表单是动态插入弹窗里的如果只插入 HTML 不做重新渲染select、checkbox、radio 的样式就是原生 HTML 的样子跟整个 LayUI 风格完全不一致。function openEditDialog(data) { var html [ form classlayui-form lay-filtereditForm, div classlayui-form-item, label classlayui-form-label用户名/label, div classlayui-input-block, input typetext nameusername value (data ? data.username : ) classlayui-input, /div, /div, div classlayui-form-item, label classlayui-form-label角色/label, div classlayui-input-block, select namerole, option valueadmin管理员/option, option valueuser普通用户/option, /select, /div, /div, div classlayui-form-item, div classlayui-input-block, button classlayui-btn lay-submit lay-filtersubmitBtn提交/button, /div, /div, /form ].join(); layer.open({ type: 1, title: data ? 编辑用户 : 新增用户, area: 500px, content: html, success: function() { form.render(); // 关键每次弹窗内容渲染后必须调用 } }); }这个弹窗里塞了select组件form.render()的作用就是在 HTML 插入后重新初始化一次表单组件。有人把form.render()写在layer.open前面那等于在弹窗内容还没插入的时候渲染自然没效果。正确做法是放在success回调里等弹窗 DOM 准备完毕再渲染。要注意form.render()默认渲染所有表单元素如果页面中有多个表单结构可以指定参数比如form.render(select)来限定只渲染某类组件、减少不必要的开销。4.2 表单提交拦截lay-submit 的监听与接口回调表单提交的常见做法是在按钮上标记lay-submit和lay-filter然后在form.on(submit(过滤器值))里拦截提交、手动发请求。form.on(submit(submitBtn), function(data) { var fieldData data.field; // 前端基础校验可以放这里 if (!fieldData.username) { layer.msg(用户名不能为空); return false; } $.ajax({ url: /api/user/save, method: post, data: fieldData, success: function(res) { if (res.code 0) { layer.closeAll(); table.reload(userTable); layer.msg(保存成功); } else { layer.msg(res.msg || 保存失败); } }, error: function() { layer.msg(网络异常); } }); return false; // 阻止表单默认提交 });data.field是框架自动收集的表单数据key 就是表单元素的name属性。把return false写在 ajax 之后是关键否则浏览器会按原生表单行为提交一次页面。比较麻烦的是编辑场景下的数据回填一种方式是编辑前先查一次详情接口另一种是把行的数据直接塞给表单。多数情况下我推荐先查详情接口——表格里的列表字段往往不全直接回填会漏字段。4.3 laydate 日期组件与表单字段的联动一类典型的时间范围需求后台的筛选区必定有“开始时间”、“结束时间”这一对输入。LayUI 的 laydate 组件支持范围选择也支持两个独立控件联动。laydate.render({ elem: #startTime, done: function(value, date) { laydate.render({ elem: #endTime, min: date // 起点日期的 date 对象 }); } });这段逻辑实现了选择开始时间后结束日期的可选范围顺延到开始时间之后避免结束时间早于开始时间。要注意done回调里的date参数不是字符串是一个对象含year、month、date等字段直接传给第二个渲染实例的min配置是可行的。实际项目里还涉及两个弹窗互相重置的问题处理方式一般是每次筛选条件变化时重新渲染目标控件并清理已选值。5. LayUI 避坑指南六种常见问题的现象、原因与解决5.1 图标不显示或者出现乱码方块现象页面所有字体图标显示成方块或者干脆没有图标。 原因LayUI 的字体文件iconfont路径配置不正确或者静态资源目录没有包含字体文件。 解决在layui.css不远处应该存在fonts目录放置了字体文件。检查站点是否拦截了.woff、.ttf后缀的请求。部署到二级目录时确认 css 里引用的路径相对位置是否仍然正确。建议在浏览器 Network 面板里筛选font类型逐一查看字体文件的请求状态。5.2 table 渲染请求了两次现象打开页面表格数据接口被请求了两遍。 原因最常见的是把table.render同时写在两个地方——比如既在layui.use回调里写又在layui.all.js全局模式下再写一遍。 解决检查页面的 js 引入如果用了layui.all.js就不需要layui.use包裹直接全局使用如果用layui.js就必须在layui.use回调里调用。另外还要检查table.render是否绑定了两次初始化事件比如在弹窗打开和页面加载时都执行了同一段渲染逻辑。5.3 弹层内的表单下拉框显示为原生控件现象layer.open 弹窗里的 select 依旧显示成浏览器原生样式。 原因弹窗内容插入 DOM 后没执行form.render()。 解决在layer.open的success回调里调用form.render()。如果弹窗里还有日期控件也需要在插入后重新laydate.render否则日期选择器点击无反应。5.4 表格显示“无数据”但接口确实返回了记录现象接口返回是[{ id: 1, name: 张三 }, ...]但表格一直渲染为无数据。 原因接口返回的数据格式不符合 LayUI 的默认约定。默认要求是{ code: 0, msg: , count: 2, data: [{...}] }其中code必须是 0。后端经常返回code:200表示成功这时表格会判定为失败。 解决两个方向。一个是在后端接口做适配把code改成 0、total改成count另一个是用parseData回调处理——在table.render里配置parseData: function(res) { return { code: 0, msg: , count: res.total, data: res.rows }; }。推荐优先用parseData因为只需改前端一处、后端无需动5.5 弹窗点确定后无法关闭现象layer.confirm里点确定弹窗关不掉。 原因layer.confirm的回调函数里没有调用layer.close(index)或没有返回true。回调函数默认不会自动关闭弹窗需要手动控制。 解决在确认回调里主动调用layer.close(index)如果回调里要发 ajax 请求等success回调里再调用layer.close这样能防止用户连续点击重复提交。5.6 table 行事件拿不到当前行数据现象操作列的删除按钮点击后obj.data为 undefined。 原因table.on(tool(...))监听的过滤器值写错了或者col配置的toolbar模板不是字符串而是 DOM 节点选择器。 解决先确认table.render的elem对应元素上设置了lay-filter你的表名同时确认toolbar模板里按钮的lay-event与监听分支的事件名一致。用浏览器控制台打印obj确认拿到的数据结构格式。6. 进阶实操封装一个项目通用的 Crud 表格处理工具后台上 70% 以上的页面都是“左侧查询区 右侧表格区 顶部操作按钮 行内操作”的固定结构。把表格封装成一个通用工具之后每个页面只需要写配置项这个思路能大幅减少重复代码。// commonTable.js layui.define([table, layer, form], function(exports) { var table layui.table; var commonTable { render: function(options) { // options.url, options.elem, options.cols, options.where return table.render({ elem: options.elem, url: options.url, where: options.where || {}, page: options.page false ? false : true, limit: options.limit || 10, cols: options.cols, parseData: function(res) { return { code: 0, msg: res.msg || , count: res.total || res.count || 0, data: res.rows || res.data || [] }; } }); }, reload: function(tableId, where) { table.reload(tableId, { where: where, page: { curr: 1 } }); } }; exports(commonTable, commonTable); });在业务页面里只需要引入这个自定义模块并写配置layui.use([commonTable, form], function() { var commonTable layui.commonTable; var table layui.table; var $ layui.jquery; commonTable.render({ elem: #listTable, url: /api/list, cols: [[ { field: id, title: ID }, { field: name, title: 名称, templet: function(d) { return d.name || -; } }, { title: 操作, toolbar: #rowTpl } ]] }); // 查询按钮 $(#searchBtn).on(click, function() { var where { keyword: $(#keyword).val(), status: $(#status).val() }; commonTable.reload(listTable, where); }); });封装时要注意几点。一是parseData的兼容处理要写全因为不同后端返回的分页字段名可能不同二是统一的reload一定要重置当前页码为 1不然用户在第 5 页点查询结果还在第 5 页、数据对不上三是where参数可以直接传表单收集的对象但空值字段要在请求前做一次过滤——常见的坑是传了一堆空字符串参数后端排序和查询逻辑都被干扰。更纯粹的做法是判断空值后直接删掉字段这一点对后端接收参数不够宽容的项目尤其重要。做这套封装最大的好处是新项目页面开发基本就是复制粘贴 改配置。某个不算复杂的管理页面从拆需求到联调完毕半天时间就够了。当然LayUI 也有明显的边界它的组件风格偏后台管理跟面向 C 端的复杂交互相去甚远同时官方维护节奏放缓新版本迭代不像主流框架那样频繁。如果你的团队完全不熟悉 jQuery 的写法团队成员更习惯 Vue 或 React 的思维模式那学习和维护成本就需要纳入选型考量。建议是内部管理系统、运营后台这类重表格重表单的页面用 LayUI 依然高效省事需要大量自定义组件的开放性页面还是老老实实选主流框架。每次接新项目我都会先把查询区、表格、弹窗这三板斧的模板准备好再把 parseData 和后端约定好——前期花半小时对齐后面的开发节奏会舒服很多希望帮到你。本文还有配套的精品资源点击获取

相关新闻

PyCharm中numpy/pandas/matplotlib导入失败:根因与完整解决方案

PyCharm中numpy/pandas/matplotlib导入失败:根因与完整解决方案

/* 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 1:11:54 阅读更多 →
设备出海怎么联网?波兰物联网卡与国际物联网卡选型要点

设备出海怎么联网?波兰物联网卡与国际物联网卡选型要点

波兰部分城市正在推进远程抄表。从行业动态看,一些项目采用带GSM传输的智能水表,也有公社部署远程抄表装置,单台水表月均连接成本成为关注点。表面看只是换表,背后却把设备出海怎么联网推到台前。水表、气表、工业网关到了当地&am…

2026/10/15 1:11:54 阅读更多 →
LS-DYNA重启动技术原理与工程实践指南

LS-DYNA重启动技术原理与工程实践指南

1. 项目概述在工程仿真领域,重启动分析就像给一辆正在行驶的卡车更换发动机——既要保证车辆继续前进,又不能因为更换过程导致失控。LS-DYNA作为显式动力学分析的行业标准工具,其重启动功能是处理复杂仿真问题时不可或缺的"急救包"…

2026/10/15 1:11:54 阅读更多 →

最新新闻

ECharts柱状图配置全解析:从基础到动态排序与性能优化

ECharts柱状图配置全解析:从基础到动态排序与性能优化

/* 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 1:57:11 阅读更多 →
LVGL 图像按钮(lv_imgbtn)实战指南:Simple Image button 示例全解与源码原理

LVGL 图像按钮(lv_imgbtn)实战指南:Simple Image button 示例全解与源码原理

嵌入式物联网智能硬件嵌入式GUI硬件开发 【免费下载链接】HoloCubic 带网络功能的伪全息透明显示桌面站 项目地址: https://gitcode.com/gh_mirrors/ho/HoloCubic 点击查看 免费下载 本篇文章围绕 HoloCubic 固件所采用的 LVGL 图形库中的 lv_imgbtn(图…

2026/10/15 1:57:11 阅读更多 →
深入解析 LAMMPS `compute msd/chunk`:逐块均方位移的计算原理与实战配置

深入解析 LAMMPS `compute msd/chunk`:逐块均方位移的计算原理与实战配置

科研科学计算高性能计算 【免费下载链接】lammps Public development project of the LAMMPS MD software package 项目地址: https://gitcode.com/gh_mirrors/la/lammps 点击查看 免费下载 导读 compute msd/chunk 是 LAMMPS 中用于按 chunk(原子分组…

2026/10/15 1:57:11 阅读更多 →
车机双系统下用ASAN抓内存踩踏:8155p上Android.mk与Android.bp配置实战

车机双系统下用ASAN抓内存踩踏:8155p上Android.mk与Android.bp配置实战

/* 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 1:57:11 阅读更多 →
Go 1.27.1 内存局部性调优实录:压榨 CPU 缓存行命中率的工程实践

Go 1.27.1 内存局部性调优实录:压榨 CPU 缓存行命中率的工程实践

在微服务吞吐量达到数万 QPS 的高性能网关或高频事件调度引擎中,单纯依赖算法时间复杂度(如将 $O(N)$ 降为 $O(1)$)已经无法进一步带来数量级的性能突破。很多底层服务开发者发现,即便 CPU 利用率跑满了 100%,服务处理…

2026/10/15 1:57:11 阅读更多 →
Start Bootstrap 主题 One Page Wonder 详解:基于 Bootstrap 4 快速构建单页网站

Start Bootstrap 主题 One Page Wonder 详解:基于 Bootstrap 4 快速构建单页网站

前端文档 【免费下载链接】startbootstrap A library of free and open source Bootstrap themes and templates 项目地址: https://gitcode.com/gh_mirrors/st/startbootstrap 点击查看 免费下载 One Page Wonder 是 Start Bootstrap 开源仓库中的一款经典单页主题…

2026/10/15 1:56:09 阅读更多 →

日新闻

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/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/14 7:53:34 阅读更多 →