From 75fff13550509023bec5eae00d05287bf0487d71 Mon Sep 17 00:00:00 2001 From: yystopf Date: Mon, 18 Dec 2023 15:49:41 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E6=8E=92=E8=A1=8C=E6=A6=9C=E6=9F=A5=E8=AF=A2=E4=B8=B0?= =?UTF-8?q?=E5=AF=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admins/projects_rank_controller.rb | 75 +++++++++++++++++-- app/views/admins/projects_rank/index.html.erb | 68 ++++------------- app/views/admins/projects_rank/index.js.erb | 1 + .../projects_rank/shared/_data_list.html.erb | 39 ++++++++++ 4 files changed, 121 insertions(+), 62 deletions(-) create mode 100644 app/views/admins/projects_rank/index.js.erb create mode 100644 app/views/admins/projects_rank/shared/_data_list.html.erb diff --git a/app/controllers/admins/projects_rank_controller.rb b/app/controllers/admins/projects_rank_controller.rb index c4f968da..df759872 100644 --- a/app/controllers/admins/projects_rank_controller.rb +++ b/app/controllers/admins/projects_rank_controller.rb @@ -1,16 +1,77 @@ class Admins::ProjectsRankController < Admins::BaseController - + before_action :get_timeable_key_names, only:[:index] 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) + puts @names_array + unless @names_array.blank? + $redis_cache.zunionstore("admin-days-project-rank", @names_array) + deleted_data = $redis_cache.smembers("v2-project-rank-deleted") + $redis_cache.zrem("admin-days-project-rank", deleted_data) unless deleted_data.blank? + @date_rank = $redis_cache.zrevrange("admin-days-project-rank", 0, -1, withscores: true) + @date_rank = @date_rank.map do |i| + visits = 0 + watchers = 0 + praises = 0 + forks = 0 + issues = 0 + pullrequests = 0 + commits = 0 + (begin_date..end_date).to_a.each do |d| + result = $redis_cache.hgetall("v2-project-statistic:#{i[0]}-#{d}") + 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 + end + i + [visits,watchers,praises,forks,issues,pullrequests,commits] + end + case params[:sort_by] + when 'visits' + @date_rank = @date_rank.sort{|i| i[2]} + when 'watchers' + @date_rank = @date_rank.sort{|i| i[3]} + when 'praises' + @date_rank = @date_rank.sort{|i| i[4]} + when 'forks' + @date_rank = @date_rank.sort{|i| i[5]} + when 'issues' + @date_rank = @date_rank.sort{|i| i[6]} + when 'pullrequests' + @date_rank = @date_rank.sort{|i| i[7]} + when 'commits' + @date_rank = @date_rank.sort{|i| i[8]} + else + @date_rank = @date_rank.sort{|i| i[1]} + end + if params[:sort_direction].blank? || params[:sort_direction].to_s.downcase == "desc" + @date_rank = @date_rank.reverse + end + else + @date_rank = [] + end 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 get_timeable_key_names + begin + @names_array = [] + (begin_date..end_date).to_a.each do |i| + @names_array << "v2-project-rank-#{i}" + end + rescue + @names_array = [] + end end end \ No newline at end of file diff --git a/app/views/admins/projects_rank/index.html.erb b/app/views/admins/projects_rank/index.html.erb index d3a7926b..3ea7b8ae 100644 --- a/app/views/admins/projects_rank/index.html.erb +++ b/app/views/admins/projects_rank/index.html.erb @@ -6,69 +6,27 @@
<%= 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")%> + <%= select_tag(:begin_date, options_for_select(dates_array, params[:begin_date]), class:"form-control",id: "project-rank-begin-date-select")%> +
+
+ + <% dates_array = (0..30).to_a.map { |item| [(Date.today-item.days).to_s, (Date.today-item.days).to_s] } %> + <%= select_tag(:end_date, options_for_select(dates_array, params[:end_date]), class:"form-control",id: "project-rank-end-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"]%>"> - <%= "#{owner_common["name"]}/#{project_common["name"]}" %> - - <%= item[1] %><%= visits || 0 %><%= watchers || 0 %><%= praises || 0 %><%= forks || 0 %><%= issues || 0 %><%= pullrequests || 0 %><%= commits || 0 %>暂无数据
+
+ <%= render partial: 'admins/projects_rank/shared/data_list', locals: { date_rank: @date_rank } %>
\ No newline at end of file diff --git a/app/views/admins/projects_rank/index.js.erb b/app/views/admins/projects_rank/index.js.erb new file mode 100644 index 00000000..7e0f0e5f --- /dev/null +++ b/app/views/admins/projects_rank/index.js.erb @@ -0,0 +1 @@ +$('.project-rank-list-container').html("<%= j( render partial: 'admins/projects_rank/shared/data_list', locals: { date_rank: @date_rank } ) %>"); \ No newline at end of file diff --git a/app/views/admins/projects_rank/shared/_data_list.html.erb b/app/views/admins/projects_rank/shared/_data_list.html.erb new file mode 100644 index 00000000..06b41b45 --- /dev/null +++ b/app/views/admins/projects_rank/shared/_data_list.html.erb @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + <% 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"]}")%> + + + + + + + + + + + + <% end %> + +
排名项目得分<%= sort_tag('访问数', name: 'visits', path: admins_projects_rank_index_path) %><%= sort_tag('关注数', name: 'watchers', path: admins_projects_rank_index_path) %><%= sort_tag('点赞数', name: 'praises', path: admins_projects_rank_index_path) %><%= sort_tag('fork数', name: 'forks', path: admins_projects_rank_index_path) %><%= sort_tag('疑修数', name: 'issues', path: admins_projects_rank_index_path) %><%= sort_tag('合并请求数', name: 'pullrequests', path: admins_projects_rank_index_path) %><%= sort_tag('提交数', name: 'commits', path: admins_projects_rank_index_path) %>
<%= index + 1%> + /<%= project_common["identifier"]%>"> + <%= "#{owner_common["name"]}/#{project_common["name"]}" %> + + <%= item[1] %><%= item[2] %><%= item[3] %><%= item[4] %><%= item[5] %><%= item[6] %><%= item[7] %><%= item[8] %>
\ No newline at end of file From 016a2f8cf5c3278c3f180a71a5977955c66862c6 Mon Sep 17 00:00:00 2001 From: yystopf Date: Mon, 18 Dec 2023 16:04:14 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E5=90=8E?= =?UTF-8?q?=E5=8F=B0=E7=AE=A1=E7=90=86sidebar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/admins/shared/_sidebar.html.erb | 52 +++++++++++------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/app/views/admins/shared/_sidebar.html.erb b/app/views/admins/shared/_sidebar.html.erb index 813e2338..4db54507 100644 --- a/app/views/admins/shared/_sidebar.html.erb +++ b/app/views/admins/shared/_sidebar.html.erb @@ -13,13 +13,7 @@
    -
  • <%= sidebar_item(admins_path, '概览', icon: 'dashboard', controller: 'admins-dashboards') %>
  • -
  • - <%= sidebar_item_group('#rank-submenu', '排行榜', icon: 'calendar') do %> -
  • <%= sidebar_item(admins_users_rank_index_path, '用户排行榜', icon: 'user', controller: 'admins-users_rank') %>
  • -
  • <%= sidebar_item(admins_projects_rank_index_path, '项目排行榜', icon: 'database', controller: 'admins-projects_rank') %>
  • - <% end %> - +
  • <%= sidebar_item(admins_path, '数据概览', icon: 'dashboard', controller: 'admins-dashboards') %>
  • <%= sidebar_item_group('#user-submenu', '用户', icon: 'user') do %>
  • <%= sidebar_item(admins_users_path, '用户列表', icon: 'user', controller: 'admins-users') %>
  • @@ -27,15 +21,23 @@ <% end %> -
  • - <%= sidebar_item_group('#pages-submenu', '站点管理', icon: 'cogs') do %> -
  • <%= sidebar_item(admins_identity_verifications_path, '身份审核列表', icon: 'user', controller: 'admins-identity_verifications') %>
  • -
  • <%= sidebar_item(admins_site_pages_path, '用户站点列表', icon: 'sitemap', controller: 'admins-site_pages') %>
  • -
  • <%= sidebar_item(admins_page_themes_path, '站点主题配置', icon: 'cogs', controller: 'admins-page_themes') %>
  • - + <%= sidebar_item_group('#setting-submenu', '用户支持', icon: 'cogs') do %> +
  • <%= sidebar_item(admins_faqs_path, 'FAQ', icon: 'question-circle', controller: 'admins-faqs') %>
  • +
  • <%= sidebar_item(admins_nps_path, 'NPS用户调研', icon: 'question-circle', controller: 'admins-nps') %>
  • +
  • <%= sidebar_item(admins_feedbacks_path, '用户反馈', icon: 'question-circle', controller: 'admins-feedbacks') %>
  • +
  • <%= sidebar_item(admins_system_notifications_path, '系统公告配置', icon: 'bell', controller: 'admins-system_notifications') %>
  • <% end %> +
  • <%= sidebar_item(admins_laboratories_path, '导航栏配置', icon: 'cloud', controller: 'admins-laboratories') %>
  • +
  • + <%= sidebar_item_group('#setting-system', '开发者配置', icon: 'wrench') do %> +
  • <%= sidebar_item(admins_sites_path, 'setting接口配置', icon: 'deaf', controller: 'admins-sites') %>
  • +
  • <%= sidebar_item(admins_edu_settings_path, '全局变量配置', icon: 'pencil-square', controller: 'admins-edu_settings') %>
  • +
  • <%= sidebar_item(admins_message_templates_path, '消息模版配置', icon: 'folder', controller: 'admins-message_templates') %>
  • + <% end %> + +
  • <%= sidebar_item(admins_reversed_keywords_path, '禁用词管理', icon: 'key', controller: 'admins-reversed_keywords') %>
  • <%= sidebar_item_group('#projects-submenu', '开源项目', icon: 'database') do %>
  • <%= sidebar_item(admins_projects_path, '项目列表', icon: 'database', controller: 'admins-projects') %>
  • @@ -45,9 +47,6 @@
  • <%= sidebar_item(admins_project_ignores_path, '忽略文件', icon: 'git', controller: 'admins-project_ignores') %>
  • <% end %> - -
  • <%= sidebar_item(admins_reversed_keywords_path, '系统保留关键词', icon: 'key', controller: 'admins-reversed_keywords') %>
  • -
  • <%= sidebar_item(admins_laboratories_path, '云上实验室', icon: 'cloud', controller: 'admins-laboratories') %>
  • <%= sidebar_item_group('#setting-index', '首页配置', icon: 'file') do %>
  • <%= sidebar_item(admins_topic_banners_path, 'banner管理', icon: 'image', controller: 'admins-topic-banners') %>
  • @@ -71,25 +70,26 @@ <% end %>
  • - <%= sidebar_item_group('#setting-submenu', '网站建设', icon: 'cogs') do %> -
  • <%= sidebar_item(admins_faqs_path, 'FAQ', icon: 'question-circle', controller: 'admins-faqs') %>
  • -
  • <%= sidebar_item(admins_nps_path, 'NPS用户调研', icon: 'question-circle', controller: 'admins-nps') %>
  • -
  • <%= sidebar_item(admins_feedbacks_path, '用户反馈', icon: 'question-circle', controller: 'admins-feedbacks') %>
  • + <%= sidebar_item_group('#pages-submenu', '个人站点管理', icon: 'cogs') do %> +
  • <%= sidebar_item(admins_identity_verifications_path, '身份审核列表', icon: 'user', controller: 'admins-identity_verifications') %>
  • +
  • <%= sidebar_item(admins_site_pages_path, '用户站点列表', icon: 'sitemap', controller: 'admins-site_pages') %>
  • +
  • <%= sidebar_item(admins_page_themes_path, '站点主题配置', icon: 'cogs', controller: 'admins-page_themes') %>
  • + <% end %>
  • - <%= sidebar_item_group('#setting-system', '系统配置', icon: 'wrench') do %> -
  • <%= sidebar_item(admins_sites_path, 'setting接口配置', icon: 'deaf', controller: 'admins-sites') %>
  • -
  • <%= sidebar_item(admins_edu_settings_path, '全局变量配置', icon: 'pencil-square', controller: 'admins-edu_settings') %>
  • -
  • <%= sidebar_item(admins_system_notifications_path, '系统通知配置', icon: 'bell', controller: 'admins-system_notifications') %>
  • -
  • <%= sidebar_item(admins_message_templates_path, '消息模版配置', icon: 'folder', controller: 'admins-message_templates') %>
  • + <%= sidebar_item_group('#rank-submenu', '活跃度排行', icon: 'calendar') do %> +
  • <%= sidebar_item(admins_users_rank_index_path, '用户活跃度排行', icon: 'user', controller: 'admins-users_rank') %>
  • +
  • <%= sidebar_item(admins_projects_rank_index_path, '项目活跃度排行', icon: 'database', controller: 'admins-projects_rank') %>
  • <% end %> + + <%= render_admin_statistics_item %> +
  • <%= sidebar_item('/admins/sidekiq', '定时任务', icon: 'bell', controller: 'root') %>
  • - <%= render_admin_statistics_item %>
  • <%= sidebar_item('/', '返回主站', icon: 'sign-out', controller: 'root') %>
From 21f559f2547911ada4d73bb8a042d2d5f1ef6235 Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 19 Dec 2023 14:57:54 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E6=8E=92=E8=A1=8C=E6=A6=9C=E4=BD=BF=E7=94=A8=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=AD=98=E5=82=A8=E4=BB=A5=E5=8F=8A=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- .../admins/projects_rank_controller.rb | 96 +++++++------------ app/jobs/daily_project_statistics_job.rb | 32 +++++++ app/models/daily_project_statistic.rb | 28 ++++++ app/views/admins/projects_rank/index.html.erb | 30 +++--- app/views/admins/projects_rank/index.js.erb | 2 +- .../projects_rank/shared/_data_list.html.erb | 24 +++-- config/sidekiq_cron.yml | 5 + ...9020521_create_daily_project_statistics.rb | 19 ++++ 9 files changed, 153 insertions(+), 86 deletions(-) create mode 100644 app/jobs/daily_project_statistics_job.rb create mode 100644 app/models/daily_project_statistic.rb create mode 100644 db/migrate/20231219020521_create_daily_project_statistics.rb 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 df759872..c1f9722c 100644 --- a/app/controllers/admins/projects_rank_controller.rb +++ b/app/controllers/admins/projects_rank_controller.rb @@ -1,56 +1,17 @@ class Admins::ProjectsRankController < Admins::BaseController - before_action :get_timeable_key_names, only:[:index] def index - puts @names_array - unless @names_array.blank? - $redis_cache.zunionstore("admin-days-project-rank", @names_array) - deleted_data = $redis_cache.smembers("v2-project-rank-deleted") - $redis_cache.zrem("admin-days-project-rank", deleted_data) unless deleted_data.blank? - @date_rank = $redis_cache.zrevrange("admin-days-project-rank", 0, -1, withscores: true) - @date_rank = @date_rank.map do |i| - visits = 0 - watchers = 0 - praises = 0 - forks = 0 - issues = 0 - pullrequests = 0 - commits = 0 - (begin_date..end_date).to_a.each do |d| - result = $redis_cache.hgetall("v2-project-statistic:#{i[0]}-#{d}") - 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 - end - i + [visits,watchers,praises,forks,issues,pullrequests,commits] - end - case params[:sort_by] - when 'visits' - @date_rank = @date_rank.sort{|i| i[2]} - when 'watchers' - @date_rank = @date_rank.sort{|i| i[3]} - when 'praises' - @date_rank = @date_rank.sort{|i| i[4]} - when 'forks' - @date_rank = @date_rank.sort{|i| i[5]} - when 'issues' - @date_rank = @date_rank.sort{|i| i[6]} - when 'pullrequests' - @date_rank = @date_rank.sort{|i| i[7]} - when 'commits' - @date_rank = @date_rank.sort{|i| i[8]} - else - @date_rank = @date_rank.sort{|i| i[1]} - end - if params[:sort_direction].blank? || params[:sort_direction].to_s.downcase == "desc" - @date_rank = @date_rank.reverse - end - else - @date_rank = [] - end + @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 @@ -63,15 +24,32 @@ class Admins::ProjectsRankController < Admins::BaseController params.fetch(:end_date, Date.today.to_s) end - def get_timeable_key_names - begin - @names_array = [] - (begin_date..end_date).to_a.each do |i| - @names_array << "v2-project-rank-#{i}" - end - rescue - @names_array = [] + def sort_by + params.fetch(:sort_by, "score") + end + + def sort_direction + params.fetch(:sort_direction, "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 3ea7b8ae..e9d38afa 100644 --- a/app/views/admins/projects_rank/index.html.erb +++ b/app/views/admins/projects_rank/index.html.erb @@ -5,28 +5,34 @@
<%= 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(:begin_date, options_for_select(dates_array, params[:begin_date]), class:"form-control",id: "project-rank-begin-date-select")%> +
+ 开始日期 +
-
- - <% dates_array = (0..30).to_a.map { |item| [(Date.today-item.days).to_s, (Date.today-item.days).to_s] } %> - <%= select_tag(:end_date, options_for_select(dates_array, params[:end_date]), class:"form-control",id: "project-rank-end-date-select")%> +
+ 结束日期 +
<% end %> - + <%= link_to '导出', "/项目活跃度排行.xls", class: 'btn btn-primary mr-3' %>
- <%= render partial: 'admins/projects_rank/shared/data_list', locals: { date_rank: @date_rank } %> + <%= render partial: 'admins/projects_rank/shared/data_list', locals: { statistics: @statistics } %>
\ No newline at end of file diff --git a/app/views/admins/projects_rank/index.js.erb b/app/views/admins/projects_rank/index.js.erb index 7e0f0e5f..0d36dd86 100644 --- a/app/views/admins/projects_rank/index.js.erb +++ b/app/views/admins/projects_rank/index.js.erb @@ -1 +1 @@ -$('.project-rank-list-container').html("<%= j( render partial: 'admins/projects_rank/shared/data_list', locals: { date_rank: @date_rank } ) %>"); \ No newline at end of file +$('.project-rank-list-container').html("<%= j( render partial: 'admins/projects_rank/shared/data_list', locals: { statistics: @statistics } ) %>"); \ No newline at end of file diff --git a/app/views/admins/projects_rank/shared/_data_list.html.erb b/app/views/admins/projects_rank/shared/_data_list.html.erb index 06b41b45..bb9f4577 100644 --- a/app/views/admins/projects_rank/shared/_data_list.html.erb +++ b/app/views/admins/projects_rank/shared/_data_list.html.erb @@ -14,25 +14,23 @@ - <% date_rank.each_with_index do |item, index| %> + <% statistics.each_with_index do |item, index| %> <%= index + 1%> - <% project_common = $redis_cache.hgetall("v2-project-common:#{item[0]}") %> - <% owner_common = $redis_cache.hgetall("v2-owner-common:#{project_common["owner_id"]}")%> - /<%= project_common["identifier"]%>"> - <%= "#{owner_common["name"]}/#{project_common["name"]}" %> + "> + <%= "#{item&.project&.owner&.nickname}/#{item&.project&.name}" %> - <%= item[1] %> - <%= item[2] %> - <%= item[3] %> - <%= item[4] %> - <%= item[5] %> - <%= item[6] %> - <%= item[7] %> - <%= item[8] %> + <%= item&.score %> + <%= item&.visits %> + <%= item&.watchers %> + <%= item&.praises %> + <%= item&.forks %> + <%= item&.issues %> + <%= item&.pullrequests %> + <%= item&.commits %> <% end %> diff --git a/config/sidekiq_cron.yml b/config/sidekiq_cron.yml index 448e9c94..0ec8f997 100644 --- a/config/sidekiq_cron.yml +++ b/config/sidekiq_cron.yml @@ -7,3 +7,8 @@ delay_expired_issue: cron: "0 0 * * *" class: "DelayExpiredIssueJob" queue: message + +create_daily_project_statistics: + cron: "0 1 * * *" + class: "DailyProjectStatisticsJob" + queue: cache \ No newline at end of file diff --git a/db/migrate/20231219020521_create_daily_project_statistics.rb b/db/migrate/20231219020521_create_daily_project_statistics.rb new file mode 100644 index 00000000..4465154d --- /dev/null +++ b/db/migrate/20231219020521_create_daily_project_statistics.rb @@ -0,0 +1,19 @@ +class CreateDailyProjectStatistics < ActiveRecord::Migration[5.2] + def change + create_table :daily_project_statistics do |t| + t.references :project + t.date :date + t.index :date + t.integer :score, default: 0 + t.integer :visits, default: 0 + t.integer :watchers, default: 0 + t.integer :praises, default: 0 + t.integer :forks, default: 0 + t.integer :issues, default: 0 + t.integer :pullrequests, default: 0 + t.integer :commits, default: 0 + + t.timestamps + end + end +end From 26461f3a4407838b907c9ef1c1cdf7d5feed5c18 Mon Sep 17 00:00:00 2001 From: yystopf Date: Tue, 19 Dec 2023 15:05:00 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E9=98=B2?= =?UTF-8?q?=E6=AD=A2sql=E6=B3=A8=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/admins/projects_rank_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/admins/projects_rank_controller.rb b/app/controllers/admins/projects_rank_controller.rb index c1f9722c..bee024f8 100644 --- a/app/controllers/admins/projects_rank_controller.rb +++ b/app/controllers/admins/projects_rank_controller.rb @@ -25,11 +25,11 @@ class Admins::ProjectsRankController < Admins::BaseController end def sort_by - params.fetch(:sort_by, "score") + DailyProjectStatistic.column_names.include?(params.fetch(:sort_by, "score")) ? params.fetch(:sort_by, "score") : "score" end def sort_direction - params.fetch(:sort_direction, "desc") + %w(desc asc).include?(params.fetch(:sort_direction, "desc")) ? params.fetch(:sort_direction, "desc") : "desc" end def export_excel(data)