kra/internal/initialize/plugin.go

100 lines
2.5 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package initialize
import (
"fmt"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
// Plugin 插件接口 (v1版本)
type Plugin interface {
// Register 注册路由
Register(group *gin.RouterGroup)
// RouterPath 返回路由路径
RouterPath() string
}
// PluginV2 插件接口 (v2版本)
type PluginV2 interface {
// Register 注册到引擎
Register(engine *gin.Engine)
}
// PluginManager 插件管理器
type PluginManager struct {
db *gorm.DB
pluginsV1 []Plugin
pluginsV2 []PluginV2
initialized bool
}
// NewPluginManager 创建插件管理器
func NewPluginManager(db *gorm.DB) *PluginManager {
return &PluginManager{
db: db,
pluginsV1: make([]Plugin, 0),
pluginsV2: make([]PluginV2, 0),
}
}
// RegisterPluginV1 注册V1版本插件
func (m *PluginManager) RegisterPluginV1(plugin Plugin) {
m.pluginsV1 = append(m.pluginsV1, plugin)
}
// RegisterPluginV2 注册V2版本插件
func (m *PluginManager) RegisterPluginV2(plugin PluginV2) {
m.pluginsV2 = append(m.pluginsV2, plugin)
}
// InstallPlugins 安装所有插件
func (m *PluginManager) InstallPlugins(privateGroup *gin.RouterGroup, publicGroup *gin.RouterGroup, engine *gin.Engine) {
if m.db == nil {
fmt.Println("项目暂未初始化,无法安装插件,初始化后重启项目即可完成插件安装")
return
}
// 安装V1版本插件
m.installPluginsV1(privateGroup, publicGroup)
// 安装V2版本插件
m.installPluginsV2(engine)
m.initialized = true
}
// installPluginsV1 安装V1版本插件
func (m *PluginManager) installPluginsV1(privateGroup *gin.RouterGroup, publicGroup *gin.RouterGroup) {
for _, plugin := range m.pluginsV1 {
fmt.Printf("%s 注册开始!\n", plugin.RouterPath())
pluginGroup := privateGroup.Group(plugin.RouterPath())
plugin.Register(pluginGroup)
fmt.Printf("%s 注册成功!\n", plugin.RouterPath())
}
}
// installPluginsV2 安装V2版本插件
func (m *PluginManager) installPluginsV2(engine *gin.Engine) {
for _, plugin := range m.pluginsV2 {
plugin.Register(engine)
}
}
// PluginInit 初始化V1版本插件兼容旧版方式
func PluginInit(group *gin.RouterGroup, plugins ...Plugin) {
for _, plugin := range plugins {
fmt.Printf("%s 注册开始!\n", plugin.RouterPath())
pluginGroup := group.Group(plugin.RouterPath())
plugin.Register(pluginGroup)
fmt.Printf("%s 注册成功!\n", plugin.RouterPath())
}
}
// PluginInitV2 初始化V2版本插件兼容旧版方式
func PluginInitV2(engine *gin.Engine, plugins ...PluginV2) {
for _, plugin := range plugins {
plugin.Register(engine)
}
}