乐于分享
好东西不私藏

RAGFlow源码解析-10、API应用层完整解析(第八周)

RAGFlow源码解析-10、API应用层完整解析(第八周)

一、API Blueprint架构设计

1.1 API模块列表

共19个API Blueprint模块

Blueprint模块
功能
主要端点
kb_app
知识库管理
/kb/create, /kb/update, /kb/list
dialog_app
对话管理
/dialog/set, /dialog/ask
document_app
文档管理
/document/upload, /document/run
file_app
文件管理
/file/upload, /file/download
canvas_app
Agent画布
/canvas/run, /canvas/stop
chunk_app
Chunk管理
/chunk/list, /chunk/create
conversation_app
会话管理
/conversation/list, /conversation/delete
llm_app
LLM管理
/llm/list, /llm/add
user_app
用户管理
/user/login, /user/logout
tenant_app
租户管理
/tenant/add, /tenant/list
system_app
系统配置
/system/version, /system/status
search_app
搜索API
/search/chunk, /search/document
api_app
API管理
/api/create, /api/list
plugin_app
插件管理
/plugin/list, /plugin/install
mcp_server_app
MCP服务器
/mcp_server/list, /mcp_server/run
langfuse_app
Langfuse集成
/langfuse/config
evaluation_app
评估管理
/evaluation/create, /evaluation/run
connector_app
连接器管理
/connector/list, /connector/run
file2document_app
文件转文档
/file2document/run

二、知识库管理API(kb_app)

2.1 创建知识库端点

源码位置api/apps/kb_app.py:55-75

@manager.route('/create', methods=['post'])@login_required@validate_request("name")async def create():    req = await get_request_json()    # 第60-65行:创建知识库    e, res = KnowledgebaseService.create_with_name(        name = req.pop("name"None),        tenant_id = current_user.id,        parser_id = req.pop("parser_id"None),        **req    )    if not e:        return res    try:        if not KnowledgebaseService.save(**res):            return get_data_error_result()        return get_json_result(data={"kb_id":res["id"]})    except Exception as e:        return server_error_response(e)

API请求示例

POST /kb/create{  "name""技术文档库",  "parser_id""naive",  "description""存储技术文档"}

API响应示例

{  "code": 0,  "data": {    "kb_id": "kb_abc123"  },  "message": "success"}

2.2 更新知识库端点

源码位置api/apps/kb_app.py:78-184

@manager.route('/update', methods=['post'])@login_required@validate_request("kb_id""name""description""parser_id")@not_allowed_parameters("id""tenant_id""created_by""create_time""update_time""create_date""update_date""created_by")async def update():    req = await get_request_json()    # 第84-91行:参数校验    if not isinstance(req["name"], str):        return get_data_error_result(message="Dataset name must be string.")    if req["name"].strip() == "":        return get_data_error_result(message="Dataset name can't be empty.")    if len(req["name"].encode("utf-8")) > DATASET_NAME_LIMIT:        return get_data_error_result(            message=f"Dataset name length is {len(req['name'])} which is large than {DATASET_NAME_LIMIT}")    req["name"] = req["name"].strip()    # 第92-105行:Infinity特殊处理    if settings.DOC_ENGINE_INFINITY:        parser_id = req.get("parser_id")        if isinstance(parser_id, str) and parser_id.lower() == "tag":            return get_json_result(                code=RetCode.OPERATING_ERROR,                message="The chunking method Tag has not been supported by Infinity yet.",                data=False,            )        if "pagerank" in req and req["pagerank"] > 0:            return get_json_result(                code=RetCode.DATA_ERROR,                message="'pagerank' can only be set when doc_engine is elasticsearch",                data=False,            )    # 第107-112行:权限检查    if not KnowledgebaseService.accessible4deletion(req["kb_id"], current_user.id):        return get_json_result(            data=False,            message='No authorization.',            code=RetCode.AUTHENTICATION_ERROR        )    try:        # 第114-118行:所有权验证        if not KnowledgebaseService.query(created_by=current_user.id, id=req["kb_id"]):            return get_json_result(                data=False, message='Only owner of dataset authorized for this operation.',                code=RetCode.OPERATING_ERROR)        e, kb = KnowledgebaseService.get_by_id(req["kb_id"])        # 第123-132行:重命名文件夹        if e and req["name"].lower() != kb.name.lower():            FileService.filter_update(                [                    File.tenant_id == kb.tenant_id,                    File.source_type == FileSource.KNOWLEDGEBASE,                    File.type == "folder",                    File.name == kb.name,                ],                {"name": req["name"]},            )        # 第138-142行:名称重复检查        if req["name"].lower() != kb.name.lower() \                and len(KnowledgebaseService.query(name=req["name"], tenant_id=current_user.id, status=StatusEnum.VALID.value)) >= 1:            return get_data_error_result(message="Duplicated dataset name.")        del req["kb_id"]        connectors = []        if "connectors" in req:            connectors = req["connectors"]            del req["connectors"]        if not KnowledgebaseService.update_by_id(kb.id, req):            return get_data_error_result()        # 第152-169行:更新pagerank        if kb.pagerank != req.get("pagerank"0):            if req.get("pagerank"0) > 0:                await thread_pool_exec(                    settings.docStoreConn.update,                    {"kb_id": kb.id},                    {PAGERANK_FLD: req["pagerank"]},                    search.index_name(kb.tenant_id),                    kb.id,                )            else:                await thread_pool_exec(                    settings.docStoreConn.update,                    {"exists": PAGERANK_FLD},                    {"remove": PAGERANK_FLD},                    search.index_name(kb.tenant_id),                    kb.id,                )        e, kb = KnowledgebaseService.get_by_id(kb.id)        if not e:            return get_data_error_result(message="Database error (Knowledgebase rename)!")        errors = Connector2KbService.link_connectors(kb.id, [conn for conn in connectors], current_user.id)        if errors:            logging.error("Link KB errors: ", errors)        kb = kb.to_dict()        kb.update(req)        kb["connectors"] = connectors        return get_json_result(data=kb)    except Exception as e:        return server_error_response(e)

关键验证逻辑流程图


三、对话管理API(dialog_app)

3.1 对话设置端点

源码位置api/apps/dialog_app.py(推测)

@manager.route('/set', methods=['post'])@login_required@validate_request("id""name""kb_ids")async def set_dialog():    req = await get_request_json()    # 提取参数    dialog_id = req["id"]    name = req["name"]    kb_ids = req["kb_ids"]    llm_id = req.get("llm_id""")    # 创建或更新对话配置    if dialog_id:        e, dialog = DialogService.get_by_id(dialog_id)        if not e:            return get_data_error_result(message="Dialog not found")        DialogService.update_by_id(dialog_id, req)    else:        req["tenant_id"] = current_user.id        req["created_by"] = current_user.id        dialog_id = DialogService.save(**req)    return get_json_result(data={"id": dialog_id})

3.2 对话问答端点

源码位置api/apps/dialog_app.py(推测)

@manager.route('/ask', methods=['post'])@login_required@validate_request("question""dialog_id")async def ask():    req = await get_request_json()    question = req["question"]    dialog_id = req["dialog_id"]    stream = req.get("stream"True)    # 获取对话配置    e, dialog = DialogService.get_by_id(dialog_id)    if not e:        return get_data_error_result(message="Dialog not found")    # 获取知识库列表    kb_ids = dialog.kb_ids    embd_mdl = LLMBundle(current_user.id, LLMType.EMBEDDING, llm_name=dialog.embd_id)    # 执行检索    from rag.nlp import search    dealer = search.Dealer(settings.docStoreConn)    ranks = await dealer.retrieval(        question=question,        embd_mdl=embd_mdl,        tenant_ids=[current_user.id],        kb_ids=kb_ids,        page=1,        page_size=10    )    # 生成答案    chat_mdl = LLMBundle(current_user.id, LLMType.CHAT, llm_name=dialog.llm_id)    if stream:        # 流式返回        async def generate():            async for delta in chat_mdl.async_chat_streamly("", [{"role""user""content": question}], {}):                yield f"data: {delta}\n\n"        return Response(generate(), mimetype="text/event-stream")    else:        # 非流式返回        ans, tk_count = await chat_mdl.async_chat("", [{"role""user""content": question}], {})        return get_json_result(data={"answer": ans, "token_count": tk_count})

对话流程图


四、文档管理API(document_app)

4.1 文档上传端点

源码位置api/apps/document_app.py(推测)

@manager.route('/upload', methods=['post'])@login_requiredasync def upload():    req = await get_request_json()    kb_id = req["kb_id"]    files = req.get("files", [])    # 检查知识库权限    if not KnowledgebaseService.accessible(kb_id, current_user.id):        return get_json_result(            code=RetCode.AUTHENTICATION_ERROR,            message="No authorization."        )    # 上传文件到MinIO    doc_ids = []    for file in files:        # 保存文件        file_path = FileService.upload(file, kb_id)        # 创建文档记录        doc_id = DocumentService.create(            kb_id=kb_id,            name=file.filename,            location=file_path,            size=file.size        )        doc_ids.append(doc_id)    return get_json_result(data={"doc_ids": doc_ids})

4.2 文档解析端点

源码位置api/apps/document_app.py(推测)

@manager.route('/run', methods=['post'])@login_required@validate_request("doc_ids")async def run():    req = await get_request_json()    doc_ids = req["doc_ids"]    parser_id = req.get("parser_id""naive")    parser_config = req.get("parser_config", {})    # 创建解析任务    task_ids = []    for doc_id in doc_ids:        # 检查文档权限        if not DocumentService.accessible(doc_id, current_user.id):            continue        # 创建任务        task_id = TaskService.create(            doc_id=doc_id,            task_type="dataflow",            parser_id=parser_id,            parser_config=parser_config        )        task_ids.append(task_id)    # 发送任务到Redis队列    for task_id in task_ids:        REDIS_CONN.queue_product(            "ragflow_svr_queue",            {"id": task_id, "task_type""dataflow"}        )    return get_json_result(data={"task_ids": task_ids})

五、Canvas画布API(canvas_app)

5.1 画布运行端点

源码位置api/apps/canvas_app.py:135(推测)

@manager.route('/run', methods=['post'])@login_requiredasync def run():    req = await get_request_json()    canvas_id = req["canvas_id"]    query = req.get("query""")    files = req.get("files", [])    # 获取Canvas DSL    e, cvs = UserCanvasService.get_by_id(canvas_id)    if not e:        return get_data_error_result(message="Canvas not found")    # 创建Canvas实例    from agent.canvas import Canvas    canvas = Canvas(        dsl=cvs.dsl,        tenant_id=current_user.id,        canvas_id=canvas_id    )    # 设置全局变量    canvas.globals["sys.query"] = query    canvas.globals["sys.files"] = files    # 执行Canvas    async def generate():        async for output in canvas.run():            yield f"data: {json.dumps(output, ensure_ascii=False)}\n\n"    return Response(generate(), mimetype="text/event-stream")

六、API装饰器设计

6.1 login_required装饰器

源码位置api/apps/__init__.py(推测)

def login_required(func):    """登录验证装饰器"""    @wraps(func)    async def wrapper(*args, **kwargs):        # 从请求头获取token        token = request.headers.get("Authorization")        if not token:            return get_json_result(                code=RetCode.AUTHENTICATION_ERROR,                message="Authorization header missing."            )        # 验证token        try:            payload = jwt.decode(token, settings.SECRET_KEY, algorithms=["HS256"])            user_id = payload.get("user_id")            # 设置current_user            g.current_user = UserService.get_by_id(user_id)        except jwt.ExpiredSignatureError:            return get_json_result(                code=RetCode.AUTHENTICATION_ERROR,                message="Token expired."            )        except jwt.InvalidTokenError:            return get_json_result(                code=RetCode.AUTHENTICATION_ERROR,                message="Invalid token."            )        return await func(*args, **kwargs)    return wrapper

6.2 validate_request装饰器

源码位置api/utils/api_utils.py(推测)

def validate_request(*required_fields):    """请求参数验证装饰器"""    def decorator(func):        @wraps(func)        async def wrapper(*args, **kwargs):            req = await get_request_json()            # 检查必需字段            missing_fields = [field for field in required_fields if field not in req]            if missing_fields:                return get_json_result(                    code=RetCode.DATA_ERROR,                    message=f"Missing required fields: {', '.join(missing_fields)}"                )            return await func(*args, **kwargs)        return wrapper    return decorator

七、API响应格式设计

7.1 统一响应函数

源码位置api/utils/api_utils.py

def get_json_result(code=RetCode.SUCCESS, message="success", data=None):    """成功响应"""    return jsonify({        "code": code,        "message": message,        "data": data    })def get_data_error_result(message="Data error"):    """数据错误响应"""    return jsonify({        "code": RetCode.DATA_ERROR,        "message": message,        "data"None    })def server_error_response(e):    """服务器错误响应"""    logging.exception(e)    return jsonify({        "code": RetCode.SERVER_ERROR,        "message"str(e),        "data"None    })

7.2 错误码枚举

源码位置common/constants.py

classRetCode(StrEnum):    SUCCESS = "0"    DATA_ERROR = "400"    AUTHENTICATION_ERROR = "401"    FORBIDDEN = "403"    NOT_FOUND = "404"    OPERATING_ERROR = "405"    SERVER_ERROR = "500"

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-06-04 15:17:34 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/709648.html
  2. 运行时间 : 0.439796s [ 吞吐率:2.27req/s ] 内存消耗:4,742.16kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=641cfd7dfa92e2b9d2ab3984f498a96e
  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.000489s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000666s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.016538s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.001492s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000617s ]
  6. SELECT * FROM `set` [ RunTime:0.026804s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000768s ]
  8. SELECT * FROM `article` WHERE `id` = 709648 LIMIT 1 [ RunTime:0.051527s ]
  9. UPDATE `article` SET `lasttime` = 1780557454 WHERE `id` = 709648 [ RunTime:0.053330s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.007031s ]
  11. SELECT * FROM `article` WHERE `id` < 709648 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.015239s ]
  12. SELECT * FROM `article` WHERE `id` > 709648 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.046167s ]
  13. SELECT * FROM `article` WHERE `id` < 709648 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.030034s ]
  14. SELECT * FROM `article` WHERE `id` < 709648 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.061804s ]
  15. SELECT * FROM `article` WHERE `id` < 709648 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.018677s ]
0.443673s