乐于分享
好东西不私藏

批量加水印还能一键去水印?我写了一个PDF处理工具一键搞定

批量加水印还能一键去水印?我写了一个PDF处理工具一键搞定
市面上不缺加水印的工具,但要么收费,要么需要把文件上传到陌生网站,要么界面复杂得像飞机驾驶舱。往往真正需要的东西其实特别简单:一个网页,上传PDF,能加水印也能去水印,点个按钮,等着收文件。今天花了一个下午,搭了个小工具。不用装任何软件,也不用把合同传到什么乱七八糟的网站上。

今天就把这个工具的实现过程写出来。分两大块:后端Python(干活的引擎)和前端HTML页面(点来点去的界面)。代码都贴出来了,复制回去改改就能跑。

先说说后端怎么搞的

Python里能处理PDF的库好几个,最常被提起的是 PyPDF2 和 pikepdf。我把它们放一起比了一下:

  • PyPDF2
     是纯Python写的,pip install 完事,最简单。缺点是碰到AES-256加密的PDF会报错,大文件处理起来内存飙得厉害。
  • pikepdf
     底层是C++的QPDF库,性能稳,加密文件也照啃不误。装起来稍微绕一点,但 pip install pikepdf 也基本能搞定。

日常办公用,文件不大、没加密,PyPDF2 足够了。如果处理的是重要合同、带密码的文件,或者追求一个稳字,换 pikepdf。我两个版本的代码都贴出来,按需取用。

加水印的思路

给PDF加水印,代码做的事其实挺“笨”的——它不是真的在页面上画东西,而是把水印PDF的每一页,和原始PDF的每一页,像两张透明胶片一样叠在一起。

所以你事先得准备一个水印PDF。怎么准备?打开Word或PPT,打上“公司机密”几个字,调好字体、透明度、倾斜角度,导出成PDF就行。这个PDF有多少页不重要,代码只取第一页当模板,然后往目标文件上反复贴。

去水印的思路

去水印比加水印麻烦不少,因为它要跟PDF的底层结构打交道。PDF文件里,水印通常是两种形式:要么是文本对象(比如“机密”两个字),要么是一张图片。

去文本水印的思路是:找到页面内容流里负责“显示文字”的那条指令,检查文字里有没有你指定的关键词(比如“机密”),有的话就把那段文字替换成空字符串。图片水印的处理更复杂一些,这里先不展开。

有个事得先说明白:去水印的效果,完全取决于水印当初是怎么加上去的。如果水印是通过专门的工具“烧”进页面里的,或者跟正文糊在同一个图层上,那大概率去不干净,甚至可能伤到正文。本文的方法,对付那种“叠加型”的文本水印比较有效。

安装库

打开命令行:

# PyPDF2 版pip install PyPDF2# pikepdf 版(二选一)pip install pikepdf

后端完整代码(PyPDF2版)

新建文件 pdf_tool_backend.py,把下面这些贴进去:

import osimport zipfilefrom PyPDF2 import PdfReader, PdfWriterfrom PyPDF2.generic import ContentStream, NameObject, TextStringObjectfrom PyPDF2.utils import b_# ----- 加水印 -----defadd_watermark_single(input_pdf_path, watermark_pdf_path, output_pdf_path):    watermark_reader = PdfReader(watermark_pdf_path)    watermark_page = watermark_reader.pages[0]    input_reader = PdfReader(input_pdf_path)    writer = PdfWriter()for page in input_reader.pages:        page.merge_page(watermark_page)        writer.add_page(page)withopen(output_pdf_path, "wb"as f:        writer.write(f)returnTruedefbatch_add_watermark(input_folder, watermark_pdf, output_folder):    os.makedirs(output_folder, exist_ok=True)    pdf_files = [f for f in os.listdir(input_folder) if f.lower().endswith('.pdf')]ifnot pdf_files:print("📭 文件夹里没有PDF文件")return []    results = []print(f"📂 共发现 {len(pdf_files)} 个PDF文件")for idx, filename inenumerate(pdf_files, start=1):        input_path = os.path.join(input_folder, filename)        output_path = os.path.join(output_folder, f"水印_{filename}")        add_watermark_single(input_path, watermark_pdf, output_path)        results.append(output_path)print(f"   [加水印 {idx}/{len(pdf_files)}{filename}")return results# ----- 去水印 -----defremove_watermark_single(input_pdf_path, watermark_text, output_pdf_path):    reader = PdfReader(input_pdf_path)    writer = PdfWriter()for page in reader.pages:        content_object = page["/Contents"]        content = ContentStream(content_object, reader)for operands, operator in content.operations:if operator == b_("Tj"or operator == b_("TJ"):if operands:                    text_item = operands[0if operator == b_("Tj"else operands[0][0]ifisinstance(text_item, TextStringObject):if watermark_text in text_item:if operator == b_("Tj"):                                operands[0] = TextStringObject("")else:                                operands[0] = [TextStringObject("")]        page[NameObject("/Contents")] = content        writer.add_page(page)withopen(output_pdf_path, "wb"as f:        writer.write(f)returnTruedefbatch_remove_watermark(input_folder, watermark_text, output_folder):    os.makedirs(output_folder, exist_ok=True)    pdf_files = [f for f in os.listdir(input_folder) if f.lower().endswith('.pdf')]ifnot pdf_files:print("📭 文件夹里没有PDF文件")return []    results = []print(f"📂 共发现 {len(pdf_files)} 个PDF文件")for idx, filename inenumerate(pdf_files, start=1):        input_path = os.path.join(input_folder, filename)        output_path = os.path.join(output_folder, f"无水印_{filename}")try:            remove_watermark_single(input_path, watermark_text, output_path)            results.append(output_path)print(f"   [去水印 {idx}/{len(pdf_files)}{filename}")except Exception as e:print(f"   ⚠️ [跳过] {filename} - 处理失败,可能水印格式不兼容")return results# ----- 打包下载 -----defzip_folder(folder_path, zip_path):with zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED) as zipf:for root, dirs, files in os.walk(folder_path):for file in files:                file_path = os.path.join(root, file)                arcname = os.path.relpath(file_path, folder_path)                zipf.write(file_path, arcname)return zip_path# ----- 本地测试入口 -----if __name__ == "__main__":    input_dir = r"C:\Users\你的用户名\Desktop\原始PDF"    watermark_file = r"C:\Users\你的用户名\Desktop\水印.pdf"    output_dir = r"C:\Users\你的用户名\Desktop\处理后"print("=" * 50)print("        PDF批量处理工具(后端)")print("=" * 50)print("\n🔖 正在添加水印...")    batch_add_watermark(input_dir, watermark_file, output_dir)# 去水印的话把这行注释去掉# batch_remove_watermark(input_dir, "机密", output_dir)print(f"\n✅ 处理完成!文件保存在:{output_dir}")

代码里干了什么

加水印部分:PdfReader 打开水印文件,取第一页。然后打开要处理的PDF,一页一页调用 merge_page 把水印贴上去。最后 PdfWriter 把处理过的页面攒成一个新文件。

去水印部分:拿到每一页的“内容流”(/Contents),这个流里面是一串操作指令。遍历这些指令,找到文本显示操作(Tj 或 TJ),检查显示的文字里有没有你指定的关键词。有就替换成空字符串。最后把修改后的内容流塞回页面。

换 pikepdf 的话怎么写

pikepdf 的代码确实更干净:

import pikepdf# 加水印defadd_watermark_pike(input_pdf, watermark_pdf, output_pdf):with pikepdf.open(input_pdf) as target, pikepdf.open(watermark_pdf) as watermark:        wm_page = watermark.pages[0]for page in target.pages:            page.add_overlay(wm_page)        target.save(output_pdf)# 去水印(文本水印需要更深层操作,这里给个加水印的例子)# 去水印的逻辑类似,也是操作内容流,但 pikepdf 的 API 更直观一些

pikepdf 的好处是稳定,大文件不虚,加密文件也能搞。代价是安装包大一点(它依赖 QPDF 的 C++ 库)。

再说前端界面怎么搭的

光有后端脚本,每次都得改路径,用起来还是有点烦。我顺手用 TailwindCSS 搭了个网页界面。打开就是一个卡片,能上传文件,能切“加水印”还是“去水印”,能输入水印关键词,点一下等着收文件就行。

前端完整代码

新建 index.html

<!DOCTYPE html><htmllang="zh-CN"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>PDF批量处理 - 加水印/去水印</title><scriptsrc="https://cdn.tailwindcss.com"></script></head><bodyclass="bg-gray-50 min-h-screen flex items-center justify-center p-4"><divclass="max-w-4xl w-full bg-white rounded-2xl shadow-lg p-6 md:p-8"><h1class="text-2xl font-bold text-gray-800 mb-1">📄 PDF批量处理工具</h1><pclass="text-gray-500 text-sm mb-6">上传PDF,加水印或去水印,一键下载</p><!-- 上传区 --><divclass="border-2 border-dashed border-gray-300 rounded-xl p-6 mb-6 text-center hover:border-blue-400 transition-colors cursor-pointer"id="uploadArea"><divclass="text-4xl mb-2">📂</div><pclass="text-gray-600 font-medium mb-1">点击或拖拽上传PDF文件</p><pclass="text-gray-400 text-xs">支持批量,单文件不超过50MB</p><inputtype="file"id="fileInput"multipleaccept=".pdf"class="hidden"></div><!-- 文件列表 --><divclass="mb-6"><divclass="flex items-center justify-between mb-3"><h2class="text-sm font-semibold text-gray-700">待处理文件</h2><spanclass="text-xs text-gray-400"id="fileCount">0 个文件</span></div><divid="fileList"class="space-y-2 max-h-64 overflow-y-auto"><divclass="bg-gray-50 rounded-lg p-8 text-center text-gray-400 text-sm">                    暂无文件,请先上传</div></div></div><!-- 功能切换 --><divclass="grid grid-cols-2 gap-4 mb-6"><!-- 加水印卡片 --><divclass="border rounded-xl p-4 cursor-pointer transition-all"id="watermarkCard"><divclass="flex items-center gap-2 mb-2"><spanclass="text-2xl">🔖</span><h3class="font-semibold text-gray-700">加水印</h3></div><pclass="text-xs text-gray-500 mb-3">为PDF添加文字水印</p><divclass="bg-blue-50 rounded-lg p-3"><labelclass="text-xs text-gray-600 block mb-1">水印文字</label><inputtype="text"id="watermarkText"value="公司机密"placeholder="例如:公司机密"class="w-full px-3 py-2 text-sm border border-gray-200 rounded-lg focus:outline-none focus:border-blue-400"><pclass="text-xs text-gray-400 mt-1">需提前准备水印PDF模板</p></div></div><!-- 去水印卡片 --><divclass="border rounded-xl p-4 cursor-pointer transition-all"id="removeCard"><divclass="flex items-center gap-2 mb-2"><spanclass="text-2xl">🧹</span><h3class="font-semibold text-gray-700">去水印</h3></div><pclass="text-xs text-gray-500 mb-3">去除文本水印</p><divclass="bg-orange-50 rounded-lg p-3"><labelclass="text-xs text-gray-600 block mb-1">要删除的水印文字</label><inputtype="text"id="removeWatermarkText"value="机密"placeholder="例如:机密"class="w-full px-3 py-2 text-sm border border-gray-200 rounded-lg focus:outline-none focus:border-orange-400"><pclass="text-xs text-gray-400 mt-1">输入水印中包含的关键词</p></div></div></div><!-- 当前模式 --><divclass="bg-gray-50 rounded-lg p-3 mb-6 flex items-center justify-between"><spanclass="text-sm text-gray-600">当前模式:</span><spanclass="text-sm font-medium px-3 py-1 bg-white rounded-full shadow-sm"id="currentMode">加水印</span></div><!-- 操作按钮 --><divclass="flex gap-3"><buttonid="processBtn"class="flex-1 bg-blue-600 hover:bg-blue-700 text-white font-medium py-3 px-4 rounded-xl transition-colors shadow-sm disabled:bg-gray-300 disabled:cursor-not-allowed">                开始处理</button><buttonid="downloadBtn"class="bg-gray-100 hover:bg-gray-200 text-gray-700 font-medium py-3 px-4 rounded-xl transition-colors disabled:opacity-50 disabled:cursor-not-allowed"disabled>                下载全部</button></div><divid="statusBar"class="mt-4 text-center text-sm text-gray-500 min-h-6"></div></div><script>let selectedFiles = [];let currentMode = 'watermark';const fileList = document.getElementById('fileList');const fileCount = document.getElementById('fileCount');const processBtn = document.getElementById('processBtn');const downloadBtn = document.getElementById('downloadBtn');const statusBar = document.getElementById('statusBar');const currentModeSpan = document.getElementById('currentMode');const watermarkCard = document.getElementById('watermarkCard');const removeCard = document.getElementById('removeCard');        watermarkCard.addEventListener('click'() => {            currentMode = 'watermark';            currentModeSpan.textContent = '加水印';            watermarkCard.classList.add('border-blue-400''bg-blue-50/30');            removeCard.classList.remove('border-orange-400''bg-orange-50/30');            processBtn.classList.remove('bg-orange-600''hover:bg-orange-700');            processBtn.classList.add('bg-blue-600''hover:bg-blue-700');        });        removeCard.addEventListener('click'() => {            currentMode = 'remove';            currentModeSpan.textContent = '去水印';            removeCard.classList.add('border-orange-400''bg-orange-50/30');            watermarkCard.classList.remove('border-blue-400''bg-blue-50/30');            processBtn.classList.remove('bg-blue-600''hover:bg-blue-700');            processBtn.classList.add('bg-orange-600''hover:bg-orange-700');        });const uploadArea = document.getElementById('uploadArea');const fileInput = document.getElementById('fileInput');        uploadArea.addEventListener('click'() => fileInput.click());        uploadArea.addEventListener('dragover'(e) => {            e.preventDefault();            uploadArea.classList.add('border-blue-400''bg-blue-50');        });        uploadArea.addEventListener('dragleave'() => {            uploadArea.classList.remove('border-blue-400''bg-blue-50');        });        uploadArea.addEventListener('drop'(e) => {            e.preventDefault();            uploadArea.classList.remove('border-blue-400''bg-blue-50');const files = Array.from(e.dataTransfer.files).filter(f => f.type === 'application/pdf');addFiles(files);        });        fileInput.addEventListener('change'(e) => {const files = Array.from(e.target.files);addFiles(files);            fileInput.value = '';        });functionaddFiles(files) {            selectedFiles = [...selectedFiles, ...files];renderFileList();        }functionrenderFileList() {if (selectedFiles.length === 0) {                fileList.innerHTML = '<div class="bg-gray-50 rounded-lg p-8 text-center text-gray-400 text-sm">暂无文件,请先上传</div>';                fileCount.textContent = '0 个文件';                processBtn.disabled = true;return;            }            processBtn.disabled = false;            fileCount.textContent = `${selectedFiles.length} 个文件`;            fileList.innerHTML = selectedFiles.map((file, index) =>`                <div class="bg-gray-50 rounded-lg p-3 flex items-center justify-between">                    <div class="flex items-center gap-3">                        <span class="text-red-500">📄</span>                        <div>                            <p class="text-sm text-gray-700 truncate max-w-xs">${file.name}</p>                            <p class="text-xs text-gray-400">${(file.size / 1024).toFixed(1)} KB</p>                        </div>                    </div>                    <button onclick="removeFile(${index})" class="text-gray-400 hover:text-red-500 text-lg">&times;</button>                </div>            `).join('');        }window.removeFile = function(index) {            selectedFiles.splice(index, 1);renderFileList();        };        processBtn.addEventListener('click'() => {if (selectedFiles.length === 0return;            processBtn.disabled = true;const action = currentMode === 'watermark' ? '加水印' : '去水印';const watermarkValue = currentMode === 'watermark'                ? document.getElementById('watermarkText').value                : document.getElementById('removeWatermarkText').value;            statusBar.textContent = `⏳ 正在${action},处理 ${selectedFiles.length} 个文件...`;// 模拟处理(真实场景替换成 fetch 调用后端)setTimeout(() => {                statusBar.textContent = `✅ ${action}完成!共处理 ${selectedFiles.length} 个文件`;                downloadBtn.disabled = false;                processBtn.disabled = false;            }, 2000);        });        downloadBtn.addEventListener('click'() => {            statusBar.textContent = '📥 正在打包下载...';setTimeout(() => {                statusBar.textContent = '✅ 下载完成!';            }, 1500);        });        watermarkCard.classList.add('border-blue-400''bg-blue-50/30');</script></body></html>

界面长什么样

打开后就是一个大白卡片。顶上是一个拖拽上传区,文件扔进去就出现在下面列表里。中间两个卡片,一个加水印一个去水印,点了哪个按钮颜色就跟着变。每个卡片里都有对应的输入框——加水印填水印文字,去水印填要删的关键词。底部状态条会告诉你处理到哪一步了。

整个页面没用一行自定义CSS,全是Tailwind的原子类拼出来的。bg-white rounded-2xl shadow-lg p-6 就是白色背景、圆角、阴影、内边距。改样式直接在HTML里加类名就行,不用切来切去改CSS文件。

前后端怎么接起来

现在前端里的处理按钮只是装装样子(setTimeout 模拟了一下)。真要跑起来,得把那个点击事件换成真实的API请求:

const formData = newFormData();selectedFiles.forEach(file => formData.append('files', file));formData.append('mode', currentMode);formData.append('watermark_text'document.getElementById(    currentMode === 'watermark' ? 'watermarkText' : 'removeWatermarkText').value);fetch('http://localhost:8000/process', {method'POST',body: formData}).then(res => res.blob()).then(blob => {const url = window.URL.createObjectURL(blob);const a = document.createElement('a');    a.href = url;    a.download = 'processed_pdfs.zip';    a.click();    statusBar.textContent = '✅ 下载已开始!';});

后端用 FastAPI 或 Flask 起一个服务,接收文件,根据 mode 参数调用 batch_add_watermark 或 batch_remove_watermark,然后把输出文件夹打成zip包返回。具体怎么搭这个服务,要是大家感兴趣我后面再写一篇干货。

写在最后

这篇文章算是把前后端分离的小项目完整跑通了一遍:

  • 后端用 PyPDF2(或 pikepdf)当PDF处理引擎,加水印靠 merge_page,去水印靠解析内容流替换文本。
  • 前端用TailwindCSS画界面,上传、列表、功能切换、状态反馈一条龙。

把这个东西跑起来之后,你可以把水印PDF换成自己公司的模板,部署到部门内网服务器上,或者继续往上加功能——加页码、压缩文件、设置密码,骨架已经有了,往上添肉就行。

写到这里。如果你身边也有被PDF反复折磨的同事,可以把这个工具分享给他。或者你有啥其他想自动化的办公场景,评论区唠唠,我看看能不能研究下用代码写个工具。

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