diff --git a/controller/admin_comment_edit.go b/controller/admin_comment_edit.go index 6a3c7ac..ff116a4 100644 --- a/controller/admin_comment_edit.go +++ b/controller/admin_comment_edit.go @@ -34,7 +34,7 @@ func (h *BaseHandler) AdminCommentEditPage(ctx *fasthttp.RequestCtx) { comment := model.CommentGetById(db, tidI, cidI) evn := &admin.CommentEdit{} - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteCf = scf evn.Title = "评论修改" evn.PageName = "admin_comment_edit" @@ -42,7 +42,7 @@ func (h *BaseHandler) AdminCommentEditPage(ctx *fasthttp.RequestCtx) { author, _ := model.UserGetById(db, comment.UserId) if author.ID == 0 { - author = curUser + author = evn.CurrentUser } evn.NodeLst = model.NodeGetAll(h.App.Mc, h.App.Db) diff --git a/controller/admin_comment_review.go b/controller/admin_comment_review.go index 30ee93d..5ff3727 100644 --- a/controller/admin_comment_review.go +++ b/controller/admin_comment_review.go @@ -22,7 +22,7 @@ func (h *BaseHandler) AdminCommentReviewPage(ctx *fasthttp.RequestCtx) { db := h.App.Db evn := &admin.CommentEdit{} - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteCf = scf evn.Title = "待审核评论" evn.PageName = "admin_comment_review" @@ -56,7 +56,7 @@ func (h *BaseHandler) AdminCommentReviewPage(ctx *fasthttp.RequestCtx) { author, _ = model.UserGetById(db, rec.UserId) } if author.ID == 0 { - author = curUser + author = evn.CurrentUser } evn.NodeLst = model.NodeGetAll(h.App.Mc, h.App.Db) diff --git a/controller/admin_link.go b/controller/admin_link.go index aa54df9..50378ab 100644 --- a/controller/admin_link.go +++ b/controller/admin_link.go @@ -18,7 +18,7 @@ func (h *BaseHandler) AdminLinkPage(ctx *fasthttp.RequestCtx) { scf := h.App.Cf.Site evn := &admin.Link{} - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteCf = scf evn.Title = "链接管理" evn.PageName = "admin_link" diff --git a/controller/admin_node.go b/controller/admin_node.go index 0848142..206f5ff 100644 --- a/controller/admin_node.go +++ b/controller/admin_node.go @@ -18,7 +18,7 @@ func (h *BaseHandler) AdminNodePage(ctx *fasthttp.RequestCtx) { scf := h.App.Cf.Site evn := &admin.Node{} - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteCf = scf evn.Title = "分区管理" evn.PageName = "admin_node" diff --git a/controller/admin_ratelimit_iplookup.go b/controller/admin_ratelimit_iplookup.go index bf329ce..aefc99c 100644 --- a/controller/admin_ratelimit_iplookup.go +++ b/controller/admin_ratelimit_iplookup.go @@ -18,7 +18,7 @@ func (h *BaseHandler) AdminRateLimitIpLookup(ctx *fasthttp.RequestCtx) { scf := h.App.Cf.Site evn := &admin.IpLookup{} - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteCf = scf evn.Title = "Ip Lookup" evn.PageName = "admin_IpLookup" diff --git a/controller/admin_ratelimit_setting.go b/controller/admin_ratelimit_setting.go index b31fdef..8d0fa5a 100644 --- a/controller/admin_ratelimit_setting.go +++ b/controller/admin_ratelimit_setting.go @@ -19,7 +19,7 @@ func (h *BaseHandler) AdminRateLimitSetting(ctx *fasthttp.RequestCtx) { scf := h.App.Cf.Site evn := &admin.RateLimitSetting{} - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteCf = scf evn.Title = "Rate Limit Setting" evn.PageName = "admin_RateLimitSetting" diff --git a/controller/admin_site_config.go b/controller/admin_site_config.go index 43867b1..8afe3b9 100644 --- a/controller/admin_site_config.go +++ b/controller/admin_site_config.go @@ -23,7 +23,7 @@ func (h *BaseHandler) AdminSiteConfigPage(ctx *fasthttp.RequestCtx) { scf := h.App.Cf.Site evn := &admin.SiteConfig{} - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteCf = scf evn.Title = "网站设置" evn.PageName = "admin_site_setting" diff --git a/controller/admin_site_router.go b/controller/admin_site_router.go index 5804725..9b45940 100644 --- a/controller/admin_site_router.go +++ b/controller/admin_site_router.go @@ -20,7 +20,7 @@ func (h *BaseHandler) AdminSiteRouterPage(ctx *fasthttp.RequestCtx) { scf := h.App.Cf.Site evn := &admin.SiteRouter{} - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteCf = scf evn.Title = "自定义路由" evn.PageName = "admin_site_router" diff --git a/controller/admin_topic_add.go b/controller/admin_topic_add.go index c946a83..8990a03 100644 --- a/controller/admin_topic_add.go +++ b/controller/admin_topic_add.go @@ -25,7 +25,7 @@ func (h *BaseHandler) AdminTopicAddPage(ctx *fasthttp.RequestCtx) { scf := h.App.Cf.Site evn := &admin.TopicAdd{} - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteCf = scf evn.Title = "发表文章" evn.PageName = "topic_input" @@ -35,7 +35,7 @@ func (h *BaseHandler) AdminTopicAddPage(ctx *fasthttp.RequestCtx) { NodeId: 1, UserId: curUser.ID, } - evn.DefaultUser = curUser + evn.DefaultUser = evn.CurrentUser evn.HasMsg = model.MsgCheckHasOne(db, curUser.ID) // evn.DefaultNode, _ = model.NodeGetById(h.App.Db, evn.DefaultTopic.NodeId) // evn.DefaultNode = model.Node{} diff --git a/controller/admin_topic_edit.go b/controller/admin_topic_edit.go index aa75ca1..dbfbf66 100644 --- a/controller/admin_topic_edit.go +++ b/controller/admin_topic_edit.go @@ -18,7 +18,7 @@ func (h *BaseHandler) AdminTopicEditPage(ctx *fasthttp.RequestCtx) { scf := h.App.Cf.Site evn := &admin.TopicAdd{} - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteCf = scf evn.Title = "编辑帖子" evn.PageName = "admin_topic_edit" @@ -54,7 +54,7 @@ func (h *BaseHandler) AdminTopicEditPage(ctx *fasthttp.RequestCtx) { author, _ = model.UserGetById(h.App.Db, rec.UserId) } if author.ID == 0 { - author = curUser + author = evn.CurrentUser } evn.ReadMoreBreak = model.ReadMoreBreak diff --git a/controller/admin_topic_review.go b/controller/admin_topic_review.go index be8a5fa..2eaf94e 100644 --- a/controller/admin_topic_review.go +++ b/controller/admin_topic_review.go @@ -19,7 +19,7 @@ func (h *BaseHandler) AdminTopicReviewPage(ctx *fasthttp.RequestCtx) { scf := h.App.Cf.Site evn := &admin.TopicAdd{} - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteCf = scf evn.Title = "待审核帖子" evn.PageName = "admin_topic_review" @@ -53,7 +53,7 @@ func (h *BaseHandler) AdminTopicReviewPage(ctx *fasthttp.RequestCtx) { author, _ = model.UserGetById(h.App.Db, rec.UserId) } if author.ID == 0 { - author = curUser + author = evn.CurrentUser } evn.DefaultTopic = model.Topic{ diff --git a/controller/admin_user.go b/controller/admin_user.go index e983e3d..17a3f4e 100644 --- a/controller/admin_user.go +++ b/controller/admin_user.go @@ -20,7 +20,7 @@ func (h *BaseHandler) AdminUserPage(ctx *fasthttp.RequestCtx) { scf := h.App.Cf.Site evn := &admin.User{} - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteCf = scf evn.Title = "用户管理" diff --git a/controller/base_controller.go b/controller/base_controller.go index c0e2955..df3b432 100644 --- a/controller/base_controller.go +++ b/controller/base_controller.go @@ -7,6 +7,7 @@ import ( "github.com/valyala/fasthttp" "goyoubbs/model" "net" + "strconv" "strings" "time" ) @@ -57,26 +58,41 @@ func ReadUserIP(ctx *fasthttp.RequestCtx) string { return "" } -func (h *BaseHandler) CurrentUser(ctx *fasthttp.RequestCtx) (model.User, error) { - var user model.User +func (h *BaseHandler) CurrentUser(ctx *fasthttp.RequestCtx) (*model.User, error) { + user := &model.User{} ssValue := h.GetCookie(ctx, "SessionID") if len(ssValue) == 0 { return user, errors.New("SessionID cookie not found ") } - z := strings.Split(ssValue, ":") - uid := z[0] - sessionID := z[1] - - rs := h.App.Db.Hget(model.UserTbName, sdb.DS2b(uid)) - if rs.State == "ok" { - _ = json.Unmarshal(rs.Data[0], &user) - if sessionID == user.Session { - _ = h.SetCookie(ctx, "SessionID", ssValue, 365) - return user, nil + index := strings.Index(ssValue, ":") + if index == -1 { + return user, errors.New("SessionID cookie not found ") + } + uId, _ := strconv.ParseUint(ssValue[:index], 10, 64) + if uId == 0 { + return user, errors.New("UserID is 0 ") + } + var ok bool + model.UserMapMux.RLock() + user, ok = model.UserMap[uId] + model.UserMapMux.RUnlock() + if !ok { + rs := h.App.Db.Hget(model.UserTbName, sdb.I2b(uId)) + if rs.OK() { + _ = json.Unmarshal(rs.Data[0], &user) + if user.ID > 0 { + model.UserMapMux.Lock() + model.UserMap[uId] = user + model.UserMapMux.Unlock() + } } } + if user != nil { + _ = h.SetCookie(ctx, "SessionID", ssValue, 365) + return user, nil + } - return user, errors.New("user not found") + return &model.User{}, errors.New("user not found") } func (h *BaseHandler) SetCookie(ctx *fasthttp.RequestCtx, name, value string, days int) error { diff --git a/controller/home.go b/controller/home.go index 5f9f228..fc93901 100644 --- a/controller/home.go +++ b/controller/home.go @@ -50,7 +50,7 @@ func (h *BaseHandler) HomePage(ctx *fasthttp.RequestCtx) { evn := &ybs.HomePage{} evn.SiteCf = scf evn.Title = scf.Name - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteInfo = model.GetSiteInfo(db) evn.DefaultNode = model.Node{ID: 1} diff --git a/controller/member_page.go b/controller/member_page.go index 8ebb23c..1ce332e 100644 --- a/controller/member_page.go +++ b/controller/member_page.go @@ -102,7 +102,7 @@ func (h *BaseHandler) MemberPage(ctx *fasthttp.RequestCtx) { evn := &ybs.MemberPage{} evn.SiteCf = scf evn.Title = "会员: " + user.Name + " 最近" + titleText + " - " + scf.Name - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.NodeLst = model.NodeGetAll(h.App.Mc, db) evn.TopicPageInfo = topicPageInfo diff --git a/controller/my_msg.go b/controller/my_msg.go index 5b7921b..c468d2f 100644 --- a/controller/my_msg.go +++ b/controller/my_msg.go @@ -17,7 +17,7 @@ func (h *BaseHandler) MyMsgPage(ctx *fasthttp.RequestCtx) { scf := h.App.Cf.Site evn := &ybs.MyMsg{} - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteCf = scf evn.Title = "未读信息" diff --git a/controller/node.go b/controller/node.go index c8d825d..4365fbb 100644 --- a/controller/node.go +++ b/controller/node.go @@ -66,7 +66,7 @@ func (h *BaseHandler) NodePage(ctx *fasthttp.RequestCtx) { evn := &ybs.NodePage{} evn.SiteCf = scf evn.Title = "Category: " + node.Name + " - " + scf.Name - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.DefaultNode = node evn.NodeLst = model.NodeGetAll(h.App.Mc, db) diff --git a/controller/search.go b/controller/search.go index abfb48c..88236d1 100644 --- a/controller/search.go +++ b/controller/search.go @@ -59,7 +59,7 @@ func (h *BaseHandler) SearchPage(ctx *fasthttp.RequestCtx) { evn := &ybs.SearchPage{} evn.SiteCf = scf evn.Title = "搜索: " + q + " - " + scf.Name - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.Q = q evn.NodeLst = model.NodeGetAll(h.App.Mc, db) diff --git a/controller/tag.go b/controller/tag.go index 34e4a50..d7a7f18 100644 --- a/controller/tag.go +++ b/controller/tag.go @@ -62,7 +62,7 @@ func (h *BaseHandler) TagPage(ctx *fasthttp.RequestCtx) { evn := &ybs.TagPage{} evn.SiteCf = scf evn.Title = "Tag: " + tagRaw + " - " + scf.Name - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.Tag = tagLower evn.NodeLst = model.NodeGetAll(h.App.Mc, db) diff --git a/controller/topic_add.go b/controller/topic_add.go index 8b65d96..2e94447 100644 --- a/controller/topic_add.go +++ b/controller/topic_add.go @@ -25,7 +25,7 @@ func (h *BaseHandler) TopicAddPage(ctx *fasthttp.RequestCtx) { scf := h.App.Cf.Site evn := &ybs.UserTopicAdd{} - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteCf = scf evn.Title = "发表文章" evn.PageName = "topic_input" @@ -42,7 +42,7 @@ func (h *BaseHandler) TopicAddPage(ctx *fasthttp.RequestCtx) { NodeId: 1, UserId: curUser.ID, } - evn.DefaultUser = curUser + evn.DefaultUser = evn.CurrentUser evn.HasMsg = model.MsgCheckHasOne(db, curUser.ID) evn.DefaultNode = node evn.NodeLst = model.NodeGetAll(h.App.Mc, db) diff --git a/controller/topic_detail.go b/controller/topic_detail.go index 2a091a7..d2057bc 100644 --- a/controller/topic_detail.go +++ b/controller/topic_detail.go @@ -57,7 +57,7 @@ func (h *BaseHandler) TopicDetailPage(ctx *fasthttp.RequestCtx) { safeTitle := html.EscapeString(topic.Title) evn := &ybs.TopicDetailPage{} - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteCf = scf evn.Title = safeTitle + " - " + scf.Name evn.Keywords = topic.Tags diff --git a/controller/user_setting.go b/controller/user_setting.go index 7e0d1c5..a4405de 100644 --- a/controller/user_setting.go +++ b/controller/user_setting.go @@ -23,12 +23,12 @@ func (h *BaseHandler) UserSettingPage(ctx *fasthttp.RequestCtx) { scf := h.App.Cf.Site evn := &ybs.UserSetting{} - evn.CurrentUser = curUser + evn.CurrentUser = *curUser evn.SiteCf = scf evn.Title = "个人设置" // - evn.User = curUser + evn.User = evn.CurrentUser evn.NodeLst = model.NodeGetAll(h.App.Mc, h.App.Db) @@ -71,7 +71,7 @@ func (h *BaseHandler) UserSettingPost(ctx *fasthttp.RequestCtx) { db := h.App.Db // 编辑 - obj := curUser + obj := *curUser if len(rec.Password) > 0 && len(rec.Password0) > 0 { if rec.Password0 != obj.Password { diff --git a/model/cached.go b/model/cached.go index d28854d..361615a 100644 --- a/model/cached.go +++ b/model/cached.go @@ -1,6 +1,9 @@ package model -import "sync/atomic" +import ( + "sync" + "sync/atomic" +) var ( RateLimitDay int @@ -8,6 +11,8 @@ var ( BadIpPrefixLst = NewConStrSlice() // 17.121 AllowIpPrefixLst = NewConStrSlice() // Manual input, select from all ipInfo list BadBotNameMap atomic.Value //map[string]interface{}{} // key: string, value: name. DataForSeoBot,SeznamBot,GrapeshotCrawler, + UserMapMux = &sync.RWMutex{} + UserMap = make(map[uint64]*User) // current user map key: uint64 user id ) func init() { diff --git a/model/user.go b/model/user.go index 9340ea6..88ceeb4 100644 --- a/model/user.go +++ b/model/user.go @@ -184,6 +184,12 @@ func UserSet(db *sdb.DB, obj User) User { return User{} } _ = db.Hset(UserTbName, sdb.I2b(obj.ID), jb) + // update UserMap + UserMapMux.Lock() + if _, ok := UserMap[obj.ID]; ok { + UserMap[obj.ID] = &obj + } + UserMapMux.Unlock() return obj }