diff --git a/internal/web/actions/actionutils/menu.go b/internal/web/actions/actionutils/menu.go index 3b8532c1..c2d3ca9b 100644 --- a/internal/web/actions/actionutils/menu.go +++ b/internal/web/actions/actionutils/menu.go @@ -1,6 +1,6 @@ package actionutils -// 子菜单定义 +// Menu 子菜单定义 type Menu struct { Id string `json:"id"` Name string `json:"name"` @@ -11,14 +11,14 @@ type Menu struct { CountNormalItems int `json:"countNormalItems"` } -// 获取新对象 +// NewMenu 获取新对象 func NewMenu() *Menu { return &Menu{ Items: []*MenuItem{}, } } -// 添加菜单项 +// Add 添加菜单项 func (this *Menu) Add(name string, subName string, url string, isActive bool) *MenuItem { item := &MenuItem{ Name: name, @@ -36,7 +36,7 @@ func (this *Menu) Add(name string, subName string, url string, isActive bool) *M return item } -// 添加特殊菜单项,不计数 +// AddSpecial 添加特殊菜单项,不计数 func (this *Menu) AddSpecial(name string, subName string, url string, isActive bool) *MenuItem { item := this.Add(name, subName, url, isActive) this.CountNormalItems-- diff --git a/internal/web/actions/actionutils/menu_group.go b/internal/web/actions/actionutils/menu_group.go index dc3611bd..47d24281 100644 --- a/internal/web/actions/actionutils/menu_group.go +++ b/internal/web/actions/actionutils/menu_group.go @@ -5,20 +5,20 @@ import ( "github.com/iwind/TeaGo/lists" ) -// 菜单分组 +// MenuGroup 菜单分组 type MenuGroup struct { Menus []*Menu `json:"menus"` AlwaysMenu *Menu `json:"alwaysMenu"` } -// 获取新菜单分组对象 +// NewMenuGroup 获取新菜单分组对象 func NewMenuGroup() *MenuGroup { return &MenuGroup{ Menus: []*Menu{}, } } -// 查找菜单,如果找不到则自动创建 +// FindMenu 查找菜单,如果找不到则自动创建 func (this *MenuGroup) FindMenu(menuId string, menuName string) *Menu { for _, m := range this.Menus { if m.Id == menuId { @@ -33,7 +33,7 @@ func (this *MenuGroup) FindMenu(menuId string, menuName string) *Menu { return menu } -// 排序 +// Sort 排序 func (this *MenuGroup) Sort() { lists.Sort(this.Menus, func(i int, j int) bool { menu1 := this.Menus[i] @@ -42,7 +42,7 @@ func (this *MenuGroup) Sort() { }) } -// 设置子菜单 +// SetSubMenu 设置子菜单 func SetSubMenu(action actions.ActionWrapper, menu *MenuGroup) { action.Object().Data["teaSubMenus"] = menu } diff --git a/internal/web/actions/actionutils/menu_item.go b/internal/web/actions/actionutils/menu_item.go index 0a1b9363..921f824e 100644 --- a/internal/web/actions/actionutils/menu_item.go +++ b/internal/web/actions/actionutils/menu_item.go @@ -1,6 +1,6 @@ package actionutils -// 菜单项 +// MenuItem 菜单项 type MenuItem struct { Id string `json:"id"` Name string `json:"name"` diff --git a/internal/web/actions/actionutils/page.go b/internal/web/actions/actionutils/page.go index 8011f658..82d75f4d 100644 --- a/internal/web/actions/actionutils/page.go +++ b/internal/web/actions/actionutils/page.go @@ -127,7 +127,7 @@ func (this *Page) AsHTML() string { return `
` + strings.Join(result, "") + `
` } -// 判断是否为最后一页 +// IsLastPage 判断是否为最后一页 func (this *Page) IsLastPage() bool { return this.Current == this.Max } diff --git a/internal/web/actions/actionutils/tabbar.go b/internal/web/actions/actionutils/tabbar.go index 8f943e58..23eb2d23 100644 --- a/internal/web/actions/actionutils/tabbar.go +++ b/internal/web/actions/actionutils/tabbar.go @@ -5,19 +5,19 @@ import ( "github.com/iwind/TeaGo/maps" ) -// Tabbar定义 +// Tabbar Tabbar定义 type Tabbar struct { items []maps.Map } -// 获取新对象 +// NewTabbar 获取新对象 func NewTabbar() *Tabbar { return &Tabbar{ items: []maps.Map{}, } } -// 添加菜单项 +// Add 添加菜单项 func (this *Tabbar) Add(name string, subName string, url string, icon string, active bool) maps.Map { m := maps.Map{ "name": name, @@ -31,12 +31,12 @@ func (this *Tabbar) Add(name string, subName string, url string, icon string, ac return m } -// 取得所有的Items +// Items 取得所有的Items func (this *Tabbar) Items() []maps.Map { return this.items } -// 设置子菜单 +// SetTabbar 设置子菜单 func SetTabbar(action actions.ActionWrapper, tabbar *Tabbar) { action.Object().Data["teaTabbar"] = tabbar.Items() } diff --git a/internal/web/actions/actionutils/utils.go b/internal/web/actions/actionutils/utils.go index 8f0a2522..ad4ded6c 100644 --- a/internal/web/actions/actionutils/utils.go +++ b/internal/web/actions/actionutils/utils.go @@ -1,11 +1,18 @@ package actionutils import ( + "encoding/json" + "errors" "fmt" + "github.com/TeaOSLab/EdgeAdmin/internal/configs" teaconst "github.com/TeaOSLab/EdgeAdmin/internal/const" rpcerrors "github.com/TeaOSLab/EdgeCommon/pkg/rpc/errors" + "github.com/iwind/TeaGo/Tea" "github.com/iwind/TeaGo/actions" "github.com/iwind/TeaGo/logs" + "github.com/iwind/TeaGo/maps" + "io/ioutil" + "net" "net/http" "os" "path/filepath" @@ -24,24 +31,78 @@ func Fail(action actions.ActionWrapper, err error) { // FailPage 提示页面错误信息 func FailPage(action actions.ActionWrapper, err error) { - if err != nil { - logs.Println("[" + reflect.TypeOf(action).String() + "]" + findStack(err.Error())) + if err == nil { + err = errors.New("unknown error") } - err = rpcerrors.HumanError(err) + + logs.Println("[" + reflect.TypeOf(action).String() + "]" + findStack(err.Error())) + + // 当前API终端地址 + var apiEndpoints = []string{} + apiConfig, apiConfigErr := configs.LoadAPIConfig() + if apiConfigErr == nil && apiConfig != nil { + apiEndpoints = append(apiEndpoints, apiConfig.RPC.Endpoints...) + } + + var isRPCConnError bool + err, isRPCConnError = rpcerrors.HumanError(err, apiEndpoints, Tea.ConfigFile("api.yaml")) + action.Object().ResponseWriter.WriteHeader(http.StatusInternalServerError) if len(action.Object().Request.Header.Get("X-Requested-With")) > 0 { action.Object().WriteString(teaconst.ErrServer) } else { - action.Object().WriteString(` + // 本地的一些错误提示 + var isLocalAPI = false + if isRPCConnError { + host, _, hostErr := net.SplitHostPort(action.Object().Request.Host) + if hostErr == nil { + for _, endpoint := range apiEndpoints { + if strings.HasPrefix(endpoint, "http://"+host) || strings.HasPrefix(endpoint, "https://"+host) || strings.HasPrefix(endpoint, host) { + isLocalAPI = true + break + } + } + } + } + + var issuesHTML = "" + if isLocalAPI { + // 读取本地API节点的issues + issuesData, issuesErr := ioutil.ReadFile(Tea.Root + "/edge-api/logs/issues.log") + if issuesErr == nil { + var issueMaps = []maps.Map{} + issuesErr = json.Unmarshal(issuesData, &issueMaps) + if issuesErr == nil && len(issueMaps) > 0 { + var issueMap = issueMaps[0] + issuesHTML = "本地API节点启动错误:" + issueMap.GetString("message") + ",处理建议:" + issueMap.GetString("suggestion") + } + } + } + + var html = ` - + + 有系统错误需要处理 + + +
` + teaconst.ErrServer + ` -
可以通过查看 $安装目录/logs/run.log 日志文件查看具体的错误提示。
-
-
Error: ` + err.Error() + ` -
+
可以通过查看 $安装目录/logs/run.log 日志文件查看具体的错误提示。
+
+
Error: ` + err.Error() + `
` + + if len(issuesHTML) > 0 { + html += `
+
` + issuesHTML + `
` + } + + action.Object().WriteString(html + ` +
`) }