当前位置:首页>python>【Python大语言模型系列】基于FastAPI开发一个简单的AI聊天应用(完整项目)

【Python大语言模型系列】基于FastAPI开发一个简单的AI聊天应用(完整项目)

  • 2026-08-19 01:54:31
【Python大语言模型系列】基于FastAPI开发一个简单的AI聊天应用(完整项目)

这是我的第477篇原创文章。

写在前面

『数据杂坛』以Python语言为核心,垂直于数据科学领域,专注于(可戳👉)Python程序设计|数据分析|特征工程|机器学习分类|机器学习回归|深度学习分类|深度学习回归|单变量时序预测|多变量时序预测|语音识别|图像识别|自然语音处理|大语言模型|软件设计开发等技术栈交流学习,涵盖数据挖掘计算机视觉自然语言处理等应用领域。(文末有惊喜福利

一、引言

本项目展示了使用 FastAPI 构建 AI 聊天应用的完整流程,核心技术包括:

  • 异步编程:提升并发处理能力
  • 流式响应:改善用户体验
  • 会话管理:实现多轮对话记忆
  • 角色系统:支持多样化 AI 交互

这个架构具有良好的扩展性,可以轻松添加用户认证、多模态交互等高级功能。FastAPI 的高性能和完善的类型系统使其成为构建现代 AI 应用的理想选择。

  • 核心功能

    • 连续多轮对话:AI 能记住对话历史,就像和真人聊天一样自然

    • 多角色切换:可以选择不同的 AI 角色(智能助手、AI 老师、编程专家)

    • 流式响应:AI 回复时有打字机效果,体验更流畅

    • 会话管理:支持多个对话会话,可以随时切换

    • Web 界面:简洁美观的聊天界面,操作简单

  • 技术栈

    • 后端框架:FastAPI(Python 的现代 Web 框架)

    • 数据存储:Redis(高性能内存数据库)

    • AI 模型:支持 OpenAI 接口请求调用

    • 前端:HTML + CSS + JavaScript

    • 服务器:Uvicorn(高性能 ASGI 服务器)

  • 技术特性

    • 数据持久化: 支持Redis存储,自动降级到内存存储

    • 配置灵活: 支持环境变量和配置文件

    • 日志系统: 完整的日志记录和错误追踪

    • 响应式设计: 现代化的Web界面

    • API文档: 自动生成的FastAPI文档

项目结构

fastapi-ai-chat-demo/├── main.py                 # 主应用文件├── config.py              # 配置管理├── start_server.py        # 启动脚本├── requirements.txt       # 依赖包列表├── .env.example          # 环境变量模板├── ai_providers/         # AI提供商模块│   ├── __init__.py│   ├── base.py          # 基础类定义│   ├── factory.py       # 提供商工厂│   ├── openai_provider.py│   ├── deepseek_provider.py│   ├── doubao_provider.py│   ├── kimi_provider.py│   ├── qianwen_provider.py│   └── openai_compatible_provider.py├── static/              # 静态文件│   ├── index.html      # 聊天界面│   ├── css/│   └── js/├── docs/               # 项目文档└── logs/              # 日志文件目录

这个项目是"逻辑上分离,工程上未分离"。

逻辑层面(API 通信):是分离的。前端通过 fetch 调 HTTP API 获取数据,后端只返回 JSON 数据,不返回 HTML 页面,前端独立渲染。这就是标准的"前后端分离"通信模式:

工程/部署层面:没分离。同一进程提供:前端文件由 FastAPI 直接托管 —— app.mount("/static", StaticFiles(...)) (main.py:61),访问 / 重定向到 /static/index.html (main.py:394)。前端不需要独立服务器。同一目录、同一仓库:static/ 就放在后端项目里。无前端构建工具链:没有 Vite/Webpack/npm,没有 React/Vue,没有独立构建产物。就是一个原生 HTML + 内联 <script> 单文件。同端口部署:前后端都跑在 0.0.0.0:8000,不存在跨域问题,所以接口连 CORS 配置都没有(只有响应头手写了个 Access-Control-Allow-Origin,main.py:428)。

前端文件和后端 API 由同一个进程提供。但是:前端代码的执行不在这个进程 。关键点——FastAPI 只是把 index.html 的字节发给浏览器,它自己不会执行 JS。 下载到浏览器后,<script> 里的代码是在你电脑上的浏览器进程里跑的。

二、实现过程

2.1 后端实现

API接口

聊天相关

  • POST /chat/start- 开始新的聊天会话

  • POST /chat/stream- 流式聊天接口

  • GET /chat/history- 获取聊天历史

  • GET /chat/sessions- 获取用户会话列表

  • DELETE /chat/session/{session_id}- 删除聊天会话

  • DELETE /chat/history/{session_id}- 清除对话历史

配置相关

  • GET /roles- 获取可用的AI角色列表

  • GET /providers- 获取可用的AI提供商列表

  • 文件上传

  • POST /upload/image- 图片上传接口

其他

  • GET /- 重定向到聊天界面

  • GET /api- API信息

详细的API文档可访问:http://localhost:8000/docs

我们的聊天应用提供了 5 个核心 API 接口,就像一个完整的"聊天服务台":

1. 开始新对话:为每个用户创建一个新的"聊天房间",返回房间号(会话 ID)。

@app.post("/chat/start")async def start_chat(user_id: str):    session_id = generate_session_id()    return {"session_id": session_id, "welcome_message""你好!我是你的AI助手"}

2. 流式聊天:这是核心接口!处理用户消息,调用 AI 生成回复,并实时返回。

@app.get("/chat/stream")async def chat_stream(user_id: str, session_id: str, message: str, role: str = "assistant"):    return StreamingResponse(generate_streaming_response(user_id, session_id, message, role))

 3. 获取聊天历史:查看之前的聊天记录,就像翻看聊天记录本

@app.get("/chat/history")async def get_chat_history(user_id: str, session_id: str):    history = await get_conversation_history(user_id, session_id)    return {"messages": history, "total"len(history)}

4. 清除对话历史:清空聊天记录,重新开始对话。

@app.delete("/chat/history/{session_id}")async def clear_conversation_history(session_id: str, user_id: str):    redis_client.delete(get_conversation_key(user_id, session_id))    return {"message""对话历史已清除"}

5. 获取 AI 角色列表:获取所有可用的 AI 角色(助手、老师、程序员等)。

@app.get("/roles")async def get_roles():    return {"roles": AI_ROLES, "default_role""assistant"}

安全特性

  • 参数验证:检查输入参数的有效性
  • 错误处理:优雅处理各种异常情况
  • CORS 支持:允许跨域访问
  • 速率限制:防止恶意请求(可选)

2.2 前端实现

前端就是用户看到和操作的界面,我们用 HTML、CSS 和 JavaScript 构建了一个现代化的聊天界面。

界面结构:我们的聊天界面包含几个主要部分:

<divclass="chat-container">    <!-- 1. 头部:显示标题和角色选择 -->    <divclass="chat-header">        <h1>🤖 AI智能助手</h1>        <selectid="roleSelect">            <optionvalue="assistant">💬 智能助手</option>            <optionvalue="teacher">👨‍🏫 AI老师</option>            <optionvalue="programmer">👨‍💻 编程专家</option>        </select>    </div>    <!-- 2. 消息区域:显示对话内容 -->    <divclass="messages-container"id="messagesContainer">        <!-- 消息会动态添加到这里 -->    </div>    <!-- 3. 输入区域:用户输入消息 -->    <divclass="input-container">        <inputtype="text"id="messageInput"placeholder="输入你的消息...">        <buttononclick="sendMessage()">📤 发送</button>    </div>    <!-- 4. 工具栏:常用功能按钮 -->    <divclass="toolbar">        <buttononclick="clearHistory()">🗑️ 清除历史</button>        <buttononclick="newChat()">🆕 新对话</button>    </div></div>

效果展示

样式设计特点

  • 现代化外观:使用渐变色和圆角设计
  • 消息气泡:用户消息在右边(蓝色),AI 消息在左边(白色)
  • 响应式布局:在手机和电脑上都能正常显示
  • 动画效果:按钮悬停效果和打字指示器
  • 清晰层次:不同区域有明确的视觉分割

JavaScript 核心逻辑:JavaScript 负责处理用户交互和与后端的通信,就像聊天应用的"大脑"。

1. 开始新对话

async function startNewChat() {    // 调用后端API创建新会话    const response = await fetch('/api/chat/start', { method'POST' });    const data = await response.json();    currentSessionId = data.session_id;    // 显示欢迎消息    addMessage('assistant''你好!我是你的AI助手,有什么可以帮助你的吗?');}

2. 发送消息

async function sendMessage() {    const message = document.getElementById('messageInput').value;    // 显示用户消息    addMessage('user', message);    // 使用EventSource接收流式响应    const eventSource = new EventSource(`/api/chat/stream?session_id=${currentSessionId}&message=${message}`);    eventSource.onmessage = function(event) {        const data = JSON.parse(event.data);        if (data.content) {            // 实时显示AI回复            updateAIMessage(data.content);        }    };}

3. 添加消息到界面

function addMessage(role, content) {    const messageDiv = document.createElement('div');    messageDiv.className = `message ${role}`;    // 用户消息显示在右边,AI消息显示在左边    const icon = role === 'user' ? '👤' : '🤖';    messageDiv.innerHTML = `${icon}${content}`;    document.getElementById('messagesContainer').appendChild(messageDiv);    // 自动滚动到最新消息    messageDiv.scrollIntoView({ behavior'smooth' });}

4. 清除历史记录

async function clearHistory() {    if (confirm('确定要清除所有对话历史吗?')) {        await fetch(`/api/chat/history/${currentSessionId}`, { method'DELETE' });        document.getElementById('messagesContainer').innerHTML = '';        addMessage('system''对话历史已清除');    }}

技术亮点

  • EventSource:实现服务器推送,让 AI 回复实时显示
  • DOM 操作:动态添加和更新聊天消息
  • 用户体验:自动滚动、按钮状态管理、错误提示
  • 响应式设计:适配不同设备和屏幕尺寸

2.3 数据模型设计

在聊天应用中,我们需要一个标准的"消息格式"来确保数据的一致性。就像寄信需要标准的信封格式一样:

class ChatMessage(BaseModel):    role: str        # 谁说的话:"user"(用户) 或 "assistant"(AI)    content: str     # 说了什么:具体的对话内容    timestamp: float # 什么时候说的:消息时间戳

为什么需要这个格式?

  • role 字段:帮助 AI 区分哪些是用户的问题,哪些是自己的回答
  • content 字段:存储实际的对话内容
  • timestamp 字段:记录时间,方便按时间顺序显示对话

这种标准化的数据格式让我们的应用更加稳定可靠,也方便后续的功能扩展。

2.4 多轮对话实现

会话管理就像给每个用户分配一个"聊天房间",让 AI 能够记住每个用户的对话历史。

1. 生成会话 ID

def generate_session_id() -> str:    return str(uuid.uuid4())

每个用户开始聊天时,系统会生成一个唯一的"房间号"(会话 ID),就像酒店给客人分配房间一样。

2. 保存对话消息

def save_message(user_id: str, session_id: str, message: ChatMessage):    conversation_key = get_conversation_key(user_id, session_id)    redis_client.lpush(conversation_key, json.dumps(message_data))    redis_client.ltrim(conversation_key, 019)  # 只保留最近20条消息

通过 userid + 会话 id 生成 key,将消息保存到 Redis 队列中

3. 获取对话历史

def get_conversation_history(user_id: str, session_id: str):    conversation_key = get_conversation_key(user_id, session_id)    messages = redis_client.lrange(conversation_key, 0, -1)    return [json.loads(msg) for msg in messages]

从 userid + 会话 id 生成 key,从 Redis 中读取用户该会话的历史消息,让 AI 了解之前聊了什么

为什么这样设计?

  • 唯一性:每个会话都有独特的 ID,避免混淆

  • 持久化:消息存储在 Redis 中,重启应用也不会丢失

  • 性能优化:只保留最近的消息,避免内存占用过大

  • 自动清理:每次只保留最近 20 条消息,自动清理旧数据

2.5 流式响应

流式响应就像 AI 在"实时打字",让用户看到回复逐字出现,而不是等待很久后一次性显示全部内容。

1. 保存用户消息

user_msg = ChatMessage(role="user", content=user_message)save_message(session_id, user_msg)

首先将用户的问题保存到"聊天记录本"中。

2. 获取对话历史

history = get_conversation_history(session_id, limit=10)

读取最近 10 条对话记录,让 AI 了解聊天的上下文。

3. 构建完整对话

messages = [    {"role""system""content": AI_ROLES[role]},  # AI角色设定    *history,  # 历史对话    {"role""user""content": user_message}  # 当前问题]

将角色设定、历史对话和当前问题组合成完整的对话上下文。

4. 调用 AI 服务

response = client.chat.completions.create(    model="gpt-4o",    messages=messages,    stream=True  # 关键:启用流式响应)

在 openAi 接口请求格式中,stream=True 表示启用流式响应。

5. 实时返回回复

for chunk in response:    if chunk.choices[0].delta.content:        content = chunk.choices[0].delta.content        yield f"data: {json.dumps({'content': content})}\n\n"

AI 每生成一小段文字,就立即发送给前端显示。

技术亮点

  • Server-Sent Events (SSE)  :使用 SSE 协议实现服务器向浏览器的实时推送

  • 异步处理:不阻塞其他用户的请求

  • 错误恢复:网络中断时能够优雅处理

  • 上下文保持:每次对话都能"记住"之前聊过的内容

2.6 完整链路:用户发消息 → 模型回复

① 前端准备(浏览器)

<head> 和 <body> 是 HTML 文档的两大组成部分:   

 <head> — 元信息区(不可见)                 

  • - 浏览器渲染前读取,不直接显示在页面上         

  • - 内容:<title>、<meta>(charset、viewport、description)、<link>(CSS、图标)、<style>、     <script>(通常放这里预加载)            

  • - 本文件中的例子:index.html:3-15 里的 charset、viewport、marked.js/highlight.js 引用

<body> — 内容区(可见) 

  • - 用户实际看到的页面内容   

  • - 内容:文本、图片、按钮、div 等结构元素,以及通常放在末尾的 <script>(此时 DOM 已加载完)    

  • - 本文件中的例子:index.html:1686 起的 .app-container 布局、聊天界面、模态框

步骤:

    1、打开页面 GET /static/index.html(main.py:398 根路径重定向)2、getUserId()从 localStorage取或生成 user_id(demo_user_xxx,index.html:18453、启动时 loadProviders()调 GET /providers(index.html:1864),拿可选提供商/模型填充下拉框4、会话:前端本地 currentSessionId(无后端建会话接口,前端自行维护/复用)

    ② 发送消息(前端 → 后端)

    前端通过 #messageInput textarea 获取用户输入,两条触发路径:                                  

    • 输入框事件:textarea 绑定 onkeypress="handleKeyPress(event)" (index.html:1736),按         Enter(非 Shift)时 handleKeyPress (index.html:2318) 调用 sendMessage()。

    • 点击发送按钮:onclick="sendMessage()" (index.html:1763)。

    核心取值逻辑在 sendMessage() (index.html:2340):      

    const message = messageInput.value.trim();   // 读取并去空格                                       ...                                                                                           messageInput.value = '';      // 发送后清空输入框                              

    图片输入是另一条链:handleImageUpload(event) (index.html:2944) 从 <input type="file" id="imageUpload" onchange="handleImageUpload(event)"> (index.html:1755) 读取文件,经 /upload/image 转 base64 存入 currentImageData,随消息一起发。

    1、sendMessage() 构建请求体(index.html:2390):{ user_id, session_id, message, provider, model, image_data, image_type }2、fetch POST /chat/stream,Content-Type: application/json(index.html:2401

    ③ 后端入口 chat_stream(main.py:408)

      1、读取 ChatRequest,role被硬编码为 "assistant"(request.role被忽略)2、校验角色、直接返回 StreamingResponse(media_type="text/event-stream")(SSE3、实际工作在生成器 generate_streaming_response中执行

      ④ 后端 generate_streaming_response(main.py:307)

        1、存用户消息:把用户消息封装 AIMessage→ save_message_to_redis(main.py:177  - Redis 可用:LPUSH conversation:{user_id}:{session_id},设 7 天过期,并更新 user_sessionshash   - Redis 不可用:写入进程内 MEMORY_STORAGE2、取历史:get_conversation_history(main.py:234)LRANGE后 reverse(Redis 倒序存)3、裁剪:只取最近 MAX_HISTORY_MESSAGES(默认20)条4、构造消息:每轮转换回 AIMessage(带 image_data/image_type)5、调模型:ai_manager.generate_streaming_response(messages, provider, model, system_prompt)

        ⑤ MultiProviderManager 路由(factory.py:332)

          1、选定提供商:前端传的 provider(存在则用),否则默认提供商2、model非空时放进 kwargs 透传3、调对应实例的 generate_streaming_response

          ⑥ OpenAICompatibleProvider 调 OpenAI SDK(openai_compatible_provider.py:117)

            1、format_messages(:165):系统提示放最前;带图的 user 消息转成多模态数组:[{type:"image_url", image_url:{url:"data:image/jpeg;base64,..."}}, {type:"text", text:"..."}]2、_build_request_params(:216):model(优先 kwargs → 配置)、max_tokens、temperature、extra_body={"enable_thinking"True}、stream=True3、client.chat.completions.create(**params)返回流迭代器4、逐 chunk 输出(:147):   - 有 delta.reasoning_content → data: {"type":"reasoning","content":...}   - 有 delta.content → data: {"type":"content","content":...}

            ⑦ 后端透传与落库(回到 main.py:350)

              1、每个 chunk:累计 full_response;解析 JSON,只把 type=='content' 累进 content_only_response(深度思考不进历史)2yield chunk原样透传前端3、流结束后:content_only_response封装 assistant ChatMessage → save_message_to_redis入库4、最后 yield data: {"type":"end","session_id":...}(main.py:387

              ⑧ 前端渲染流(index.html:2424 processStream)

                1、reader.read()逐块解码,按 data: 前缀解析 JSON2type==='reasoning'→ 渲染进思考区(.reasoning-content,折叠展示,实时 markdown)3type==='content' → 渲染正文消息(renderMarkdownContent)4、收到 type==='end' → 恢复输入框、更新会话列表

                ⑨ 异常路径

                  1、后端生成器内:抛错则 yield data: {"type":"error",...}(main.py:3922、provider 层:SDK 异常被 provider 内 catch,yield 的是裸错误字符串(无 data: 前缀,openai_compatible_provider.py:163),前端按 data:过滤会直接忽略——错误对用户不可见(配合日志里 403 过期 key 的现象,前端表现为"没回复"

                  一次请求的完整调用栈

                  index.html sendMessage  → POST /chat/stream (main.py:408)    → generate_streaming_response (main.py:307)      → save_message_to_redis (用户消息)      [main.py:177]      → get_conversation_history               [main.py:234]      → MultiProviderManager.generate_streaming_response (factory.py:332)        → OpenAICompatibleProvider.generate_streaming_response (openai_compatible_provider.py:117)          → OpenAI SDK chat.completions.create(stream=True)      → 逐 chunk 解析 + 透传 SSE      → save_message_to_redis (assistant 回复,仅 content)   [main.py:384]  → 前端 processStream 按类型渲染

                  2.7 使用redis

                  三、小结

                  基本聊天

                  • 访问应用首页

                  • 点击"开始新对话"创建会话

                  • 输入消息开始聊天

                  • 支持实时流式响应

                  切换AI提供商

                  • 在聊天界面可以选择不同的AI提供商

                  • 支持在对话中动态切换模型

                  • 每个提供商支持多个模型选择

                  角色切换

                  • 智能助手:通用AI助手

                  • AI老师:教学和解释专家

                  • 编程专家:编程和技术问题专家

                  图片理解

                  • 点击图片上传按钮

                  • 选择图片文件(支持jpg、png等格式)

                  • 发送消息,AI将分析图片内容

                  会话管理

                  • 查看历史会话列表

                  • 删除不需要的会话

                  • 清除会话对话历史

                  环境要求

                  • Python 3.8+

                  • Redis (可选,不配置时使用内存存储)

                  安装依赖

                  pip install -r requirements.txt

                  配置环境变量

                  复制环境变量模板:

                  cp .env.example .env

                  编辑 .env 文件,配置你的AI提供商API密钥:

                  # OpenAI配置OPENAI_API_KEY=your_openai_api_keyOPENAI_BASE_URL=https://api.openai.com/v1# DeepSeek配置DEEPSEEK_API_KEY=your_deepseek_api_key# 豆包配置DOUBAO_API_KEY=your_doubao_api_key# Kimi配置KIMI_API_KEY=your_kimi_api_key# 通义千问配置QIANWEN_API_KEY=your_qianwen_api_key# Redis配置(可选)REDIS_HOST=localhostREDIS_PORT=6379REDIS_PASSWORD=REDIS_DB=0# 应用配置DEFAULT_AI_PROVIDER=openaiDEBUG=trueLOG_LEVEL=INFO

                  启动应用

                  # 方式1:直接启动python main.py# 方式2:使用启动脚本python start_server.py# 方式3:使用uvicornuvicorn main:app --host 0.0.0.0 --port 8000 --reload

                  访问 http://localhost:8000 开始使用聊天应用。

                  三、小结

                  服务启动后效果展示:

                  应用提供完整的日志记录功能:

                  • 控制台输出:实时查看应用状态
                  • 文件日志:保存在 logs/ 目录下
                  • 日志级别:支持DEBUG、INFO、WARNING、ERROR

                  日志内容包括:

                  • API请求和响应
                  • AI提供商调用情况
                  • 错误和异常信息
                  • 会话管理操作
                  热门原创文章推荐阅读点击标题可跳转
                  写在后面

                  作者简介:

                  读研期间发表6篇SCI数据算法相关论文,目前在某研究院从事数据算法相关研究工作,结合自身科研实践经历不定期持续分享关于Python、数据分析、特征工程、机器学习、深度学习、人工智能系列基础知识与案例。

                  致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。

                  1、关注下方公众号,点击“领资料”即可免费领取电子资料书籍。

                  2、文章底部点击喜欢作者即可联系作者获取相关数据集和源码

                  3、数据算法方向论文指导就业指导,点击“联系我”添加作者微信直接交流。

                  4、有商务合作相关意向,点击“联系我”添加作者微信直接交流。

                  免费电子书籍,带你入门人工智能:

                  最新文章

                  随机文章

                  基本 文件 流程 错误 SQL 调试
                  1. 请求信息 : 2026-08-21 13:34:55 HTTP/2.0 GET : https://f.mffb.com.cn/a/510802.html
                  2. 运行时间 : 0.449671s [ 吞吐率:2.22req/s ] 内存消耗:4,976.80kb 文件加载:140
                  3. 缓存信息 : 0 reads,0 writes
                  4. 会话信息 : SESSION_ID=fec2afd658991193f0edabc4962ead0e
                  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.001012s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
                  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001389s ]
                  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.001512s ]
                  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.101371s ]
                  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001701s ]
                  6. SELECT * FROM `set` [ RunTime:0.070911s ]
                  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.001877s ]
                  8. SELECT * FROM `article` WHERE `id` = 510802 LIMIT 1 [ RunTime:0.004836s ]
                  9. UPDATE `article` SET `lasttime` = 1787290496 WHERE `id` = 510802 [ RunTime:0.016465s ]
                  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.009090s ]
                  11. SELECT * FROM `article` WHERE `id` < 510802 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.026602s ]
                  12. SELECT * FROM `article` WHERE `id` > 510802 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.010090s ]
                  13. SELECT * FROM `article` WHERE `id` < 510802 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.007452s ]
                  14. SELECT * FROM `article` WHERE `id` < 510802 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.008949s ]
                  15. SELECT * FROM `article` WHERE `id` < 510802 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002735s ]
                  0.454473s