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) } }