Files
RuoYi-Vue3-FastAPI/ruoyi-fastapi-backend/plugins/examples/python/bundle_demo/__init__.py
T
insistence 4bd83bc7cd feat: 支持 v2 插件、独立前端和签名制品发布 (#130)
* feat: 支持 v2 插件、原生扩展与签名发布

* fix: 修复测试

* feat: 增强宿主 SDK、运行观测与制品维护能力

* feat: 增强文件传输、配置观测与本地开发能力

* feat: 支持 SSE 实时事件流并完善开发脚手架

* feat: 完善长连接鉴权复核与关闭回收

* feat: 增强生命周期与任务关闭可靠性

* feat: 收紧健康检查契约并补齐前端与真实网络验收

* feat: 增加SDK溯源与离线更新工具并验证跨版本兼容

* feat: 增加持久化业务示例与受控 Python 交付

* feat: 增加统一运行诊断与多worker状态观测

* feat: 增加固定目标发布等待与自动验收

* fix: 修复多环境插件部署前缀与代理配置不一致

* fix: 修复测试
2026-10-09 23:49:45 +08:00

68 lines
2.3 KiB
Python

from fastapi import FastAPI, Request
from pydantic import BaseModel, Field
from plugins.core.sdk import PluginDefinition, PluginHostContext, PluginRequestContext, plugin_endpoint
from utils.time_util import TimezoneUtil
from .events import register_event_routes
from .files import register_file_routes
class EchoInput(BaseModel):
"""
用于验证 POST 链路的回显请求参数。
"""
message: str = Field(min_length=1, max_length=80)
async def summary(context: PluginRequestContext) -> dict[str, str]:
snapshot = await context.host.read_config()
return {
'pluginId': context.host.plugin_id,
'userName': context.user.user.user_name,
'serverTime': TimezoneUtil.utc_now().isoformat(),
'greeting': str(snapshot.values.get('greeting', '')),
'configRevision': snapshot.revision,
}
def create_plugin(host: PluginHostContext) -> PluginDefinition:
"""
声明仅提供相对 API 的子应用,页面资源由宿主交付。
:param host: 宿主提供的插件上下文
:return: 插件能力声明
"""
def create_app(context: PluginHostContext) -> FastAPI:
"""
创建独立前端示例需要的查询和回显接口。
:param context: 宿主提供的插件上下文
:return: 插件 ASGI 子应用
"""
app = FastAPI(title='独立前端示例', docs_url=None, redoc_url=None)
register_file_routes(app)
register_event_routes(app)
app.add_api_route(
'/api/summary',
plugin_endpoint(summary, permission='bundle_demo:view'),
summary='获取插件页面概览接口',
description='用于获取当前插件标识、登录用户名和服务器时间',
response_model=dict[str, str],
)
@app.post(
'/api/echo',
summary='回显插件页面消息接口',
description='用于回显插件页面提交的消息并返回服务器时间',
)
async def echo(payload: EchoInput, request: Request) -> dict[str, str]:
request.state.plugin_context.require_permission('bundle_demo:view')
return {'message': payload.message, 'serverTime': TimezoneUtil.utc_now().isoformat()}
return app
return PluginDefinition(app_factory=create_app)