乐于分享
好东西不私藏

第七篇:【插件篇】QwenPaw前端插件系统

第七篇:【插件篇】QwenPaw前端插件系统

7.1 章节概述

插件系统是现代前端应用扩展性的核心保障。QwenPaw的插件系统设计精妙,它允许第三方开发者扩展应用功能,同时保持核心代码的稳定性和安全性。

本章将深入剖析QwenPaw前端的插件系统实现,包括PluginContext上下文、Host Externals机制、动态模块注册表,以及插件加载器等核心组件。

通过阅读本章,您将:

理解插件系统的核心设计理念
掌握PluginContext的实现原理
学会Host Externals的依赖共享机制
了解模块注册表的运行时替换能力

7.2 插件系统架构总览

7.2.1 系统架构图

┌─────────────────────────────────────────────────────────────────────────────┐
│ QwenPaw 插件系统架构 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ 插件系统入口层 │ │
│ │ │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐ │ │
│ │ │ PluginProvider │ │ │
│ │ │ - 封装PluginSystem单例 │ │ │
│ │ │ - 提供usePlugins Hook │ │ │
│ │ │ - 订阅插件状态变化 │ │ │
│ │ └─────────────────────────────────────────────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ 插件核心层 │ │
│ │ │ │
│ │ ┌────────────────┐ ┌────────────────┐ ┌────────────────────────┐ │ │
│ │ │ PluginSystem │ │ ModuleRegistry │ │ HostExternals │ │ │
│ │ │ 插件状态管理 │ │ 模块注册表 │ │ Host依赖暴露 │ │ │
│ │ └────────────────┘ └────────────────┘ └────────────────────────┘ │ │
│ │ │ │
│ │ ┌────────────────┐ ┌────────────────┐ ┌────────────────────────┐ │ │
│ │ │ PluginLoader │ │ 动态模块注册 │ │ 工具渲染配置 │ │ │
│ │ │ 插件加载器 │ │ registerHostModulesEager │ │ toolRenderConfig │ │ │
│ │ └────────────────┘ └────────────────┘ └────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────────────────────────────────────────────────────┐ │
│ │ 插件实例层 │ │
│ │ │ │
│ │ ┌────────────────┐ ┌────────────────┐ ┌────────────────────────┐ │ │
│ │ │ Plugin A │ │ Plugin B │ │ Plugin C │ │ │
│ │ │ - 注册路由 │ │ - 注册组件 │ │ - 注册工具渲染器 │ │ │
│ │ │ - 注册工具 │ │ - 注册工具 │ │ - 覆盖页面模块 │ │ │
│ │ └────────────────┘ └────────────────┘ └────────────────────────┘ │ │
│ └───────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

7.2.2 核心组件职责

组件 职责 核心功能
PluginProvider 插件上下文Provider 状态管理、订阅分发
PluginSystem 插件系统单例 路由注册、工具渲染配置
ModuleRegistry 模块注册表 运行时模块替换
HostExternals Host依赖暴露 React/antd等共享
PluginLoader 插件加载器 动态加载插件代码

7.3 PluginContext详解

7.3.1 上下文定义

// plugins/PluginContext.tsx

/**
* 工具渲染器配置
* 键为工具名称,值为渲染该工具的React组件
*/

export interface ToolRenderConfig {
[toolName: string]: React.ComponentType<{
params: Record<string, unknown>;
onResult: (result: unknown) => void;
}>;
}

/**
* 插件路由声明
*/

export interface PluginRouteDeclaration {
path: string; // 路由路径,如 "/my-plugin/page"
component: React.ComponentType; // 路由组件
title?: string; // 菜单标题
icon?: React.ReactNode; // 菜单图标
order?: number; // 菜单排序
}

/**
* 插件上下文值
*/

export interface PluginContextValue {
// 工具名称到渲染组件的映射
toolRenderConfig: ToolRenderConfig;

// 插件注册的路由列表
pluginRoutes: PluginRouteDeclaration[];

// 插件加载状态
loading: boolean;

// 加载失败信息
error: string | null;
}

// 默认值
const defaultContextValue: PluginContextValue = {
toolRenderConfig: {},
pluginRoutes: [],
loading: true,
error: null,
};

// 创建上下文
const PluginContext = createContext<PluginContextValue>(defaultContextValue);

7.3.2 Provider实现

/**
* 插件上下文Provider
* 包裹应用根组件,使所有子组件可以通过usePlugins()访问插件系统
*/

export function PluginProvider({ children }: { children: React.ReactNode }) {
// 从PluginSystem单例获取初始状态
const [toolRenderConfig, setToolRenderConfig] = useState<PluginContextValue['toolRenderConfig']>(
pluginSystem.getToolRenderConfig()
);

const [pluginRoutes, setPluginRoutes] = useState<PluginContextValue['pluginRoutes']>(
pluginSystem.getRoutes()
);

const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);

useEffect(() => {
// 订阅PluginSystem状态变化
// 当任何插件注册新功能时,所有订阅者都会收到通知
const unsub = pluginSystem.subscribe(() => {
setToolRenderConfig(pluginSystem.getToolRenderConfig());
setPluginRoutes(pluginSystem.getRoutes());
});

// 加载所有已安装的插件
// 注意:加载失败不会阻止其他插件加载(非阻塞设计)
loadAllPlugins().then(({ failed }) => {
if (failed.length > 0) {
setError(failed.join('; '));
}
setLoading(false);
});

return unsub;
}, []);

return (
<PluginContext.Provider value={{
toolRenderConfig,
pluginRoutes,
loading,
error,
}}>
{children}
</PluginContext.Provider>
);
}

7.3.3 Consumer Hook

/**
* 使用插件上下文的Hook
* 在任何组件中调用此Hook即可访问插件系统
*
* @example
* ```tsx
* const { pluginRoutes, toolRenderConfig } = usePlugins();
* ```
*/

export function usePlugins(): PluginContextValue {
const context = useContext(PluginContext);

// 开发环境警告:未在PluginProvider中使用时
if (process.env.NODE_ENV === 'development' && context === defaultContextValue) {
console.warn(
'usePlugins() was called outside of PluginProvider. ' +
'Make sure your app is wrapped with <PluginProvider>.'
);
}

return context;
}

7.4 Host Externals机制

7.4.1 设计背景

在传统的Web应用打包中,每个bundle会包含自己的React、antd等库副本。这在大多数场景下没有问题,但在插件系统中会导致严重问题:

1.
版本冲突:插件可能依赖不同版本的React
2.
体积膨胀:每个插件都携带自己的库副本
3.
内存浪费:多个React实例同时存在

QwenPaw的Host Externals机制通过在window上共享核心依赖来解决这个问题。

7.4.2 依赖暴露实现

// plugins/hostExternals.ts

/**
* 在window上暴露Host应用的依赖
* 使插件可以直接使用这些依赖,而无需打包自己的副本
*/


// 需要暴露的依赖列表
const HOST_EXTERNALS = {
// React核心
'react': React,
'react-dom': ReactDOM,
'react-dom/client': ReactDOMClient,

// React Router
'react-router': require('react-router'),
'react-router-dom': require('react-router-dom'),

// Ant Design
'antd': require('antd'),
'@ant-design/icons': require('@ant-design/icons'),

// agentscope-ai组件
'@agentscope-ai/design': require('@agentscope-ai/design'),
'@agentscope-ai/icons': require('@agentscope-ai/icons'),
'@agentscope-ai/chat': require('@agentscope-ai/chat'),

// 状态管理
'zustand': require('zustand'),

// 国际化
'i18next': require('i18next'),
'react-i18next': require('react-i18next'),
};

/**
* 安装Host Externals
* 在应用启动时调用此函数,将依赖暴露到window上
*/

export function installHostExternals(): void {
for (const [name, module] of Object.entries(HOST_EXTERNALS)) {
(window as unknown as Record<string, unknown>)[name] = module;
}

// 同时在__HOST_EXTERNALS__下保存,便于插件查找
(window as unknown as Record<string, unknown>).__HOST_EXTERNALS__ = HOST_EXTERNALS;
}

/**
* 获取Host Externals
*/

export function getHostExternals() {
return (window as unknown as Record<string, unknown>).__HOST_EXTERNALS__;
}

7.4.3 插件中的使用方式

// 插件代码中使用Host依赖
// 插件不需要import这些库,而是从window上获取

// 获取React
const React = window.React;

// 获取antd
const { Button, Input } = window.antd;

// 使用组件
function MyPlugin() {
return (
<Button type="primary">插件按钮</Button>
);
}

7.4.4 原理图解

┌─────────────────────────────────────────────────────────────────────────────┐
│ Host Externals 原理 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Host应用启动 │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ installHostExternals() │ │
│ │ │ │
│ │ window.React = React │ │
│ │ window.antd = antd │ │
│ │ window['react-router-dom'] = react-router-dom │ │
│ │ window.zustand = zustand │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ 插件加载 │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Plugin Bundle │ │
│ │ ┌─────────────────────────────────────────────────────────────────┐│ │
│ │ │ // 插件代码 ││ │
│ │ │ const Button = window.antd.Button; ││ │
│ │ │ return <Button>使用共享的antd</Button>; ││ │
│ │ └─────────────────────────────────────────────────────────────────┘│ │
│ │ │ │
│ │ 插件bundle中不包含antd代码,体积大幅减小 │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

7.5 模块注册表

7.5.1 核心概念

模块注册表(ModuleRegistry)允许插件在运行时替换Host应用中的模块。这是一种强大的扩展机制,使得插件可以:

1.
覆盖页面组件:替换整个页面的实现
2.
替换工具渲染器:自定义特定工具的显示方式
3.
扩展现有组件:在现有组件基础上添加功能

7.5.2 实现原理

// plugins/moduleRegistry.ts

/**
* 模块注册表
* 存储插件提供的模块替换
*/

class ModuleRegistry {
// 模块映射:模块键 -> 模块名 -> 模块值
private registry: Map<string, Map<string, unknown>> = new Map();

/**
* 注册一个模块
* @param moduleKey 模块键,如 "Settings/Debug/index"
* @param moduleName 导出名,如 "default"
* @param moduleValue 模块值
*/

register(moduleKey: string, moduleName: string, moduleValue: unknown): void {
if (!this.registry.has(moduleKey)) {
this.registry.set(moduleKey, new Map());
}
this.registry.get(moduleKey)!.set(moduleName, moduleValue);
}

/**
* 获取已注册的模块
* @param moduleKey 模块键
* @param moduleName 导出名,默认为 "default"
* @returns 模块值或undefined
*/

get(moduleKey: string, moduleName = 'default'): unknown | undefined {
return this.registry.get(moduleKey)?.get(moduleName);
}

/**
* 检查模块是否已注册
*/

has(moduleKey: string): boolean {
return this.registry.has(moduleKey);
}

/**
* 取消注册模块
*/

unregister(moduleKey: string, moduleName?: string): void {
if (moduleName) {
this.registry.get(moduleKey)?.delete(moduleName);
} else {
this.registry.delete(moduleKey);
}
}

/**
* 获取所有注册的模块键
*/

getRegisteredKeys(): string[] {
return Array.from(this.registry.keys());
}

/**
* 清空注册表
*/

clear(): void {
this.registry.clear();
}
}

// 单例导出
export const moduleRegistry = new ModuleRegistry();

7.5.3 懒加载集成

模块注册表与懒加载系统集成,实现插件模块替换:

// utils/lazyWithRetry.ts

import { moduleRegistry } from '../plugins/moduleRegistry';

/**
* 带插件模块替换的懒加载
*/

export function lazyWithRetry<T>(
factory: () => Promise<{ default: T }>,
moduleKeyOrPath?: string,
) {
return lazy(() =>
retryImport(factory, MAX_RETRIES).then((mod) => {
// 检查是否有插件覆盖
if (!moduleKeyOrPath) return mod;

const key = moduleKeyOrPath.startsWith('.')
? pathToModuleKey(moduleKeyOrPath)
: moduleKeyOrPath;

// 从注册表获取插件提供的替代实现
const patched = moduleRegistry.get(key, 'default');

// 如果有替代实现,优先使用
if (patched) {
return { default: patched as T };
}

return mod;
}),
);
}

7.6 动态模块注册

7.6.1 预加载机制

// plugins/dynamicModuleRegistry.ts

/**
* 动态模块注册
* 自动发现并注册src/pages目录下的所有模块
*/

export function registerHostModulesEager(): void {
// 使用Vite的import.meta.glob发现所有页面模块
const pageModules = import.meta.glob<{
default: unknown;
}>
('../pages/**/*./*.{ts,tsx}', { eager: true });

// 注册每个模块
for (const [path, module] of Object.entries(pageModules)) {
// 从路径提取模块键
const key = pathToModuleKey(path);

// 注册default导出
moduleRegistry.register(key, 'default', module.default);
}
}

/**
* 从文件路径提取模块键
* "../pages/Settings/Debug/index.tsx" → "Settings/Debug/index"
*/

function pathToModuleKey(path: string): string {
return path
.replace(/^.*\/pages\//, '') // 移除pages/前的路径
.replace(/\.(tsx?|jsx?)$/, ''); // 移除扩展名
}

7.6.2 插件注册流程

// 插件注册示例
class MyPlugin {
register() {
// 注册自定义路由
pluginSystem.registerRoute({
path: '/my-plugin',
component: MyPluginPage,
title: '我的插件',
icon: <PluginIcon />,
});

// 注册工具渲染器
pluginSystem.registerToolRenderer('myTool', MyToolRenderer);

// 替换现有页面
moduleRegistry.register('Settings/Debug/index', 'default', MyDebugPage);
}
}

7.7 插件加载器

7.7.1 加载器实现

// plugins/usePluginLoader.ts

/**
* 加载结果
*/

interface LoadResult {
loaded: string[]; // 成功加载的插件列表
failed: string[]; // 加载失败的插件列表
}

/**
* 从插件目录加载所有插件
*/

export async function loadAllPlugins(): Promise<LoadResult> {
const loaded: string[] = [];
const failed: string[] = [];

// 动态发现插件
const pluginModules = import.meta.glob<{
default: { new (): Plugin };
}>
('../plugins/*/index.{ts,tsx}', { eager: true });

// 逐个加载插件
for (const [path, factory] of Object.entries(pluginModules)) {
try {
const PluginClass = factory.default;
const plugin = new PluginClass();

// 调用插件的register方法
plugin.register({
pluginSystem,
moduleRegistry,
});

loaded.push(plugin.name);
} catch (error) {
console.error(`Failed to load plugin from ${path}:`, error);
failed.push(path);
}
}

return { loaded, failed };
}

7.7.2 错误处理策略

// 加载策略:单个插件失败不影响其他插件
export async function loadAllPlugins(): Promise<LoadResult> {
const loaded: string[] = [];
const failed: string[] = [];

for (const [path, factory] of Object.entries(pluginModules)) {
try {
// 插件加载有独立的try-catch
const plugin = await loadPlugin(factory);
plugin.register();
loaded.push(plugin.name);
} catch (error) {
// 失败不影响其他插件
failed.push(path);
console.error(`Plugin ${path} failed:`, error);
}
}

// 即使有失败,也返回成功列表
return { loaded, failed };
}

7.8 插件系统使用场景

7.8.1 注册自定义路由

// 插件注册路由
pluginSystem.registerRoute({
path: '/my-plugin/dashboard',
component: DashboardPage,
title: '仪表盘',
icon: <DashboardOutlined />,
order: 100,
});

// 在MainLayout中渲染
function MainLayout() {
const { pluginRoutes } = usePlugins();

return (
<Routes>
{/* 静态路由 */}
<Route path="/chat" element={<Chat />} />

{/* 插件路由 */}
{pluginRoutes.map(route => (
<Route
key={route.path}
path={route.path}
element={<route.component />}
/>
))}
</Routes>
);
}

7.8.2 注册工具渲染器

// 注册自定义工具渲染器
pluginSystem.registerToolRenderer('file_writer', FileWriterRenderer);

// 使用工具渲染器
function ChatMessage({ message }) {
const { toolRenderConfig } = usePlugins();

if (message.tool_calls) {
return message.tool_calls.map(tool => {
const Renderer = toolRenderConfig[tool.name];

if (Renderer) {
return <Renderer params={tool.params} onResult={handleResult} />;
}

// 默认渲染器
return <DefaultToolRenderer tool={tool} />;
});
}
}

7.8.3 替换页面模块

// 替换Debug页面
moduleRegistry.register('Settings/Debug/index', 'default', MyDebugPage);

// 在MainLayout中使用(通过lazyWithRetry)
const DebugPage = lazyImportWithRetry('../../pages/Settings/Debug');

// 实际渲染的是插件提供的版本
<Route path="/debug" element={<DebugPage />} />

7.9 源码位置索引

模块 文件路径 核心功能
PluginContext console/src/plugins/PluginContext.tsx 插件上下文Provider
hostExternals console/src/plugins/hostExternals.ts Host依赖暴露
moduleRegistry console/src/plugins/moduleRegistry.ts 模块注册表
dynamicModuleRegistry console/src/plugins/dynamicModuleRegistry.ts 动态模块注册
usePluginLoader console/src/plugins/usePluginLoader.ts 插件加载器
App集成 console/src/App.tsx 插件Provider集成

7.10 本章小结

本章我们深入剖析了QwenPaw前端的插件系统设计:

1.
PluginContext:提供全局插件状态访问的上下文Provider
2.
PluginSystem:管理插件注册和状态的单例
3.
Host Externals:通过window共享核心依赖,避免打包重复
4.
ModuleRegistry:运行时模块替换的注册表
5.
动态加载:自动发现和加载插件的机制

QwenPaw的插件系统设计平衡了扩展性和安全性,是现代前端应用架构的典范。


往期回顾

【前端开篇】前端工程技术栈与架构概览
【组件篇】前端组件体系设计
【状态篇】Zustand状态管理实现
【API篇】前端API层与后端通信
【路由篇】路由系统与动态加载
【国际化篇】i18n多语言支持

下期预告

【总结篇】前端技术亮点与工程实践 - 综合分析QwenPaw前端的技术创新

参考文献

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