diff --git a/README.md b/README.md index 7e984ca..bf407fc 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@
LOGO designed by 熊大 .

-    +   

:trollface: Nezha Monitoring: Self-hosted, lightweight server and website monitoring and O&M tool.

diff --git a/cmd/dashboard/controller/common_page.go b/cmd/dashboard/controller/common_page.go index 06ee331..123d4ab 100644 --- a/cmd/dashboard/controller/common_page.go +++ b/cmd/dashboard/controller/common_page.go @@ -101,6 +101,7 @@ func (p *commonPage) checkViewPassword(c *gin.Context) { return } + c.Set(model.CtxKeyViewPasswordVerified, true) c.Next() } @@ -125,20 +126,32 @@ func (p *commonPage) service(c *gin.Context) { })) } -func (cp *commonPage) getServerStat() ([]byte, error) { +func (cp *commonPage) getServerStat(c *gin.Context) ([]byte, error) { v, err, _ := cp.requestGroup.Do("serverStats", func() (any, error) { singleton.SortedServerLock.RLock() defer singleton.SortedServerLock.RUnlock() + + _, isMember := c.Get(model.CtxKeyAuthorizedUser) + _, isViewPasswordVerfied := c.Get(model.CtxKeyViewPasswordVerified) + + var servers []*model.Server + + if isMember || isViewPasswordVerfied { + servers = singleton.SortedServerList + } else { + servers = singleton.SortedServerListForGuest + } + return utils.Json.Marshal(Data{ Now: time.Now().Unix() * 1000, - Servers: singleton.SortedServerList, + Servers: servers, }) }) return v.([]byte), err } func (cp *commonPage) home(c *gin.Context) { - stat, err := cp.getServerStat() + stat, err := cp.getServerStat(c) if err != nil { mygin.ShowErrorPage(c, mygin.ErrInfo{ Code: http.StatusInternalServerError, @@ -186,7 +199,7 @@ func (cp *commonPage) ws(c *gin.Context) { defer conn.Close() count := 0 for { - stat, err := cp.getServerStat() + stat, err := cp.getServerStat(c) if err != nil { continue } diff --git a/cmd/dashboard/controller/member_api.go b/cmd/dashboard/controller/member_api.go index 8881c38..01144e6 100644 --- a/cmd/dashboard/controller/member_api.go +++ b/cmd/dashboard/controller/member_api.go @@ -306,6 +306,7 @@ type serverForm struct { Secret string Tag string Note string + HideForGuest string } func (ma *memberAPI) addOrEditServer(c *gin.Context) { @@ -321,6 +322,7 @@ func (ma *memberAPI) addOrEditServer(c *gin.Context) { s.ID = sf.ID s.Tag = sf.Tag s.Note = sf.Note + s.HideForGuest = sf.HideForGuest == "on" if s.ID == 0 { s.Secret = utils.MD5(fmt.Sprintf("%s%s%d", time.Now(), sf.Name, admin.ID)) s.Secret = s.Secret[:18] diff --git a/model/common.go b/model/common.go index 8b81d49..fc51e7c 100644 --- a/model/common.go +++ b/model/common.go @@ -5,7 +5,7 @@ import ( ) const CtxKeyAuthorizedUser = "ckau" - +const CtxKeyViewPasswordVerified = "ckvpv" const CacheKeyOauth2State = "p:a:state" type Common struct { diff --git a/model/server.go b/model/server.go index c2c62b5..95e798d 100644 --- a/model/server.go +++ b/model/server.go @@ -16,6 +16,7 @@ type Server struct { Secret string `gorm:"uniqueIndex" json:"-"` Note string `json:"-"` // 管理员可见备注 DisplayIndex int // 展示排序,越大越靠前 + HideForGuest bool // 对游客隐藏 Host *Host `gorm:"-"` State *HostState `gorm:"-"` @@ -38,10 +39,17 @@ func (s *Server) CopyFromRunningServer(old *Server) { s.PrevHourlyTransferOut = old.PrevHourlyTransferOut } +func boolToString(b bool) string { + if b { + return "true" + } + return "false" +} + func (s Server) Marshal() template.JS { name, _ := utils.Json.Marshal(s.Name) tag, _ := utils.Json.Marshal(s.Tag) note, _ := utils.Json.Marshal(s.Note) secret, _ := utils.Json.Marshal(s.Secret) - return template.JS(fmt.Sprintf(`{"ID":%d,"Name":%s,"Secret":%s,"DisplayIndex":%d,"Tag":%s,"Note":%s}`, s.ID, name, secret, s.DisplayIndex, tag, note)) // #nosec + return template.JS(fmt.Sprintf(`{"ID":%d,"Name":%s,"Secret":%s,"DisplayIndex":%d,"Tag":%s,"Note":%s,"HideForGuest": %s}`, s.ID, name, secret, s.DisplayIndex, tag, note, boolToString(s.HideForGuest))) // #nosec } diff --git a/resource/static/main.js b/resource/static/main.js index a008a23..42b1b68 100644 --- a/resource/static/main.js +++ b/resource/static/main.js @@ -292,6 +292,11 @@ function addOrEditServer(server, conf) { modal.find(".command.field").attr("style", "display:none"); modal.find("input[name=secret]").val(""); } + if (server && server.HideForGuest) { + modal.find(".ui.hideforguest.checkbox").checkbox("set checked"); + } else { + modal.find(".ui.hideforguest.checkbox").checkbox("set unchecked"); + } showFormModal(".server.modal", "#serverForm", "/api/server"); } diff --git a/resource/template/common/footer.html b/resource/template/common/footer.html index f92d1b7..cf2e1b5 100644 --- a/resource/template/common/footer.html +++ b/resource/template/common/footer.html @@ -10,7 +10,7 @@ - +