当前位置:首页>python>Python-截图自动保存工具 / Screenshot Auto Save Tool

Python-截图自动保存工具 / Screenshot Auto Save Tool

  • 2026-03-25 02:59:11
Python-截图自动保存工具 / Screenshot Auto Save Tool

项目介绍 / Project Introduction

截图自动保存工具是一款功能强大的Windows截图管理工具,提供自动检测剪贴板截图并保存到指定目录的功能,同时保留剪贴板内容,方便用户粘贴到聊天工具等应用中。

Screenshot Auto Save Tool is a powerful Windows screenshot management tool that automatically detects clipboard screenshots and saves them to a specified directory, while preserving clipboard content for easy pasting into chat tools and other applications.

主要功能 / Key Features

🎨 现代化界面 / Modern UI

  • 简洁美观的界面设计
  • 窗口居中显示,无闪烁启动
  • 支持系统托盘运行,后台监控
  • 自定义消息框,操作便捷

🚀 核心功能 / Core Features

  • 自动保存:检测剪贴板中的截图并自动保存
  • 防重复保存:同一截图只保存一次,避免重复文件
  • 保留剪贴板:保存后剪贴板内容不变,可继续粘贴
  • 格式支持:支持 PNG、JPG、WEBP 三种图片格式
  • 质量设置:可调整 JPG 和 WEBP 格式的图片质量
  • 自定义路径:可设置截图保存的路径

📋 托盘功能 / Tray Features

  • 显示窗口:从托盘图标打开主窗口
  • 打开图片目录:快速打开截图保存目录
  • 退出程序:完全退出应用

💾 数据持久化 / Data Persistence

  • 自动记录已保存图片的哈希值
  • 程序重启后仍能识别已保存的图片
  • 避免重复保存相同的截图

系统要求 / System Requirements

  • Windows 10/11
  • Python 3.7+
  • 依赖库:
  • pywin32 (用于剪贴板操作)
  • Pillow (用于图像处理)
  • pystray (用于系统托盘功能)

使用指南 / Usage Guide

基本操作 / Basic Operations

  1. **启动程序**:运行`screenshot_tool.exe`或从源码启动
  2. **截图**:使用系统截图工具(如 Win+Shift+S)或其他截图工具截图
  3. **自动保存**:截图后工具会自动检测并保存到指定目录
  4. **查看保存**:可通过保存成功消息框中的"打开图片"按钮查看保存的截图
  5. **管理设置**:点击"配置保存格式/路径"按钮修改保存设置
  6. **后台运行**:点击窗口关闭按钮,程序会最小化到系统托盘继续运行

配置说明 / Configuration

  • 图片格式:选择 PNG、JPG 或 WEBP 格式
  • 图片质量:调整 JPG 和 WEBP 格式的图片质量(1-100)
  • 保存路径:设置截图保存的目录

技术实现 / Technical Implementation

  • 编程语言:Python 3.11
  • GUI框架:Tkinter(原生组件)
  • 辅助库:pywin32 (剪贴板操作),Pillow (图像处理),pystray (系统托盘)
  • 打包工具:PyInstaller
  • 数据存储:配置文件和哈希值记录文件

常见问题 / FAQ

Q: 程序无法启动怎么办?

A: 请检查以下几点:

  • 是否安装了Python 3.7+
  • 是否安装了必要的依赖库
  • 是否以管理员身份运行

Q: 截图没有自动保存?

A: 请检查以下几点:

  • 截图是否成功复制到剪贴板
  • 保存路径是否存在且有写入权限
  • 截图是否已经保存过

Q: 保存的图片在哪里?

A: 默认保存到程序目录下的`screenshots`文件夹,可在配置中修改保存路径。

更新日志 / Changelog

v1.0.0

  • 初始版本发布
  • 实现截图自动保存功能
  • 支持多种图片格式和质量设置
  • 系统托盘运行

v1.1.0

  • 优化启动过程,窗口居中无闪烁
  • 改进防重复保存逻辑,持久化存储已保存图片哈希值
  • 增强消息框功能,添加打开图片按钮
  • 优化托盘菜单,添加打开图片目录选项

v1.2.0

  • 修复打包脚本,确保成功生成可执行文件
  • 添加 MIT 许可证文件
  • 更新项目结构文档
  • 优化依赖安装说明

v1.3.0

  • 优化启动速度,采用后台初始化和快速显示界面
  • 修复保存历史功能,确保程序重启后不会重复保存图片
  • 增强配置初始化,确保启动时配置未就绪时使用默认值
  • 改进错误处理,提高程序稳定性
import win32clipboardfrom PIL import Image, ImageGrab, ImageDrawimport tkinter as tkfrom tkinter import ttk, filedialogimport configparserimport osimport ioimport hashlibfrom datetime import datetimeimport pystrayfrom pystray import MenuItem as itemimport loggingfrom typing import OptionalUnionSet# 配置日志logging.basicConfig(    level=logging.INFO,    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',    handlers=[        logging.FileHandler('screenshot_tool.log'),        logging.StreamHandler()    ])logger = logging.getLogger(__name__)# -------------------------- 全局变量(防重复保存 + 剪贴板保护) --------------------------LAST_IMAGE_HASH = None  # 记录上一次保存的截图哈希值SAVED_HASHES_FILE = "saved_hashes.txt"  # 存储已保存图片哈希值的文件CLIPBOARD_FORMAT = win32clipboard.CF_DIB  # 截图的剪贴板格式# 全局变量:主窗口和托盘图标root = Nonetray_icon = None# 已保存的图片哈希值集合saved_hashes = set()# -------------------------- 配置文件处理 --------------------------CONFIG_FILE = "screenshot_saver_config.ini"config = configparser.ConfigParser()# -------------------------- 窗口居中函数 --------------------------def center_window(window, width, height):    # 获取屏幕宽高    screen_width = window.winfo_screenwidth()    screen_height = window.winfo_screenheight()    # 计算窗口左上角坐标    x = (screen_width - width) // 2    y = (screen_height - height) // 2    # 设置窗口位置    window.geometry(f"{width}x{height}+{x}+{y}")# -------------------------- 自定义消息框函数 --------------------------def custom_messagebox(title, message, icon=None, open_path=None):    # 创建独立的窗口    msg_win = tk.Toplevel()    msg_win.title(title)    msg_win.resizable(FalseFalse)    msg_win.transient()  # 设置为主窗口的临时窗口    msg_win.grab_set()  # 模态窗口,阻止其他窗口操作    # 计算消息框大小    message_lines = message.split('\n')    max_line_length = max(len(line) for line in message_lines)    # 增加最小宽度和高度,确保完整显示内容    width = min(500max(400, max_line_length * 7))    height = min(250120 + len(message_lines) * 22)    # 居中显示    center_window(msg_win, width, height)    # 添加消息内容    msg_label = tk.Label(msg_win, text=message, font=("微软雅黑"9), justify="left", padx=20, pady=20)    msg_label.pack(fill=tk.BOTH, expand=True)    # 添加按钮框架    button_frame = tk.Frame(msg_win)    button_frame.pack(pady=10)    # 关闭窗口函数    def close_window():        msg_win.grab_release()        msg_win.destroy()    # 打开文件夹函数    def open_folder():        if open_path:            os.startfile(os.path.dirname(open_path))        close_window()    # 打开图片函数    def open_image():        if open_path:            os.startfile(open_path)        close_window()    # 添加确定按钮    ok_button = tk.Button(button_frame, text="确定", command=close_window, font=("微软雅黑"9), width=10)    ok_button.pack(side=tk.RIGHT, padx=5)    # 添加打开按钮(如果提供了路径)    if open_path:        open_image_button = tk.Button(button_frame, text="打开图片", command=open_image, font=("微软雅黑"9), width=10)        open_image_button.pack(side=tk.RIGHT, padx=5)    # 绑定回车键    msg_win.bind('<Return>'lambda e: close_window())    # 等待窗口关闭    msg_win.wait_window()# 初始化配置(首次运行自动创建)def init_config() -> None:    default_save_path = os.path.abspath("./screenshots")  # 默认保存到工具目录下的screenshots文件夹    if not os.path.exists(CONFIG_FILE):        logger.info("配置文件不存在,创建默认配置")        config["DEFAULT"] = {            "image_format""PNG",        # 默认格式:PNG/JPG/WEBP            "quality""95",              # JPG/WEBP质量(1-100)            "save_path": default_save_path  # 默认保存路径        }        try:            with open(CONFIG_FILE, "w", encoding="utf-8"as f:                config.write(f)            logger.info(f"配置文件已创建:{CONFIG_FILE}")        except Exception as e:            logger.error(f"创建配置文件失败: {str(e)}")    else:        try:            config.read(CONFIG_FILE, encoding="utf-8")            logger.info(f"配置文件已加载:{CONFIG_FILE}")        except Exception as e:            logger.error(f"读取配置文件失败: {str(e)}")    # 自动创建保存目录(不存在则创建)    try:        save_path = config["DEFAULT"]["save_path"]        if not os.path.exists(save_path):            os.makedirs(save_path)            logger.info(f"保存目录已创建:{save_path}")    except Exception as e:        logger.error(f"创建保存目录失败: {str(e)}")# 保存配置def save_config(new_format: str, quality: str, new_save_path: str) -> None:    config["DEFAULT"]["image_format"] = new_format    config["DEFAULT"]["quality"] = quality    config["DEFAULT"]["save_path"] = new_save_path    try:        with open(CONFIG_FILE, "w", encoding="utf-8"as f:            config.write(f)        logger.info(f"配置已保存:格式={new_format}, 质量={quality}, 路径={new_save_path}")    except Exception as e:        logger.error(f"保存配置文件失败: {str(e)}")    # 确保新路径存在    try:        if not os.path.exists(new_save_path):            os.makedirs(new_save_path)            logger.info(f"保存目录已创建:{new_save_path}")    except Exception as e:        logger.error(f"创建保存目录失败: {str(e)}")# 加载已保存的哈希值def load_saved_hashes():    global saved_hashes    try:        if os.path.exists(SAVED_HASHES_FILE):            with open(SAVED_HASHES_FILE, "r", encoding="utf-8"as f:                saved_hashes = set(line.strip() for line in f if line.strip())            logger.info(f"加载了 {len(saved_hashes)} 个已保存的图片哈希值")        else:            logger.info("未找到哈希值文件,使用空集合")    except Exception as e:        logger.error(f"加载哈希值文件失败: {str(e)}")        saved_hashes = set()  # 忽略错误,使用空集合# 保存哈希值到文件def save_hash_to_file(img_hash):    global saved_hashes    saved_hashes.add(img_hash)    try:        with open(SAVED_HASHES_FILE, "w", encoding="utf-8"as f:            for hash_val in saved_hashes:                f.write(hash_val + "\n")        logger.debug(f"已保存哈希值: {img_hash}")    except Exception as e:        logger.error(f"保存哈希值文件失败: {str(e)}")        # 忽略错误,继续执行# -------------------------- 剪贴板处理(核心:保留剪贴板内容) --------------------------# 获取图片哈希值(防重复保存)def get_image_hash(img):    # 统一转换为RGB模式,确保颜色模式一致    if img.mode != 'RGB':        img = img.convert('RGB')    img_bytes = img.tobytes()    return hashlib.md5(img_bytes).hexdigest()# 安全读取剪贴板图片(不修改剪贴板内容)def read_clipboard_image_safely() -> Optional[Image.Image]:    img = None    try:        # 方法1:优先用PIL读取(兼容Win+Shift+S/QQ/微信截图)        img = ImageGrab.grabclipboard()        if isinstance(img, Image.Image):            logger.debug("使用PIL成功读取剪贴板图片")            return img.copy()  # 复制图片,不影响原剪贴板        # 方法2:兼容其他截图工具(读取DIB格式,不修改剪贴板)        win32clipboard.OpenClipboard()        try:            if win32clipboard.IsClipboardFormatAvailable(CLIPBOARD_FORMAT):                dib_data = win32clipboard.GetClipboardData(CLIPBOARD_FORMAT)                # 读取数据但不清空剪贴板                img = Image.open(io.BytesIO(dib_data))                img = img.copy()  # 复制图片对象                logger.debug("使用DIB格式成功读取剪贴板图片")            else:                logger.debug("剪贴板中没有DIB格式图片")        finally:            win32clipboard.CloseClipboard()  # 必须关闭剪贴板,且不调用EmptyClipboard    except Exception as e:        logger.error(f"读取剪贴板失败: {str(e)}")        pass  # 无图片时静默忽略    # 确保返回的是图像对象    if not isinstance(img, Image.Image):        return None    return img# 自动保存图片(保留剪贴板)def auto_save_screenshot() -> None:    global LAST_IMAGE_HASH    # 1. 安全读取剪贴板图片(不修改剪贴板)    img = read_clipboard_image_safely()    if img is None:        return    # 2. 防重复保存(同一截图只保存一次)    img_hash = get_image_hash(img)    if img_hash == LAST_IMAGE_HASH or img_hash in saved_hashes:        logger.debug(f"图片已保存过,哈希值:{img_hash}")        return    LAST_IMAGE_HASH = img_hash    # 保存哈希值到集合和文件    save_hash_to_file(img_hash)    # 3. 读取配置(确保配置已初始化)    try:        img_format = config["DEFAULT"]["image_format"].upper()        quality = int(config["DEFAULT"]["quality"])        save_path = config["DEFAULT"]["save_path"]    except (KeyError, ValueError) as e:        # 配置未初始化,使用默认值        logger.warning(f"配置读取失败: {str(e)},使用默认值")        img_format = "PNG"        quality = 95        save_path = os.path.abspath("./screenshots")        # 确保保存路径存在        if not os.path.exists(save_path):            os.makedirs(save_path)            logger.info(f"创建保存目录: {save_path}")    # 4. 生成毫秒级时间戳文件名(绝对不重复)    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")[:-3]    filename = f"screenshot_{timestamp}.{img_format.lower()}"    full_path = os.path.join(save_path, filename)    # 5. 按格式保存图片    try:        if img_format == "JPG":            img = img.convert("RGB")  # JPG不支持透明通道            img.save(full_path, format=img_format, quality=quality)        elif img_format == "WEBP":            img.save(full_path, format=img_format, quality=quality)        else:  # PNG(无损,保留透明通道)            img.save(full_path, format=img_format)        logger.info(f"截图已保存:{full_path}")        # 异步提示(不阻塞监听,不影响剪贴板)        custom_messagebox("保存成功"f"截图已自动保存:\n{full_path}\n✓ 剪贴板截图仍可粘贴到聊天工具", open_path=full_path)    except Exception as e:        logger.error(f"保存图片失败: {str(e)}")        custom_messagebox("保存失败"f"错误:{str(e)}\n请检查保存路径权限")# -------------------------- 配置界面 --------------------------def open_config_window():    config_win = tk.Toplevel()    config_win.title("截图保存配置")    center_window(config_win, 420240)    config_win.resizable(FalseFalse)    # 读取当前配置    current_format = config["DEFAULT"]["image_format"]    current_quality = config["DEFAULT"]["quality"]    current_save_path = config["DEFAULT"]["save_path"]    # 1. 图片格式选择    tk.Label(config_win, text="图片格式:", font=("微软雅黑"9)).grid(row=0, column=0, padx=10, pady=8, sticky="w")    format_var = tk.StringVar(value=current_format)    format_combo = ttk.Combobox(config_win, textvariable=format_var, values=["PNG""JPG""WEBP"], state="readonly", width=15)    format_combo.grid(row=0, column=1, padx=10, pady=8)    # 2. 图片质量设置    tk.Label(config_win, text="图片质量(1-100):", font=("微软雅黑"9)).grid(row=1, column=0, padx=10, pady=8, sticky="w")    quality_entry = tk.Entry(config_win, width=18)    quality_entry.insert(0, current_quality)    quality_entry.grid(row=1, column=1, padx=10, pady=8)    # 3. 保存路径选择    tk.Label(config_win, text="自动保存路径:", font=("微软雅黑"9)).grid(row=2, column=0, padx=10, pady=8, sticky="w")    path_var = tk.StringVar(value=current_save_path)    path_entry = tk.Entry(config_win, textvariable=path_var, width=18)    path_entry.grid(row=2, column=1, padx=10, pady=8)    # 路径选择按钮    def select_path():        folder = filedialog.askdirectory(title="选择截图自动保存文件夹")        if folder:            path_var.set(folder)    tk.Button(config_win, text="📁 选择文件夹", command=select_path, font=("微软雅黑"8)).grid(row=2, column=2, padx=5, pady=8)    # 保存配置按钮    def confirm_config():        new_format = format_var.get()        new_quality = quality_entry.get()        new_save_path = path_var.get()        # 验证参数        if not new_quality.isdigit() or not (1 <= int(new_quality) <= 100):            custom_messagebox("提示""质量必须是1-100的数字!")            return        # 保存配置并创建路径        save_config(new_format, new_quality, new_save_path)        custom_messagebox("配置成功""新配置已生效!下次截图将按此设置保存")        config_win.destroy()    tk.Button(config_win, text="保存配置", command=confirm_config, font=("微软雅黑"9)).grid(row=3, column=0, columnspan=3, pady=10)# -------------------------- 主程序 --------------------------# 显示窗口def show_window():    global root, tray_icon    if root:        root.deiconify()  # 显示窗口        root.lift()  # 置于顶层# 退出程序def exit_program():    global root, tray_icon    if tray_icon:        tray_icon.stop()  # 停止托盘图标    if root:        root.destroy()  # 销毁窗口# 设置托盘图标def setup_tray_icon() -> None:    global root, tray_icon    # 尝试加载app_ico.ico作为托盘图标    try:        # 尝试多种路径获取图标文件        import sys        import os        # 检查当前目录        icon_path = "app_ico.ico"        if not os.path.exists(icon_path):            # 检查可执行文件所在目录(打包后)            if hasattr(sys, '_MEIPASS'):                icon_path = os.path.join(sys._MEIPASS, "app_ico.ico")        if os.path.exists(icon_path):            image = Image.open(icon_path)            logger.info(f"已加载托盘图标:{icon_path}")        else:            raise FileNotFoundError(f"图标文件不存在:{icon_path}")    except Exception as e:        logger.warning(f"加载图标失败: {str(e)},使用默认图标")        # 如果图标文件不存在,创建一个简单的图标        image = Image.new('RGB', (6464), color=(255255255))        draw = ImageDraw.Draw(image)        draw.rectangle([10105454], fill=(0128255))        draw.text([2020], "截图", fill=(255255255))    # 打开图片目录    def open_image_dir():        try:            save_path = config["DEFAULT"]["save_path"]            os.startfile(save_path)            logger.info(f"已打开图片目录:{save_path}")        except Exception as e:            logger.error(f"打开图片目录失败: {str(e)}")            custom_messagebox("错误"f"打开图片目录失败:{str(e)}")    # 创建菜单    menu = (        item('显示窗口', show_window),        item('打开图片目录', open_image_dir),        item('退出', exit_program)    )    # 创建托盘图标    try:        tray_icon = pystray.Icon("screenshot_tool", image, "截图自动保存工具", menu)        # 启动托盘图标        import threading        threading.Thread(target=tray_icon.run, daemon=True).start()        logger.info("托盘图标已启动")    except Exception as e:        logger.error(f"启动托盘图标失败: {str(e)}")def main():    global root    # 快速创建主窗口    root = tk.Tk()    # 立即隐藏窗口,避免初始闪烁    root.withdraw()    # 设置窗口标题    root.title("截图自动保存工具(保留剪贴板)")    # 设置窗口大小和位置    center_window(root, 480140)    root.resizable(FalseFalse)    # 快速显示窗口框架    # 状态提示    status_label = tk.Label(        root,         text="✅ 工具启动中...",        font=("微软雅黑"10),        justify="center"    )    status_label.pack(pady=15)    # 配置按钮(暂时禁用)    config_button = tk.Button(root, text="⚙️ 配置保存格式/路径", command=open_config_window, font=("微软雅黑"10), state=tk.DISABLED)    config_button.pack(pady=5)    # 确保窗口完全准备好后再显示    root.update_idletasks()    # 显示窗口    root.deiconify()    # 加载已保存的哈希值(在主线程中执行,确保在监听开始前完成)    load_saved_hashes()    # 循环监听剪贴板(200ms检测一次,响应更快)    def loop_listen():        auto_save_screenshot()        root.after(200, loop_listen)  # 200ms检测一次,不占用系统资源    # 启动监听    loop_listen()    # 修改关闭按钮行为,最小化到托盘    def on_closing():        root.withdraw()  # 隐藏窗口    root.protocol("WM_DELETE_WINDOW", on_closing)    # 后台初始化函数    def background_init():        # 初始化配置和保存目录        init_config()        # 设置窗口图标        try:            import sys            import os            # 尝试多种路径获取图标文件            icon_path = "app_ico.ico"            if not os.path.exists(icon_path):                # 检查可执行文件所在目录(打包后)                if hasattr(sys, '_MEIPASS'):                    icon_path = os.path.join(sys._MEIPASS, "app_ico.ico")            root.iconbitmap(icon_path)        except:            pass  # 如果图标文件不存在,忽略错误        # 更新状态提示        status_label.config(text="✅ 工具已运行!\n1. 截图后自动保存到指定目录\n2. 剪贴板保留截图,可粘贴到微信/QQ等聊天工具")        # 启用配置按钮        config_button.config(state=tk.NORMAL)        # 设置托盘图标        setup_tray_icon()    # 在后台线程中执行初始化操作    import threading    threading.Thread(target=background_init, daemon=True).start()    # 运行主窗口    root.mainloop()if __name__ == "__main__":    main()

最新文章

随机文章

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