From 0cfbbf06c5c4e51af162f519c60a4a3013482ba7 Mon Sep 17 00:00:00 2001 From: chenyifan01 Date: Wed, 7 Dec 2022 15:36:33 +0800 Subject: [PATCH] #3169 repo square:improve loading speed --- modules/setting/setting.go | 2 + routers/home.go | 22 +++++++--- services/repository/square.go | 82 ++++++++++++++++++++++++++++++++++- 3 files changed, 99 insertions(+), 7 deletions(-) diff --git a/modules/setting/setting.go b/modules/setting/setting.go index 702ad9f6b..b6a4cb540 100755 --- a/modules/setting/setting.go +++ b/modules/setting/setting.go @@ -668,6 +668,7 @@ var ( //repo square config IncubationSourceOrgId int64 + PaperRepoTopicName string //nginx proxy PROXYURL string @@ -1579,6 +1580,7 @@ func NewContext() { sec = Cfg.Section("repo-square") IncubationSourceOrgId = sec.Key("INCUBATION_ORG_ID").MustInt64(9) + PaperRepoTopicName = sec.Key("PAPER_REPO_TOPIC_NAME").MustString("openi-paper") sec = Cfg.Section("point") CloudBrainPaySwitch = sec.Key("CLOUDBRAIN_PAY_SWITCH").MustBool(false) diff --git a/routers/home.go b/routers/home.go index 7378fbc4f..3d24fa179 100755 --- a/routers/home.go +++ b/routers/home.go @@ -7,8 +7,8 @@ package routers import ( "bytes" - "encoding/json" "code.gitea.io/gitea/routers/response" + "encoding/json" "net/http" "strconv" "strings" @@ -300,9 +300,19 @@ func ExploreRepos(ctx *context.Context) { } func GetRepoSquarePage(ctx *context.Context) { + //banner + ctx.Data["SquareBanners"] = repository.GetBanners() + //配置的标签 + ctx.Data["SquareTopics"] = repository.GetTopics() + ctx.Data["SquareRecommendRepos"] = repository.GetRecommendRepos() + + repos, _ := repository.GetPreferredRepos() + ctx.Data["SquarePreferredRepos"] = repos + //领域精选 ctx.HTML(200, tplRepoSquare) } func GetRepoSearchPage(ctx *context.Context) { + ctx.Data["Topics"] = repository.GetTopics() ctx.HTML(200, tplRepoSearch) } @@ -361,11 +371,11 @@ func RepoFind(ctx *context.Context) { topic := strings.Trim(ctx.Query("topic"), " ") sort := strings.Trim(ctx.Query("sort"), " ") page := ctx.QueryInt("page") - pageSize := models.AvailablePageSize(ctx.QueryInt("pageSize")) + pageSize := ctx.QueryInt("pageSize") if pageSize == 0 { - pageSize = models.PageSize15 + pageSize = 15 } - if !pageSize.IsLegal() { + if pageSize > 100 { ctx.JSON(http.StatusOK, response.ServerError("pageSize illegal")) return } @@ -379,7 +389,7 @@ func RepoFind(ctx *context.Context) { } result, err := repository.FindRepos(repository.FindReposOptions{ - ListOptions: models.ListOptions{Page: page, PageSize: pageSize.Int()}, + ListOptions: models.ListOptions{Page: page, PageSize: pageSize}, Actor: ctx.User, Sort: sort, Keyword: keyword, @@ -966,4 +976,4 @@ func HomePrivacy(ctx *context.Context) { func HomeResoruceDesc(ctx *context.Context) { ctx.HTML(200, tplResoruceDesc) -} \ No newline at end of file +} diff --git a/services/repository/square.go b/services/repository/square.go index b1a7401e5..0fd32e3e8 100644 --- a/services/repository/square.go +++ b/services/repository/square.go @@ -4,9 +4,87 @@ import ( "code.gitea.io/gitea/models" "code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/setting" + "encoding/json" + "github.com/patrickmn/go-cache" + "time" ) +var repoSquareCache = cache.New(2*time.Minute, 1*time.Minute) + +const ( + RREFERED_CACHE = "PreferredRepos" + REPO_BANNER_CACHE = "RepoBanner" + TOPICS_CACHE = "RepoTopics" + RECOMMEND_CACHE = "RecommendRepos" +) + +func GetBanners() []map[string]string { + v, success := repoSquareCache.Get(REPO_BANNER_CACHE) + if success { + log.Debug("GetBanners from cache,value = %v", v) + if v == nil { + return nil + } + r := v.([]map[string]string) + return r + } + repoMap := getMapContent("repos/square_banner") + repoSquareCache.Set(REPO_BANNER_CACHE, repoMap, 1*time.Minute) + return repoMap +} + +func GetTopics() []map[string]string { + v, success := repoSquareCache.Get(TOPICS_CACHE) + if success { + log.Debug("GetTopics from cache,value = %v", v) + if v == nil { + return nil + } + r := v.([]map[string]string) + return r + } + repoMap := getMapContent("repos/recommend_topics") + repoSquareCache.Set(TOPICS_CACHE, repoMap, 1*time.Minute) + return repoMap +} + +func getMapContent(fileName string) []map[string]string { + url := setting.RecommentRepoAddr + fileName + result, err := RecommendContentFromPromote(url) + remap := make([]map[string]string, 0) + if err == nil { + json.Unmarshal([]byte(result), &remap) + } + return remap +} + +func GetRecommendRepos() []map[string]interface{} { + v, success := repoSquareCache.Get(RECOMMEND_CACHE) + if success { + log.Debug("GetRecommendRepos from cache,value = %v", v) + if v == nil { + return nil + } + r := v.([]map[string]interface{}) + return r + } + repoMap := getMapContent("home/projects") + r, _ := GetRecommendRepoFromPromote(repoMap) + repoSquareCache.Set(RECOMMEND_CACHE, r, 1*time.Minute) + return r +} + func GetPreferredRepos() ([]*models.Repository4Card, error) { + v, success := repoSquareCache.Get(RREFERED_CACHE) + if success { + log.Debug("GetPreferredRepos from cache,value = %v", v) + if v == nil { + return nil, nil + } + r := v.([]*models.Repository4Card) + return r, nil + } + repos, err := models.GetSelectedRepos(models.FindSelectedReposOpts{ ListOptions: models.ListOptions{ PageSize: 10, @@ -21,6 +99,8 @@ func GetPreferredRepos() ([]*models.Repository4Card, error) { for i, r := range repos { result[i] = r.ToCardFormat() } + + repoSquareCache.Set(RREFERED_CACHE, result, 1*time.Minute) return result, nil } @@ -51,7 +131,7 @@ func GetHotPaperRepos() ([]*models.Repository4Card, error) { }, OrderBy: models.SearchOrderByLastMonthVisitsReverse + "," + models.SearchOrderByRecentUpdated, TopicOnly: true, - TopicName: "openi-paper", + TopicName: setting.PaperRepoTopicName, AllPublic: true, }) if err != nil {