diff --git a/app/controllers/admins/projects_rank_controller.rb b/app/controllers/admins/projects_rank_controller.rb new file mode 100644 index 000000000..c4f968da4 --- /dev/null +++ b/app/controllers/admins/projects_rank_controller.rb @@ -0,0 +1,16 @@ +class Admins::ProjectsRankController < Admins::BaseController + + def index + @rank_date = rank_date + deleted_data = $redis_cache.smembers("v2-project-rank-deleted") + $redis_cache.zrem("v2-project-rank-#{rank_date}", deleted_data) unless deleted_data.blank? + @date_rank = $redis_cache.zrevrange("v2-project-rank-#{rank_date}", 0, -1, withscores: true) + end + + private + + def rank_date + params.fetch(:date, Date.today.to_s) + end + +end \ No newline at end of file diff --git a/app/controllers/admins/users_rank_controller.rb b/app/controllers/admins/users_rank_controller.rb new file mode 100644 index 000000000..2c7a62ae5 --- /dev/null +++ b/app/controllers/admins/users_rank_controller.rb @@ -0,0 +1,15 @@ +class Admins::UsersRankController < Admins::BaseController + + def index + @rank_date = rank_date + @date_rank = $redis_cache.zrevrange("v2-user-rank-#{rank_date}", 0, -1, withscores: true) + end + + private + + def rank_date + params.fetch(:date, Date.today.to_s) + end + + +end \ No newline at end of file diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 53f6d1aea..52c776477 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -53,7 +53,7 @@ class ProjectsController < ApplicationController ActiveRecord::Base.transaction do Projects::CreateForm.new(project_params).validate! @project = Projects::CreateService.new(current_user, project_params).call - OpenProjectDevOpsJob.perform_later(@project&.id, current_user.id) + OpenProjectDevOpsJob.set(wait: 5.seconds).perform_later(@project&.id, current_user.id) end rescue Exception => e uid_logger_error(e.message) diff --git a/app/jobs/migrate_remote_repository_job.rb b/app/jobs/migrate_remote_repository_job.rb index 5e56901a0..696607ae3 100644 --- a/app/jobs/migrate_remote_repository_job.rb +++ b/app/jobs/migrate_remote_repository_job.rb @@ -15,7 +15,7 @@ class MigrateRemoteRepositoryJob < ApplicationJob ## open jianmu devops project_id = repo&.project&.id puts "############ mirror project_id,user_id: #{project_id},#{user_id} ############" - OpenProjectDevOpsJob.perform_later(project_id, user_id) if project_id.present? && user_id.present? + OpenProjectDevOpsJob.set(wait: 5.seconds).perform_later(project_id, user_id) if project_id.present? && user_id.present? puts "############ mirror status: #{repo.mirror.status} ############" else repo&.mirror&.failed! diff --git a/app/models/project.rb b/app/models/project.rb index a8816bd76..e1670bf53 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -188,7 +188,7 @@ class Project < ApplicationRecord forked_project = self.forked_from_project if forked_project.present? forked_project.decrement(:forked_count, 1) - forked_project.update_column(:forked_count, forked_project.forked_count) + forked_project.update_attribute(:forked_count, forked_project.forked_count) end end diff --git a/app/queries/projects/list_query.rb b/app/queries/projects/list_query.rb index 447ab5070..c4c81957b 100644 --- a/app/queries/projects/list_query.rb +++ b/app/queries/projects/list_query.rb @@ -22,10 +22,12 @@ class Projects::ListQuery < ApplicationQuery sort_direction = params[:sort_direction] || "desc" collection = optimize_sorting(collection, sort) if params[:category_id].present? - custom_sort(collection, sort, sort_direction) - - # scope = scope.reorder("projects.#{sort} #{sort_direction}") - # scope + # 如果有搜索关键字根据ES搜索结果排序 + if params[:search].present? && @ids.present? + collection.reorder(Arel.sql("FIELD(projects.id,#{@ids.join(',')})")) + else + custom_sort(collection, sort, sort_direction) + end end def filter_projects(collection) @@ -38,10 +40,10 @@ class Projects::ListQuery < ApplicationQuery end def by_search(items) - ids = Projects::ElasticsearchService.call(params[:search]) + @ids = Projects::ElasticsearchService.call(params[:search]) items = items.where(platform: 'forge') - if ids.present? - items = items.where(id: ids).by_name_or_identifier(params[:search]) + if @ids.present? + items = items.where(id: @ids).by_name_or_identifier(params[:search]) else items = items.by_name_or_identifier(params[:search]) end diff --git a/app/services/api/v1/projects/code_stats/list_service.rb b/app/services/api/v1/projects/code_stats/list_service.rb index 84f4bac36..a5e330e21 100644 --- a/app/services/api/v1/projects/code_stats/list_service.rb +++ b/app/services/api/v1/projects/code_stats/list_service.rb @@ -1,6 +1,6 @@ class Api::V1::Projects::CodeStats::ListService < ApplicationService - attr_reader :project, :ref, :owner, :repo, :token + attr_reader :project, :ref, :owner, :repo, :token, :page, :limit attr_accessor :gitea_data def initialize(project, params, token=nil) diff --git a/app/services/cache/v2/project_date_rank_service.rb b/app/services/cache/v2/project_date_rank_service.rb index 9d8ffca90..9df69bbb4 100644 --- a/app/services/cache/v2/project_date_rank_service.rb +++ b/app/services/cache/v2/project_date_rank_service.rb @@ -28,6 +28,10 @@ class Cache::V2::ProjectDateRankService < ApplicationService "v2-project-rank-#{@rank_date.to_s}" end + def project_rank_statistic_key + "v2-project-statistic:#{@project_id}-#{@rank_date.to_s}" + end + def project_rank $redis_cache.zscore(project_rank_key, @project_id) end @@ -35,26 +39,37 @@ class Cache::V2::ProjectDateRankService < ApplicationService def set_project_rank if @visits.present? $redis_cache.zincrby(project_rank_key, @visits.to_i * 1, @project_id) + $redis_cache.hincrby(project_rank_statistic_key, "visits", @visits.to_i) end if @watchers.present? $redis_cache.zincrby(project_rank_key, @watchers.to_i * 5, @project_id) + $redis_cache.hincrby(project_rank_statistic_key, "watchers", @watchers.to_i) end if @praises.present? $redis_cache.zincrby(project_rank_key, @praises.to_i * 5, @project_id) + $redis_cache.hincrby(project_rank_statistic_key, "praises", @praises.to_i) end if @forks.present? $redis_cache.zincrby(project_rank_key, @forks.to_i * 10, @project_id) + $redis_cache.hincrby(project_rank_statistic_key, "forks", @forks.to_i) end if @issues.present? $redis_cache.zincrby(project_rank_key, @issues.to_i * 5, @project_id) + $redis_cache.hincrby(project_rank_statistic_key, "issues", @issues.to_i) end if @pullrequests.present? $redis_cache.zincrby(project_rank_key, @pullrequests.to_i * 10, @project_id) + $redis_cache.hincrby(project_rank_statistic_key, "pullrequests", @pullrequests.to_i) end if @commits.present? $redis_cache.zincrby(project_rank_key, @commits.to_i * 5, @project_id) + $redis_cache.hincrby(project_rank_statistic_key, "commits", @commits.to_i) end $redis_cache.zscore(project_rank_key, @project_id) + + # 设置过期时间(一个月) + $redis_cache.expireat(project_rank_key, (@rank_date+30.days).to_time.to_i) + $redis_cache.expireat(project_rank_statistic_key, (@rank_date+30.days).to_time.to_i) end end \ No newline at end of file diff --git a/app/services/cache/v2/user_date_rank_service.rb b/app/services/cache/v2/user_date_rank_service.rb index a3351b724..b669e4d67 100644 --- a/app/services/cache/v2/user_date_rank_service.rb +++ b/app/services/cache/v2/user_date_rank_service.rb @@ -115,5 +115,9 @@ class Cache::V2::UserDateRankService < ApplicationService $redis_cache.zadd(user_rank_key, score-300, @user_id) if score > 300 $redis_cache.zscore(user_rank_key, @user_id) + + # 设置过期时间(一个月) + $redis_cache.expireat(user_rank_key, (@rank_date+30.days).to_time.to_i) + $redis_cache.expireat(user_date_statistic_key, (@rank_date+30.days).to_time.to_i) end end \ No newline at end of file diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index 837775d36..f8b38df47 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -29,7 +29,7 @@ class Projects::ForkService < ApplicationService ProjectUnit.init_types(clone_project.id) - @project.update_column('forked_count', @project&.forked_count.to_i + 1) + @project.update_attribute('forked_count', @project&.forked_count.to_i + 1) new_repository.update_column('url', result['clone_url']) if result ForkUser.create(project_id: @project.id, fork_project_id: clone_project.id, user_id: clone_project.user_id) diff --git a/app/views/admins/projects_rank/index.html.erb b/app/views/admins/projects_rank/index.html.erb new file mode 100644 index 000000000..056e0a0da --- /dev/null +++ b/app/views/admins/projects_rank/index.html.erb @@ -0,0 +1,74 @@ +<% define_admin_breadcrumbs do %> + <% add_admin_breadcrumb('项目排行榜', admins_path) %> +<% end %> + + +
+ <%= form_tag(admins_projects_rank_index_path, method: :get, class: 'form-inline search-form flex-1', id: 'project-rank-date-form') do %> +
+ + <% dates_array = (0..30).to_a.map { |item| [(Date.today-item.days).to_s, (Date.today-item.days).to_s] } %> + <%= select_tag(:date, options_for_select(dates_array, params[:date]), class:"form-control",id: "project-rank-date-select")%> +
+ <% end %> + +
+ +
+ + + + + + + + + + + + + + + + + <% @date_rank.each_with_index do |item, index| %> + + + <% project_common = $redis_cache.hgetall("v2-project-common:#{item[0]}") %> + <% owner_common = $redis_cache.hgetall("v2-owner-common:#{project_common["owner_id"]}")%> + + + + <% project_date_statistic_key = "v2-project-statistic:#{item[0]}-#{@rank_date}"%> + <% if $redis_cache.exists(project_date_statistic_key)%> + <% visits = $redis_cache.hget(project_date_statistic_key, "visits") %> + + <% watchers = $redis_cache.hget(project_date_statistic_key, "watchers") %> + + <% praises = $redis_cache.hget(project_date_statistic_key, "praises") %> + + <% forks = $redis_cache.hget(project_date_statistic_key, "forks") %> + + <% issues = $redis_cache.hget(project_date_statistic_key, "issues") %> + + <% pullrequests = $redis_cache.hget(project_date_statistic_key, "pullrequests") %> + + <% commits = $redis_cache.hget(project_date_statistic_key, "commits") %> + + <% else %> + + <% end %> + + <% end %> + +
排名项目得分访问数关注数点赞数fork数疑修数合并请求数提交数
<%= index + 1%> + /<%= project_common["identifier"]%>"> + <%= project_common["name"] %> + + <%= item[1] %><%= visits || 0 %><%= watchers || 0 %><%= praises || 0 %><%= forks || 0 %><%= issues || 0 %><%= pullrequests || 0 %><%= commits || 0 %>暂无数据
+
+ \ No newline at end of file diff --git a/app/views/admins/shared/_sidebar.html.erb b/app/views/admins/shared/_sidebar.html.erb index afd0dad68..fb96f088e 100644 --- a/app/views/admins/shared/_sidebar.html.erb +++ b/app/views/admins/shared/_sidebar.html.erb @@ -14,6 +14,12 @@