@@ -10,11 +10,15 @@ type RecommendOrg struct { | |||||
Order int64 `xorm:"INDEX NOT NULL unique"` | Order int64 `xorm:"INDEX NOT NULL unique"` | ||||
OrgID int64 `xorm:"INDEX NOT NULL unique"` | OrgID int64 `xorm:"INDEX NOT NULL unique"` | ||||
CreatedUnix timeutil.TimeStamp `xorm:"created"` | CreatedUnix timeutil.TimeStamp `xorm:"created"` | ||||
} | |||||
Org *User `xorm:"-"` | |||||
type RecommendOrgInfo struct { | |||||
RecommendOrg `xorm:"extends"` | |||||
User `xorm:"extends"` | |||||
} | } | ||||
type RecommendOrgList []*RecommendOrg | type RecommendOrgList []*RecommendOrg | ||||
type RecommendOrgInfoList []*RecommendOrgInfo | |||||
func getRecommendOrgs(e Engine) (RecommendOrgList, error) { | func getRecommendOrgs(e Engine) (RecommendOrgList, error) { | ||||
orgs := make(RecommendOrgList, 0, 10) | orgs := make(RecommendOrgList, 0, 10) | ||||
@@ -27,6 +31,19 @@ func GetRecommendOrgs() (RecommendOrgList, error) { | |||||
return getRecommendOrgs(x) | return getRecommendOrgs(x) | ||||
} | } | ||||
func getRecommendOrgInfos(e Engine) (RecommendOrgInfoList, error) { | |||||
orgs := make(RecommendOrgInfoList, 0, 10) | |||||
if err := e.Table(&RecommendOrg{}).Join("INNER", "`user`", "`user`.id = `recommend_org`.org_id"). | |||||
OrderBy("recommend_org.order").Find(&orgs); err != nil { | |||||
return orgs, err | |||||
} | |||||
return orgs, nil | |||||
} | |||||
func GetRecommendOrgInfos() (RecommendOrgInfoList, error) { | |||||
return getRecommendOrgInfos(x) | |||||
} | |||||
func delRecommendOrgs(e Engine) error { | func delRecommendOrgs(e Engine) error { | ||||
sql := "delete from recommend_org" | sql := "delete from recommend_org" | ||||
_, err := e.Exec(sql) | _, err := e.Exec(sql) | ||||
@@ -1412,6 +1412,15 @@ func GetRepositoriesByForkID(forkID int64) ([]*Repository, error) { | |||||
return getRepositoriesByForkID(x, forkID) | return getRepositoriesByForkID(x, forkID) | ||||
} | } | ||||
func getALLRepositories(e Engine) ([]*Repository, error) { | |||||
repos := make([]*Repository, 0, 1000) | |||||
return repos, e.Find(&repos) | |||||
} | |||||
func GetAllRepositories() ([]*Repository, error) { | |||||
return getALLRepositories(x) | |||||
} | |||||
func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err error) { | func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err error) { | ||||
repo.LowerName = strings.ToLower(repo.Name) | repo.LowerName = strings.ToLower(repo.Name) | ||||
@@ -2414,6 +2423,7 @@ func updateRepositoryCols(e Engine, repo *Repository, cols ...string) error { | |||||
} | } | ||||
// UpdateRepositoryCols updates repository's columns | // UpdateRepositoryCols updates repository's columns | ||||
// Notice: it will update the updated_unix automatically, be careful to use this | |||||
func UpdateRepositoryCols(repo *Repository, cols ...string) error { | func UpdateRepositoryCols(repo *Repository, cols ...string) error { | ||||
return updateRepositoryCols(x, repo, cols...) | return updateRepositoryCols(x, repo, cols...) | ||||
} | } | ||||
@@ -2443,3 +2453,11 @@ func (repo *Repository) IncreaseCloneCnt() { | |||||
return | return | ||||
} | } | ||||
func UpdateRepositoryCommitNum(repo *Repository) error { | |||||
if _,err := x.Exec("UPDATE `repository` SET num_commit = ? where id = ?", repo.NumCommit, repo.ID); err != nil { | |||||
return err | |||||
} | |||||
return nil | |||||
} |
@@ -7,6 +7,7 @@ package routers | |||||
import ( | import ( | ||||
"bytes" | "bytes" | ||||
"net/http" | |||||
"strings" | "strings" | ||||
"code.gitea.io/gitea/models" | "code.gitea.io/gitea/models" | ||||
@@ -146,6 +147,7 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { | |||||
orderBy = models.SearchOrderByRecentUpdated | orderBy = models.SearchOrderByRecentUpdated | ||||
} | } | ||||
//todo:support other topics | |||||
keyword := strings.Trim(ctx.Query("q"), " ") | keyword := strings.Trim(ctx.Query("q"), " ") | ||||
topicOnly := ctx.QueryBool("topic") | topicOnly := ctx.QueryBool("topic") | ||||
ctx.Data["TopicOnly"] = topicOnly | ctx.Data["TopicOnly"] = topicOnly | ||||
@@ -179,7 +181,15 @@ func RenderRepoSearch(ctx *context.Context, opts *RepoSearchOptions) { | |||||
pager.AddParam(ctx, "topic", "TopicOnly") | pager.AddParam(ctx, "topic", "TopicOnly") | ||||
ctx.Data["Page"] = pager | ctx.Data["Page"] = pager | ||||
ctx.HTML(200, opts.TplName) | |||||
recommendOrgs, err := models.GetRecommendOrgInfos() | |||||
if err != nil { | |||||
log.Error("GetRecommendOrgInfos failed:%v", err.Error(), ctx.Data["MsgID"]) | |||||
ctx.ServerError("GetRecommendOrgInfos", err) | |||||
return | |||||
} | |||||
ctx.Data["RecommendOrgs"] = recommendOrgs | |||||
ctx.HTML(http.StatusOK, opts.TplName) | |||||
} | } | ||||
// ExploreRepos render explore repositories page | // ExploreRepos render explore repositories page | ||||
@@ -0,0 +1,37 @@ | |||||
// Copyright 2020 The Gitea Authors. All rights reserved. | |||||
// Use of this source code is governed by a MIT-style | |||||
// license that can be found in the LICENSE file. | |||||
package private | |||||
import ( | |||||
"gitea.com/macaron/macaron" | |||||
"net/http" | |||||
"code.gitea.io/gitea/models" | |||||
"code.gitea.io/gitea/modules/log" | |||||
) | |||||
func UpdateAllRepoCommitCnt(ctx *macaron.Context) { | |||||
repos, err := models.GetAllRepositories() | |||||
if err != nil { | |||||
log.Error("GetAllRepositories failed:%v", err.Error(), ctx.Data["MsgID"]) | |||||
ctx.JSON(http.StatusInternalServerError, map[string]string{ | |||||
"error_msg": "GetAllRepositories failed", | |||||
}) | |||||
return | |||||
} | |||||
for i, repo := range repos { | |||||
log.Info("%d:begin updateRepoCommitCnt(id = %d, name = %s)", i, repo.ID, repo.Name) | |||||
if err = updateRepoCommitCnt(ctx, repo); err != nil { | |||||
log.Error("updateRepoCommitCnt(id = %d, name = %s) failed:%v", repo.ID, repo.Name, err.Error(), ctx.Data["MsgID"]) | |||||
continue | |||||
} | |||||
log.Info("%d:finish updateRepoCommitCnt(id = %d, name = %s)", i, repo.ID, repo.Name) | |||||
} | |||||
ctx.JSON(http.StatusOK, map[string]string{ | |||||
"error_msg": "", | |||||
}) | |||||
} |
@@ -546,8 +546,8 @@ func updateRepoCommitCnt(ctx *macaron.Context, repo *models.Repository) error { | |||||
} | } | ||||
repo.NumCommit = count | repo.NumCommit = count | ||||
if err = models.UpdateRepositoryCols(repo, "num_commit"); err != nil { | |||||
log.Error("UpdateRepositoryCols failed:%v", err.Error(), ctx.Data["MsgID"]) | |||||
if err = models.UpdateRepositoryCommitNum(repo); err != nil { | |||||
log.Error("UpdateRepositoryCommitNum failed:%v", err.Error(), ctx.Data["MsgID"]) | |||||
return err | return err | ||||
} | } | ||||
@@ -42,6 +42,7 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
m.Post("/manager/shutdown", Shutdown) | m.Post("/manager/shutdown", Shutdown) | ||||
m.Post("/manager/restart", Restart) | m.Post("/manager/restart", Restart) | ||||
m.Post("/manager/flush-queues", bind(private.FlushOptions{}), FlushQueues) | m.Post("/manager/flush-queues", bind(private.FlushOptions{}), FlushQueues) | ||||
m.Post("/cmd/update_all_repo_commit_cnt", UpdateAllRepoCommitCnt) | |||||
}, CheckInternalToken) | }, CheckInternalToken) | ||||
} | } |
@@ -39,13 +39,13 @@ | |||||
</style> | </style> | ||||
<div class="ui secondary pointing tabular top attached borderless menu navbar"> | <div class="ui secondary pointing tabular top attached borderless menu navbar"> | ||||
<a class="active item" href="https://git.openi.org.cn/explore/repos?sort=moststars&q=&tab="> | |||||
<a class="active item" href="{{$.Link}}?sort=hot&q=&tab="> | |||||
<svg class="svg octicon-repo" width="16" height="16" aria-hidden="true"> | <svg class="svg octicon-repo" width="16" height="16" aria-hidden="true"> | ||||
<use xlink:href="#octicon-repo" /> | <use xlink:href="#octicon-repo" /> | ||||
</svg> | </svg> | ||||
热门{{.i18n.Tr "explore.repos"}} | 热门{{.i18n.Tr "explore.repos"}} | ||||
</a> | </a> | ||||
<a class=" item" href="https://git.openi.org.cn/explore/repos?sort=mostforks&q=&tab="> | |||||
<a class=" item" href="{{$.Link}}?sort=active&q=&tab="> | |||||
<svg class="svg octicon-inbox" width="16" height="16" aria-hidden="true"> | <svg class="svg octicon-inbox" width="16" height="16" aria-hidden="true"> | ||||
<use xlink:href="#octicon-inbox" /> | <use xlink:href="#octicon-inbox" /> | ||||
</svg> | </svg> | ||||
@@ -31,10 +31,19 @@ | |||||
<!-- Swiper --> | <!-- Swiper --> | ||||
<div class="ui container swiper-container"> | <div class="ui container swiper-container"> | ||||
<div class="swiper-wrapper"> | <div class="swiper-wrapper"> | ||||
<!--{{range .RecommendOrgs}} | |||||
<div class="swiper-slide"> | |||||
<div class="ui card"> | |||||
<a class="image" href="{{$.HomeLink}}/{{.User.Name}}"> | |||||
<img class="ui avatar image" src="{{.User.RelAvatarLink}}" alt="{{.User.Name}}" title="{{.User.Name}}"> | |||||
</a> | |||||
</div> | |||||
</div> | |||||
{{end}}--> | |||||
<div class="swiper-slide"> | <div class="swiper-slide"> | ||||
<div class="ui card"> | <div class="ui card"> | ||||
<a class="image" href="https://git.openi.org.cn/OpenI"> | |||||
<img src="/img/org-openi@2x-80.jpg" alt="OpenI" title="OpenI"> | |||||
<a class="image" href="https://git.openi.org.cn/user/avatar/OpenI"> | |||||
<img src="/img/org-openi@2x-80.jpg" alt="OpenI 启智社区" title="OpenI 启智社区"> | |||||
</a> | </a> | ||||
</div> | </div> | ||||
</div> | </div> | ||||