# VWED脚本注册声明示例文档 ## 概述 本文档详细说明了在VWED在线脚本中如何注册和声明各种类型的内置函数,包括API接口、自定义函数、事件监听器和定时任务。 --- ## 1. API接口注册示例 ### 1.1 基本GET接口 ```python def boot(): """脚本启动函数""" # 注册GET接口 - 传参数和定义执行逻辑分开 VWED.api.register_route( path="/hello", method="GET", handler=hello_handler, description="问候接口" ) def hello_handler(request_data): """处理问候请求""" name = request_data["query_params"].get("name", "World") return {"message": f"Hello, {name}!"} ``` **请求示例**: `GET /api/dynamic/hello?name=张三` **响应示例**: ```json { "message": "Hello, 张三!" } ``` ### 1.2 带参数定义的POST接口 ```python def boot(): # 注册POST接口,简化参数定义 - 传参数和定义执行逻辑分开 VWED.api.register_route( path="/calculate", method="POST", handler=calculate_handler, description="数学计算接口", params={"a": 0, "b": 0, "operation": "add"} # 简化的参数定义:键值对形式的默认值 ) def calculate_handler(a: int, b: int, operation: str): """数学计算处理器 - 直接接收参数""" # 执行计算 if operation == "add": result = a + b elif operation == "subtract": result = a - b elif operation == "multiply": result = a * b elif operation == "divide": result = a / b if b != 0 else None else: result = None # 记录日志 VWED.log.sync_info(f"计算执行: {a} {operation} {b} = {result}") return { "result": result, "operation": operation, "operand_a": a, "operand_b": b, "timestamp": VWED.util.now() } ``` **请求示例**: ```bash POST /api/dynamic/calculate Content-Type: application/json { "a": 10, "b": 5, "operation": "multiply" } ``` ### 1.3 数据处理接口 ```python def boot(): # 注册数据处理接口 - 传参数和定义执行逻辑分开 VWED.api.register_route( path="/process-data", method="POST", handler=process_data_handler, description="数据处理接口", params={"data_list": [], "process_type": "filter"} # 简化的参数定义 ) def process_data_handler(data_list: list, process_type: str): """处理批量数据 - 直接接收参数""" if process_type == "filter": # 过滤正数 result = [x for x in data_list if isinstance(x, (int, float)) and x > 0] elif process_type == "sort": # 排序 result = sorted(data_list) elif process_type == "sum": # 求和 result = sum(x for x in data_list if isinstance(x, (int, float))) else: result = data_list VWED.log.sync_info(f"数据处理完成: {process_type}, 输入{len(data_list)}项,输出{len(result) if isinstance(result, list) else 1}项") return { "original_data": data_list, "processed_data": result, "process_type": process_type, "input_count": len(data_list), "output_count": len(result) if isinstance(result, list) else 1 } ``` --- ## 2. 自定义函数注册示例 ### 2.1 简单计算函数 ```python def boot(): # 注册简单函数 - 传参数和定义执行逻辑分开 VWED.function.register( name="simple_add", handler=simple_add, description="简单加法函数", params={"a": 0, "b": 0} # 简化的参数定义 ) def simple_add(a: int, b: int): """供VWED任务调用的加法函数 - 直接接收参数""" result = a + b VWED.log.sync_info(f"执行加法: {a} + {b} = {result}") return {"result": result} ``` **VWED任务中的调用方式**: ```json { "block_type": "script", "execution_mode": "function_call", "function_name": "simple_add", "function_args": { "a": 10, "b": 20 } } ``` ### 2.2 带多个参数的函数 ```python def boot(): # 注册多参数函数 - 简化的参数定义 VWED.function.register( name="data_statistics", handler=data_statistics, description="数据统计函数", params={"numbers": [1, 2, 3], "operation": "sum", "round_digits": 2} # 简化的参数定义 ) def data_statistics(numbers: list, operation: str, round_digits: int): """数据统计函数 - 直接接收参数""" if not numbers: return {"error": "数字数组不能为空"} # 执行计算 if operation == "sum": result = sum(numbers) elif operation == "avg": result = sum(numbers) / len(numbers) elif operation == "max": result = max(numbers) elif operation == "min": result = min(numbers) elif operation == "median": sorted_numbers = sorted(numbers) n = len(sorted_numbers) if n % 2 == 0: result = (sorted_numbers[n//2-1] + sorted_numbers[n//2]) / 2 else: result = sorted_numbers[n//2] else: return {"error": f"不支持的运算类型: {operation}"} # 四舍五入 if isinstance(result, float): result = round(result, round_digits) VWED.log.sync_info(f"数据统计: {operation}({numbers}) = {result}") return { "result": result, "operation": operation, "input_count": len(numbers), "input_numbers": numbers } ``` ### 2.3 异步函数示例 ```python def boot(): # 注册异步函数 - 简化的参数定义 VWED.function.register( name="async_data_fetch", handler=async_data_fetch, description="异步数据获取函数", params={"source": "database", "delay": 1} # 简化的参数定义 ) async def async_data_fetch(source: str, delay: int): """异步获取和处理数据 - 直接接收参数""" await VWED.log.info(f"开始异步数据获取: {source}") # 模拟异步操作 await VWED.util.async_sleep(delay) # 模拟数据获取 mock_data = { "database": [{"id": 1, "name": "数据1"}, {"id": 2, "name": "数据2"}], "api": [{"status": "success", "data": "API数据"}], "file": [{"content": "文件内容", "size": 1024}] } data = mock_data.get(source, []) await VWED.log.info(f"异步数据获取完成: {source}, 获取到{len(data)}条记录") return { "source": source, "data": data, "count": len(data), "fetch_time": delay, "completed_at": VWED.util.now() } ``` ### 2.4 数据验证函数 ```python def boot(): # 注册数据验证函数 - 简化的参数定义 VWED.function.register( name="validate_user_data", handler=validate_user_data, description="用户数据验证函数", params={"user_data": {"name": "", "age": 0, "email": ""}, "strict_mode": False} # 简化的参数定义 ) def validate_user_data(user_data: dict, strict_mode: bool): """验证用户数据 - 直接接收参数""" errors = [] warnings = [] # 必填字段检查 if not user_data.get("name"): errors.append("姓名是必填字段") # 年龄验证 age = user_data.get("age") if age is not None: if not isinstance(age, int) or age < 0: errors.append("年龄必须是非负整数") elif age > 150: warnings.append("年龄超过150岁,请确认") # 邮箱验证 email = user_data.get("email") if email: if "@" not in email or "." not in email: if strict_mode: errors.append("邮箱格式不正确") else: warnings.append("邮箱格式可能不正确") # 记录验证结果 is_valid = len(errors) == 0 VWED.log.sync_info(f"用户数据验证: {'通过' if is_valid else '失败'}, 错误{len(errors)}个,警告{len(warnings)}个") return { "is_valid": is_valid, "errors": errors, "warnings": warnings, "validated_fields": list(user_data.keys()), "strict_mode": strict_mode } ``` --- ## 3. 事件监听器注册示例 ### 3.1 基本事件监听器 ```python def boot(): # 注册基本事件监听器 - 传参数和定义执行逻辑分开 VWED.event.listen( event_name="user_login", handler=on_user_login ) def on_user_login(event_data): """用户登录事件处理""" user_id = event_data.get("user_id", "unknown") login_time = event_data.get("login_time", VWED.util.now()) VWED.log.sync_info(f"用户登录: {user_id} at {login_time}") # 更新登录统计 login_count = VWED.data.get("login_count", 0) VWED.data.set("login_count", login_count + 1) # 记录最近登录用户 recent_logins = VWED.data.get("recent_logins", []) recent_logins.append({"user_id": user_id, "time": login_time}) # 只保留最近10条记录 if len(recent_logins) > 10: recent_logins = recent_logins[-10:] VWED.data.set("recent_logins", recent_logins) ``` ### 3.2 高优先级事件监听器 ```python def boot(): # 注册高优先级事件监听器 @VWED.event.listen("system_error", priority=0) # 优先级0最高 def on_system_error(event_data): """系统错误事件处理(高优先级)""" error_type = event_data.get("error_type", "unknown") error_message = event_data.get("error_message", "") VWED.log.sync_error(f"系统错误: {error_type} - {error_message}") # 错误统计 error_count = VWED.data.get("error_count", 0) VWED.data.set("error_count", error_count + 1) # 如果是严重错误,触发告警 if error_type in ["database_down", "memory_overflow", "security_breach"]: # 触发告警事件 asyncio.create_task(VWED.event.emit("critical_alert", { "level": "critical", "source": "system_monitor", "error_type": error_type, "message": error_message, "timestamp": VWED.util.now() })) ``` ### 3.3 任务完成事件监听器 ```python def boot(): # 监听VWED任务完成事件 @VWED.event.listen("task_completed", priority=1) def on_task_completed(event_data): """任务完成事件处理""" task_id = event_data.get("task_id", "unknown") task_status = event_data.get("status", "unknown") execution_time = event_data.get("execution_time_ms", 0) VWED.log.sync_info(f"任务完成: {task_id}, 状态: {task_status}, 耗时: {execution_time}ms") # 更新任务统计 completed_tasks = VWED.data.get("completed_tasks", []) completed_tasks.append({ "task_id": task_id, "status": task_status, "execution_time_ms": execution_time, "completed_at": VWED.util.now() }) # 只保留最近100条记录 if len(completed_tasks) > 100: completed_tasks = completed_tasks[-100:] VWED.data.set("completed_tasks", completed_tasks) # 如果任务执行时间过长,记录预警 if execution_time > 30000: # 超过30秒 VWED.log.sync_warning(f"任务执行时间过长: {task_id} ({execution_time}ms)") ``` --- ## 4. 定时任务注册示例 ### 4.1 周期性定时任务 ```python def boot(): # 注册周期性定时任务 - 每分钟执行一次 - 传参数和定义执行逻辑分开 VWED.timer.interval( interval=60, # 60秒间隔 handler=system_monitor ) def system_monitor(): """系统监控定时任务""" # 获取系统统计信息 stats = { "login_count": VWED.data.get("login_count", 0), "error_count": VWED.data.get("error_count", 0), "completed_tasks": len(VWED.data.get("completed_tasks", [])), "check_time": VWED.util.now() } VWED.log.sync_info(f"系统监控: 登录{stats['login_count']}次, 错误{stats['error_count']}个, 完成任务{stats['completed_tasks']}个") # 保存监控记录 monitor_history = VWED.data.get("monitor_history", []) monitor_history.append(stats) # 只保留最近24小时的记录 if len(monitor_history) > 1440: # 24*60分钟 monitor_history = monitor_history[-1440:] VWED.data.set("monitor_history", monitor_history) ``` ### 4.2 一次性延迟任务 ```python def boot(): # 注册一次性延迟任务 - 10秒后执行 @VWED.timer.once(delay=10) def initialization_task(): """初始化任务(延迟执行)""" VWED.log.sync_info("执行初始化任务") # 初始化数据结构 if not VWED.data.has("initialized"): VWED.data.set("login_count", 0) VWED.data.set("error_count", 0) VWED.data.set("completed_tasks", []) VWED.data.set("monitor_history", []) VWED.data.set("initialized", True) VWED.data.set("init_time", VWED.util.now()) VWED.log.sync_info("系统数据初始化完成") ``` ### 4.3 数据清理定时任务 ```python def boot(): # 注册数据清理任务 - 每小时执行一次 @VWED.timer.interval(3600) # 3600秒 = 1小时 def data_cleanup(): """数据清理定时任务""" VWED.log.sync_info("开始执行数据清理") cleanup_count = 0 # 清理过期的监控记录 monitor_history = VWED.data.get("monitor_history", []) original_count = len(monitor_history) # 只保留最近12小时的记录 monitor_history = monitor_history[-720:] # 12*60分钟 VWED.data.set("monitor_history", monitor_history) cleanup_count += original_count - len(monitor_history) # 清理过期的任务记录 completed_tasks = VWED.data.get("completed_tasks", []) original_count = len(completed_tasks) # 只保留最近50条记录 completed_tasks = completed_tasks[-50:] VWED.data.set("completed_tasks", completed_tasks) cleanup_count += original_count - len(completed_tasks) # 清理过期的登录记录 recent_logins = VWED.data.get("recent_logins", []) original_count = len(recent_logins) # 只保留最近20条记录 recent_logins = recent_logins[-20:] VWED.data.set("recent_logins", recent_logins) cleanup_count += original_count - len(recent_logins) VWED.log.sync_info(f"数据清理完成,清理了{cleanup_count}条过期记录") # 记录清理统计 cleanup_stats = VWED.data.get("cleanup_stats", []) cleanup_stats.append({ "cleanup_time": VWED.util.now(), "cleaned_records": cleanup_count }) # 只保留最近10次清理记录 if len(cleanup_stats) > 10: cleanup_stats = cleanup_stats[-10:] VWED.data.set("cleanup_stats", cleanup_stats) ``` --- ## 5. 完整的脚本示例 以下是一个包含所有类型注册的完整脚本示例: ```python def boot(): """脚本启动函数 - 注册所有服务""" VWED.log.sync_info("=== 开始注册脚本服务 ===") # 注册API接口 register_api_services() # 注册自定义函数 register_custom_functions() # 注册事件监听器 register_event_listeners() # 注册定时任务 register_timer_tasks() VWED.log.sync_info("=== 脚本服务注册完成 ===") def register_api_services(): """注册API服务""" VWED.log.sync_info("注册API接口...") # 传参数和定义执行逻辑分开 VWED.api.register_route( path="/status", method="GET", handler=get_system_status, description="系统状态查询接口" ) VWED.api.register_route( path="/trigger-event", method="POST", handler=trigger_event, description="手动触发事件接口" ) def get_system_status(request_data): return { "status": "running", "timestamp": VWED.util.now(), "script_id": VWED.get_script_id(), "stats": { "login_count": VWED.data.get("login_count", 0), "error_count": VWED.data.get("error_count", 0), "task_count": len(VWED.data.get("completed_tasks", [])) } } def trigger_event(request_data): event_name = request_data["body"].get("event_name") event_data = request_data["body"].get("event_data", {}) if event_name: # 异步触发事件 asyncio.create_task(VWED.event.emit(event_name, event_data)) return {"success": True, "event_triggered": event_name} else: return {"success": False, "error": "event_name is required"} def register_custom_functions(): """注册自定义函数""" VWED.log.sync_info("注册自定义函数...") # 传参数和定义执行逻辑分开 VWED.function.register( name="get_statistics", handler=get_statistics, description="获取系统统计信息" ) VWED.function.register( name="reset_counters", handler=reset_counters, description="重置计数器" ) def get_statistics(args): return { "login_count": VWED.data.get("login_count", 0), "error_count": VWED.data.get("error_count", 0), "completed_tasks": len(VWED.data.get("completed_tasks", [])), "monitor_records": len(VWED.data.get("monitor_history", [])), "initialized": VWED.data.get("initialized", False), "init_time": VWED.data.get("init_time", None) } def reset_counters(args): VWED.data.set("login_count", 0) VWED.data.set("error_count", 0) VWED.data.set("completed_tasks", []) VWED.log.sync_info("计数器已重置") return {"success": True, "reset_time": VWED.util.now()} def register_event_listeners(): """注册事件监听器""" VWED.log.sync_info("注册事件监听器...") # 传参数和定义执行逻辑分开 VWED.event.listen( event_name="user_action", handler=on_user_action ) def on_user_action(event_data): action = event_data.get("action", "unknown") user_id = event_data.get("user_id", "unknown") VWED.log.sync_info(f"用户操作: {user_id} 执行了 {action}") # 记录用户操作 user_actions = VWED.data.get("user_actions", []) user_actions.append({ "user_id": user_id, "action": action, "timestamp": VWED.util.now() }) # 只保留最近50条记录 if len(user_actions) > 50: user_actions = user_actions[-50:] VWED.data.set("user_actions", user_actions) def register_timer_tasks(): """注册定时任务""" VWED.log.sync_info("注册定时任务...") # 传参数和定义执行逻辑分开 VWED.timer.interval( interval=30, # 每30秒 handler=heartbeat ) VWED.timer.once( delay=5, # 5秒后执行一次 handler=delayed_initialization ) def heartbeat(): heartbeat_count = VWED.data.get("heartbeat_count", 0) VWED.data.set("heartbeat_count", heartbeat_count + 1) if heartbeat_count % 10 == 0: # 每300秒(5分钟)记录一次 VWED.log.sync_info(f"系统心跳 #{heartbeat_count}") def delayed_initialization(): VWED.log.sync_info("延迟初始化任务执行") VWED.data.set("delayed_init_completed", True) # 工具函数示例 def format_timestamp(timestamp_str): """格式化时间戳""" try: from datetime import datetime dt = datetime.fromisoformat(timestamp_str.replace('Z', '+00:00')) return dt.strftime("%Y-%m-%d %H:%M:%S") except: return timestamp_str def calculate_average(numbers): """计算平均值""" if not numbers: return 0 return sum(numbers) / len(numbers) ``` --- ## 6. 注册验证和调试技巧 ### 6.1 验证注册状态 在脚本中可以添加验证代码来检查注册状态: ```python def boot(): # ... 注册代码 ... # 验证注册状态 verify_registrations() def verify_registrations(): """验证注册状态""" # 可以通过API查询注册状态 # GET /api/script/registry/status VWED.log.sync_info("验证注册状态...") # 这里可以添加自定义验证逻辑 expected_functions = ["get_statistics", "reset_counters"] expected_apis = ["/status", "/trigger-event"] VWED.log.sync_info(f"预期注册函数: {expected_functions}") VWED.log.sync_info(f"预期注册API: {expected_apis}") ``` ### 6.2 调试技巧 ```python def boot(): try: # 注册代码 register_all_services() VWED.log.sync_info("✓ 所有服务注册成功") except Exception as e: VWED.log.sync_error(f"✗ 服务注册失败: {str(e)}") # 可以根据需要添加详细的错误处理 def register_all_services(): """集中注册所有服务""" service_count = 0 # 注册API(带计数) api_services = register_api_services() service_count += api_services # 注册函数(带计数) function_services = register_custom_functions() service_count += function_services # 注册事件监听器(带计数) event_services = register_event_listeners() service_count += event_services # 注册定时任务(带计数) timer_services = register_timer_tasks() service_count += timer_services VWED.log.sync_info(f"总共注册了 {service_count} 个服务") return service_count ``` --- ## 总结 本文档提供了VWED脚本中各种注册声明的完整示例,包括: 1. **API接口注册** - 支持GET/POST/PUT/DELETE等HTTP方法 2. **自定义函数注册** - 供VWED任务系统调用的函数 3. **事件监听器注册** - 响应系统和自定义事件 4. **定时任务注册** - 周期性和一次性任务 每种类型都提供了从简单到复杂的多个示例,帮助开发者快速掌握VWED脚本的注册机制。 关键要点: - 所有注册都必须在 `boot()` 函数中进行 - 使用装饰器语法进行注册声明 - 支持详细的参数定义和文档描述 - 提供完整的错误处理和日志记录 - 支持异步和同步两种执行模式