Reviewed-on: https://git.openi.org.cn/OpenI/aiforge/pulls/1830 Reviewed-by: zhoupzh <zhoupzh@pcl.ac.cn>tags/v1.22.4.1^2
| @@ -1,4 +1,17 @@ | |||||
| DELETE FROM public.dataset_es; | |||||
| DROP FOREIGN TABLE public.dataset_es; | DROP FOREIGN TABLE public.dataset_es; | ||||
| DROP TRIGGER IF EXISTS es_insert_dataset on public.dataset; | |||||
| DROP FUNCTION public.insert_dataset_data(); | |||||
| DROP TRIGGER IF EXISTS es_udpate_dataset_file_name on public.attachment; | |||||
| DROP FUNCTION public.udpate_dataset_file_name; | |||||
| DROP TRIGGER IF EXISTS es_update_dataset on public.dataset; | |||||
| DROP FUNCTION public.update_dataset; | |||||
| DROP TRIGGER IF EXISTS es_delete_dataset on public.dataset; | |||||
| DROP FUNCTION public.delete_dataset; | |||||
| CREATE FOREIGN TABLE public.dataset_es | CREATE FOREIGN TABLE public.dataset_es | ||||
| ( | ( | ||||
| id bigint NOT NULL, | id bigint NOT NULL, | ||||
| @@ -1,4 +1,15 @@ | |||||
| delete from public.issue_es; | |||||
| DROP FOREIGN TABLE public.issue_es; | DROP FOREIGN TABLE public.issue_es; | ||||
| DROP TRIGGER IF EXISTS es_insert_issue on public.issue; | |||||
| DROP FUNCTION public.insert_issue_data; | |||||
| DROP TRIGGER IF EXISTS es_udpate_issue_comment on public.comment; | |||||
| DROP FUNCTION udpate_issue_comment; | |||||
| DROP TRIGGER IF EXISTS es_update_issue on public.issue; | |||||
| DROP FUNCTION public.update_issue; | |||||
| DROP TRIGGER IF EXISTS es_delete_issue on public.issue; | |||||
| DROP FUNCTION public.delete_issue; | |||||
| CREATE FOREIGN TABLE public.issue_es | CREATE FOREIGN TABLE public.issue_es | ||||
| ( | ( | ||||
| id bigint NOT NULL, | id bigint NOT NULL, | ||||
| @@ -1,5 +1,18 @@ | |||||
| -- 要处理项目从私有变为公有,并且从公有变成私有的情况 | -- 要处理项目从私有变为公有,并且从公有变成私有的情况 | ||||
| DELETE FROM public.repository_es; | |||||
| DROP FOREIGN table if exists public.repository_es; | DROP FOREIGN table if exists public.repository_es; | ||||
| DROP TRIGGER IF EXISTS es_insert_repository on public.repository; | |||||
| DROP FUNCTION public.insert_repository_data; | |||||
| DROP TRIGGER IF EXISTS es_update_repository on public.repository; | |||||
| DROP FUNCTION public.update_repository; | |||||
| DROP TRIGGER IF EXISTS es_delete_repository on public.repository; | |||||
| DROP FUNCTION public.delete_repository; | |||||
| DROP TRIGGER IF EXISTS es_udpate_repository_lang on public.language_stat; | |||||
| DROP FUNCTION public.udpate_repository_lang; | |||||
| CREATE FOREIGN TABLE public.repository_es ( | CREATE FOREIGN TABLE public.repository_es ( | ||||
| id bigint NOT NULL, | id bigint NOT NULL, | ||||
| owner_id bigint, | owner_id bigint, | ||||
| @@ -1,4 +1,13 @@ | |||||
| DELETE FROM public.user_es; | |||||
| DROP FOREIGN table if exists public.user_es; | DROP FOREIGN table if exists public.user_es; | ||||
| DROP TRIGGER IF EXISTS es_insert_user on public.user; | |||||
| DROP FUNCTION public.insert_user_data; | |||||
| DROP TRIGGER IF EXISTS es_update_user on public.user; | |||||
| DROP FUNCTION public.update_user; | |||||
| DROP TRIGGER IF EXISTS es_delete_user on public.user; | |||||
| DROP FUNCTION public.delete_user; | |||||
| CREATE FOREIGN TABLE public.user_es | CREATE FOREIGN TABLE public.user_es | ||||
| ( | ( | ||||
| id bigint NOT NULL , | id bigint NOT NULL , | ||||
| @@ -138,6 +138,7 @@ func init() { | |||||
| new(OfficialTag), | new(OfficialTag), | ||||
| new(OfficialTagRepos), | new(OfficialTagRepos), | ||||
| new(WechatBindLog), | new(WechatBindLog), | ||||
| new(OrgStatistic), | |||||
| new(SearchRecord), | new(SearchRecord), | ||||
| ) | ) | ||||
| @@ -8,6 +8,7 @@ package models | |||||
| import ( | import ( | ||||
| "fmt" | "fmt" | ||||
| "os" | "os" | ||||
| "strconv" | |||||
| "strings" | "strings" | ||||
| "code.gitea.io/gitea/modules/log" | "code.gitea.io/gitea/modules/log" | ||||
| @@ -19,6 +20,17 @@ import ( | |||||
| "xorm.io/xorm" | "xorm.io/xorm" | ||||
| ) | ) | ||||
| type OrgStatistic struct { | |||||
| ID int64 `xorm:"pk autoincr"` | |||||
| OrgID int64 `xorm:"UNIQUE"` | |||||
| NumScore int `xorm:"INDEX NOT NULL DEFAULT 0"` | |||||
| } | |||||
| type OrgScore struct { | |||||
| *User | |||||
| Score string | |||||
| } | |||||
| // IsOwnedBy returns true if given user is in the owner team. | // IsOwnedBy returns true if given user is in the owner team. | ||||
| func (org *User) IsOwnedBy(uid int64) (bool, error) { | func (org *User) IsOwnedBy(uid int64) (bool, error) { | ||||
| return IsOrganizationOwner(org.ID, uid) | return IsOrganizationOwner(org.ID, uid) | ||||
| @@ -135,6 +147,93 @@ func (org *User) RemoveOrgRepo(repoID int64) error { | |||||
| return org.removeOrgRepo(x, repoID) | return org.removeOrgRepo(x, repoID) | ||||
| } | } | ||||
| func UpdateOrgStatistics() { | |||||
| ids, err := GetOrganizationsId() | |||||
| if err != nil { | |||||
| return | |||||
| } | |||||
| for _, id := range ids { | |||||
| org := User{ID: id} | |||||
| orgStat := &OrgStatistic{OrgID: id} | |||||
| numScore, err := org.getOrgStatistics() | |||||
| if err == nil { | |||||
| has, _ := x.Get(orgStat) | |||||
| orgStat.NumScore = numScore | |||||
| if has { | |||||
| x.ID(orgStat.ID).Cols("num_score").Update(&orgStat) | |||||
| } else { | |||||
| x.Insert(orgStat) | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| func (org *User) getOrgStatistics() (int, error) { | |||||
| count, err := getRepositoryCount(x, org) | |||||
| if err != nil { | |||||
| return 0, err | |||||
| } | |||||
| err = org.GetRepositories(ListOptions{int(count), 1}) | |||||
| if err != nil { | |||||
| return 0, err | |||||
| } | |||||
| var numScore = 0 | |||||
| for _, repo := range org.Repos { | |||||
| numScore += int(getOpenIByRepoId(repo.ID)) | |||||
| } | |||||
| return numScore, nil | |||||
| } | |||||
| func FindTopNStarsOrgs(n int) ([]*OrgScore, error) { | |||||
| sql := "select a.id,sum(b.num_stars) score from \"user\" a ,repository b where a.id=b.owner_id and a.type=1 group by a.id order by score desc limit " + strconv.Itoa(n) | |||||
| return findTopNOrgs(sql) | |||||
| } | |||||
| func FindTopNMembersOrgs(n int) ([]*OrgScore, error) { | |||||
| sql := "select id, count(user_id) score from" + | |||||
| " (select org_id as id, uid as user_id from org_user " + | |||||
| "union select a.id,b.user_id from \"user\" a,collaboration b,repository c " + | |||||
| "where a.type=1 and a.id=c.owner_id and b.repo_id=c.id) d " + | |||||
| "group by id order by score desc limit " + strconv.Itoa(n) | |||||
| return findTopNOrgs(sql) | |||||
| } | |||||
| func FindTopNOpenIOrgs(n int) ([]*OrgScore, error) { | |||||
| sql := "select org_id id,num_score score from org_statistic order by num_score desc limit 10" + strconv.Itoa(n) | |||||
| return findTopNOrgs(sql) | |||||
| } | |||||
| func findTopNOrgs(sql string) ([]*OrgScore, error) { | |||||
| resutls, err := x.QueryString(sql) | |||||
| if err != nil { | |||||
| return nil, err | |||||
| } | |||||
| var orgScore []*OrgScore | |||||
| for _, record := range resutls { | |||||
| id, _ := strconv.ParseInt(record["id"], 10, 64) | |||||
| user, err := getUserByID(x, id) | |||||
| if err != nil { | |||||
| continue | |||||
| } | |||||
| orgScore = append(orgScore, &OrgScore{user, record["score"]}) | |||||
| } | |||||
| return orgScore, nil | |||||
| } | |||||
| // CreateOrganization creates record of a new organization. | // CreateOrganization creates record of a new organization. | ||||
| func CreateOrganization(org, owner *User) (err error) { | func CreateOrganization(org, owner *User) (err error) { | ||||
| if !owner.CanCreateOrganization() { | if !owner.CanCreateOrganization() { | ||||
| @@ -73,6 +73,16 @@ func (repo *RepoStatistic) DisplayName() string { | |||||
| return repo.Alias | return repo.Alias | ||||
| } | } | ||||
| func getOpenIByRepoId(repoId int64) float64 { | |||||
| repoStatistic := new(RepoStatistic) | |||||
| has, err := xStatistic.Cols("radar_total").Where("repo_id=?", repoId).Desc("id").Limit(1).Get(repoStatistic) | |||||
| if !has || err != nil { | |||||
| return 0 | |||||
| } | |||||
| return repoStatistic.RadarTotal | |||||
| } | |||||
| func DeleteRepoStatDaily(date string) error { | func DeleteRepoStatDaily(date string) error { | ||||
| sess := xStatistic.NewSession() | sess := xStatistic.NewSession() | ||||
| defer sess.Close() | defer sess.Close() | ||||
| @@ -2104,6 +2104,12 @@ func GetOrganizationsCount() (int64, error) { | |||||
| } | } | ||||
| func GetOrganizationsId() ([]int64, error) { | |||||
| var ids []int64 | |||||
| err := x.Table("user").Where("type=1").Cols("id").Find(&ids) | |||||
| return ids, err | |||||
| } | |||||
| func GetBlockChainUnSuccessUsers() ([]*User, error) { | func GetBlockChainUnSuccessUsers() ([]*User, error) { | ||||
| users := make([]*User, 0, 10) | users := make([]*User, 0, 10) | ||||
| err := x.Where("public_key = ''"). | err := x.Where("public_key = ''"). | ||||
| @@ -185,6 +185,17 @@ func registerHandleSummaryStatistic() { | |||||
| }) | }) | ||||
| } | } | ||||
| func registerHandleOrgStatistic() { | |||||
| RegisterTaskFatal("handle_org_statistic", &BaseConfig{ | |||||
| Enabled: true, | |||||
| RunAtStart: false, | |||||
| Schedule: "0 0 2 * * ?", | |||||
| }, func(ctx context.Context, _ *models.User, _ Config) error { | |||||
| models.UpdateOrgStatistics() | |||||
| return nil | |||||
| }) | |||||
| } | |||||
| func registerSyncCloudbrainStatus() { | func registerSyncCloudbrainStatus() { | ||||
| RegisterTaskFatal("sync_cloudbrain_status", &BaseConfig{ | RegisterTaskFatal("sync_cloudbrain_status", &BaseConfig{ | ||||
| Enabled: true, | Enabled: true, | ||||
| @@ -215,4 +226,5 @@ func initBasicTasks() { | |||||
| registerHandleSummaryStatistic() | registerHandleSummaryStatistic() | ||||
| registerSyncCloudbrainStatus() | registerSyncCloudbrainStatus() | ||||
| registerHandleOrgStatistic() | |||||
| } | } | ||||
| @@ -2198,6 +2198,16 @@ customize = Customize | |||||
| selected_project=Selected Projects | selected_project=Selected Projects | ||||
| fold = Fold | fold = Fold | ||||
| unfold = Unfold | unfold = Unfold | ||||
| org_member = Member | |||||
| org_members = Members | |||||
| org_team = Team | |||||
| org_teams = Teams | |||||
| org_repository = Repository | |||||
| org_repositories = Repositories | |||||
| star = Star Top10 | |||||
| member = Members Top10 | |||||
| active = Active Top10 | |||||
| form.name_reserved = The organization name '%s' is reserved. | form.name_reserved = The organization name '%s' is reserved. | ||||
| form.name_pattern_not_allowed = The pattern '%s' is not allowed in an organization name. | form.name_pattern_not_allowed = The pattern '%s' is not allowed in an organization name. | ||||
| @@ -2203,6 +2203,16 @@ customize = 自定义 | |||||
| selected_project=精选项目 | selected_project=精选项目 | ||||
| fold = 收起 | fold = 收起 | ||||
| unfold = 展开 | unfold = 展开 | ||||
| org_member = 成员 | |||||
| org_members = 成员 | |||||
| org_team = 团队 | |||||
| org_teams = 团队 | |||||
| org_repository = 项目 | |||||
| org_repositories = 项目 | |||||
| star = 点赞榜 | |||||
| member = 成员榜 | |||||
| active = 活跃榜 | |||||
| form.name_reserved=组织名称 '%s' 是被保留的。 | form.name_reserved=组织名称 '%s' 是被保留的。 | ||||
| form.name_pattern_not_allowed=组织名称中不允许使用 "%s"。 | form.name_pattern_not_allowed=组织名称中不允许使用 "%s"。 | ||||
| @@ -108,8 +108,9 @@ function searchItem(type,sortType){ | |||||
| currentSearchSortBy = sortBy[sortType]; | currentSearchSortBy = sortBy[sortType]; | ||||
| currentSearchAscending = sortAscending[sortType]; | currentSearchAscending = sortAscending[sortType]; | ||||
| OnlySearchLabel =false; | OnlySearchLabel =false; | ||||
| page(currentPage); | page(currentPage); | ||||
| }else{ | |||||
| emptySearch(); | |||||
| } | } | ||||
| } | } | ||||
| @@ -121,49 +122,31 @@ function search(){ | |||||
| if(!isEmpty(currentSearchKeyword)){ | if(!isEmpty(currentSearchKeyword)){ | ||||
| currentSearchKeyword = currentSearchKeyword.trim(); | currentSearchKeyword = currentSearchKeyword.trim(); | ||||
| } | } | ||||
| $('#searchForm').addClass("hiddenSearch"); | |||||
| initPageInfo(); | |||||
| if(!isEmpty(currentSearchKeyword)){ | if(!isEmpty(currentSearchKeyword)){ | ||||
| document.getElementById("find_id").innerHTML=getLabel(isZh,"search_finded"); | |||||
| currentSearchSortBy = sortBy[10]; | |||||
| currentSearchAscending = "false"; | |||||
| OnlySearchLabel =false; | |||||
| page(currentPage); | |||||
| if(currentSearchTableName != "repository"){ | |||||
| doSearch("repository",currentSearchKeyword,1,pageSize,true,"",false); | |||||
| } | |||||
| if(currentSearchTableName != "issue"){ | |||||
| doSearch("issue",currentSearchKeyword,1,pageSize,true,"",false); | |||||
| } | |||||
| if(currentSearchTableName != "user"){ | |||||
| doSearch("user",currentSearchKeyword,1,pageSize,true,"",false); | |||||
| } | |||||
| if(currentSearchTableName != "org"){ | |||||
| doSearch("org",currentSearchKeyword,1,pageSize,true,"",false); | |||||
| } | |||||
| if(currentSearchTableName != "dataset"){ | |||||
| doSearch("dataset",currentSearchKeyword,1,pageSize,true,"",false); | |||||
| } | |||||
| if(currentSearchTableName != "pr"){ | |||||
| doSearch("pr",currentSearchKeyword,1,pageSize,true,"",false); | |||||
| } | |||||
| doSpcifySearch(currentSearchTableName,currentSearchKeyword,sortBy[10],"false"); | |||||
| }else{ | }else{ | ||||
| initDiv(false); | |||||
| document.getElementById("find_id").innerHTML=getLabel(isZh,"search_empty"); | |||||
| $('#find_title').html(""); | |||||
| document.getElementById("sort_type").innerHTML=""; | |||||
| document.getElementById("child_search_item").innerHTML=""; | |||||
| document.getElementById("page_menu").innerHTML=""; | |||||
| $('#repo_total').text(""); | |||||
| $('#pr_total').text(""); | |||||
| $('#issue_total').text(""); | |||||
| $('#dataset_total').text(""); | |||||
| $('#user_total').text(""); | |||||
| $('#org_total').text(""); | |||||
| setActivate(null); | |||||
| emptySearch(); | |||||
| } | } | ||||
| } | } | ||||
| function emptySearch(){ | |||||
| initDiv(false); | |||||
| initPageInfo(); | |||||
| $('#searchForm').addClass("hiddenSearch"); | |||||
| document.getElementById("find_id").innerHTML=getLabel(isZh,"search_empty"); | |||||
| $('#find_title').html(""); | |||||
| document.getElementById("sort_type").innerHTML=""; | |||||
| document.getElementById("child_search_item").innerHTML=""; | |||||
| document.getElementById("page_menu").innerHTML=""; | |||||
| $('#repo_total').text(""); | |||||
| $('#pr_total').text(""); | |||||
| $('#issue_total').text(""); | |||||
| $('#dataset_total').text(""); | |||||
| $('#user_total').text(""); | |||||
| $('#org_total').text(""); | |||||
| setActivate(null); | |||||
| } | |||||
| function initDiv(isSearchLabel=false){ | function initDiv(isSearchLabel=false){ | ||||
| if(isSearchLabel){ | if(isSearchLabel){ | ||||
| document.getElementById("search_div").style.display="none"; | document.getElementById("search_div").style.display="none"; | ||||
| @@ -174,7 +157,6 @@ function initDiv(isSearchLabel=false){ | |||||
| document.getElementById("user_item").style.display="none"; | document.getElementById("user_item").style.display="none"; | ||||
| document.getElementById("org_item").style.display="none"; | document.getElementById("org_item").style.display="none"; | ||||
| document.getElementById("find_id").innerHTML=""; | document.getElementById("find_id").innerHTML=""; | ||||
| }else{ | }else{ | ||||
| document.getElementById("search_div").style.display="block"; | document.getElementById("search_div").style.display="block"; | ||||
| document.getElementById("search_label_div").style.display="none"; | document.getElementById("search_label_div").style.display="none"; | ||||
| @@ -187,6 +169,39 @@ function initDiv(isSearchLabel=false){ | |||||
| } | } | ||||
| } | } | ||||
| function doSpcifySearch(tableName,keyword,sortBy="",ascending="false"){ | |||||
| initDiv(false); | |||||
| $('#searchForm').addClass("hiddenSearch"); | |||||
| document.getElementById("find_id").innerHTML=getLabel(isZh,"search_finded"); | |||||
| currentSearchKeyword = keyword; | |||||
| initPageInfo(); | |||||
| currentSearchTableName = tableName; | |||||
| currentSearchSortBy = sortBy; | |||||
| currentSearchAscending = ascending; | |||||
| OnlySearchLabel =false; | |||||
| page(currentPage); | |||||
| if(currentSearchTableName != "repository"){ | |||||
| doSearch("repository",currentSearchKeyword,1,pageSize,true,"",false); | |||||
| } | |||||
| if(currentSearchTableName != "issue"){ | |||||
| doSearch("issue",currentSearchKeyword,1,pageSize,true,"",false); | |||||
| } | |||||
| if(currentSearchTableName != "user"){ | |||||
| doSearch("user",currentSearchKeyword,1,pageSize,true,"",false); | |||||
| } | |||||
| if(currentSearchTableName != "org"){ | |||||
| doSearch("org",currentSearchKeyword,1,pageSize,true,"",false); | |||||
| } | |||||
| if(currentSearchTableName != "dataset"){ | |||||
| doSearch("dataset",currentSearchKeyword,1,pageSize,true,"",false); | |||||
| } | |||||
| if(currentSearchTableName != "pr"){ | |||||
| doSearch("pr",currentSearchKeyword,1,pageSize,true,"",false); | |||||
| } | |||||
| } | |||||
| function doSearchLabel(tableName,keyword,sortBy="",ascending="false"){ | function doSearchLabel(tableName,keyword,sortBy="",ascending="false"){ | ||||
| initDiv(true); | initDiv(true); | ||||
| //document.getElementById("search_div").style.display="none"; | //document.getElementById("search_div").style.display="none"; | ||||
| @@ -1272,8 +1287,17 @@ var zhCN={ | |||||
| sessionStorage.removeItem("searchLabel"); | sessionStorage.removeItem("searchLabel"); | ||||
| doSearchLabel(sessionStorage.getItem("tableName"),sessionStorage.getItem("keyword"),sessionStorage.getItem("sortBy"),sessionStorage.getItem("ascending")); | doSearchLabel(sessionStorage.getItem("tableName"),sessionStorage.getItem("keyword"),sessionStorage.getItem("sortBy"),sessionStorage.getItem("ascending")); | ||||
| }else{ | }else{ | ||||
| console.log("normal search...."); | |||||
| search(); | |||||
| var specifySearch = sessionStorage.getItem("specifySearch"); | |||||
| if(specifySearch){ | |||||
| sessionStorage.removeItem("specifySearch"); | |||||
| console.log("search sepcial keyword=...." + sessionStorage.getItem("keyword")); | |||||
| document.getElementById("keyword_input").value = sessionStorage.getItem("keyword"); | |||||
| doSpcifySearch(sessionStorage.getItem("tableName"),sessionStorage.getItem("keyword"),sessionStorage.getItem("sortBy"),sessionStorage.getItem("ascending")); | |||||
| }else{ | |||||
| console.log("normal search...."); | |||||
| search(); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -49,7 +49,7 @@ func Home(ctx *context.Context) { | |||||
| ctx.HTML(200, tplHome) | ctx.HTML(200, tplHome) | ||||
| } | } | ||||
| func setRecommendURL(ctx *context.Context) { | |||||
| func setRecommendURLOnly(ctx *context.Context) { | |||||
| addr := setting.RecommentRepoAddr[10:] | addr := setting.RecommentRepoAddr[10:] | ||||
| start := strings.Index(addr, "/") | start := strings.Index(addr, "/") | ||||
| end := strings.Index(addr, "raw") | end := strings.Index(addr, "raw") | ||||
| @@ -58,7 +58,10 @@ func setRecommendURL(ctx *context.Context) { | |||||
| } else { | } else { | ||||
| ctx.Data["RecommendURL"] = setting.RecommentRepoAddr | ctx.Data["RecommendURL"] = setting.RecommentRepoAddr | ||||
| } | } | ||||
| } | |||||
| func setRecommendURL(ctx *context.Context) { | |||||
| setRecommendURLOnly(ctx) | |||||
| ctx.Data["page_title"] = ctx.Tr("home.page_title") | ctx.Data["page_title"] = ctx.Tr("home.page_title") | ||||
| ctx.Data["page_small_title"] = ctx.Tr("home.page_small_title") | ctx.Data["page_small_title"] = ctx.Tr("home.page_small_title") | ||||
| ctx.Data["page_description"] = ctx.Tr("home.page_description") | ctx.Data["page_description"] = ctx.Tr("home.page_description") | ||||
| @@ -441,17 +444,39 @@ func ExploreOrganizations(ctx *context.Context) { | |||||
| ctx.Data["PageIsExploreOrganizations"] = true | ctx.Data["PageIsExploreOrganizations"] = true | ||||
| ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled | ctx.Data["IsRepoIndexerEnabled"] = setting.Indexer.RepoIndexerEnabled | ||||
| visibleTypes := []structs.VisibleType{structs.VisibleTypePublic} | |||||
| if ctx.User != nil { | |||||
| visibleTypes = append(visibleTypes, structs.VisibleTypeLimited, structs.VisibleTypePrivate) | |||||
| N := 10 | |||||
| starInfo, err := models.FindTopNStarsOrgs(N) | |||||
| if err != nil { | |||||
| log.Error("GetStarOrgInfos failed:%v", err.Error(), ctx.Data["MsgID"]) | |||||
| ctx.ServerError("GetStarOrgInfos", err) | |||||
| return | |||||
| } | |||||
| memberInfo, err := models.FindTopNMembersOrgs(N) | |||||
| if err != nil { | |||||
| log.Error("GetMemberOrgInfos failed:%v", err.Error(), ctx.Data["MsgID"]) | |||||
| ctx.ServerError("GetMemberOrgInfos", err) | |||||
| return | |||||
| } | |||||
| openIInfo, err := models.FindTopNOpenIOrgs(N) | |||||
| if err != nil { | |||||
| log.Error("GetOpenIOrgInfos failed:%v", err.Error(), ctx.Data["MsgID"]) | |||||
| ctx.ServerError("GetOpenIOrgInfos", err) | |||||
| return | |||||
| } | } | ||||
| RenderUserSearch(ctx, &models.SearchUserOptions{ | |||||
| Actor: ctx.User, | |||||
| Type: models.UserTypeOrganization, | |||||
| ListOptions: models.ListOptions{PageSize: setting.UI.ExplorePagingNum}, | |||||
| Visible: visibleTypes, | |||||
| }, tplExploreOrganizations) | |||||
| recommendOrgs, err := GetRecommendOrg() | |||||
| if err != nil { | |||||
| log.Error("GetRecommendOrgInfos failed:%v", err.Error(), ctx.Data["MsgID"]) | |||||
| ctx.ServerError("GetRecommendOrgInfos", err) | |||||
| return | |||||
| } | |||||
| setRecommendURLOnly(ctx) | |||||
| ctx.Data["RecommendOrgs"] = recommendOrgs | |||||
| ctx.Data["StarOrgs"] = starInfo | |||||
| ctx.Data["MemberOrgs"] = memberInfo | |||||
| ctx.Data["ActiveOrgs"] = openIInfo | |||||
| ctx.HTML(http.StatusOK, tplExploreOrganizations) | |||||
| } | } | ||||
| // ExploreCode render explore code page | // ExploreCode render explore code page | ||||
| @@ -583,12 +608,12 @@ func NotFound(ctx *context.Context) { | |||||
| ctx.NotFound("home.NotFound", nil) | ctx.NotFound("home.NotFound", nil) | ||||
| } | } | ||||
| func RecommendOrgFromPromote(ctx *context.Context) { | |||||
| func GetRecommendOrg() ([]map[string]interface{}, error) { | |||||
| url := setting.RecommentRepoAddr + "organizations" | url := setting.RecommentRepoAddr + "organizations" | ||||
| result, err := repository.RecommendFromPromote(url) | result, err := repository.RecommendFromPromote(url) | ||||
| if err != nil { | if err != nil { | ||||
| ctx.ServerError("500", err) | |||||
| return | |||||
| return nil, err | |||||
| } | } | ||||
| resultOrg := make([]map[string]interface{}, 0) | resultOrg := make([]map[string]interface{}, 0) | ||||
| for _, userName := range result { | for _, userName := range result { | ||||
| @@ -598,6 +623,7 @@ func RecommendOrgFromPromote(ctx *context.Context) { | |||||
| userMap["Name"] = user.Name | userMap["Name"] = user.Name | ||||
| userMap["Description"] = user.Description | userMap["Description"] = user.Description | ||||
| userMap["FullName"] = user.FullName | userMap["FullName"] = user.FullName | ||||
| userMap["HomeLink"] = user.HomeLink() | |||||
| userMap["ID"] = user.ID | userMap["ID"] = user.ID | ||||
| userMap["Avatar"] = user.RelAvatarLink() | userMap["Avatar"] = user.RelAvatarLink() | ||||
| userMap["NumRepos"] = user.NumRepos | userMap["NumRepos"] = user.NumRepos | ||||
| @@ -608,7 +634,15 @@ func RecommendOrgFromPromote(ctx *context.Context) { | |||||
| log.Info("query user error," + err.Error()) | log.Info("query user error," + err.Error()) | ||||
| } | } | ||||
| } | } | ||||
| return resultOrg, nil | |||||
| } | |||||
| func RecommendOrgFromPromote(ctx *context.Context) { | |||||
| resultOrg, err := GetRecommendOrg() | |||||
| if err != nil { | |||||
| ctx.ServerError("500", err) | |||||
| return | |||||
| } | |||||
| ctx.JSON(200, resultOrg) | ctx.JSON(200, resultOrg) | ||||
| } | } | ||||
| @@ -45,6 +45,8 @@ func RegisterRoutes(m *macaron.Macaron) { | |||||
| m.Post("/manager/flush-queues", bind(private.FlushOptions{}), FlushQueues) | m.Post("/manager/flush-queues", bind(private.FlushOptions{}), FlushQueues) | ||||
| m.Post("/tool/update_all_repo_commit_cnt", UpdateAllRepoCommitCnt) | m.Post("/tool/update_all_repo_commit_cnt", UpdateAllRepoCommitCnt) | ||||
| m.Post("/tool/repo_stat/:date", RepoStatisticManually) | m.Post("/tool/repo_stat/:date", RepoStatisticManually) | ||||
| m.Get("/tool/org_stat", OrgStatisticManually) | |||||
| m.Post("/tool/update_repo_visit/:date", UpdateRepoVisit) | m.Post("/tool/update_repo_visit/:date", UpdateRepoVisit) | ||||
| m.Post("/task/history_handle/duration", repo.HandleTaskWithNoDuration) | m.Post("/task/history_handle/duration", repo.HandleTaskWithNoDuration) | ||||
| @@ -45,6 +45,10 @@ func RepoStatisticManually(ctx *macaron.Context) { | |||||
| repo.TimingCountDataByDate(date) | repo.TimingCountDataByDate(date) | ||||
| } | } | ||||
| func OrgStatisticManually() { | |||||
| models.UpdateOrgStatistics() | |||||
| } | |||||
| func UpdateRepoVisit(ctx *macaron.Context) { | func UpdateRepoVisit(ctx *macaron.Context) { | ||||
| date := ctx.Params("date") | date := ctx.Params("date") | ||||
| log.Info("date(%s)", date) | log.Info("date(%s)", date) | ||||
| @@ -1,68 +1,251 @@ | |||||
| <link rel="stylesheet" href="/swiper/swiper-bundle.min.css"> | |||||
| <link rel="stylesheet" href="/css/git.openi.css"> | |||||
| <script src="/swiper/swiper-bundle.min.js"></script> | |||||
| <script src="/self/js/jquery.min.js" type="text/javascript"></script> | |||||
| {{template "base/head" .}} | {{template "base/head" .}} | ||||
| <div class="explore users"> | <div class="explore users"> | ||||
| {{template "explore/search" .}} | |||||
| <div class="ui container"> | |||||
| <div class="ui grid"> | |||||
| {{template "explore/navbar" .}} | |||||
| <div class="sixteen wide mobile ten wide tablet ten wide computer column"> | |||||
| <h2 class="ui left floated medium header"> | |||||
| {{.i18n.Tr "explore.organizations"}} | |||||
| </h2> | |||||
| <div class="ui right floated secondary filter menu"> | |||||
| <!-- Sort --> | |||||
| <div class="ui right dropdown type jump item"> | |||||
| <span class="text"> | |||||
| {{.i18n.Tr "repo.issues.filter_sort"}} | |||||
| <i class="dropdown icon"></i> | |||||
| </span> | |||||
| <div class="menu"> | |||||
| <a class="{{if eq .SortType "newest"}}active{{end}} item" href="{{$.Link}}?sort=newest&q={{$.Keyword}}&tab={{$.TabName}}">{{.i18n.Tr "repo.issues.filter_sort.latest"}}</a> | |||||
| <a class="{{if eq .SortType "oldest"}}active{{end}} item" href="{{$.Link}}?sort=oldest&q={{$.Keyword}}&tab={{$.TabName}}">{{.i18n.Tr "repo.issues.filter_sort.oldest"}}</a> | |||||
| <a class="{{if eq .SortType "alphabetically"}}active{{end}} item" href="{{$.Link}}?sort=alphabetically&q={{$.Keyword}}&tab={{$.TabName}}">{{.i18n.Tr "repo.issues.label.filter_sort.alphabetically"}}</a> | |||||
| <a class="{{if eq .SortType "reversealphabetically"}}active{{end}} item" href="{{$.Link}}?sort=reversealphabetically&q={{$.Keyword}}&tab={{$.TabName}}">{{.i18n.Tr "repo.issues.label.filter_sort.reverse_alphabetically"}}</a> | |||||
| <a class="{{if eq .SortType "recentupdate"}}active{{end}} item" href="{{$.Link}}?sort=recentupdate&q={{$.Keyword}}&tab={{$.TabName}}">{{.i18n.Tr "repo.issues.filter_sort.recentupdate"}}</a> | |||||
| <a class="{{if eq .SortType "leastupdate"}}active{{end}} item" href="{{$.Link}}?sort=leastupdate&q={{$.Keyword}}&tab={{$.TabName}}">{{.i18n.Tr "repo.issues.filter_sort.leastupdate"}}</a> | |||||
| </div> | |||||
| <!-- {{template "explore/search" .}} --> | |||||
| <div class="repos--seach"> | |||||
| <div class="ui container"> | |||||
| <div class="ui two column centered grid"> | |||||
| <div class="fourteen wide mobile ten wide tablet ten wide computer column ui form ignore-dirty" > | |||||
| <div class="ui fluid action input" id="search_all"> | |||||
| <input id = 'value_s' name="q" value="{{.Keyword}}" placeholder="{{.i18n.Tr "explore.search"}}..." onkeydown="if(event.keyCode==13){all_search();}" autofocus> | |||||
| <input type="hidden" name="tab" value="{{$.TabName}}"> | |||||
| <button class="ui green button" onclick="all_search()">{{.i18n.Tr "explore.search"}}</button> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| <div class="ui clearing divider"></div> | |||||
| <div class="ui user list"> | |||||
| {{range .Users}} | |||||
| <div class="item"> | |||||
| <img class="ui avatar image" src="{{.RelAvatarLink}}"> | |||||
| <div class="content"> | |||||
| <span class="header"> | |||||
| <a href="{{.HomeLink}}">{{.Name}}</a> {{.FullName}} | |||||
| {{if .Visibility.IsPrivate}} | |||||
| <span class="text gold">{{svg "octicon-lock" 16}}</span> | |||||
| {{end}} | |||||
| </span> | |||||
| <div class="description"> | |||||
| {{if .Location}} | |||||
| {{svg "octicon-location" 16}} {{.Location}} | |||||
| {{end}} | |||||
| {{if and .Website}} | |||||
| {{svg "octicon-link" 16}} | |||||
| <a href="{{.Website}}" rel="nofollow">{{.Website}}</a> | |||||
| {{end}} | |||||
| {{svg "octicon-clock" 16}} {{$.i18n.Tr "user.join_on"}} {{.CreatedUnix.FormatShort}} | |||||
| </div> | |||||
| </div> | |||||
| <div class="ui container homeorg"> | |||||
| <div class="ui center aligned header"> | |||||
| <h1 class="title_re"> | |||||
| {{$.i18n.Tr "home.page_recommend_org"}} | |||||
| </h1> | |||||
| <p class="re_con"> {{$.i18n.Tr "home.page_recommend_org_desc"}}<a href="{{.RecommendURL}}"> {{$.i18n.Tr "home.page_recommend_org_commit"}}</a></p> | |||||
| </div> | |||||
| <div class="sixteen wide tablet sixteen wide computer column"> | |||||
| <div class="homeorg-list" > | |||||
| <div class="swiper-wrapper" id="recommendorg" style="height:auto"> | |||||
| {{range .RecommendOrgs}} | |||||
| <div class="swiper-slide"> | |||||
| <a href="{{.HomeLink}}" class= "ui fluid card"> | |||||
| <div class="content"> | |||||
| <div class= "ui small header"> | |||||
| <img class="ui image" src="{{.Avatar}}" > | |||||
| <div class="content nowrap"> | |||||
| <span class="ui blue"> {{.Name}} </span> {{.FullName}} | |||||
| <div class="sub header"> | |||||
| <span> | |||||
| {{.NumRepos}} | |||||
| {{if le .NumRepos 1}} | |||||
| {{$.i18n.Tr "org.org_repository"}} | |||||
| {{else}} | |||||
| {{$.i18n.Tr "org.org_repositories"}} | |||||
| {{end}} | |||||
| </span> | |||||
| . <span> | |||||
| {{.NumMembers}} | |||||
| {{if le .NumRepos 1}} | |||||
| {{$.i18n.Tr "org.org_member"}} | |||||
| {{else}} | |||||
| {{$.i18n.Tr "org.org_members"}} | |||||
| {{end}} | |||||
| </span> | |||||
| .<span> | |||||
| {{.NumTeams}} | |||||
| {{if le .NumRepos 1}} | |||||
| {{$.i18n.Tr "org.org_team"}} | |||||
| {{else}} | |||||
| {{$.i18n.Tr "org.org_teams"}} | |||||
| {{end}} | |||||
| </span> | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| </div> | |||||
| </a> | |||||
| </div> | </div> | ||||
| {{else}} | |||||
| <div>{{$.i18n.Tr "explore.org_no_results"}}</div> | |||||
| {{end}} | {{end}} | ||||
| </div> | </div> | ||||
| {{template "base/paginate" .}} | |||||
| <div class="swiper-pagination"></div> | |||||
| </div> | </div> | ||||
| <div class="sixteen wide mobile six wide tablet three wide computer column"> | |||||
| {{template "explore/repo_right" .}} | |||||
| </div> | |||||
| </div> | |||||
| <div class="ui container homeorg"> | |||||
| <div class="content_top10"> | |||||
| <div class="ui three doubling cards"> | |||||
| <div class="card_list" > | |||||
| <div class="list_title star_title"> | |||||
| <p class="p_text"> <i class="ri-star-line"> </i>{{$.i18n.Tr "org.star"}}</p> | |||||
| </div> | |||||
| <li style="list-style:none"> | |||||
| {{ range $i,$user :=.StarOrgs}} | |||||
| <ul class="orgs" style="display: flex;"> | |||||
| {{if eq $i 0}} | |||||
| <div class="org_icon"> | |||||
| <svg width="1em" height="1em" viewBox="0 0 32 32" class="contribution-item-img__2-fih"><defs><path id="rank1_svg__a" d="M13.69 20V9.616h-1.598l-3.139 2.61 1.027 1.218 1.95-1.804V20z"></path></defs><g fill="none" fill-rule="evenodd"><path d="M0 0h32v32H0z"></path><g transform="translate(4 2.667)"><path fill="#D16C11" d="M0 0h6.976l5.49 7.642L17.063 0H24L12 16z"></path><circle fill="#F7C049" cx="12" cy="14.667" r="12"></circle><circle fill="#FEE6AD" cx="12" cy="14.667" r="9.333"></circle><g fill-rule="nonzero"><use fill="#FFF" xlink:href="#rank1_svg__a"></use><use fill="#D74D03" xlink:href="#rank1_svg__a"></use></g></g></g></svg> | |||||
| </div> | |||||
| {{else if eq $i 1}} | |||||
| <div class="org_icon"> | |||||
| <svg width="1em" height="1em" viewBox="0 0 32 32" class="contribution-item-img__2-fih"><g transform="translate(4 2.667)" fill="none" fill-rule="evenodd"><path fill="#305269" d="M0 0h6.976l5.49 7.642L17.063 0H24L12 16z"></path><circle fill="#BDD8F0" cx="12" cy="14.667" r="12"></circle><circle fill="#E1E9FC" cx="12" cy="14.667" r="9.333"></circle><path d="M15.817 20v-1.584h-4.81l3.212-2.977c.469-.43.853-.883 1.151-1.357.298-.474.447-1.039.447-1.694 0-.499-.088-.934-.264-1.305a2.525 2.525 0 00-.718-.917 3.169 3.169 0 00-1.064-.543 4.531 4.531 0 00-1.312-.183c-.47 0-.905.064-1.306.19-.4.128-.753.314-1.056.558-.303.244-.55.55-.74.917-.191.366-.306.79-.345 1.268l1.848.147c.059-.43.23-.772.513-1.027.284-.254.646-.381 1.086-.381.205 0 .398.032.579.095.18.064.34.154.477.272a1.262 1.262 0 01.455.997c0 .176-.035.345-.103.506a2.52 2.52 0 01-.257.462 3.476 3.476 0 01-.345.418c-.127.132-.249.257-.366.374l-4.034 3.901V20h6.952z" fill="#305269" fill-rule="nonzero"></path></g></svg> | |||||
| </div> | |||||
| {{else if eq $i 2}} | |||||
| <div class="org_icon"> | |||||
| <svg width="1em" height="1em" viewBox="0 0 32 32" class="contribution-item-img__2-fih"><g transform="translate(4 2.667)" fill="none" fill-rule="evenodd"><path fill="#865B45" d="M0 0h6.976l5.49 7.642L17.063 0H24L12 16z"></path><circle fill="#E7C5AC" cx="12" cy="14.667" r="12"></circle><circle fill="#FEDDC7" cx="12" cy="14.667" r="9.333"></circle><path d="M12.239 20.176c.46 0 .902-.066 1.327-.198.425-.132.8-.328 1.122-.587.323-.259.58-.579.77-.96.19-.382.286-.822.286-1.32 0-.646-.171-1.203-.513-1.672-.343-.47-.846-.753-1.511-.851v-.03c.557-.136.992-.422 1.305-.857.313-.435.47-.932.47-1.489 0-.46-.09-.863-.272-1.21a2.547 2.547 0 00-.726-.865 3.232 3.232 0 00-1.056-.521 4.521 4.521 0 00-1.276-.176 4.52 4.52 0 00-1.1.132 3.404 3.404 0 00-.968.403 2.79 2.79 0 00-.762.697 3.181 3.181 0 00-.499.997l1.863.499c.127-.362.33-.643.608-.843.279-.2.594-.301.946-.301.44 0 .797.127 1.071.381.274.255.41.582.41.983 0 .313-.058.562-.175.748a1.17 1.17 0 01-.462.425 1.903 1.903 0 01-.646.191 6.09 6.09 0 01-.74.044h-.455v1.584h.425c.264 0 .533.02.807.059.274.039.52.115.74.227.22.112.402.274.543.484.142.21.213.482.213.814a1.533 1.533 0 01-.52 1.18 1.772 1.772 0 01-.558.33 1.88 1.88 0 01-.667.118c-.47 0-.841-.117-1.115-.352s-.464-.567-.572-.997l-1.877.498c.117.43.288.8.513 1.108.225.308.491.56.8.755.307.196.652.34 1.033.433a5.13 5.13 0 001.218.139z" fill="#865B45" fill-rule="nonzero"></path></g></svg> | |||||
| </div> | |||||
| {{else }} | |||||
| <div class="org_icon org_icon_num" > | |||||
| {{Add $i 1}} | |||||
| </div> | |||||
| {{end}} | |||||
| <li class="li_avatar"> | |||||
| <img class="ui avatar image" src="{{$user.RelAvatarLink}}" > | |||||
| </li> | |||||
| <li class="li_name"> | |||||
| <p class="org_line_hight">{{$user.Name}}</p> | |||||
| </li> | |||||
| <ul> | |||||
| <li class="li_score" > | |||||
| <i class="ri-star-line org_line_hight org_icon_color"></i> <p class="p_score">{{$user.Score}}</p> | |||||
| </li> | |||||
| </ul> | |||||
| </ul> | |||||
| {{end}} | |||||
| </li> | |||||
| </div> | |||||
| <div class="card_list" > | |||||
| <div class="list_title star_title"> | |||||
| <p class="p_text"> <i class="ri-user-2-line"> </i>{{$.i18n.Tr "org.member"}}</p> | |||||
| </div> | |||||
| <li style="list-style:none"> | |||||
| {{ range $i,$user :=.StarOrgs}} | |||||
| <ul class="orgs" style="display: flex;"> | |||||
| {{if eq $i 0}} | |||||
| <div class="org_icon"> | |||||
| <svg width="1em" height="1em" viewBox="0 0 32 32" class="contribution-item-img__2-fih"><defs><path id="rank1_svg__a" d="M13.69 20V9.616h-1.598l-3.139 2.61 1.027 1.218 1.95-1.804V20z"></path></defs><g fill="none" fill-rule="evenodd"><path d="M0 0h32v32H0z"></path><g transform="translate(4 2.667)"><path fill="#D16C11" d="M0 0h6.976l5.49 7.642L17.063 0H24L12 16z"></path><circle fill="#F7C049" cx="12" cy="14.667" r="12"></circle><circle fill="#FEE6AD" cx="12" cy="14.667" r="9.333"></circle><g fill-rule="nonzero"><use fill="#FFF" xlink:href="#rank1_svg__a"></use><use fill="#D74D03" xlink:href="#rank1_svg__a"></use></g></g></g></svg> | |||||
| </div> | |||||
| {{else if eq $i 1}} | |||||
| <div class="org_icon"> | |||||
| <svg width="1em" height="1em" viewBox="0 0 32 32" class="contribution-item-img__2-fih"><g transform="translate(4 2.667)" fill="none" fill-rule="evenodd"><path fill="#305269" d="M0 0h6.976l5.49 7.642L17.063 0H24L12 16z"></path><circle fill="#BDD8F0" cx="12" cy="14.667" r="12"></circle><circle fill="#E1E9FC" cx="12" cy="14.667" r="9.333"></circle><path d="M15.817 20v-1.584h-4.81l3.212-2.977c.469-.43.853-.883 1.151-1.357.298-.474.447-1.039.447-1.694 0-.499-.088-.934-.264-1.305a2.525 2.525 0 00-.718-.917 3.169 3.169 0 00-1.064-.543 4.531 4.531 0 00-1.312-.183c-.47 0-.905.064-1.306.19-.4.128-.753.314-1.056.558-.303.244-.55.55-.74.917-.191.366-.306.79-.345 1.268l1.848.147c.059-.43.23-.772.513-1.027.284-.254.646-.381 1.086-.381.205 0 .398.032.579.095.18.064.34.154.477.272a1.262 1.262 0 01.455.997c0 .176-.035.345-.103.506a2.52 2.52 0 01-.257.462 3.476 3.476 0 01-.345.418c-.127.132-.249.257-.366.374l-4.034 3.901V20h6.952z" fill="#305269" fill-rule="nonzero"></path></g></svg> | |||||
| </div> | |||||
| {{else if eq $i 2}} | |||||
| <div class="org_icon"> | |||||
| <svg width="1em" height="1em" viewBox="0 0 32 32" class="contribution-item-img__2-fih"><g transform="translate(4 2.667)" fill="none" fill-rule="evenodd"><path fill="#865B45" d="M0 0h6.976l5.49 7.642L17.063 0H24L12 16z"></path><circle fill="#E7C5AC" cx="12" cy="14.667" r="12"></circle><circle fill="#FEDDC7" cx="12" cy="14.667" r="9.333"></circle><path d="M12.239 20.176c.46 0 .902-.066 1.327-.198.425-.132.8-.328 1.122-.587.323-.259.58-.579.77-.96.19-.382.286-.822.286-1.32 0-.646-.171-1.203-.513-1.672-.343-.47-.846-.753-1.511-.851v-.03c.557-.136.992-.422 1.305-.857.313-.435.47-.932.47-1.489 0-.46-.09-.863-.272-1.21a2.547 2.547 0 00-.726-.865 3.232 3.232 0 00-1.056-.521 4.521 4.521 0 00-1.276-.176 4.52 4.52 0 00-1.1.132 3.404 3.404 0 00-.968.403 2.79 2.79 0 00-.762.697 3.181 3.181 0 00-.499.997l1.863.499c.127-.362.33-.643.608-.843.279-.2.594-.301.946-.301.44 0 .797.127 1.071.381.274.255.41.582.41.983 0 .313-.058.562-.175.748a1.17 1.17 0 01-.462.425 1.903 1.903 0 01-.646.191 6.09 6.09 0 01-.74.044h-.455v1.584h.425c.264 0 .533.02.807.059.274.039.52.115.74.227.22.112.402.274.543.484.142.21.213.482.213.814a1.533 1.533 0 01-.52 1.18 1.772 1.772 0 01-.558.33 1.88 1.88 0 01-.667.118c-.47 0-.841-.117-1.115-.352s-.464-.567-.572-.997l-1.877.498c.117.43.288.8.513 1.108.225.308.491.56.8.755.307.196.652.34 1.033.433a5.13 5.13 0 001.218.139z" fill="#865B45" fill-rule="nonzero"></path></g></svg> | |||||
| </div> | |||||
| {{else }} | |||||
| <div class="org_icon org_icon_num" > | |||||
| {{Add $i 1}} | |||||
| </div> | |||||
| {{end}} | |||||
| <li class="li_avatar"> | |||||
| <img class="ui avatar image" src="{{$user.RelAvatarLink}}" > | |||||
| </li> | |||||
| <li class="li_name"> | |||||
| <p class="org_line_hight">{{$user.Name}}</p> | |||||
| </li> | |||||
| <ul> | |||||
| <li class="li_score"> | |||||
| <i class="ri-user-2-line org_line_hight org_icon_color"></i> <p class="p_score">{{$user.Score}}</p> | |||||
| </li> | |||||
| </ul> | |||||
| </ul> | |||||
| {{end}} | |||||
| </li> | |||||
| </div> | |||||
| <div class="card_list" > | |||||
| <div class="list_title star_title"> | |||||
| <p class="p_text"> <i class="ri-blaze-fill"> </i>{{$.i18n.Tr "org.active"}}</p> | |||||
| </div> | |||||
| <li style="list-style:none"> | |||||
| {{ range $i,$user :=.StarOrgs}} | |||||
| <ul class="orgs" style="display: flex;"> | |||||
| {{if eq $i 0}} | |||||
| <div class="org_icon"> | |||||
| <svg width="1em" height="1em" viewBox="0 0 32 32" class="contribution-item-img__2-fih"><defs><path id="rank1_svg__a" d="M13.69 20V9.616h-1.598l-3.139 2.61 1.027 1.218 1.95-1.804V20z"></path></defs><g fill="none" fill-rule="evenodd"><path d="M0 0h32v32H0z"></path><g transform="translate(4 2.667)"><path fill="#D16C11" d="M0 0h6.976l5.49 7.642L17.063 0H24L12 16z"></path><circle fill="#F7C049" cx="12" cy="14.667" r="12"></circle><circle fill="#FEE6AD" cx="12" cy="14.667" r="9.333"></circle><g fill-rule="nonzero"><use fill="#FFF" xlink:href="#rank1_svg__a"></use><use fill="#D74D03" xlink:href="#rank1_svg__a"></use></g></g></g></svg> | |||||
| </div> | |||||
| {{else if eq $i 1}} | |||||
| <div class="org_icon"> | |||||
| <svg width="1em" height="1em" viewBox="0 0 32 32" class="contribution-item-img__2-fih"><g transform="translate(4 2.667)" fill="none" fill-rule="evenodd"><path fill="#305269" d="M0 0h6.976l5.49 7.642L17.063 0H24L12 16z"></path><circle fill="#BDD8F0" cx="12" cy="14.667" r="12"></circle><circle fill="#E1E9FC" cx="12" cy="14.667" r="9.333"></circle><path d="M15.817 20v-1.584h-4.81l3.212-2.977c.469-.43.853-.883 1.151-1.357.298-.474.447-1.039.447-1.694 0-.499-.088-.934-.264-1.305a2.525 2.525 0 00-.718-.917 3.169 3.169 0 00-1.064-.543 4.531 4.531 0 00-1.312-.183c-.47 0-.905.064-1.306.19-.4.128-.753.314-1.056.558-.303.244-.55.55-.74.917-.191.366-.306.79-.345 1.268l1.848.147c.059-.43.23-.772.513-1.027.284-.254.646-.381 1.086-.381.205 0 .398.032.579.095.18.064.34.154.477.272a1.262 1.262 0 01.455.997c0 .176-.035.345-.103.506a2.52 2.52 0 01-.257.462 3.476 3.476 0 01-.345.418c-.127.132-.249.257-.366.374l-4.034 3.901V20h6.952z" fill="#305269" fill-rule="nonzero"></path></g></svg> | |||||
| </div> | |||||
| {{else if eq $i 2}} | |||||
| <div class="org_icon"> | |||||
| <svg width="1em" height="1em" viewBox="0 0 32 32" class="contribution-item-img__2-fih"><g transform="translate(4 2.667)" fill="none" fill-rule="evenodd"><path fill="#865B45" d="M0 0h6.976l5.49 7.642L17.063 0H24L12 16z"></path><circle fill="#E7C5AC" cx="12" cy="14.667" r="12"></circle><circle fill="#FEDDC7" cx="12" cy="14.667" r="9.333"></circle><path d="M12.239 20.176c.46 0 .902-.066 1.327-.198.425-.132.8-.328 1.122-.587.323-.259.58-.579.77-.96.19-.382.286-.822.286-1.32 0-.646-.171-1.203-.513-1.672-.343-.47-.846-.753-1.511-.851v-.03c.557-.136.992-.422 1.305-.857.313-.435.47-.932.47-1.489 0-.46-.09-.863-.272-1.21a2.547 2.547 0 00-.726-.865 3.232 3.232 0 00-1.056-.521 4.521 4.521 0 00-1.276-.176 4.52 4.52 0 00-1.1.132 3.404 3.404 0 00-.968.403 2.79 2.79 0 00-.762.697 3.181 3.181 0 00-.499.997l1.863.499c.127-.362.33-.643.608-.843.279-.2.594-.301.946-.301.44 0 .797.127 1.071.381.274.255.41.582.41.983 0 .313-.058.562-.175.748a1.17 1.17 0 01-.462.425 1.903 1.903 0 01-.646.191 6.09 6.09 0 01-.74.044h-.455v1.584h.425c.264 0 .533.02.807.059.274.039.52.115.74.227.22.112.402.274.543.484.142.21.213.482.213.814a1.533 1.533 0 01-.52 1.18 1.772 1.772 0 01-.558.33 1.88 1.88 0 01-.667.118c-.47 0-.841-.117-1.115-.352s-.464-.567-.572-.997l-1.877.498c.117.43.288.8.513 1.108.225.308.491.56.8.755.307.196.652.34 1.033.433a5.13 5.13 0 001.218.139z" fill="#865B45" fill-rule="nonzero"></path></g></svg> | |||||
| </div> | |||||
| {{else }} | |||||
| <div class="org_icon org_icon_num" > | |||||
| {{Add $i 1}} | |||||
| </div> | |||||
| {{end}} | |||||
| <li class="li_avatar"> | |||||
| <img class="ui avatar image" src="{{$user.RelAvatarLink}}" > | |||||
| </li> | |||||
| <li class="li_name"> | |||||
| <p class="org_line_hight">{{$user.Name}}</p> | |||||
| </li> | |||||
| </ul> | |||||
| {{end}} | |||||
| </li> | |||||
| </div> | |||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| </div> | </div> | ||||
| {{template "base/footer" .}} | {{template "base/footer" .}} | ||||
| <script> | |||||
| function all_search(){ | |||||
| var inputValue = document.getElementById("value_s").value; | |||||
| console.log("Keyword",inputValue) | |||||
| sessionStorage.setItem("keyword",inputValue); | |||||
| sessionStorage.setItem("tableName","org"); | |||||
| sessionStorage.setItem("specifySearch",true); | |||||
| sessionStorage.setItem("sortBy","default"); | |||||
| sessionStorage.setItem("ascending","false"); | |||||
| window.open("/all/search/"); | |||||
| } | |||||
| window.onload = function() { | |||||
| var swiperOrg = new Swiper(".homeorg-list", { | |||||
| slidesPerView: 1, | |||||
| slidesPerColumn: 3, | |||||
| slidesPerColumnFill:'row', | |||||
| spaceBetween: 15, | |||||
| pagination: { | |||||
| el: ".swiper-pagination", | |||||
| clickable: true, | |||||
| }, | |||||
| autoplay: { | |||||
| delay: 4500, | |||||
| disableOnInteraction: false, | |||||
| }, | |||||
| breakpoints: { | |||||
| 768: { | |||||
| slidesPerView: 3, | |||||
| }, | |||||
| 1024: { | |||||
| slidesPerView: 4, | |||||
| }, | |||||
| }, | |||||
| }); | |||||
| } | |||||
| </script> | |||||
| @@ -811,6 +811,89 @@ display: block; | |||||
| box-shadow: -15px 0px 10px #fff; | box-shadow: -15px 0px 10px #fff; | ||||
| } | } | ||||
| .content_top10{ | |||||
| padding:10px; | |||||
| padding-top:0px; | |||||
| } | |||||
| .re_con{ | |||||
| color: rgba(136, 136, 136, 100); | |||||
| font-size: 14px; | |||||
| text-align: center; | |||||
| font-family: SourceHanSansSC-light; | |||||
| } | |||||
| .title_re{ | |||||
| margin-top: 50px !important; | |||||
| } | |||||
| .card_list { | |||||
| width: calc(33.33333333333333% - 2em); | |||||
| margin-left: 1em; | |||||
| margin-right: 1em | |||||
| } | |||||
| .list_title{ | |||||
| height: 52px; | |||||
| text-align: center | |||||
| } | |||||
| .star_title{ | |||||
| background-color: #3291F8; | |||||
| } | |||||
| .memb_title{ | |||||
| background-color: #706FE3; | |||||
| } | |||||
| .act_title{ | |||||
| background-color: #13C28D; | |||||
| } | |||||
| .p_text{ | |||||
| line-height: 50px; | |||||
| text-align:left; | |||||
| padding-left:15px; | |||||
| font-size:18px; | |||||
| color:#FFFFFF; | |||||
| } | |||||
| .orgs { | |||||
| display: flex; | |||||
| flex-flow: row wrap; | |||||
| padding: 0; | |||||
| margin-top:20px | |||||
| } | |||||
| .orgs li { | |||||
| display: flex; | |||||
| border-bottom: 0!important; | |||||
| padding: 3px!important; | |||||
| } | |||||
| .p_score{ | |||||
| line-height: 28px; | |||||
| width: 100%; | |||||
| /* padding-right: 20px; */ | |||||
| text-align: right; | |||||
| } | |||||
| .org_line_hight{ | |||||
| line-height: 28px; | |||||
| } | |||||
| .org_icon{ | |||||
| margin-top: 10px; | |||||
| margin-right: 10px; | |||||
| padding-left: 15px; | |||||
| } | |||||
| .org_icon_num{ | |||||
| margin-left: 2px; | |||||
| margin-right: 13px; | |||||
| } | |||||
| .org_icon_color{ | |||||
| color: #FA8C16; | |||||
| } | |||||
| .li_name{ | |||||
| list-style:none; | |||||
| width: 55%; | |||||
| } | |||||
| .li_avatar{ | |||||
| list-style: none; | |||||
| width: 10%; | |||||
| } | |||||
| .li_score{ | |||||
| list-style:none; | |||||
| margin-left: 2px; | |||||
| } | |||||
| /**seach**/ | /**seach**/ | ||||
| /**搜索导航条适配窄屏**/ | /**搜索导航条适配窄屏**/ | ||||
| .seachnav{ | .seachnav{ | ||||