mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-11-11 19:53:55 +08:00
插件增加静态文件目录自动映射,优化插件模板引擎与主模块的耦合关系
This commit is contained in:
@@ -7,9 +7,10 @@ package addons
|
||||
|
||||
import (
|
||||
"context"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/net/ghttp"
|
||||
"github.com/gogf/gf/v2/os/gfile"
|
||||
"hotgo/internal/consts"
|
||||
"github.com/gogf/gf/v2/os/gview"
|
||||
"hotgo/internal/model/input/form"
|
||||
"sort"
|
||||
"sync"
|
||||
@@ -17,15 +18,16 @@ import (
|
||||
|
||||
// Skeleton 模块骨架
|
||||
type Skeleton struct {
|
||||
Label string `json:"label"` // 标识
|
||||
Name string `json:"name"` // 名称
|
||||
Group int `json:"group"` // 分组
|
||||
Logo string `json:"logo"` // logo
|
||||
Brief string `json:"brief"` // 简介
|
||||
Description string `json:"description"` // 详细描述
|
||||
Author string `json:"author"` // 作者
|
||||
Version string `json:"version"` // 版本号
|
||||
RootPath string `json:"rootPath"` // 根路径
|
||||
Label string `json:"label"` // 标识
|
||||
Name string `json:"name"` // 名称
|
||||
Group int `json:"group"` // 分组
|
||||
Logo string `json:"logo"` // logo
|
||||
Brief string `json:"brief"` // 简介
|
||||
Description string `json:"description"` // 详细描述
|
||||
Author string `json:"author"` // 作者
|
||||
Version string `json:"version"` // 版本号
|
||||
RootPath string `json:"rootPath"` // 根路径
|
||||
View *gview.View `json:"view"` // 模板引擎
|
||||
}
|
||||
|
||||
func (s *Skeleton) GetModule() Module {
|
||||
@@ -71,6 +73,14 @@ func RegisterModule(m Module) Module {
|
||||
if ok {
|
||||
panic("module repeat registration, name:" + name)
|
||||
}
|
||||
|
||||
sk := m.GetSkeleton()
|
||||
if sk == nil {
|
||||
panic("module skeleton not initialized, name:" + name)
|
||||
}
|
||||
|
||||
sk.RootPath = GetModulePath(name)
|
||||
sk.View = NewView(m.Ctx(), name)
|
||||
modules[name] = m
|
||||
return m
|
||||
}
|
||||
@@ -110,9 +120,45 @@ func GetModuleRealPath(name string) string {
|
||||
return path
|
||||
}
|
||||
|
||||
// GetModulePath 获取指定模块相对路径
|
||||
func GetModulePath(name string) string {
|
||||
return "./" + consts.AddonsDir + "/" + name
|
||||
// NewView 初始化一个插件的模板引擎
|
||||
func NewView(ctx context.Context, name string) *gview.View {
|
||||
view := gview.New()
|
||||
|
||||
if err := view.SetPath(ViewPath(name)); err != nil {
|
||||
g.Log().Warningf(ctx, "NewView SetPath err:%+v", err)
|
||||
return nil
|
||||
}
|
||||
|
||||
// 默认和主模块使用一致的变量分隔符号
|
||||
delimiters := g.Cfg().MustGet(ctx, "viewer.delimiters", []string{"@{", "}"}).Strings()
|
||||
if len(delimiters) != 2 {
|
||||
g.Log().Warning(ctx, "NewView delimiters config error")
|
||||
return nil
|
||||
}
|
||||
view.SetDelimiters(delimiters[0], delimiters[1])
|
||||
|
||||
//// 更多配置
|
||||
//view.SetI18n()
|
||||
//// ...
|
||||
return view
|
||||
}
|
||||
|
||||
// AddStaticPath 设置插件静态目录映射
|
||||
func AddStaticPath(ctx context.Context, server *ghttp.Server, p ...string) {
|
||||
basePath := g.Cfg().MustGet(ctx, "server.serverRoot").String()
|
||||
if len(p) > 0 {
|
||||
basePath = p[0]
|
||||
}
|
||||
|
||||
if basePath == "" {
|
||||
return
|
||||
}
|
||||
|
||||
for _, module := range filterInstalled() {
|
||||
name := module.GetSkeleton().Name
|
||||
prefix, path := StaticPath(name, basePath)
|
||||
server.AddStaticPath(prefix, path)
|
||||
}
|
||||
}
|
||||
|
||||
// filterInstalled 过滤已安装模块
|
||||
|
||||
Reference in New Issue
Block a user