mirror of
https://github.com/acepanel/panel.git
synced 2026-02-04 12:40:25 +08:00
refactor: 插件
This commit is contained in:
@@ -1,32 +1,34 @@
|
||||
package plugins
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"runtime"
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/goravel/framework/contracts/foundation"
|
||||
"github.com/goravel/framework/contracts/route"
|
||||
"github.com/goravel/framework/facades"
|
||||
|
||||
"github.com/TheTNB/panel/v2/app/http/middleware"
|
||||
)
|
||||
|
||||
var plugins sync.Map
|
||||
|
||||
type Meta[ctx any] struct {
|
||||
Name string // 插件名称
|
||||
Description string // 插件描述
|
||||
Slug string // 插件标识
|
||||
Version string // 插件版本
|
||||
Requires []string // 依赖插件
|
||||
Excludes []string // 排除插件
|
||||
Install string // 安装命令
|
||||
Uninstall string // 卸载命令
|
||||
Update string // 更新命令
|
||||
OnEnable func(ctx) // 启用插件后执行的命令
|
||||
OnDisable func(ctx) // 禁用插件后执行的命令
|
||||
type Plugin struct {
|
||||
Name string // 插件名称
|
||||
Description string // 插件描述
|
||||
Slug string // 插件标识
|
||||
Version string // 插件版本
|
||||
Requires []string // 依赖插件
|
||||
Excludes []string // 排除插件
|
||||
Install string // 安装命令
|
||||
Uninstall string // 卸载命令
|
||||
Update string // 更新命令
|
||||
OnEnable func() error // 启用插件后执行的命令
|
||||
OnDisable func() error // 禁用插件后执行的命令
|
||||
}
|
||||
|
||||
func AutoRegister(o *Meta[*context.Context]) foundation.Application {
|
||||
func NewPlugin() (*Plugin, error) {
|
||||
pc, _, _, ok := runtime.Caller(1)
|
||||
if !ok {
|
||||
panic("unable to get caller")
|
||||
@@ -41,12 +43,21 @@ func AutoRegister(o *Meta[*context.Context]) foundation.Application {
|
||||
if b < 0 {
|
||||
panic("invalid package name: " + name)
|
||||
}
|
||||
name = name[:b]
|
||||
return Register(name, o)
|
||||
slug := name[:b]
|
||||
|
||||
if _, ok = plugins.Load(slug); ok {
|
||||
return nil, errors.New("plugin already exists")
|
||||
}
|
||||
|
||||
instance := &Plugin{
|
||||
Slug: slug,
|
||||
}
|
||||
plugins.Store(slug, instance)
|
||||
|
||||
return instance, instance.OnEnable()
|
||||
}
|
||||
|
||||
// Register 注册插件控制器
|
||||
func Register(service string, o *Meta[*context.Context]) foundation.Application {
|
||||
plugins.Store(service, o)
|
||||
return facades.App()
|
||||
// Route 注册路由
|
||||
func (r *Plugin) Route(group func(router route.Router)) {
|
||||
facades.Route().Prefix("api/plugins/"+r.Slug).Middleware(middleware.Session(), middleware.MustInstall()).Group(group)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user