diff --git a/examples/quarkadmin/main.go b/examples/quarkadmin/main.go index 3474ae2..d9bc1c3 100644 --- a/examples/quarkadmin/main.go +++ b/examples/quarkadmin/main.go @@ -2,6 +2,7 @@ package main import ( "github.com/quarkcms/quark-go/pkg/app/handler/admin" + "github.com/quarkcms/quark-go/pkg/app/handler/miniapp" "github.com/quarkcms/quark-go/pkg/app/handler/mix" "github.com/quarkcms/quark-go/pkg/app/handler/tool" "github.com/quarkcms/quark-go/pkg/app/install" @@ -25,6 +26,9 @@ func main() { // 加载Mix服务 providers = append(providers, mix.Providers...) + // 加载MiniApp服务 + providers = append(providers, miniapp.Providers...) + // 加载工具服务 providers = append(providers, tool.Providers...) diff --git a/pkg/app/handler/miniapp/forms/.keep b/pkg/app/handler/miniapp/forms/.keep new file mode 100644 index 0000000..e69de29 diff --git a/pkg/app/handler/miniapp/logins/.keep b/pkg/app/handler/miniapp/logins/.keep new file mode 100644 index 0000000..e69de29 diff --git a/pkg/app/handler/miniapp/pages/index.go b/pkg/app/handler/miniapp/pages/index.go new file mode 100644 index 0000000..9176bee --- /dev/null +++ b/pkg/app/handler/miniapp/pages/index.go @@ -0,0 +1,35 @@ +package pages + +import ( + "github.com/quarkcms/quark-go/pkg/builder" + "github.com/quarkcms/quark-go/pkg/builder/template/miniapppage" + "github.com/quarkcms/quark-go/pkg/component/miniapp/navbar" + "github.com/quarkcms/quark-go/pkg/component/miniapp/tabbar" +) + +type Index struct { + miniapppage.Template +} + +// 初始化 +func (p *Index) Init() interface{} { + // 初始化模板 + p.TemplateInit() + + return p +} + +// 头部导航 +func (p *Index) Navbar(ctx *builder.Context, navbar *navbar.Component) interface{} { + return navbar.SetTitle("首页") +} + +// 组件渲染 +func (p *Index) Content(ctx *builder.Context) interface{} { + return "Hello World!" +} + +// 底部导航 +func (p *Index) Tabbar(ctx *builder.Context, tabbar *tabbar.Component) interface{} { + return tabbar.SetBottom(true) +} diff --git a/pkg/app/handler/miniapp/providers.go b/pkg/app/handler/miniapp/providers.go new file mode 100644 index 0000000..0090a10 --- /dev/null +++ b/pkg/app/handler/miniapp/providers.go @@ -0,0 +1,8 @@ +package miniapp + +import "github.com/quarkcms/quark-go/pkg/app/handler/miniapp/pages" + +// 注册服务 +var Providers = []interface{}{ + &pages.Index{}, +} diff --git a/pkg/builder/template/miniapppage/miniapppage.go b/pkg/builder/template/miniapppage/miniapppage.go new file mode 100644 index 0000000..422bdff --- /dev/null +++ b/pkg/builder/template/miniapppage/miniapppage.go @@ -0,0 +1,105 @@ +package miniapppage + +import ( + "reflect" + + "github.com/quarkcms/quark-go/pkg/builder" + "github.com/quarkcms/quark-go/pkg/builder/template" + "github.com/quarkcms/quark-go/pkg/component/miniapp/navbar" + "github.com/quarkcms/quark-go/pkg/component/miniapp/page" + "github.com/quarkcms/quark-go/pkg/component/miniapp/tabbar" + "github.com/quarkcms/quark-go/pkg/dal/db" +) + +// 后台登录模板 +type Template struct { + template.Template + Title string + Style string +} + +// 初始化 +func (p *Template) Init() interface{} { + p.TemplateInit() + + return p +} + +// 初始化模板 +func (p *Template) TemplateInit() interface{} { + + // 初始化数据对象 + p.DB = db.Client + + // 注册路由映射 + p.GET("/api/miniapp/page/:resource/index", p.Render) // 渲染页面路由 + + // 标题 + p.Title = "QuarkGo" + + return p +} + +// 头部导航 +func (p *Template) Navbar(ctx *builder.Context, navbar *navbar.Component) interface{} { + return nil +} + +// 内容 +func (p *Template) Content(ctx *builder.Context) interface{} { + return nil +} + +// 底部导航 +func (p *Template) Tabbar(ctx *builder.Context, tabbar *tabbar.Component) interface{} { + return nil +} + +// 组件渲染 +func (p *Template) Render(ctx *builder.Context) error { + var ( + components []interface{} + ) + + // 标题 + title := reflect. + ValueOf(ctx.Template). + Elem(). + FieldByName("Title"). + String() + + // 导航 + navbar := ctx.Template.(interface { + Navbar(ctx *builder.Context, navbar *navbar.Component) interface{} + }).Navbar(ctx, navbar.New()) + + // 底部菜单 + tabbar := ctx.Template.(interface { + Tabbar(ctx *builder.Context, tabbar *tabbar.Component) interface{} + }).Tabbar(ctx, tabbar.New()) + + // 样式 + style := reflect. + ValueOf(ctx.Template). + Elem(). + FieldByName("Style"). + String() + + // 内容 + content := ctx.Template.(interface { + Content(ctx *builder.Context) interface{} + }).Content(ctx) + components = append(components, content) + + // 组件 + component := (&page.Component{}). + Init(). + SetTitle(title). + SetNavbar(navbar). + SetTabbar(tabbar). + SetStyle(style). + SetContent(components). + JsonSerialize() + + return ctx.JSON(200, component) +} diff --git a/pkg/component/miniapp/component/element.go b/pkg/component/miniapp/component/element.go new file mode 100644 index 0000000..2aaacb2 --- /dev/null +++ b/pkg/component/miniapp/component/element.go @@ -0,0 +1,37 @@ +package component + +import ( + "crypto/md5" + "encoding/hex" + + "github.com/go-basic/uuid" +) + +type Element struct { + Key string `json:"key"` + ComponentKey string `json:"componentKey"` + Component string `json:"component"` + Style interface{} `json:"style"` +} + +const DEFAULT_KEY = "" +const DEFAULT_CRYPT = true + +// 设置Key +func (p *Element) SetKey(key string, crypt bool) *Element { + + if key == "" { + key = uuid.New() + } + + if crypt { + h := md5.New() + h.Write([]byte(key)) + key = hex.EncodeToString(h.Sum(nil)) + } + + p.Key = key + p.ComponentKey = key + + return p +} diff --git a/pkg/component/miniapp/navbar/navbar.go b/pkg/component/miniapp/navbar/navbar.go new file mode 100644 index 0000000..7917305 --- /dev/null +++ b/pkg/component/miniapp/navbar/navbar.go @@ -0,0 +1,56 @@ +package navbar + +import "github.com/quarkcms/quark-go/pkg/component/miniapp/component" + +type Component struct { + component.Element + Title string `json:"title"` + LeftText string `json:"leftText"` + Desc string `json:"desc"` + LeftShow bool `json:"leftShow"` + TitleIcon bool `json:"titleIcon"` + Border bool `json:"border"` + Fixed bool `json:"fixed"` + Placeholder bool `json:"placeholder"` + SafeAreaInsetTop bool `json:"safeAreaInsetTop"` + ZIndex int `json:"zIndex"` +} + +// 初始化组件 +func New() *Component { + return (&Component{}).Init() +} + +// 初始化 +func (p *Component) Init() *Component { + p.Component = "navbar" + p.SetKey("navbar", component.DEFAULT_CRYPT) + + return p +} + +// Set style. +func (p *Component) SetStyle(style interface{}) *Component { + p.Style = style + + return p +} + +// 标题 +func (p *Component) SetTitle(title string) *Component { + p.Title = title + return p +} + +// 左侧文案 +func (p *Component) SetLeftText(leftText string) *Component { + p.LeftText = leftText + return p +} + +// 组件json序列化 +func (p *Component) JsonSerialize() *Component { + p.Component = "navbar" + + return p +} diff --git a/pkg/component/miniapp/page/page.go b/pkg/component/miniapp/page/page.go new file mode 100644 index 0000000..826aea5 --- /dev/null +++ b/pkg/component/miniapp/page/page.go @@ -0,0 +1,62 @@ +package page + +import "github.com/quarkcms/quark-go/pkg/component/miniapp/component" + +type Component struct { + component.Element + Title string `json:"title"` + Navbar interface{} `json:"navbar"` + Content interface{} `json:"content"` + Tabbar interface{} `json:"tabbar"` +} + +// 初始化组件 +func New() *Component { + return (&Component{}).Init() +} + +// 初始化 +func (p *Component) Init() *Component { + p.Component = "page" + p.SetKey("page", component.DEFAULT_CRYPT) + + return p +} + +// Set style. +func (p *Component) SetStyle(style interface{}) *Component { + p.Style = style + + return p +} + +// 标题 +func (p *Component) SetTitle(title string) *Component { + p.Title = title + return p +} + +// 头部导航 +func (p *Component) SetNavbar(navbar interface{}) *Component { + p.Navbar = navbar + return p +} + +// 内容 +func (p *Component) SetContent(content interface{}) *Component { + p.Content = content + return p +} + +// 底部导航 +func (p *Component) SetTabbar(tabbar interface{}) *Component { + p.Tabbar = tabbar + return p +} + +// 组件json序列化 +func (p *Component) JsonSerialize() *Component { + p.Component = "page" + + return p +} diff --git a/pkg/component/miniapp/tabbar/tabbar.go b/pkg/component/miniapp/tabbar/tabbar.go new file mode 100644 index 0000000..472d309 --- /dev/null +++ b/pkg/component/miniapp/tabbar/tabbar.go @@ -0,0 +1,47 @@ +package tabbar + +import "github.com/quarkcms/quark-go/pkg/component/miniapp/component" + +type Component struct { + component.Element + Bottom bool `json:"bottom"` + UnactiveColor string `json:"unactiveColor"` + ActiveColor string `json:"activeColor"` + SafeAreaInsetBottom bool `json:"safeAreaInsetBottom"` + Placeholder bool `json:"placeholder"` + Items interface{} `json:"items"` +} + +// 初始化组件 +func New() *Component { + return (&Component{}).Init() +} + +// 初始化 +func (p *Component) Init() *Component { + p.Component = "tabbar" + p.SetKey("tabbar", component.DEFAULT_CRYPT) + + return p +} + +// Set style. +func (p *Component) SetStyle(style interface{}) *Component { + p.Style = style + + return p +} + +// 是否固定在页面底部 +func (p *Component) SetBottom(bottom bool) *Component { + p.Bottom = bottom + + return p +} + +// 组件json序列化 +func (p *Component) JsonSerialize() *Component { + p.Component = "tabbar" + + return p +}