增强插件系统:添加参数验证功能
- 在插件助手中新增 ValidateParams 函数,用于验证传入参数是否符合定义,确保参数的完整性和正确性。 - 更新 ExecuteAction 方法,集成参数验证逻辑,提升插件执行的安全性和可靠性。 - 示例程序中添加新的选项,展示如何生成插件API文档和OpenAPI/Swagger文档,增强用户体验。 此更新提升了插件系统的健壮性,便于开发者更好地管理和使用插件功能。
This commit is contained in:
83
examples/plugin/example/client_example.go
Normal file
83
examples/plugin/example/client_example.go
Normal file
@@ -0,0 +1,83 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/darkit/goproxy/examples/plugin"
|
||||
)
|
||||
|
||||
// 展示客户端代码生成功能
|
||||
func ClientGeneratorExample() {
|
||||
// 创建上下文
|
||||
ctx := context.Background()
|
||||
|
||||
// 获取插件目录
|
||||
pluginsDir := filepath.Join("..", "plugins", "dist")
|
||||
if _, err := os.Stat(pluginsDir); os.IsNotExist(err) {
|
||||
fmt.Printf("插件目录不存在: %s\n", pluginsDir)
|
||||
return
|
||||
}
|
||||
|
||||
// 创建插件管理器
|
||||
pm := plugin.NewPluginManager(pluginsDir)
|
||||
|
||||
// 加载插件
|
||||
fmt.Println("正在加载插件...")
|
||||
if err := pm.LoadPlugins(); err != nil {
|
||||
fmt.Printf("加载插件失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 初始化所有插件
|
||||
if err := pm.InitPlugins(ctx); err != nil {
|
||||
fmt.Printf("初始化插件失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 启动所有插件
|
||||
if err := pm.StartPlugins(ctx); err != nil {
|
||||
fmt.Printf("启动插件失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 创建客户端代码输出目录
|
||||
clientDir := "./client_code"
|
||||
if err := os.MkdirAll(clientDir, 0755); err != nil {
|
||||
fmt.Printf("创建客户端代码目录失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Printf("将在 %s 目录生成客户端代码\n", clientDir)
|
||||
|
||||
// 创建客户端代码生成器
|
||||
// 参数:插件管理器、输出路径、模块名称、语言(默认为go)
|
||||
clientGen := plugin.NewClientGenerator(pm, clientDir, "github.com/darkit/plugin-client", "go")
|
||||
|
||||
// 生成客户端代码
|
||||
fmt.Println("正在生成客户端代码...")
|
||||
if err := clientGen.GenerateAllClients(); err != nil {
|
||||
fmt.Printf("生成客户端代码失败: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf("成功生成客户端代码!代码位于: %s\n", clientDir)
|
||||
fmt.Println("生成的代码包括:")
|
||||
fmt.Println("- 基本客户端代码 (client/client.go)")
|
||||
fmt.Println("- 模型定义 (client/pkg/models/models.go)")
|
||||
fmt.Println("- 按插件类型生成的客户端 (client/pkg/<类型>/*.go)")
|
||||
fmt.Println("- 示例代码 (client/example/main.go)")
|
||||
fmt.Println("\n使用生成的客户端代码:")
|
||||
fmt.Println("1. 将生成的代码复制到你的项目中")
|
||||
fmt.Println("2. 调整模块名称以匹配你的项目")
|
||||
fmt.Println("3. 根据示例代码创建客户端实例并调用方法")
|
||||
}
|
||||
|
||||
// 停止所有插件
|
||||
if err := pm.StopPlugins(ctx); err != nil {
|
||||
fmt.Printf("停止插件失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Println("\n示例结束")
|
||||
}
|
77
examples/plugin/example/doc_example.go
Normal file
77
examples/plugin/example/doc_example.go
Normal file
@@ -0,0 +1,77 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/darkit/goproxy/examples/plugin"
|
||||
)
|
||||
|
||||
// 展示文档生成功能
|
||||
func DocGeneratorExample() {
|
||||
// 创建上下文
|
||||
ctx := context.Background()
|
||||
|
||||
// 获取插件目录
|
||||
pluginsDir := filepath.Join("..", "plugins", "dist")
|
||||
if _, err := os.Stat(pluginsDir); os.IsNotExist(err) {
|
||||
fmt.Printf("插件目录不存在: %s\n", pluginsDir)
|
||||
return
|
||||
}
|
||||
|
||||
// 创建插件管理器
|
||||
pm := plugin.NewPluginManager(pluginsDir)
|
||||
|
||||
// 加载插件
|
||||
fmt.Println("正在加载插件...")
|
||||
if err := pm.LoadPlugins(); err != nil {
|
||||
fmt.Printf("加载插件失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 初始化所有插件
|
||||
if err := pm.InitPlugins(ctx); err != nil {
|
||||
fmt.Printf("初始化插件失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 启动所有插件
|
||||
if err := pm.StartPlugins(ctx); err != nil {
|
||||
fmt.Printf("启动插件失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 创建文档输出目录
|
||||
docsDir := "./plugin_docs"
|
||||
if err := os.MkdirAll(docsDir, 0755); err != nil {
|
||||
fmt.Printf("创建文档目录失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Printf("将在 %s 目录生成API文档\n", docsDir)
|
||||
|
||||
// 创建文档生成器
|
||||
docGen := plugin.NewDocGenerator(pm, docsDir)
|
||||
|
||||
// 生成所有文档
|
||||
fmt.Println("正在生成API文档...")
|
||||
if err := docGen.GenerateAllDocs(); err != nil {
|
||||
fmt.Printf("生成文档失败: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf("成功生成API文档!文档位于: %s\n", docsDir)
|
||||
fmt.Println("文档包括:")
|
||||
fmt.Println("- 索引页 (index.md)")
|
||||
fmt.Println("- 按类型分组的插件列表 (plugins_by_type.md)")
|
||||
fmt.Println("- 每个插件的详细文档 (<插件名>.md)")
|
||||
}
|
||||
|
||||
// 停止所有插件
|
||||
if err := pm.StopPlugins(ctx); err != nil {
|
||||
fmt.Printf("停止插件失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Println("\n示例结束")
|
||||
}
|
@@ -15,7 +15,9 @@ func main() {
|
||||
fmt.Println("1. 基本插件加载和管理")
|
||||
fmt.Println("2. 动态参数传递示例")
|
||||
fmt.Println("3. 插件操作参数信息示例")
|
||||
fmt.Print("请输入选项 (1-3): ")
|
||||
fmt.Println("4. 插件API文档生成示例")
|
||||
fmt.Println("5. OpenAPI/Swagger文档生成示例")
|
||||
fmt.Print("请输入选项 (1-5): ")
|
||||
|
||||
var choice int
|
||||
fmt.Scan(&choice)
|
||||
@@ -27,6 +29,10 @@ func main() {
|
||||
DynamicParamsExample()
|
||||
case 3:
|
||||
OperationInfoExample()
|
||||
case 4:
|
||||
DocGeneratorExample()
|
||||
case 5:
|
||||
OpenAPIGeneratorExample()
|
||||
default:
|
||||
fmt.Println("无效的选项")
|
||||
}
|
||||
|
91
examples/plugin/example/openapi_example.go
Normal file
91
examples/plugin/example/openapi_example.go
Normal file
@@ -0,0 +1,91 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
|
||||
"github.com/darkit/goproxy/examples/plugin"
|
||||
)
|
||||
|
||||
// 展示OpenAPI文档生成功能
|
||||
func OpenAPIGeneratorExample() {
|
||||
// 创建上下文
|
||||
ctx := context.Background()
|
||||
|
||||
// 获取插件目录
|
||||
pluginsDir := filepath.Join("..", "plugins", "dist")
|
||||
if _, err := os.Stat(pluginsDir); os.IsNotExist(err) {
|
||||
fmt.Printf("插件目录不存在: %s\n", pluginsDir)
|
||||
return
|
||||
}
|
||||
|
||||
// 创建插件管理器
|
||||
pm := plugin.NewPluginManager(pluginsDir)
|
||||
|
||||
// 加载插件
|
||||
fmt.Println("正在加载插件...")
|
||||
if err := pm.LoadPlugins(); err != nil {
|
||||
fmt.Printf("加载插件失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 初始化所有插件
|
||||
if err := pm.InitPlugins(ctx); err != nil {
|
||||
fmt.Printf("初始化插件失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 启动所有插件
|
||||
if err := pm.StartPlugins(ctx); err != nil {
|
||||
fmt.Printf("启动插件失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
// 创建文档输出目录
|
||||
apiDocsDir := "./openapi_docs"
|
||||
if err := os.MkdirAll(apiDocsDir, 0755); err != nil {
|
||||
fmt.Printf("创建API文档目录失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Printf("将在 %s 目录生成OpenAPI文档\n", apiDocsDir)
|
||||
|
||||
// 创建OpenAPI生成器
|
||||
openAPIGen := plugin.NewOpenAPIGenerator(pm, apiDocsDir)
|
||||
|
||||
// 设置文档信息
|
||||
openAPIGen.SetInfo(
|
||||
"插件系统API",
|
||||
"插件系统提供的所有API接口,包括插件管理和操作执行",
|
||||
"1.0.0",
|
||||
)
|
||||
|
||||
// 设置联系人信息
|
||||
openAPIGen.SetContact(
|
||||
"插件系统开发团队",
|
||||
"plugins@example.com",
|
||||
"https://example.com/plugins",
|
||||
)
|
||||
|
||||
// 生成OpenAPI文档
|
||||
fmt.Println("正在生成OpenAPI文档...")
|
||||
if err := openAPIGen.GenerateOpenAPI(); err != nil {
|
||||
fmt.Printf("生成OpenAPI文档失败: %v\n", err)
|
||||
} else {
|
||||
fmt.Printf("成功生成OpenAPI文档!文档位于: %s\n", apiDocsDir)
|
||||
fmt.Println("文档包括:")
|
||||
fmt.Println("- OpenAPI规范文件 (openapi.json)")
|
||||
fmt.Println("- Swagger UI 界面 (index.html)")
|
||||
fmt.Printf("打开 %s/index.html 可以在浏览器中查看API文档\n", apiDocsDir)
|
||||
}
|
||||
|
||||
// 停止所有插件
|
||||
if err := pm.StopPlugins(ctx); err != nil {
|
||||
fmt.Printf("停止插件失败: %v\n", err)
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Println("\n示例结束")
|
||||
}
|
Reference in New Issue
Block a user