当前位置:首页>python>Python实现基于电脑 BIOS SN 的智能摄像头管理工具

Python实现基于电脑 BIOS SN 的智能摄像头管理工具

  • 2026-07-02 18:16:48
Python实现基于电脑 BIOS SN 的智能摄像头管理工具

基于电脑 BIOS SN 的智能摄像头管理工具

一款面向多设备管理场景的桌面端摄像头控制工具,通过电脑主板 BIOS 序列号(SN)作为唯一标识, 自动匹配并打开对应摄像头,解决多台电脑、多个摄像头环境下设备识别混乱的难题。 工具采用 PyQt5 构建现代化图形界面,搭配 OpenCV 实现高效视频采集与实时预览, 配置信息持久化为 JSON 文件,支持一次配置、长期使用,极大提升了批量设备运维的效率与准确性。


目录


    功能特性

    功能
    描述
    🔍 自动识别 SN
    启动时自动读取本机 BIOS 序列号并显示
    💾 配置持久化
    SN 与摄像头索引的映射关系保存为 JSON 文件
    📷 一键打开
    输入 SN 即可自动匹配并打开对应摄像头
    🔎 设备扫描
    扫描索引 0~9,检测所有可用摄像头及画面状态
    🖥️ 实时预览
    30fps 实时视频流渲染,流畅显示摄像头画面
    🛡️ 预热机制
    自动跳过前 10 帧黑屏,确保画面正常呈现

    环境要求

    Python >= 3.8opencv-python >= 4.5PyQt5 >= 5.15Windows 操作系统(依赖 WMIC 命令)

     快速开始

    1. 安装依赖

    pip install opencv-python PyQt5

    2. 启动程序

    python camera_by_sn.py

    3. 使用流程

    ┌─────────────────────────────────────────────────────┐│  启动程序 → 自动显示本机 SN                           ││      ↓                                              ││  点击「扫描所有摄像头」→ 确认可用摄像头索引             ││      ↓                                              ││  填写 SN + 选择摄像头索引 → 点击「保存配置」           ││      ↓                                              ││  输入 SN → 点击「打开摄像头」→ 实时预览画面           │└─────────────────────────────────────────────────────┘

     核心代码解析

    Part 1:设备标识获取模块

    本模块负责获取计算机的唯一硬件标识——BIOS 序列号,作为设备区分的核心依据。

    import subprocessdefget_local_bios_sn():"""获取当前电脑的 BIOS 序列号"""try:        result = subprocess.run(            ['wmic''bios''get''serialnumber'],            capture_output=True, text=True, timeout=10        )        lines = [l.strip() for l in result.stdout.strip().split('\n'if l.strip()]# 第一行是表头 "SerialNumber",第二行是实际序列号值if len(lines) >= 2:return lines[1]except Exception:passreturn""

    技术要点:

    • 通过 subprocess.run() 调用 Windows 系统命令 wmic bios get serialnumber
    • 设置 timeout=10 防止命令挂起阻塞主线程
    • capture_output=True 捕获标准输出,text=True 以字符串形式返回
    • 解析输出时跳过表头行,提取第二行作为实际 SN 值
    • 异常保护确保即使命令失败也不会导致程序崩溃

    配置文件读写模块:

    import osimport jsonCONFIG_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "camera_config.json")defload_config():if os.path.exists(CONFIG_FILE):with open(CONFIG_FILE, "r", encoding="utf-8"as f:return json.load(f)return {}defsave_config(config):with open(CONFIG_FILE, "w", encoding="utf-8"as f:        json.dump(config, f, indent=2, ensure_ascii=False)
    • 配置文件路径基于脚本所在目录动态计算,避免工作目录差异带来的路径问题
    • 使用 ensure_ascii=False 确保中文字符正常写入
    • indent=2 使 JSON 文件可读性更强

    Part 2:GUI 界面与交互逻辑

    界面基于 PyQt5 构建,采用垂直布局嵌套水平布局的经典组合模式。

    from PyQt5.QtWidgets import (    QApplication, QWidget, QVBoxLayout, QHBoxLayout,    QLabel, QLineEdit, QPushButton, QSpinBox, QMessageBox)from PyQt5.QtCore import QTimer, QtclassCameraApp(QWidget):def__init__(self):        super().__init__()        self.setWindowTitle("摄像头 SN 配置工具")        self.resize(860620)        self.cap = None        self.timer = QTimer()        self.timer.timeout.connect(self.update_frame)        self.config = load_config()        self.init_ui()

    界面结构层次:

    QVBoxLayout (主布局)├── QHBoxLayout (SN 显示区)│   ├── QLabel "当前电脑 SN:"│   └── QLabel [动态显示本机 SN]├── QHBoxLayout (配置输入区)│   ├── QLabel + QLineEdit (SN 输入)│   ├── QLabel + QSpinBox (摄像头索引)│   └── QPushButton "保存配置"├── QHBoxLayout (操作区)│   ├── QLineEdit (SN 输入)│   ├── QPushButton "打开摄像头"│   ├── QPushButton "关闭摄像头"│   └── QPushButton "扫描所有摄像头"├── QLabel (视频画面显示区 640×360)└── QLabel (状态栏)

    配置保存逻辑:

    defsave_config_entry(self):    sn = self.sn_input.text().strip()ifnot sn:        QMessageBox.warning(self, "提示""请输入电脑 SN")return    cam_idx = self.cam_index_spin.value()    self.config[sn] = cam_idx    save_config(self.config)    self.status_label.setText(f"已保存: SN={sn} → 摄像头索引={cam_idx}")
    • 输入验证:空值检测并弹出警告对话框
    • 内存与持久化双写:同时更新运行时字典和磁盘 JSON 文件
    • 状态反馈:操作结果实时显示在底部状态栏

    Part 3:摄像头控制与视频流渲染

    本模块包含摄像头的打开、关闭、扫描和实时视频帧渲染的全部逻辑。

    打开摄像头(含预热机制):

    import cv2from PyQt5.QtGui import QImage, QPixmapdefopen_camera(self):    sn = self.open_sn_input.text().strip()ifnot sn:        self.status_label.setText("请输入 SN")returnif sn notin self.config:        self.status_label.setText(f"配置中未找到 SN: {sn},请先保存配置")return    cam_idx = self.config[sn]    self.stop_camera()    self.cap = cv2.VideoCapture(cam_idx, cv2.CAP_DSHOW)if self.cap.isOpened():# 跳过前 10 帧(摄像头预热,避免黑屏)for _ in range(10):            self.cap.read()        self.status_label.setText(f"已打开摄像头 (SN: {sn}, 索引: {cam_idx})")        self.timer.start(30)  # 约 33fps 刷新else:        self.status_label.setText(f"摄像头索引 {cam_idx} 打开失败,请确认设备可用或更换索引")        self.cap = None

    视频帧渲染(BGR → RGB → QPixmap):

    defupdate_frame(self):if self.cap and self.cap.isOpened():        ret, frame = self.cap.read()if ret:# OpenCV 默认 BGR 格式,需转为 RGB 供 Qt 显示            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)            h, w, ch = frame.shape            img = QImage(frame.data, w, h, ch * w, QImage.Format_RGB888)            scaled = QPixmap.fromImage(img).scaled(                self.video_label.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation            )            self.video_label.setPixmap(scaled)

    摄像头扫描(亮度检测):

    defscan_cameras(self):"""扫描索引 0~9,逐个尝试打开并读取一帧,显示哪些有画面"""    self.stop_camera()    self.status_label.setText("正在扫描摄像头...")    QApplication.processEvents()    results = []for i in range(10):        cap = cv2.VideoCapture(i, cv2.CAP_DSHOW)if cap.isOpened():for _ in range(5):                cap.read()            ret, frame = cap.read()if ret:                gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)                brightness = gray.mean()                status = f"有画面 (亮度:{brightness:.0f})"if brightness > 5else"黑屏"                results.append(f"索引 {i}: 可打开 - {status}")else:                results.append(f"索引 {i}: 可打开 - 无法读取帧")            cap.release()else:            results.append(f"索引 {i}: 无法打开")    QMessageBox.information(self, "摄像头扫描结果""\n".join(results))

    技术要点:

    • cv2.CAP_DSHOW:指定 DirectShow 后端,Windows 上性能和兼容性最佳
    • 预热跳帧:许多 USB 摄像头前几帧为黑色或曝光异常,跳过可提升用户体验
    • QTimer 驱动渲染:以 30ms 间隔触发帧读取,避免阻塞 GUI 主线程
    • 亮度检测:将帧转为灰度图后计算平均像素值,阈值 5 以下判定为黑屏
    • Qt.KeepAspectRatio:保持画面宽高比,Qt.SmoothTransformation 保证缩放画质

    配置文件说明

    程序运行后会在同目录下生成 camera_config.json

    {"5CD5145Y25"0,"ABC1234567"1,"XYZ9876543"0}
    字段
    含义
    Key (字符串)
    电脑 BIOS 序列号
    Value (整数)
    该电脑要打开的摄像头索引

    知识点总结

    1. Windows 硬件信息获取

    方法
    命令
    获取内容
    WMIC
    wmic bios get serialnumber
    BIOS 序列号
    WMIC
    wmic csproduct get uuid
    主板 UUID
    PowerShell
    Get-PnpDevice -Class Camera
    摄像头设备列表

    注:WMIC 在较新版本 Windows 中已标记为弃用,后续可迁移至 Get-CimInstance PowerShell 命令。

    2. OpenCV 视频采集核心概念

    • VideoCapture:视频捕获对象,支持索引(设备)和文件路径两种打开方式
    • 后端选择CAP_DSHOW(DirectShow)、CAP_MSMF(Media Foundation)、CAP_V4L2(Linux)
    • 帧格式:OpenCV 默认使用 BGR 色彩空间,显示时需转为 RGB
    • 资源释放cap.release() 释放设备独占,避免其他程序无法访问

    3. PyQt5 GUI 开发模式

    • 信号与槽机制button.clicked.connect(handler) 事件驱动编程
    • QTimer 定时器:非阻塞的周期性任务调度,适合视频帧刷新
    • 布局管理QVBoxLayout / QHBoxLayout 组合嵌套实现响应式界面
    • 线程安全:GUI 更新必须在主线程执行,QApplication.processEvents() 强制刷新

    4. JSON 配置管理

    • 轻量级数据存储,无需数据库依赖
    • 人类可读可编辑,便于手动修改和版本管理
    • json.dump() / json.load() 一行代码完成序列化与反序列化

    拓展场景与测试步骤

    拓展应用场景

    场景
    描述
    🏭 工厂产线质检
    每台工位绑定 SN,启动即自动打开对应工业相机进行产品检测
    🏫 机房监控管理
    机房多台主机统一配置,快速定位并查看指定主机的摄像头画面
    🏥 医疗设备管理
    诊室设备通过 SN 绑定,医护人员一键调取指定设备视频
    📦 仓储物流
    扫码枪扫描设备标签后自动打开对应货架监控摄像头
    🖥️ IT 资产盘点
    结合资产管理系统,验证实际硬件与台账信息是否一致

    测试步骤

    Step 1:环境验证

    # 确认 Python 版本python --version# 确认依赖安装pip show opencv-python PyQt5

    Step 2:SN 获取验证

    # 手动执行确认能获取到 SNwmic bios get serialnumber

    Step 3:启动程序并验证界面

    python camera_by_sn.py

    检查项:

    • [ ] 程序正常启动,无报错
    • [ ] 界面顶部正确显示本机 SN
    • [ ] 所有按钮可点击

    Step 4:摄像头扫描测试

    • [ ] 点击「扫描所有摄像头」
    • [ ] 弹窗显示各索引状态
    • [ ] 记录有画面的索引编号

    Step 5:配置保存测试

    • [ ] 输入 SN,选择正确的摄像头索引
    • [ ] 点击「保存配置」
    • [ ] 确认状态栏显示保存成功
    • [ ] 检查同目录下生成 camera_config.json

    Step 6:摄像头打开测试

    • [ ] 输入已保存的 SN
    • [ ] 点击「打开摄像头」
    • [ ] 确认视频画面正常显示(非黑屏)
    • [ ] 点击「关闭摄像头」确认资源释放

    Step 7:异常场景测试

    • [ ] 输入未配置的 SN → 应提示"未找到"
    • [ ] 输入空 SN → 应提示"请输入"
    • [ ] 配置错误索引 → 应提示"打开失败"
    • [ ] 连续多次打开/关闭 → 无内存泄漏或崩溃

    📝 本工具为本地化方案,如需跨网络远程控制摄像头,请参考 camera_server.py + camera_client.py 的 C/S 架构实现。

    """根据电脑 BIOS SN 打开指定摄像头的 GUI 工具配置文件 camera_config.json 记录 SN 与摄像头索引的对应关系依赖: pip install opencv-python PyQt5"""import sysimport osimport jsonimport subprocessimport cv2from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout,QLabel, QLineEdit, QPushButton, QSpinBox, QMessageBox)from PyQt5.QtGui import QImage, QPixmapfrom PyQt5.QtCore import QTimer, QtCONFIG_FILE = os.path.join(os.path.dirname(os.path.abspath(file)), "camera_config.json")def load_config():if os.path.exists(CONFIG_FILE):with open(CONFIG_FILE, "r", encoding="utf-8"as f:return json.load(f)return {}def save_config(config):with open(CONFIG_FILE, "w", encoding="utf-8"as f:json.dump(config, f, indent=2, ensure_ascii=False)def get_local_bios_sn():"""获取当前电脑的 BIOS 序列号"""try:result = subprocess.run(['wmic''bios''get''serialnumber'],capture_output=True, text=True, timeout=10)lines = [l.strip() for l in result.stdout.strip().split('\n'if l.strip()]# 第一行是 "SerialNumber",第二行是实际值if len(lines) >= 2:return lines[1]except Exception:passreturn ""class CameraApp(QWidget):def init(self):super().init()self.setWindowTitle("摄像头 SN 配置工具")self.resize(860620)    self.cap = None    self.timer = QTimer()    self.timer.timeout.connect(self.update_frame)    self.config = load_config()    self.init_ui()def init_ui(self):    layout = QVBoxLayout()    # 当前电脑 SN 显示    local_sn = get_local_bios_sn()    sn_display = QHBoxLayout()    sn_display.addWidget(QLabel("当前电脑 SN:"))    self.local_sn_label = QLabel(local_sn if local_sn else "获取失败")    self.local_sn_label.setStyleSheet("font-weight: bold;")    sn_display.addWidget(self.local_sn_label)    sn_display.addStretch()    layout.addLayout(sn_display)    # 配置区域:SN + 摄像头索引 + 保存    config_layout = QHBoxLayout()    config_layout.addWidget(QLabel("电脑 SN:"))    self.sn_input = QLineEdit()    self.sn_input.setPlaceholderText("输入目标电脑的 BIOS SN")    self.sn_input.setText(local_sn)    config_layout.addWidget(self.sn_input)    config_layout.addWidget(QLabel("摄像头索引:"))    self.cam_index_spin = QSpinBox()    self.cam_index_spin.setRange(010)    config_layout.addWidget(self.cam_index_spin)    self.btn_save = QPushButton("保存配置")    self.btn_save.clicked.connect(self.save_config_entry)    config_layout.addWidget(self.btn_save)    layout.addLayout(config_layout)    # 打开摄像头区域    open_layout = QHBoxLayout()    open_layout.addWidget(QLabel("输入 SN 打开摄像头:"))    self.open_sn_input = QLineEdit()    self.open_sn_input.setPlaceholderText("输入 SN,自动匹配配置中的摄像头索引")    self.open_sn_input.setText(local_sn)    open_layout.addWidget(self.open_sn_input)    self.btn_open = QPushButton("打开摄像头")    self.btn_open.clicked.connect(self.open_camera)    open_layout.addWidget(self.btn_open)    self.btn_stop = QPushButton("关闭摄像头")    self.btn_stop.clicked.connect(self.stop_camera)    open_layout.addWidget(self.btn_stop)    self.btn_scan = QPushButton("扫描所有摄像头")    self.btn_scan.clicked.connect(self.scan_cameras)    open_layout.addWidget(self.btn_scan)    layout.addLayout(open_layout)    # 视频画面    self.video_label = QLabel("摄像头画面")    self.video_label.setMinimumSize(640360)    self.video_label.setStyleSheet("background-color: #222; color: white;")    self.video_label.setAlignment(Qt.AlignCenter)    layout.addWidget(self.video_label)    # 状态栏    self.status_label = QLabel("就绪")    layout.addWidget(self.status_label)    self.setLayout(layout)def save_config_entry(self):    sn = self.sn_input.text().strip()    if not sn:        QMessageBox.warning(self"提示""请输入电脑 SN")        return    cam_idx = self.cam_index_spin.value()    self.config[sn] = cam_idx    save_config(self.config)    self.status_label.setText(f"已保存: SN={sn} → 摄像头索引={cam_idx}")def open_camera(self):    sn = self.open_sn_input.text().strip()    if not sn:        self.status_label.setText("请输入 SN")        return    if sn not in self.config:        self.status_label.setText(f"配置中未找到 SN: {sn},请先保存配置")        return    cam_idx = self.config[sn]    self.stop_camera()    self.cap = cv2.VideoCapture(cam_idx, cv2.CAP_DSHOW)    if self.cap.isOpened():        # 跳过前 10 帧(摄像头预热,避免黑屏)        for _ in range(10):            self.cap.read()        self.status_label.setText(f"已打开摄像头 (SN: {sn}, 索引: {cam_idx})")        self.timer.start(30)    else:        self.status_label.setText(f"摄像头索引 {cam_idx} 打开失败,请确认设备可用或更换索引")        self.cap = Nonedef scan_cameras(self):    """扫描索引 0~9,逐个尝试打开并读取一帧,显示哪些有画面"""    self.stop_camera()    self.status_label.setText("正在扫描摄像头...")    QApplication.processEvents()    results = []    for i in range(10):        cap = cv2.VideoCapture(i, cv2.CAP_DSHOW)        if cap.isOpened():            # 跳过几帧预热            for _ in range(5):                cap.read()            ret, frame = cap.read()            if ret:                # 判断是否为黑屏(平均亮度极低)                gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)                brightness = gray.mean()                status = f"有画面 (亮度:{brightness:.0f})" if brightness > 5 else "黑屏"                results.append(f"索引 {i}: 可打开 - {status}")            else:                results.append(f"索引 {i}: 可打开 - 无法读取帧")            cap.release()        else:            results.append(f"索引 {i}: 无法打开")    info = "\n".join(results)    QMessageBox.information(self"摄像头扫描结果", info)    self.status_label.setText("扫描完成,请根据结果选择正确的摄像头索引")def stop_camera(self):    self.timer.stop()    if self.cap:        self.cap.release()        self.cap = None    self.video_label.clear()    self.video_label.setText("摄像头画面")def update_frame(self):    if self.cap and self.cap.isOpened():        ret, frame = self.cap.read()        if ret:            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)            h, w, ch = frame.shape            img = QImage(frame.data, w, h, ch * w, QImage.Format_RGB888)            scaled = QPixmap.fromImage(img).scaled(                self.video_label.size(), Qt.KeepAspectRatio, Qt.SmoothTransformation            )            self.video_label.setPixmap(scaled)def closeEvent(self, event):    self.stop_camera()    event.accept()if name == 'main':app = QApplication(sys.argv)window = CameraApp()window.show()sys.exit(app.exec_())

    最新文章

    随机文章

    基本 文件 流程 错误 SQL 调试
    1. 请求信息 : 2026-07-02 23:31:07 HTTP/2.0 GET : https://f.mffb.com.cn/a/502591.html
    2. 运行时间 : 0.406959s [ 吞吐率:2.46req/s ] 内存消耗:4,842.53kb 文件加载:140
    3. 缓存信息 : 0 reads,0 writes
    4. 会话信息 : SESSION_ID=438c2af77374755e56342c6856d08900
    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.000781s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
    2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000922s ]
    3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.008000s ]
    4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000497s ]
    5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000642s ]
    6. SELECT * FROM `set` [ RunTime:0.001147s ]
    7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000565s ]
    8. SELECT * FROM `article` WHERE `id` = 502591 LIMIT 1 [ RunTime:0.022487s ]
    9. UPDATE `article` SET `lasttime` = 1783006267 WHERE `id` = 502591 [ RunTime:0.002428s ]
    10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000247s ]
    11. SELECT * FROM `article` WHERE `id` < 502591 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.005124s ]
    12. SELECT * FROM `article` WHERE `id` > 502591 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000988s ]
    13. SELECT * FROM `article` WHERE `id` < 502591 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.127286s ]
    14. SELECT * FROM `article` WHERE `id` < 502591 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.133504s ]
    15. SELECT * FROM `article` WHERE `id` < 502591 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.016967s ]
    0.408808s