From d0598358779cbc2f1d6b9b01e30ef40f2aa24428 Mon Sep 17 00:00:00 2001 From: naiba Date: Sun, 17 Jan 2021 22:05:59 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20refactor:=20=E5=B0=8F?= =?UTF-8?q?=E5=B9=85=E6=8F=90=E5=8D=87=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/dashboard/controller/member_api.go | 6 ++++-- model/server.go | 11 ++++++----- pkg/mygin/auth.go | 23 ++++++++++++----------- resource/template/theme-default/home.html | 2 +- service/rpc/nezha.go | 7 ++++--- 5 files changed, 27 insertions(+), 22 deletions(-) diff --git a/cmd/dashboard/controller/member_api.go b/cmd/dashboard/controller/member_api.go index 3dd1bc4..4231a85 100644 --- a/cmd/dashboard/controller/member_api.go +++ b/cmd/dashboard/controller/member_api.go @@ -103,18 +103,20 @@ func (ma *memberAPI) addOrEditServer(c *gin.Context) { var isEdit bool err := c.ShouldBindJSON(&sf) if err == nil { - dao.ServerLock.Lock() - defer dao.ServerLock.Unlock() s.Name = sf.Name s.Secret = sf.Secret s.DisplayIndex = sf.DisplayIndex s.ID = sf.ID s.Tag = sf.Tag if sf.ID == 0 { + dao.ServerLock.Lock() + defer dao.ServerLock.Unlock() s.Secret = com.MD5(fmt.Sprintf("%s%s%d", time.Now(), sf.Name, admin.ID)) s.Secret = s.Secret[:10] err = dao.DB.Create(&s).Error } else { + dao.ServerLock.RLock() + defer dao.ServerLock.RUnlock() isEdit = true err = dao.DB.Save(&s).Error } diff --git a/model/server.go b/model/server.go index d382a75..b21a976 100644 --- a/model/server.go +++ b/model/server.go @@ -11,12 +11,13 @@ import ( type Server struct { Common Name string - DisplayIndex int // 展示权重,越大越靠前 - Secret string `json:"-"` Tag string - Host *Host `gorm:"-"` - State *HostState `gorm:"-"` - LastActive time.Time + Secret string `json:"-"` + DisplayIndex int // 展示权重,越大越靠前 + + Host *Host `gorm:"-"` + State *HostState `gorm:"-"` + LastActive *time.Time `gorm:"-"` TaskClose chan error `gorm:"-" json:"-"` TaskStream pb.NezhaService_RequestTaskServer `gorm:"-" json:"-"` diff --git a/pkg/mygin/auth.go b/pkg/mygin/auth.go index d376472..8ee0103 100644 --- a/pkg/mygin/auth.go +++ b/pkg/mygin/auth.go @@ -22,8 +22,6 @@ type AuthorizeOption struct { func Authorize(opt AuthorizeOption) func(*gin.Context) { return func(c *gin.Context) { - token, err := c.Cookie(dao.Conf.Site.CookieName) - token = strings.TrimSpace(token) var code uint64 = http.StatusForbidden if opt.Guest { code = http.StatusBadRequest @@ -35,18 +33,21 @@ func Authorize(opt AuthorizeOption) func(*gin.Context) { Link: opt.Redirect, Btn: opt.Btn, } - if token != "" { - } var isLogin bool - var u model.User - err = dao.DB.Where("token = ?", token).First(&u).Error - if err == nil { - isLogin = u.TokenExpired.After(time.Now()) - } - if isLogin { - c.Set(model.CtxKeyAuthorizedUser, &u) + + token, _ := c.Cookie(dao.Conf.Site.CookieName) + token = strings.TrimSpace(token) + if token != "" { + var u model.User + if err := dao.DB.Where("token = ?", token).First(&u).Error; err == nil { + isLogin = u.TokenExpired.After(time.Now()) + } + if isLogin { + c.Set(model.CtxKeyAuthorizedUser, &u) + } } + // 已登录且只能游客访问 if isLogin && opt.Guest { ShowErrorPage(c, commonErr, opt.IsPage) diff --git a/resource/template/theme-default/home.html b/resource/template/theme-default/home.html index b05f576..eed0065 100644 --- a/resource/template/theme-default/home.html +++ b/resource/template/theme-default/home.html @@ -25,7 +25,6 @@
diff --git a/service/rpc/nezha.go b/service/rpc/nezha.go index 368026f..f1cc520 100644 --- a/service/rpc/nezha.go +++ b/service/rpc/nezha.go @@ -69,10 +69,10 @@ func (s *NezhaHandler) RequestTask(h *pb.Host, stream pb.NezhaService_RequestTas return err } closeCh := make(chan error) - dao.ServerLock.Lock() + dao.ServerLock.RLock() dao.ServerList[clientID].TaskStream = stream dao.ServerList[clientID].TaskClose = closeCh - dao.ServerLock.Unlock() + dao.ServerLock.RUnlock() select { case err = <-closeCh: return err @@ -88,7 +88,8 @@ func (s *NezhaHandler) ReportSystemState(c context.Context, r *pb.State) (*pb.Re state := model.PB2State(r) dao.ServerLock.RLock() defer dao.ServerLock.RUnlock() - dao.ServerList[clientID].LastActive = time.Now() + now := time.Now() + dao.ServerList[clientID].LastActive = &now dao.ServerList[clientID].State = &state return &pb.Receipt{Proced: true}, nil }