当前位置:首页>PPT>像编辑PPT一样编辑HTML页面——聊聊可视化HTML编辑器的技术困局与破局之道

像编辑PPT一样编辑HTML页面——聊聊可视化HTML编辑器的技术困局与破局之道

  • 2026-05-08 23:42:25
像编辑PPT一样编辑HTML页面——聊聊可视化HTML编辑器的技术困局与破局之道
一个被遗忘了二十年的梦

2000年,Macromedia Dreamweaver 几乎是每个网页设计师的标配。拖拽一个图片到画布上,选中文字改个颜色,点一下按钮插入表格——不用写一行代码,一个网页就做好了。

二十年后的今天,Dreamweaver 早已进入维护模式,被 Adobe 官方宣判了"安乐死"。StackOverflow 2023年的调查显示,只有不到2.3%的开发者还在使用它,而 VS Code 的占有率已经超过了83%。

但有意思的是——人们对"可视化编辑网页"的需求从来没有消失过

不信?看看这些数据:

  • Webflow 在2024年营收突破2亿美元,估值超过40亿
  • Framer 2025年发布的站点数量暴涨400%,大量设计师从 Figma 迁移过来
  • Wix 全球用户超过2.5亿,2024年收入达到17亿美元
  • 连老牌的 WordPress Gutenberg 也在全力追赶可视化编辑的浪潮

问题来了:既然需求这么旺盛,为什么没有一个工具能做到"像编辑PPT一样编辑HTML"?

更进一步问:从技术上讲,到底卡在哪里?

这篇文章,我想从一个前端工程师的视角,认真拆解一下这个问题。

一、市场上有哪些类型的HTML编辑工具?

先梳理一下现状。目前市面上能"编辑HTML"的工具,大致可以分成四类:

1. 在线代码沙盒:CodePen、JSFiddle、CodeSandbox

这类工具的本质是带预览功能的代码编辑器。你写一行代码,右边出一个效果。对开发者来说效率很高——改个CSS属性立刻看到变化。

但它们的局限性也很明显:没有任何可视化操作能力。你想把一个按钮从页面左边拖到右边?对不起,请手动改CSS。你想调整一个元素的字号?去代码里找 font-size。所有操作最终都回到了写代码上。

使用者必须是开发者,没有任何例外。

2. 富文本编辑器:TinyMCE、CKEditor、Quill、Tiptap

这类工具解决的是内容编辑问题,不是页面制作问题。它们本质上是在模拟 Word——在一个流动的文档中,对文字进行加粗、倾斜、排版。

它们的核心局限在于:不支持自由布局。所有元素都在文档流中从上到下排列,你不能把一个按钮拖到页面的任意位置,也不能让两个元素并排浮动。它们管理的是 <body> 标签内的内容,而不是一个完整的 HTML 页面。

这就像你只能在 Word 里写文章,但永远做不出一张海报。

3. 网站建站平台:Wix、Webflow、Squarespace、Framer

这是目前最接近"可视化做网页"的品类,也是商业上最成功的。

Wix 面向完全不懂技术的小企业主,拖拽就完事了。但代价是生成的代码极其臃肿——大量 jQuery 依赖、内联样式、不可导出的专有标签。一旦用了 Wix,就永远绑在上面了。

Webflow 是设计师的首选。它能生成相对干净的 HTML/CSS,并且支持代码导出。但学习曲线非常陡峭——你必须理解 CSS 的 Flexbox、Grid、z-index 层叠上下文等概念才能用好它。本质上,Webflow 是让你用可视化操作来写 CSS,而不是让你像操作画布一样自由摆放元素。

Framer 最像 Figma,上手体验也最好。但它跑在 React 上,不提供生产级代码导出。你的网站只能托管在 Framer 上——它是目前锁定效应最强的平台之一。

各家都有各家的好,但没有一家能做到"打开浏览器就能用、像拖PPT一样做网页、导出一份干净的HTML文件"。

4. 桌面客户端:Dreamweaver、Pinegrow、Bootstrap Studio

这一类已经基本退出了主流舞台。Dreamweaver 的失败几乎成了一种象征——它死于无法适应现代 Web 开发的节奏。React、Vue、TypeScript、构建工具链,Dreamweaver 一个都跟不上。设计师跑去了 Figma,开发者跑去了 VS Code。

Pinegrow 和 Bootstrap Studio 作为小众工具还在维护,但它们要么绑定特定框架(Bootstrap),要么需要安装和学习成本,始终没有获得广泛采用。

二、核心困局:为什么"像编辑PPT一样编辑HTML"这么难?

分析了这么多竞品之后,你会发现一件很有趣的事:

所有成功的 HTML 编辑工具,都在"设计自由度"和"响应式布局"之间做了一个取舍。 没有任何工具真正同时实现了这两者。

这不是因为没有人想过,而是因为 Web 的根本机制和"自由画布"的根本假设是冲突的

设计工具的逻辑:固定画布,绝对坐标

打开 Figma、Photoshop、PowerPoint,你面对的是一个固定尺寸的画布。一个按钮放在 (100, 200) 的坐标上,它就永远在那里。这是所有设计工具的底层心智模型——像素级精确控制。

Web 的逻辑:流动文档,相对关系

而 HTML/CSS 的底层心智模型完全不同。Web 页面是一个流动的文档,元素的最终位置由无数因素动态决定:父容器的宽度、相邻元素的高度、用户的屏幕尺寸、浏览器的默认样式。position: absolute 确实能让你把元素放在一个精确的像素位置,但它会把元素从文档流中抽离——这个元素不再影响其他元素的布局,也不受其他元素影响。

这意味着什么?

  • 如果一个按钮 position: absolute; left: 200px,当父容器宽度从1920px变成375px时,按钮不会自动调整——它依然在 left: 200px,可能已经跑到了屏幕外面
  • 如果两个绝对定位的元素重叠了,没有"自动避让"机制——它们就是会重叠
  • 你无法使用 Flexbox 或 Grid 来控制绝对定位元素的排列——它们已经脱离了布局系统

这就是困局的本质:你要么牺牲设计自由度来换响应式(Webflow 的路),要么牺牲响应式来换设计自由度(产生一堆不可维护的绝对定位代码)。

有没有第三种可能?

三、技术突破口:CSS Transform Translate

有意思的事情来了。

如果你仔细想一下:拖拽操作真的需要改变元素在文档流中的位置吗?

在 PPT 里,拖拽一个元素意味着改变它的 left 和 top 坐标。在 Web 里,我们习惯性地认为"拖拽 = 改变 position + 坐标"。但这其实是一种思维惯性。

有一个 CSS 属性可以做一件非常微妙的事:让元素在视觉上移动,但在文档流中保持原位。

这个属性就是 transform: translate()

ounter(lineounter(lineounter(lineounter(lineounter(line/* 这个 div 在文档流中占据的是原始位置 *//* 但它在屏幕上被渲染到了偏移 (120px, 80px) 的地方 */div {  transformtranslate(120px80px);}

这有什么了不起的?

transform 不触发布局回流(reflow)。 当你改变一个元素的 transform 时,浏览器只做合成(compositing),不重新计算布局。这意味着:

  • 拖拽操作的性能极高,60fps 稳定
  • 其他元素不会因为你的拖拽而重新排列
  • 元素的文档流位置保持不变——它依然参与 Flexbox/Grid 的布局计算
  • 导出代码时,你可以选择保留 translate 值作为"视觉位置",也可以直接去掉让它回归文档流

这个技术选择带来了一种全新的心智模型:你不是在"改变页面的布局结构",你是在"微调元素在视觉空间中的位置"。

你拖拽一个按钮往右移动了 100px——你是对它的呈现位置做了一个微调,而不是说"这个按钮从此脱离文档流,成为一个绝对定位的孤岛"。

这才是真正适合"可视化编辑 HTML"的底层操作模型。它既给了你 PPT 般的自由拖拽体验,又保留了 HTML 文档流的响应式能力。

四、contentEditable 的泥潭

解决了布局问题,下一个难题是文字编辑

浏览器提供了一个看起来很完美的 API:contentEditable。给一个元素加上这个属性,用户就能直接在页面上编辑文字。几乎所有 WYSIWYG 编辑器都建立在这个 API 之上。

但用过的人都知道——contentEditable 是一个天坑。

它的核心问题是:浏览器从未真正为"生产级文本编辑"设计过这个 API。 不同浏览器对同一个操作产生完全不同的 HTML:

操作
Chrome
Firefox(旧版)
Safari
按 Enter 换行
产生 <div> 包裹的新行
产生 <br> 标签
产生 <div>
粘贴 Word 内容
带进数百个专有标签和样式
同左
同左,CSS 声明更多
Backspace 删行
可能残留空标签
行为不一致
可能删除不应删除的元素

这就是为什么早期 WYSIWYG 编辑器产出的 HTML 被戏称为 "div soup" —— 一层又一层的 <div> 嵌套,混杂着各种浏览器的"创作"。

Google Docs 的团队最终完全放弃了 contentEditable,自己实现了一套基于 Canvas 的渲染引擎。但这需要几百个工程师和数年的开发时间——对绝大多数项目来说不现实。

对于独立工具来说,更务实的做法是:限制 contentEditable 的使用范围,配合严格的输入过滤和序列化清理。

具体策略包括:

  • 按需激活:只在用户主动双击选中的元素上开启 contentEditable,编辑完成后立即关闭
  • 拦截 Enter:通过 e.preventDefault() 统一拦截,用 document.execCommand('insertLineBreak') 保证跨浏览器行为一致
  • 编辑前快照:进入编辑前保存 innerHTML 快照,编辑完成后做 diff,只记录有意义的变化到 undo 历史
  • 导出前清理:序列化时移除所有 data-hve-* 属性、contenteditable 残留标记和编辑器注入的样式标签

这些策略虽然不能完全消除 contentEditable 的问题,但能把副作用控制在可接受的范围内。

五、预览与编辑的"双DOM"架构

还有一个容易被忽略但非常棘手的问题:当你导入一个包含 JavaScript 的 HTML 文件时,怎么在不破坏编辑环境的前提下预览它?

为什么 innerHTML 不行

最直观的做法是把 HTML 用 innerHTML 注入到一个容器中。但 HTML5 规范明确规定:通过 innerHTML 插入的 <script> 标签不会被执行。这是一个安全机制——防止 XSS 攻击。

结果就是:用户导入的 HTML 页面在预览中"死"了——按钮没反应、轮播图不动、交互功能全部失效。

为什么不直接在主页面上跑

那把导入的 HTML 直接放到主页面 DOM 中,让脚本执行呢?也不行。因为:

  • 导入页面的 JavaScript 可能用 document.querySelector 选到了编辑器自身的 UI 组件
  • 全局 CSS 可能覆盖编辑器的工具栏、选择框、控制条的样式
  • window.onload 等全局事件可能干扰编辑器的初始化逻辑

双 DOM 隔离方案

解决方案是利用 iframe 的 srcdoc 属性,构建一套"双 DOM"架构:

编辑模式:页面使用真实 DOM。所有可视化操作(拖拽、选中、编辑)直接修改真实 DOM。编辑器自身的 chrome 元素(工具栏、选择框、对齐线等)通过 [data-hve-editor] 属性标记,在导出时自动剔除。

预览模式:将序列化后的 HTML 注入到一个全屏 iframe 的 srcdoc 属性中。利用 srcdoc 的三个特性:

  1. 脚本隔离执行:iframe 中的 <script> 标签正常执行,不受主页面 CSP 限制
  2. 样式天然隔离:iframe 有自己的样式上下文,不会和编辑器 UI 冲突
  3. about:srcdoc 同源:可以通过 iframe.contentDocument 访问 iframe 内部 DOM(这是后续导出和切换回编辑模式的关键)

切换回编辑模式时:从 iframe 的 contentDocument 中提取已被脚本修改过的 DOM(比如表单填写了值、轮播图切换了状态),清理编辑器残留物后,注入回主页面。同时保存 iframe 的滚动位置,在 DOM 重建后用 requestAnimationFrame 恢复。

这套架构的核心价值在于:预览效果和用户直接用 Chrome 打开 HTML 文件看到的效果完全一致——因为本质上就是用浏览器的正常渲染管线来展示的,跟你把 HTML 文件拖进浏览器地址栏一模一样。

六、工程实现中的几个关键细节

上面的讨论偏架构,下面聊几个具体的实现问题。这些都是在实际编码中"踩坑"后沉淀下来的经验。

6.1 对齐吸附与等距检测

PPT 用户很熟悉一个体验:拖拽元素时,当它和旁边元素对齐了,会自动"吸附"过去,并且显示一条品红色的参考线。

在 Web 里实现这个功能,核心逻辑是:

水平方向检测:遍历所有兄弟元素(非编辑器的、非拖拽中的),获取各自的 getBoundingClientRect(),检查拖拽元素的左边缘、右边缘、水平中心是否与参考元素的对应边缘在 6px 阈值内。

等距检测:当页面上有三个或以上元素时,检查相邻元素之间的间距是否相等。如果 B.left - A.right ≈ C.left - B.right(误差在 4px 内),则显示蓝色等距标记(双箭头 + 间距数值)。

性能关键:所有计算在 requestAnimationFrame 中完成。不要在 pointermove 事件中直接做 DOM 操作——pointermove 可以每秒触发几百次,而屏幕刷新只有 60Hz,多余的调用全部白费。

6.2 格式刷的 CSS 属性传播

格式刷(Format Painter)是 Office 套件中最受欢迎的功能之一。在 Web 中实现它,比看起来复杂一些:

  1. 从源元素读取 15+ 个计算后样式,包括:colorbackgroundColorfontSizefontWeightfontFamilyfontStyletextDecorationtextAlignlineHeightletterSpacingborderRadiusborderboxShadowopacitypaddingtextShadow
  2. 存储为扁平键值对
  3. 在 body 上设置 cursor: copy 提示用户当前处于格式刷模式
  4. 用户单击目标元素时,逐属性写入 element.style(内联样式)
  5. 记录完整的 before/after 样式状态到 undo 历史
  6. 双击格式刷按钮进入连续模式(350ms 内的两次点击),可以批量涂抹多个元素

注意这里读取的是 getComputedStyle 返回的计算后样式(浏览器最终解析的值),写入的是 element.style(内联样式,权重最高)。这意味着格式刷应用的是视觉等效样式,不依赖原始 CSS 规则的来源——不管是内联、<style> 标签还是外部样式表,都能正确复制。

6.3 拖拽中的 5px 死区阈值

5px,一个很小的数字,但它对用户体验的影响极大。

如果没有这个死区(dead zone),用户每次点击选中元素时,只要鼠标稍微抖动一下——哪怕只有 1px——就会触发拖拽逻辑。表现为"选中不稳定":你点了一个元素想选中它,结果它跳了一下。

具体的状态机设计:

ounter(lineounter(lineounter(lineounter(linepointerdown → pending(待确认)   ↓ 移动 < 5px → 保持 pending,cursor 变为 grabbing   ↓ 移动 >= 5px → drag(拖拽中),元素开始跟随鼠标   ↓ 抬起 → 若 pending → click(选中);若 drag → 提交位移

在 pending 阶段,1-2px 的移动就会触发 cursor: grabbing(视觉反馈),但元素本身不动。只有当移动超过 5px,才进入真正的拖拽。这让"有拖拽能力但不误触"的交互体验成立。

6.4 边缘检测:拖拽还是选中文字?

另一个交互细节:当用户点击的是一个包含大量文字的 <div>,ta 可能想做两件事——拖拽移动这个 div,或者选中其中的文字。

怎么判断意图?一个简单的启发式规则:

ounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(lineounter(line// 如果鼠标在元素边缘 10px 以内 → 拖拽意图// 如果鼠标在元素内部,且元素有文字 → 文字选中意图(不触发拖拽)function shouldStartDrag(el, offsetX, offsetY) {  const rect = el.getBoundingClientRect();  const nearEdge = offsetX < 10 || offsetY < 10    || (rect.width - offsetX) < 10 || (rect.height - offsetY) < 10;  return nearEdge || !hasTextContent(el);}

边缘区域(10px 缓冲区)的拖拽总是生效,内部区域只在没有文字内容时才生效。这让文字编辑和自由拖拽可以和平共存。

6.5 锁定元素

还有一个容易被忽略但实际使用中很重要的功能:锁定元素

当你精心调整好一个导航栏的布局后,你不希望在拖拽下面的内容区域时,不小心把导航栏也拖走了。锁定元素(data-hve-locked 属性 + 锁图标遮罩 + cursor: not-allowed)让你能把那些"完成了,不想再动"的元素保护起来。

这其实是 PPT 中"锁定图层"的 Web 版本——又一个受设计工具启发的交互模式。

七、一款落地的工具

把上面这些技术思路组合在一起,就得到了一款可用的产品。

heyhtml.com 是一个在线 HTML 可视化编辑器,把"像编辑 PPT 一样编辑 HTML"这个想法完整地做出来了。它不是那种"点几下生成一个模板页面"的工具——它给你一个真正的空白画布,你可以像操作设计软件一样拖拽、选中、编辑、排版,最终导出干净的 HTML 文件。建议pc端打开体验更佳~

几个我觉得做对了的设计决策:

零门槛。打开网页就能开始编辑,页面本身就是 Demo——你看到的所有内容都可以选中、拖拽、修改。没有注册流程,没有付费墙。

自由拖拽 + 文档流保留。所有元素使用 transform: translate() 实现位移,视觉上可以任意摆放,但文档流位置不变。既给了 PPT 的自由度,又不会导出不可维护的绝对定位代码。

格式刷 + 完整样式控制。不只是 B/I/U 文字格式化,还支持圆角、阴影、透明度、字号、字重、颜色等视觉属性的可视化调节。格式刷能跨元素复制完整的 CSS 样式。

查看模式。切换到非编辑模式时,页面通过 iframe srcdoc 渲染导入的 HTML 文件。脚本正常执行,按钮可以点击,轮播图会动。所见即所得,和 Chrome 直接打开文件一模一样。

PDF 导出。自动计算分页位置,支持 A4/Letter/16:9 幻灯片等多种页面尺寸,底层用 html2canvas 做渲染。

键盘快捷键全覆盖。Ctrl+B/I/U 文字格式,Ctrl+Z/Shift+Z 撤销重做,Ctrl+O/S 文件打开保存,Ctrl+L 锁定元素——和桌面软件的肌肉记忆保持一致。

这些不是"一个工具写给自己看的功能清单"——它们是"一个被实际使用打磨过的交互系统"。

八、一个更大的视角

最后聊一点更大的观察。

2025-2026年我们看到一个明显的趋势:代码编辑和可视化编辑的边界正在模糊。

  • GitHub Copilot 在 VS Code 里让你用自然语言生成代码
  • Vercel v0 让你描述一个 UI,它直接生成 React 组件
  • Figma AI 开始支持从设计稿生成前端代码
  • Cursor 正在重新定义"AI 时代的代码编辑器"

但有一件事 AI 目前做不好:精确的视觉微调。

AI 可以给你一个 80 分的初始方案,但要把一个按钮往左挪 3px、把标题的字号从 28px 调整到 32px、让两个卡片之间的间距和第三个卡片对齐——这些需要的是视觉判断,而不是代码生成。

这就是可视化编辑不可替代的价值。它不是为了替代代码,而是为了处理那些"用代码表达很别扭,用眼睛判断很自然"的设计决策。就像为什么 Figma 不是 Copilot——设计是一个观察-调整-再观察的循环,中间需要一双人眼。

Dreamweaver 的失败不是因为"可视化编辑 HTML"这个想法错了,而是因为那个时代的技术方案不够好。CSS Transform、File System Access API、srcdoc iframe 隔离——这些现代 Web 平台的能力是二十年前完全不可想象的。

有时候,一个被遗忘的老想法,在新的技术条件下重新做一遍,可能是更好的产品策略——而不是追逐最新的热词。


本文技术方案部分来源于 heyhtml.com 的实际工程实践。它是一个免费在线 HTML 可视化编辑器,可以在浏览器中像编辑 PPT 一样编辑 HTML 页面,直接导出干净的 HTML 文件。欢迎前往 heyhtml.com 体验。

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-09 12:32:46 HTTP/2.0 GET : https://h.sjds.net/a/513212.html
  2. 运行时间 : 0.150385s [ 吞吐率:6.65req/s ] 内存消耗:4,424.68kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=dd0e3dadb4b2974e282f311230754c68
  1. /yingpanguazai/ssd/ssd1/www/h.sjds.net/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/h.sjds.net/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/h.sjds.net/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/h.sjds.net/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/h.sjds.net/runtime/temp/ad153693ed39fba6d1bda2fe72512cde.php ( 12.06 KB )
  140. /yingpanguazai/ssd/ssd1/www/h.sjds.net/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000655s ] mysql:host=127.0.0.1;port=3306;dbname=h_sjds;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000930s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.006440s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.004251s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000663s ]
  6. SELECT * FROM `set` [ RunTime:0.000285s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000715s ]
  8. SELECT * FROM `article` WHERE `id` = 513212 LIMIT 1 [ RunTime:0.000653s ]
  9. UPDATE `article` SET `lasttime` = 1778301166 WHERE `id` = 513212 [ RunTime:0.003830s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000292s ]
  11. SELECT * FROM `article` WHERE `id` < 513212 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000575s ]
  12. SELECT * FROM `article` WHERE `id` > 513212 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000509s ]
  13. SELECT * FROM `article` WHERE `id` < 513212 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.001075s ]
  14. SELECT * FROM `article` WHERE `id` < 513212 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.019844s ]
  15. SELECT * FROM `article` WHERE `id` < 513212 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.041441s ]
0.152195s