diff --git a/.gitignore b/.gitignore
index 4a01bd5e..2735825a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -84,4 +84,5 @@ redis_data/
dump.rdb
.tags*
ceshi_user.xlsx
-public/trace_task_results
\ No newline at end of file
+public/trace_task_results
+public/项目活跃度排行.xls
\ No newline at end of file
diff --git a/app/controllers/admins/projects_rank_controller.rb b/app/controllers/admins/projects_rank_controller.rb
index c4f968da..bee024f8 100644
--- a/app/controllers/admins/projects_rank_controller.rb
+++ b/app/controllers/admins/projects_rank_controller.rb
@@ -1,16 +1,55 @@
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)
+ @statistics = DailyProjectStatistic.where("date >= ? AND date <= ?", begin_date, end_date)
+ @statistics = @statistics.group(:project_id).select("project_id,
+ sum(score) as score,
+ sum(visits) as visits,
+ sum(watchers) as watchers,
+ sum(praises) as praises,
+ sum(forks) as forks,
+ sum(issues) as issues,
+ sum(pullrequests) as pullrequests,
+ sum(commits) as commits").includes(:project)
+ @statistics = @statistics.order("#{sort_by} #{sort_direction}")
+ export_excel(@statistics.limit(50))
end
private
- def rank_date
- params.fetch(:date, Date.today.to_s)
+ def begin_date
+ params.fetch(:begin_date, Date.today.to_s)
+ end
+
+ def end_date
+ params.fetch(:end_date, Date.today.to_s)
+ end
+
+ def sort_by
+ DailyProjectStatistic.column_names.include?(params.fetch(:sort_by, "score")) ? params.fetch(:sort_by, "score") : "score"
+ end
+
+ def sort_direction
+ %w(desc asc).include?(params.fetch(:sort_direction, "desc")) ? params.fetch(:sort_direction, "desc") : "desc"
+ end
+
+ def export_excel(data)
+ book = Spreadsheet::Workbook.new
+ sheet = book.create_worksheet :name => "项目活跃度排行"
+ sheet.row(0).concat %w(排名 项目全称 项目地址 得分 访问数 关注数 点赞数 fork数 疑修数 合并请求数 提交数)
+ data.each_with_index do |d, index|
+ sheet[index+1,0] = index+1
+ sheet[index+1,1] = "#{d&.project&.owner&.nickname}/#{d&.project&.name}"
+ sheet[index+1,2] = "#{Rails.application.config_for(:configuration)['platform_url']}/#{d&.project&.owner&.login}/#{d&.project&.identifier}"
+ sheet[index+1,3] = d.score
+ sheet[index+1,4] = d.visits
+ sheet[index+1,5] = d.watchers
+ sheet[index+1,6] = d.praises
+ sheet[index+1,7] = d.forks
+ sheet[index+1,8] = d.issues
+ sheet[index+1,9] = d.pullrequests
+ sheet[index+1,10] = d.commits
+ end
+ book.write "#{Rails.root}/public/项目活跃度排行.xls"
end
end
\ No newline at end of file
diff --git a/app/jobs/daily_project_statistics_job.rb b/app/jobs/daily_project_statistics_job.rb
new file mode 100644
index 00000000..98506748
--- /dev/null
+++ b/app/jobs/daily_project_statistics_job.rb
@@ -0,0 +1,32 @@
+class DailyProjectStatisticsJob < ApplicationJob
+ queue_as :cache
+
+ def perform
+ date = (Date.today - 1.days).to_s
+ daily_data_keys = $redis_cache.keys("v2-project-statistic:*-#{date}")
+ daily_data_keys.each do |key|
+ result = $redis_cache.hgetall(key)
+ project_id = key.gsub('v2-project-statistic:', '').gsub("-#{date}", '')
+ visits = result["visits"].to_i
+ watchers = result["watchers"].to_i
+ praises = result["praises"].to_i
+ forks = result["forks"].to_i
+ issues = result["issues"].to_i
+ pullrequests = result["pullrequests"].to_i
+ commits = result["commits"].to_i
+ score = visits *1 + watchers *5 + praises * 5 + forks * 10 + issues *5 + pullrequests * 10 + commits * 5
+ DailyProjectStatistic.create!(
+ project_id: project_id,
+ date: date,
+ score: score ,
+ visits: visits,
+ watchers: watchers,
+ praises: praises,
+ forks: forks,
+ issues: issues,
+ pullrequests: pullrequests,
+ commits: commits
+ )
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/models/daily_project_statistic.rb b/app/models/daily_project_statistic.rb
new file mode 100644
index 00000000..f7fc0aad
--- /dev/null
+++ b/app/models/daily_project_statistic.rb
@@ -0,0 +1,28 @@
+# == Schema Information
+#
+# Table name: daily_project_statistics
+#
+# id :integer not null, primary key
+# project_id :integer
+# date :string(255)
+# visits :integer default("0")
+# watchers :integer default("0")
+# praises :integer default("0")
+# forks :integer default("0")
+# issues :integer default("0")
+# pullrequests :integer default("0")
+# commits :integer default("0")
+# created_at :datetime not null
+# updated_at :datetime not null
+#
+# Indexes
+#
+# index_daily_project_statistics_on_date (date)
+# index_daily_project_statistics_on_project_id (project_id)
+#
+
+class DailyProjectStatistic < ApplicationRecord
+
+
+ belongs_to :project
+end
diff --git a/app/views/admins/projects_rank/index.html.erb b/app/views/admins/projects_rank/index.html.erb
index d3a7926b..e9d38afa 100644
--- a/app/views/admins/projects_rank/index.html.erb
+++ b/app/views/admins/projects_rank/index.html.erb
@@ -5,70 +5,34 @@