增强插件系统:添加插件执行功能

- 在插件接口和基本插件实现中新增 Execute 方法,支持插件功能的动态执行。
- 更新各个插件(如日志插件、统计插件、存储插件等)以实现 Execute 方法,允许通过操作名称和参数执行特定功能。
- 在插件管理器中添加 ExecutePlugin、ExecutePluginsByType 和 ExecuteAllPlugins 方法,便于批量执行插件操作。
- 示例程序中更新插件调用方式,展示如何使用 Execute 方法进行操作。

此更新提升了插件系统的灵活性和可扩展性,便于开发者动态管理和执行插件功能。
This commit is contained in:
2025-03-14 11:31:32 +08:00
parent 0990e8c42c
commit 9f78cb483b
9 changed files with 559 additions and 7 deletions

View File

@@ -2,6 +2,7 @@ package main
import (
"context"
"encoding/base64"
"fmt"
"os"
"path/filepath"
@@ -69,6 +70,83 @@ func (p *StoragePlugin) Stop(ctx context.Context) error {
return nil
}
// Execute 执行插件功能
func (p *StoragePlugin) Execute(ctx context.Context, action string, params map[string]interface{}) (interface{}, error) {
switch action {
case "saveFile":
// 需要参数: filename, data
filename, ok := params["filename"].(string)
if !ok {
return nil, fmt.Errorf("缺少必需参数: filename")
}
// 处理两种数据格式字符串或Base64编码的二进制数据
var data []byte
if dataStr, ok := params["data"].(string); ok {
// 检查是否为Base64编码
if base64Str, ok := params["isBase64"].(bool); ok && base64Str {
var err error
data, err = base64.StdEncoding.DecodeString(dataStr)
if err != nil {
return nil, fmt.Errorf("Base64解码失败: %v", err)
}
} else {
data = []byte(dataStr)
}
} else {
return nil, fmt.Errorf("缺少必需参数: data")
}
err := p.SaveFile(filename, data)
return err == nil, err
case "loadFile":
// 需要参数: filename, returnBase64
filename, ok := params["filename"].(string)
if !ok {
return nil, fmt.Errorf("缺少必需参数: filename")
}
returnBase64, _ := params["returnBase64"].(bool)
data, err := p.LoadFile(filename)
if err != nil {
return nil, err
}
if returnBase64 {
return base64.StdEncoding.EncodeToString(data), nil
}
return string(data), nil
case "deleteFile":
// 需要参数: filename
filename, ok := params["filename"].(string)
if !ok {
return nil, fmt.Errorf("缺少必需参数: filename")
}
err := p.DeleteFile(filename)
return err == nil, err
case "listFiles":
// 不需要参数
files, err := p.ListFiles()
return files, err
case "getStorageInfo":
// 不需要参数
info := map[string]interface{}{
"storageDir": p.storageDir,
"config": p.config,
}
return info, nil
default:
return nil, fmt.Errorf("未知的操作: %s", action)
}
}
// SaveFile 保存文件
func (p *StoragePlugin) SaveFile(filename string, data []byte) error {
p.mu.Lock()