diff --git a/widgets/app/app.go b/widgets/app/app.go index 5eb743c0..f306db82 100644 --- a/widgets/app/app.go +++ b/widgets/app/app.go @@ -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") + } +} diff --git a/widgets/app/app_test.go b/widgets/app/app_test.go index 3736184e..5663bf07 100644 --- a/widgets/app/app_test.go +++ b/widgets/app/app_test.go @@ -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) diff --git a/widgets/app/types.go b/widgets/app/types.go index b87da763..ec6adb41 100644 --- a/widgets/app/types.go +++ b/widgets/app/types.go @@ -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"` } diff --git a/widgets/login/login_test.go b/widgets/login/login_test.go index ca8ea63a..76c97b7a 100644 --- a/widgets/login/login_test.go +++ b/widgets/login/login_test.go @@ -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) }