当前位置:首页>python>不用写前端:用纯 Python 搭建微生物组交互式数据看板

不用写前端:用纯 Python 搭建微生物组交互式数据看板

  • 2026-08-25 08:30:59
不用写前端:用纯 Python 搭建微生物组交互式数据看板

不用写前端:用纯 Python 搭建微生物组交互式数据看板

在微生物组和多组学研究中,我们经常需要反复完成以下工作:

  • • 上传 OTU、ASV 或物种丰度表
  • • 预览和筛选数据
  • • 计算相对丰度
  • • 绘制多样性图
  • • 下载处理结果
  • • 将分析工具部署给课题组成员使用

如果每次都编写脚本、导出图片,再手动整理结果,整个过程会比较繁琐。

Dash 提供了一种更直观的解决方案:使用纯 Python 构建交互式网页工具。即使不熟悉 HTML、CSS 和 JavaScript,也可以快速搭建适用于微生物组和多组学分析的内部数据看板。

本文将依次介绍:

  1. 1. Dash 环境安装
  2. 2. Dash 的核心运行逻辑
  3. 3. 第一个交互式网页
  4. 4. 微生物多样性可视化
  5. 5. 丰度表上传、预览与下载
  6. 6. 测试数据生成
  7. 7. Linux 服务器内网部署
  8. 8. 常见问题与安全注意事项

一、准备 Python 环境

建议使用独立的 Conda 环境,避免 Dash、Plotly、Pandas 与现有生物信息学软件发生依赖冲突。

新项目推荐使用 Python 3.11 或 3.12。如果必须使用旧版 Python,需要同时固定兼容的软件包版本。

创建环境:

conda create --name python-dash python=3.12 -yconda activate python-dash

升级 pip:

python -m pip install --upgrade pip

安装核心软件包:

python -m pip install dash plotly pandas

安装 Bootstrap 界面组件:

python -m pip install dash-bootstrap-components

如果需要部署到 Linux 服务器,还需要安装 Gunicorn:

python -m pip install gunicorn

不建议固定安装过旧的 click==8.0.3,除非某个历史项目存在明确的版本兼容需求。


二、理解 Dash 的三个核心概念

1. 创建应用

app = Dash(__name__)

这行代码用于创建整个 Dash Web 应用。

2. 定义页面布局

app.layout = ...

app.layout 用于定义页面中显示的内容,例如标题、按钮、下拉菜单、文件上传区域、数据表格和 Plotly 图形。

Dash 组件主要分为两类:

  • • html.*:标题、段落、按钮和页面容器
  • • dcc.*:下拉框、图形、上传和下载等交互组件

例如:

html.H1("页面标题")html.Div("普通内容")dcc.Dropdown(...)dcc.Graph(...)dcc.Upload(...)dcc.Download(...)

3. 使用回调函数

回调函数负责连接用户操作和页面输出:

用户操作   ↓Input 获取输入   ↓Python 回调函数执行   ↓Output 返回结果   ↓网页局部更新

例如,用户选择实验分组后,Dash 可以自动筛选数据并更新对应图形,不需要刷新整个网页。


三、创建第一个 Dash 应用

新建一个名为 app.py 的文件:

from dash import Dash, htmlapp = Dash(__name__)app.layout = html.Div(    [html.H1("Hello Dash!我的第一个交互式工具")])if __name__ == "__main__":    app.run(debug=True)

在终端中运行:

python app.py

然后在运行程序的同一台电脑上打开:

http://127.0.0.1:8050

debug=True 表示开发模式。生产环境必须关闭调试模式:

app.run(debug=False)

如果 Dash 运行在远程服务器上,建议通过 SSH 隧道、单位 VPN 或受控内网访问,不要直接将开发服务器暴露到公网。


四、创建微生物 α 多样性交互图

下面构建一个简单的 Shannon 指数看板。用户切换实验分组后,Plotly 图形会自动更新。

import pandas as pdimport plotly.express as pximport dash_bootstrap_components as dbcfrom dash import Dash, Input, Output, callback, dcc, htmlapp = Dash(    __name__,    external_stylesheets=[dbc.themes.BOOTSTRAP],)df = pd.DataFrame(    {        "Group": ["A", "A", "A", "B", "B", "B"],        "Shannon": [2.1, 2.3, 2.2, 3.5, 3.6, 3.4],    })app.layout = dbc.Container(    [        html.H2("微生物 α 多样性看板"),        dcc.Dropdown(            id="group-selector",            options=[                {"label": group, "value": group}                for group in df["Group"].unique()            ],            value="A",            clearable=False,        ),        html.Hr(),        dcc.Graph(id="box-figure"),    ],    fluid=True,)@callback(    Output("box-figure", "figure"),    Input("group-selector", "value"),)def draw_box(selected_group):    """根据用户选择的分组返回对应图形。"""    subset = df[df["Group"] == selected_group]    figure = px.box(        subset,        y="Shannon",        points="all",        title=f"Shannon 指数:Group {selected_group}",    )    return figureif __name__ == "__main__":    app.run(debug=True)

回调函数中:

  • • group-selector 是下拉菜单的组件 ID
  • • value 是下拉菜单当前选择的值
  • • box-figure 是图形组件的 ID
  • • figure 是需要更新的图形属性

回调函数参数的顺序必须与 Input 的顺序一致,返回值的顺序必须与 Output 的顺序一致。


五、构建丰度表上传和下载工具

下面创建一个接近实际科研场景的工具,实现 CSV 丰度表上传、数据预览、相对丰度计算和结果下载。

预期输入格式为:

  • • 每一行代表一个 OTU、ASV 或分类单元
  • • 数值列代表不同样本
  • • 非数值列代表 OTU ID、物种名称或分类注释

将以下内容保存为 app.py

import base64import ioimport dash_bootstrap_components as dbcimport pandas as pdfrom dash import Dash, Input, Output, State, callback, dcc, htmlfrom dash.exceptions import PreventUpdateapp = Dash(    __name__,    external_stylesheets=[dbc.themes.BOOTSTRAP],    prevent_initial_callbacks=True,)server = app.serverapp.layout = dbc.Container(    [        html.H3("微生物丰度表处理工具", className="mb-4"),        dcc.Upload(            id="upload-csv",            children=html.Div(                [                    "拖拽 CSV 文件到此处,或点击选择文件",                    html.P(                        "数据格式:行代表特征,数值列代表样本",                        className="text-muted small",                    ),                ]            ),            accept=".csv,text/csv",            multiple=False,            style={                "border": "2px dashed #007bff",                "padding": "30px",                "textAlign": "center",                "borderRadius": "8px",            },        ),        html.Div(id="upload-info", className="mt-3 mb-3"),        dbc.Button(            "下载处理后的数据",            id="download-button",            color="success",            className="mb-3",        ),        dcc.Download(id="download-result"),        html.H5("数据预览", className="mt-4"),        html.Div(id="data-preview"),    ],    fluid=True,)def decode_csv(content):    """解析 dcc.Upload 接收到的 CSV 文件。"""    _, encoded_content = content.split(",", 1)    decoded_bytes = base64.b64decode(encoded_content)    return pd.read_csv(        io.StringIO(decoded_bytes.decode("utf-8-sig"))    )@callback(    Output("upload-info", "children"),    Output("data-preview", "children"),    Input("upload-csv", "contents"),)def preview_uploaded_file(content):    if content is None:        raise PreventUpdate    try:        data = decode_csv(content)    except Exception:        error_message = dbc.Alert(            "文件解析失败,请确认上传的是有效的 CSV 文件。",            color="danger",        )        return error_message, ""    information = dbc.Alert(        f"上传成功:{data.shape[0]} 行 × {data.shape[1]} 列",        color="success",    )    preview = dbc.Table.from_dataframe(        data.head(10),        striped=True,        bordered=True,        hover=True,        responsive=True,    )    return information, preview@callback(    Output("download-result", "data"),    Input("download-button", "n_clicks"),    State("upload-csv", "contents"),    prevent_initial_call=True,)def process_and_download(n_clicks, content):    if not n_clicks or content is None:        raise PreventUpdate    data = decode_csv(content)    numeric_columns = data.select_dtypes(include="number").columns    if numeric_columns.empty:        raise PreventUpdate    column_totals = (        data[numeric_columns]        .sum(axis=0)        .replace(0, pd.NA)    )    processed = data.copy()    processed[numeric_columns] = data[numeric_columns].div(        column_totals,        axis=1,    )    return dcc.send_data_frame(        processed.to_csv,        "processed_abundance.csv",        index=False,    )if __name__ == "__main__":    app.run(        debug=True,        host="127.0.0.1",        port=8050,    )

示例默认把所有数值列视为样本丰度列。实际使用时,应根据数据结构明确区分样本丰度列、特征编号、分类注释、实验分组和环境因子。

零总丰度样本会被转换为缺失值。正式分析前,应根据研究设计确定过滤和标准化方法。


六、生成测试用丰度表

新建 generate_test_data.py

import numpy as npimport pandas as pdrng = np.random.default_rng(seed=42)otu_ids = [    f"OTU_{index + 1:03d}"    for index in range(100)]control = rng.poisson(lam=50, size=(100, 3))treatment = rng.poisson(lam=80, size=(100, 3))abundance = np.hstack([control, treatment])data = pd.DataFrame(    abundance,    index=otu_ids,    columns=[        "Control_1",        "Control_2",        "Control_3",        "Treatment_1",        "Treatment_2",        "Treatment_3",    ],)data.to_csv(    "test_abundance.csv",    index_label="OTU_ID",    encoding="utf-8",)print("已生成测试文件:test_abundance.csv")print(f"数据维度:{data.shape}")print(data.head())

运行:

python generate_test_data.py

程序会生成 test_abundance.csv,可用于测试上传、预览、标准化和下载流程。

样本分组信息通常应保存在独立的元数据表中,而不是直接加入 OTU 或 ASV 丰度表的特征行中。


七、部署到实验室内网服务器

app.run() 启动的是 Dash 开发服务器,主要用于本地调试,不适合正式的多人访问环境。在 Linux 服务器上,可以使用 Gunicorn 运行 Dash 应用。

1. 暴露 WSGI 服务对象

代码中需要包含:

server = app.server

程序底部保留:

if __name__ == "__main__":    app.run(        debug=False,        host="127.0.0.1",        port=8050,    )

使用 Gunicorn 启动时,以上 app.run() 不会执行。Gunicorn 会直接导入 server 对象。

2. 启动 Gunicorn

进入项目目录并激活环境:

cd PROJECT_DIRECTORYconda activate python-dash

启动服务:

gunicorn \  --workers 4 \  --bind 0.0.0.0:8050 \  app:server

参数含义:

  • • --workers 4:启动 4 个工作进程
  • • --bind 0.0.0.0:8050:监听服务器的网络接口
  • • app:server:导入 app.py 中的 server 对象

Worker 数量需要结合服务器内存、回调计算量、同时在线人数和单次上传文件大小确定。

团队成员连接授权的单位内网或 VPN 后,可以访问:

http://SERVER_PRIVATE_IP:8050

公开文章中不要填写真实服务器 IP。

3. 配置防火墙

只允许受信任的内网网段访问 8050 端口,不要直接对所有来源开放。

使用 firewalld 时,可由管理员配置:

sudo firewall-cmd \  --permanent \  --add-rich-rule='rule family="ipv4" source address="TRUSTED_SUBNET" port port="8050" protocol="tcp" accept'sudo firewall-cmd --reload

使用 UFW 时:

sudo ufw allow \  from TRUSTED_SUBNET \  to any port 8050 \  proto tcp

服务器地址和防火墙规则应由单位网络管理员确认。不要将 8050 端口直接映射到公网。


八、让服务在后台持续运行

临时测试可以使用:

nohup gunicorn \  --workers 4 \  --bind 0.0.0.0:8050 \  app:server \  > dash-tool.log 2>&1 &

查看日志:

tail -f dash-tool.log

长期运行更推荐使用 systemd、容器平台或其他进程管理工具。

下面是经过脱敏的 systemd 配置示例:

[Unit]Description=Internal Dash microbiome applicationAfter=network.target[Service]Type=simpleUser=SERVICE_USERGroup=SERVICE_USERWorkingDirectory=PROJECT_DIRECTORYExecStart=GUNICORN_PATH --workers 4 --bind 0.0.0.0:8050 app:serverRestart=on-failurePrivateTmp=trueNoNewPrivileges=true[Install]WantedBy=multi-user.target

保存为:

/etc/systemd/system/dash-microbiome.service

由管理员执行:

sudo systemctl daemon-reloadsudo systemctl enable --now dash-microbiomesudo systemctl status dash-microbiome

查看日志:

sudo journalctl \  --unit dash-microbiome \  --follow

公开教程中不要填写真实用户名、服务器目录、Conda 安装路径或内部主机信息。


九、常见问题

1. 浏览器无法打开页面

依次检查:

  • • 用户电脑是否连接单位内网或 VPN
  • • Gunicorn 是否正常运行
  • • 服务器防火墙是否允许访问 8050 端口
  • • Gunicorn 是否绑定到正确的网络接口
  • • 浏览器中使用的是否为服务器内网地址
  • • 服务是否被反向代理或其他安全策略拦截

不要在团队成员的电脑上输入 http://127.0.0.1:8050,因为 127.0.0.1 始终指向当前浏览器所在的电脑,而不是远程服务器。

2. 上传较大的 CSV 文件失败

Gunicorn 的 --limit-request-line 和 --limit-request-field_size 控制的是请求行和请求头,不是上传文件的请求体大小,不能通过增加这两个参数解决大文件上传问题。

如果使用 Nginx 反向代理,可以根据实际需要配置:

client_max_body_size 50M;

具体大小应根据丰度表大小、服务器内存、并发用户数和机构网络策略合理设置。不要无限制接收大型上传文件。

3. 多人上传文件会不会相互干扰

不要把用户上传的数据保存在可变的全局变量中,例如:

uploaded_dataframe = ...

不同用户或不同 Gunicorn Worker 之间可能发生状态不一致,甚至造成数据混用。

本文示例在每次回调中重新解析上传内容,没有把用户 DataFrame 放入应用级全局变量,更适合简单的多用户场景。

对于大型文件或耗时任务,建议进一步使用带过期时间的服务端缓存、独立的用户会话 ID、后台任务队列、数据访问控制和自动清理机制。

4. app.run_server() 无法使用

新版 Dash 推荐使用:

app.run()

生产环境由 Gunicorn 导入:

app:server

此时不会执行开发模式下的 app.run()


十、部署安全注意事项

实验室内部工具同样需要重视数据安全。部署前至少应检查以下事项:

  1. 1. 不要在公开代码中提交真实服务器 IP、主机名或端口映射信息。
  2. 2. 不要提交个人用户名、私人目录或内部网络结构。
  3. 3. 不要提交密码、Token、API Key、Cookie 或 SSH 私钥。
  4. 4. 生产环境必须关闭 debug=True
  5. 5. 只允许可信内网或单位 VPN 访问服务。
  6. 6. 上传文件前应检查文件类型、大小、编码和数据结构。
  7. 7. 不要直接使用用户上传的文件名创建服务器路径。
  8. 8. 不要将未发表数据或敏感样本信息上传到未经授权的服务器。
  9. 9. 定期更新依赖,并使用版本锁定文件保证环境可复现。
  10. 10. 如果数据流量经过不可信网络,应使用 HTTPS。
  11. 11. 对敏感研究数据应设置登录认证和访问权限。
  12. 12. 遵守所在机构的数据保存、备份和销毁规定。

如果只是低风险的内网原型,可以安装 dash-auth

python -m pip install dash-auth

对于未发表组学数据、临床数据或其他敏感信息,更推荐使用单位统一身份认证、带身份验证的反向代理、单位 VPN 或机构级访问控制系统。

不建议仅依赖代码中硬编码的用户名和密码。


十一、总结

Dash 的主要优势是可以使用熟悉的 Python 数据分析工具构建交互式网页应用。

对于微生物组和多组学研究,它可以用于开发:

  • • α 和 β 多样性分析看板
  • • 物种组成交互图
  • • 差异丰度分析工具
  • • 功能基因检索平台
  • • MAG 基因组信息浏览器
  • • 抗生素抗性基因监测界面
  • • 环境因子关联分析工具
  • • 多组学数据整合平台
  • • 分析流程参数配置页面
  • • 结果查询和下载系统

从一个简单的下拉菜单开始,就可以逐步加入文件上传、数据处理、交互绘图、结果下载和服务器部署功能。

对于经常需要重复分析、向团队展示结果或共享内部工具的科研人员而言,Dash 是一种门槛较低、扩展性较好的 Python Web 应用开发方案。

以上就是本次分享的所有内容,如果觉得有用,不妨点赞收藏转发给需要的人吧,这对我非常重要,非常感谢您的阅读!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-08-25 10:50:25 HTTP/2.0 GET : https://f.mffb.com.cn/a/512174.html
  2. 运行时间 : 0.243158s [ 吞吐率:4.11req/s ] 内存消耗:4,682.47kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=46449598fede26c9966f17b1cbb45b9c
  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.001135s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001354s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.002762s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000643s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001451s ]
  6. SELECT * FROM `set` [ RunTime:0.003104s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001552s ]
  8. SELECT * FROM `article` WHERE `id` = 512174 LIMIT 1 [ RunTime:0.020822s ]
  9. UPDATE `article` SET `lasttime` = 1787626225 WHERE `id` = 512174 [ RunTime:0.020170s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000651s ]
  11. SELECT * FROM `article` WHERE `id` < 512174 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.001104s ]
  12. SELECT * FROM `article` WHERE `id` > 512174 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001139s ]
  13. SELECT * FROM `article` WHERE `id` < 512174 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.006879s ]
  14. SELECT * FROM `article` WHERE `id` < 512174 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.007390s ]
  15. SELECT * FROM `article` WHERE `id` < 512174 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.004944s ]
0.246866s