插件增加静态文件目录自动映射,优化插件模板引擎与主模块的耦合关系

This commit is contained in:
孟帅
2023-06-14 18:09:49 +08:00
parent a232986311
commit 564107b980
29 changed files with 210 additions and 158 deletions

View File

@@ -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 过滤已安装模块