[add] app icons

This commit is contained in:
Max 2022-09-29 20:17:05 +08:00
parent 16aee0251a
commit a57220859e
4 changed files with 121 additions and 10 deletions

View file

@ -70,6 +70,9 @@ func Load(cfg config.Config) error {
return err
}
// Load icons
dsl.icons(cfg)
// Apply a language pack
if lang.Default != nil {
lang.Default.Apply(dsl)
@ -131,6 +134,19 @@ func exportAPI() error {
}
http.Paths = append(http.Paths, path)
process = "yao.app.Icons"
path = gou.Path{
Label: "App Icons",
Description: "App Icons",
Path: "/icons/:name",
Guard: "-",
Method: "GET",
Process: process,
In: []string{"$param.name"},
Out: gou.Out{Status: 200},
}
http.Paths = append(http.Paths, path)
// api source
source, err := jsoniter.Marshal(http)
if err != nil {
@ -152,6 +168,21 @@ func exportProcess() {
gou.RegisterProcessHandler("yao.app.setting", processSetting)
gou.RegisterProcessHandler("yao.app.xgen", processXgen)
gou.RegisterProcessHandler("yao.app.menu", processMenu)
gou.RegisterProcessHandler("yao.app.icons", processIcons)
}
func processIcons(process *gou.Process) interface{} {
process.ValidateArgNums(1)
name := process.ArgsString(0)
file, err := filepath.Abs(filepath.Join(config.Conf.Root, "icons", name))
if err != nil {
exception.New(err.Error(), 400).Throw()
}
content, err := ioutil.ReadFile(file)
if err != nil {
exception.New(err.Error(), 400).Throw()
}
return string(content)
}
func processMenu(process *gou.Process) interface{} {
@ -211,19 +242,48 @@ func processXgen(process *gou.Process) interface{} {
}
if admin, has := login.Logins["admin"]; has {
layout := map[string]interface{}{}
if admin.Layout.Site != "" {
layout["site"] = admin.Layout.Site
}
if admin.Layout.Slogan != "" {
layout["slogan"] = admin.Layout.Slogan
}
if admin.Layout.Cover != "" {
layout["cover"] = admin.Layout.Cover
}
xgenLogin["entry"]["admin"] = admin.Layout.Entry
xgenLogin["admin"] = map[string]interface{}{
"captcha": "/api/__yao/login/admin/captcha?type=digit",
"login": "/api/__yao/login/admin",
"layout": layout,
}
}
if user, has := login.Logins["user"]; has {
layout := map[string]interface{}{}
if user.Layout.Site != "" {
layout["site"] = user.Layout.Site
}
if user.Layout.Slogan != "" {
layout["slogan"] = user.Layout.Slogan
}
if user.Layout.Cover != "" {
layout["cover"] = user.Layout.Cover
}
xgenLogin["entry"]["user"] = user.Layout.Entry
xgenLogin["user"] = map[string]interface{}{
"captcha": "/api/__yao/login/user/captcha?type=digit",
"login": "/api/__yao/login/user",
"layout": layout,
}
xgenLogin["layout"] = layout
}
xgenSetting := map[string]interface{}{
@ -237,6 +297,14 @@ func processXgen(process *gou.Process) interface{} {
"login": xgenLogin,
}
if Setting.Logo != "" {
xgenSetting["logo"] = Setting.Logo
}
if Setting.Favicon != "" {
xgenSetting["favicon"] = Setting.Favicon
}
return xgenSetting
}
@ -264,3 +332,17 @@ func (dsl *DSL) replaceAdminRoot() error {
return data.ReplaceXGen("\"__yao_admin_root\"", fmt.Sprintf("\"%s\"", root))
}
// icons
func (dsl *DSL) icons(cfg config.Config) {
favicon := filepath.Join(cfg.Root, "icons", "app.ico")
if _, err := os.Stat(favicon); err == nil {
dsl.Favicon = fmt.Sprintf("/api/__yao/app/icons/app.ico")
}
logo := filepath.Join(cfg.Root, "icons", "app.png")
if _, err := os.Stat(logo); err == nil {
dsl.Logo = fmt.Sprintf("/api/__yao/app/icons/app.png")
}
}

View file

@ -8,6 +8,7 @@ import (
"github.com/yaoapp/gou"
"github.com/yaoapp/kun/any"
"github.com/yaoapp/yao/config"
"github.com/yaoapp/yao/flow"
"github.com/yaoapp/yao/lang"
"github.com/yaoapp/yao/widgets/login"
)
@ -86,7 +87,7 @@ func TestExport(t *testing.T) {
api, has := gou.APIs["widgets.app"]
assert.True(t, has)
assert.Equal(t, 2, len(api.HTTP.Paths))
assert.Equal(t, 3, len(api.HTTP.Paths))
_, has = gou.ThirdHandlers["yao.app.setting"]
assert.True(t, has)
@ -132,12 +133,33 @@ func TestProcessXgen(t *testing.T) {
assert.Equal(t, "/x/Table/pet", xgen.Get("login.entry.user"))
assert.Equal(t, "/api/__yao/login/user/captcha?type=digit", xgen.Get("login.user.captcha"))
assert.Equal(t, "/api/__yao/login/user", xgen.Get("login.user.login"))
assert.Equal(t, "/images/login/cover.svg", xgen.Get("login.layout.cover"))
assert.Equal(t, "/api/__yao/app/icons/app.ico", xgen.Get("favicon"))
assert.Equal(t, "/api/__yao/app/icons/app.png", xgen.Get("logo"))
assert.Equal(t, os.Getenv("YAO_ENV"), xgen.Get("mode"))
assert.Equal(t, "Demo Application", xgen.Get("name"))
assert.Equal(t, true, xgen.Get("optional.hideNotification"))
assert.Equal(t, "localStorage", xgen.Get("token"))
}
func TestProcessMenu(t *testing.T) {
loadApp(t)
res, err := gou.NewProcess("yao.app.Menu").Exec()
if err != nil {
t.Fatal(err)
}
assert.Len(t, res, 2)
}
func TestProcessIcons(t *testing.T) {
loadApp(t)
res, err := gou.NewProcess("yao.app.Icons", "app.png").Exec()
if err != nil {
t.Fatal(err)
}
assert.Greater(t, len(res.(string)), 10)
}
func loadApp(t *testing.T) {
os.Setenv("YAO_LANG", "")
@ -148,6 +170,11 @@ func loadApp(t *testing.T) {
t.Fatal(err)
}
err = flow.Load(config.Conf)
if err != nil {
t.Fatal(err)
}
err = Load(config.Conf)
if err != nil {
t.Fatal(err)

View file

@ -7,6 +7,8 @@ type DSL struct {
Version string `json:"version,omitempty"`
Description string `json:"description,omitempty"`
Theme string `json:"theme,omitempty"`
Logo string `json:"logo,omitempty"`
Favicon string `json:"favicon,omitempty"`
Menu MenuDSL `json:"menu,omitempty"`
Optional OptionalDSL `json:"optional,omitempty"`
}

View file

@ -27,7 +27,7 @@ func TestLoad(t *testing.T) {
assert.Equal(t, "yao.login.Admin", Logins["admin"].Action.Process)
assert.Equal(t, []string{":payload"}, Logins["admin"].Action.Args)
assert.Equal(t, "yao.utils.Captcha", Logins["admin"].Layout.Captcha)
assert.Equal(t, "/images/admin-cover.png", Logins["admin"].Layout.Cover)
assert.Equal(t, "/images/login/cover.svg", Logins["admin"].Layout.Cover)
assert.Equal(t, "/x/Chart/dashboard", Logins["admin"].Layout.Entry)
assert.Equal(t, "https://yaoapps.com", Logins["admin"].Layout.Site)
assert.Equal(t, "Make Your Dream With Yao App Engine", Logins["admin"].Layout.Slogan)
@ -37,9 +37,9 @@ func TestLoad(t *testing.T) {
assert.Equal(t, "scripts.user.Login", Logins["user"].Action.Process)
assert.Equal(t, []string{":payload"}, Logins["user"].Action.Args)
assert.Equal(t, "yao.utils.Captcha", Logins["user"].Layout.Captcha)
assert.Equal(t, "/images/user-cover.png", Logins["user"].Layout.Cover)
assert.Equal(t, "/images/login/cover.svg", Logins["user"].Layout.Cover)
assert.Equal(t, "/x/Table/pet", Logins["user"].Layout.Entry)
assert.Equal(t, "https://yaoapps.com/docs", Logins["user"].Layout.Site)
assert.Equal(t, "https://yaoapps.com/doc", Logins["user"].Layout.Site)
assert.Equal(t, "Make Your Dream With Yao App Engine", Logins["user"].Layout.Slogan)
}
@ -59,7 +59,7 @@ func TestLoadHK(t *testing.T) {
assert.Equal(t, "yao.login.Admin", Logins["admin"].Action.Process)
assert.Equal(t, []string{":payload"}, Logins["admin"].Action.Args)
assert.Equal(t, "yao.utils.Captcha", Logins["admin"].Layout.Captcha)
assert.Equal(t, "/images/admin-cover.png", Logins["admin"].Layout.Cover)
assert.Equal(t, "/images/login/cover.svg", Logins["admin"].Layout.Cover)
assert.Equal(t, "/x/Chart/dashboard", Logins["admin"].Layout.Entry)
assert.Equal(t, "https://yaoapps.com", Logins["admin"].Layout.Site)
assert.Equal(t, "夢想讓我們與眾不同", Logins["admin"].Layout.Slogan)
@ -69,9 +69,9 @@ func TestLoadHK(t *testing.T) {
assert.Equal(t, "scripts.user.Login", Logins["user"].Action.Process)
assert.Equal(t, []string{":payload"}, Logins["user"].Action.Args)
assert.Equal(t, "yao.utils.Captcha", Logins["user"].Layout.Captcha)
assert.Equal(t, "/images/user-cover.png", Logins["user"].Layout.Cover)
assert.Equal(t, "/images/login/cover.svg", Logins["user"].Layout.Cover)
assert.Equal(t, "/x/Table/pet", Logins["user"].Layout.Entry)
assert.Equal(t, "https://yaoapps.com/docs", Logins["user"].Layout.Site)
assert.Equal(t, "https://yaoapps.com/doc", Logins["user"].Layout.Site)
assert.Equal(t, "夢想讓我們與眾不同", Logins["user"].Layout.Slogan)
}
@ -91,7 +91,7 @@ func TestLoadCN(t *testing.T) {
assert.Equal(t, "yao.login.Admin", Logins["admin"].Action.Process)
assert.Equal(t, []string{":payload"}, Logins["admin"].Action.Args)
assert.Equal(t, "yao.utils.Captcha", Logins["admin"].Layout.Captcha)
assert.Equal(t, "/images/admin-cover.png", Logins["admin"].Layout.Cover)
assert.Equal(t, "/images/login/cover.svg", Logins["admin"].Layout.Cover)
assert.Equal(t, "/x/Chart/dashboard", Logins["admin"].Layout.Entry)
assert.Equal(t, "https://yaoapps.com", Logins["admin"].Layout.Site)
assert.Equal(t, "梦想让我们与众不同", Logins["admin"].Layout.Slogan)
@ -101,9 +101,9 @@ func TestLoadCN(t *testing.T) {
assert.Equal(t, "scripts.user.Login", Logins["user"].Action.Process)
assert.Equal(t, []string{":payload"}, Logins["user"].Action.Args)
assert.Equal(t, "yao.utils.Captcha", Logins["user"].Layout.Captcha)
assert.Equal(t, "/images/user-cover.png", Logins["user"].Layout.Cover)
assert.Equal(t, "/images/login/cover.svg", Logins["user"].Layout.Cover)
assert.Equal(t, "/x/Table/pet", Logins["user"].Layout.Entry)
assert.Equal(t, "https://yaoapps.com/docs", Logins["user"].Layout.Site)
assert.Equal(t, "https://yaoapps.com/doc", Logins["user"].Layout.Site)
assert.Equal(t, "梦想让我们与众不同", Logins["user"].Layout.Slogan)
}