Merge pull request '后台管理更新' (#238) from gitlink_admin_feature into standalone_develop
This commit is contained in:
commit
1d48af015e
|
@ -84,4 +84,5 @@ redis_data/
|
||||||
dump.rdb
|
dump.rdb
|
||||||
.tags*
|
.tags*
|
||||||
ceshi_user.xlsx
|
ceshi_user.xlsx
|
||||||
public/trace_task_results
|
public/trace_task_results
|
||||||
|
public/项目活跃度排行.xls
|
|
@ -1,16 +1,55 @@
|
||||||
class Admins::ProjectsRankController < Admins::BaseController
|
class Admins::ProjectsRankController < Admins::BaseController
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@rank_date = rank_date
|
@statistics = DailyProjectStatistic.where("date >= ? AND date <= ?", begin_date, end_date)
|
||||||
deleted_data = $redis_cache.smembers("v2-project-rank-deleted")
|
@statistics = @statistics.group(:project_id).select("project_id,
|
||||||
$redis_cache.zrem("v2-project-rank-#{rank_date}", deleted_data) unless deleted_data.blank?
|
sum(score) as score,
|
||||||
@date_rank = $redis_cache.zrevrange("v2-project-rank-#{rank_date}", 0, -1, withscores: true)
|
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
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def rank_date
|
def begin_date
|
||||||
params.fetch(:date, Date.today.to_s)
|
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
|
||||||
|
|
||||||
end
|
end
|
|
@ -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
|
|
@ -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
|
|
@ -5,70 +5,34 @@
|
||||||
|
|
||||||
<div class="box search-form-container user-list-form">
|
<div class="box search-form-container user-list-form">
|
||||||
<%= form_tag(admins_projects_rank_index_path, method: :get, class: 'form-inline search-form flex-1', id: 'project-rank-date-form') do %>
|
<%= form_tag(admins_projects_rank_index_path, method: :get, class: 'form-inline search-form flex-1', id: 'project-rank-date-form') do %>
|
||||||
<div class="form-group mr-2">
|
<div class="input-group">
|
||||||
<label for="status">日期:</label>
|
<span class="input-group-text">开始日期</span>
|
||||||
<% dates_array = (0..30).to_a.map { |item| [(Date.today-item.days).to_s, (Date.today-item.days).to_s] } %>
|
<input class="form-control datetimepicker" type="text" name="begin_date" value="<%= params[:begin_date] || Date.today.to_s%>" aria-label="选择日期">
|
||||||
<%= select_tag(:date, options_for_select(dates_array, params[:date]), class:"form-control",id: "project-rank-date-select")%>
|
</div>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-text">结束日期</span>
|
||||||
|
<input class="form-control datetimepicker" type="text" name="end_date" value="<%= params[:end_date] || Date.today.to_s%>" aria-label="选择日期">
|
||||||
</div>
|
</div>
|
||||||
<% end %>
|
<% end %>
|
||||||
|
<%= link_to '导出', "/项目活跃度排行.xls", class: 'btn btn-primary mr-3' %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="box admin-list-container project-language-list-container">
|
<div class="box admin-list-container project-rank-list-container">
|
||||||
<table class="table table-hover text-center subject-list-table">
|
<%= render partial: 'admins/projects_rank/shared/data_list', locals: { statistics: @statistics } %>
|
||||||
<thead class="thead-light">
|
|
||||||
<tr>
|
|
||||||
<th width="20%">排名</th>
|
|
||||||
<th width="30%">项目</th>
|
|
||||||
<th width="10%">得分</th>
|
|
||||||
<th width="10%">访问数</th>
|
|
||||||
<th width="10%">关注数</th>
|
|
||||||
<th width="10%">点赞数</th>
|
|
||||||
<th width="10%">fork数</th>
|
|
||||||
<th width="10%">疑修数</th>
|
|
||||||
<th width="10%">合并请求数</th>
|
|
||||||
<th width="10%">提交数</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
<% @date_rank.each_with_index do |item, index| %>
|
|
||||||
<tr class="">
|
|
||||||
<td><%= index + 1%></td>
|
|
||||||
<% project_common = $redis_cache.hgetall("v2-project-common:#{item[0]}") %>
|
|
||||||
<% owner_common = $redis_cache.hgetall("v2-owner-common:#{project_common["owner_id"]}")%>
|
|
||||||
<td>
|
|
||||||
<a href="/<%= owner_common["login"] %>/<%= project_common["identifier"]%>">
|
|
||||||
<%= "#{owner_common["name"]}/#{project_common["name"]}" %>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
|
|
||||||
<td><%= item[1] %></td>
|
|
||||||
<% 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") %>
|
|
||||||
<td><%= visits || 0 %></td>
|
|
||||||
<% watchers = $redis_cache.hget(project_date_statistic_key, "watchers") %>
|
|
||||||
<td><%= watchers || 0 %></td>
|
|
||||||
<% praises = $redis_cache.hget(project_date_statistic_key, "praises") %>
|
|
||||||
<td><%= praises || 0 %></td>
|
|
||||||
<% forks = $redis_cache.hget(project_date_statistic_key, "forks") %>
|
|
||||||
<td><%= forks || 0 %></td>
|
|
||||||
<% issues = $redis_cache.hget(project_date_statistic_key, "issues") %>
|
|
||||||
<td><%= issues || 0 %></td>
|
|
||||||
<% pullrequests = $redis_cache.hget(project_date_statistic_key, "pullrequests") %>
|
|
||||||
<td><%= pullrequests || 0 %></td>
|
|
||||||
<% commits = $redis_cache.hget(project_date_statistic_key, "commits") %>
|
|
||||||
<td><%= commits || 0 %></td>
|
|
||||||
<% else %>
|
|
||||||
<td colspan="7">暂无数据</td>
|
|
||||||
<% end %>
|
|
||||||
</tr>
|
|
||||||
<% end %>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
$("#project-rank-date-select").on('change', function() {
|
$(".datetimepicker").on('change', function() {
|
||||||
$("#project-rank-date-form").submit()
|
$("#project-rank-date-form").submit()
|
||||||
});
|
});
|
||||||
|
$(".datetimepicker").on('change', function() {
|
||||||
|
$("#project-rank-date-form").submit()
|
||||||
|
});
|
||||||
|
$('.datetimepicker').datetimepicker({
|
||||||
|
language: 'zh-CN', // 中文语言包
|
||||||
|
autoclose: 1, // 选中日期后自动关闭
|
||||||
|
format: 'yyyy-mm-dd', // 日期格式
|
||||||
|
minView: "month", // 最小日期显示单元,这里最小显示月份界面,即可以选择到日
|
||||||
|
todayBtn: 1, // 显示今天按钮
|
||||||
|
todayHighlight: 1, // 显示今天高亮
|
||||||
|
});
|
||||||
</script>
|
</script>
|
|
@ -0,0 +1 @@
|
||||||
|
$('.project-rank-list-container').html("<%= j( render partial: 'admins/projects_rank/shared/data_list', locals: { statistics: @statistics } ) %>");
|
|
@ -0,0 +1,37 @@
|
||||||
|
<table class="table table-hover text-center subject-list-table">
|
||||||
|
<thead class="thead-light">
|
||||||
|
<tr>
|
||||||
|
<th width="20%">排名</th>
|
||||||
|
<th width="30%">项目</th>
|
||||||
|
<th width="10%">得分</th>
|
||||||
|
<th width="10%"><%= sort_tag('访问数', name: 'visits', path: admins_projects_rank_index_path) %></th>
|
||||||
|
<th width="10%"><%= sort_tag('关注数', name: 'watchers', path: admins_projects_rank_index_path) %></th>
|
||||||
|
<th width="10%"><%= sort_tag('点赞数', name: 'praises', path: admins_projects_rank_index_path) %></th>
|
||||||
|
<th width="10%"><%= sort_tag('fork数', name: 'forks', path: admins_projects_rank_index_path) %></th>
|
||||||
|
<th width="10%"><%= sort_tag('疑修数', name: 'issues', path: admins_projects_rank_index_path) %></th>
|
||||||
|
<th width="10%"><%= sort_tag('合并请求数', name: 'pullrequests', path: admins_projects_rank_index_path) %></th>
|
||||||
|
<th width="10%"><%= sort_tag('提交数', name: 'commits', path: admins_projects_rank_index_path) %></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<% statistics.each_with_index do |item, index| %>
|
||||||
|
<tr class="">
|
||||||
|
<td><%= index + 1%></td>
|
||||||
|
<td>
|
||||||
|
<a href="<%= "/#{item&.project&.owner&.login}/#{item&.project&.identifier}"%>">
|
||||||
|
<%= "#{item&.project&.owner&.nickname}/#{item&.project&.name}" %>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td><%= item&.score %></td>
|
||||||
|
<td><%= item&.visits %></td>
|
||||||
|
<td><%= item&.watchers %></td>
|
||||||
|
<td><%= item&.praises %></td>
|
||||||
|
<td><%= item&.forks %></td>
|
||||||
|
<td><%= item&.issues %></td>
|
||||||
|
<td><%= item&.pullrequests %></td>
|
||||||
|
<td><%= item&.commits %></td>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
|
@ -13,13 +13,7 @@
|
||||||
|
|
||||||
<!-- Sidebar Links -->
|
<!-- Sidebar Links -->
|
||||||
<ul class="list-unstyled components">
|
<ul class="list-unstyled components">
|
||||||
<li><%= sidebar_item(admins_path, '概览', icon: 'dashboard', controller: 'admins-dashboards') %></li>
|
<li><%= sidebar_item(admins_path, '数据概览', icon: 'dashboard', controller: 'admins-dashboards') %></li>
|
||||||
<li>
|
|
||||||
<%= sidebar_item_group('#rank-submenu', '排行榜', icon: 'calendar') do %>
|
|
||||||
<li><%= sidebar_item(admins_users_rank_index_path, '用户排行榜', icon: 'user', controller: 'admins-users_rank') %></li>
|
|
||||||
<li><%= sidebar_item(admins_projects_rank_index_path, '项目排行榜', icon: 'database', controller: 'admins-projects_rank') %></li>
|
|
||||||
<% end %>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<%= sidebar_item_group('#user-submenu', '用户', icon: 'user') do %>
|
<%= sidebar_item_group('#user-submenu', '用户', icon: 'user') do %>
|
||||||
<li><%= sidebar_item(admins_users_path, '用户列表', icon: 'user', controller: 'admins-users') %></li>
|
<li><%= sidebar_item(admins_users_path, '用户列表', icon: 'user', controller: 'admins-users') %></li>
|
||||||
|
@ -27,15 +21,23 @@
|
||||||
|
|
||||||
<% end %>
|
<% end %>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<%= sidebar_item_group('#pages-submenu', '站点管理', icon: 'cogs') do %>
|
<%= sidebar_item_group('#setting-submenu', '用户支持', icon: 'cogs') do %>
|
||||||
<li><%= sidebar_item(admins_identity_verifications_path, '身份审核列表', icon: 'user', controller: 'admins-identity_verifications') %></li>
|
<li><%= sidebar_item(admins_faqs_path, 'FAQ', icon: 'question-circle', controller: 'admins-faqs') %></li>
|
||||||
<li><%= sidebar_item(admins_site_pages_path, '用户站点列表', icon: 'sitemap', controller: 'admins-site_pages') %></li>
|
<li><%= sidebar_item(admins_nps_path, 'NPS用户调研', icon: 'question-circle', controller: 'admins-nps') %></li>
|
||||||
<li><%= sidebar_item(admins_page_themes_path, '站点主题配置', icon: 'cogs', controller: 'admins-page_themes') %></li>
|
<li><%= sidebar_item(admins_feedbacks_path, '用户反馈', icon: 'question-circle', controller: 'admins-feedbacks') %></li>
|
||||||
|
<li><%= sidebar_item(admins_system_notifications_path, '系统公告配置', icon: 'bell', controller: 'admins-system_notifications') %></li>
|
||||||
<% end %>
|
<% end %>
|
||||||
</li>
|
</li>
|
||||||
|
<li><%= sidebar_item(admins_laboratories_path, '导航栏配置', icon: 'cloud', controller: 'admins-laboratories') %></li>
|
||||||
|
<li>
|
||||||
|
<%= sidebar_item_group('#setting-system', '开发者配置', icon: 'wrench') do %>
|
||||||
|
<li><%= sidebar_item(admins_sites_path, 'setting接口配置', icon: 'deaf', controller: 'admins-sites') %></li>
|
||||||
|
<li><%= sidebar_item(admins_edu_settings_path, '全局变量配置', icon: 'pencil-square', controller: 'admins-edu_settings') %></li>
|
||||||
|
<li><%= sidebar_item(admins_message_templates_path, '消息模版配置', icon: 'folder', controller: 'admins-message_templates') %></li>
|
||||||
|
<% end %>
|
||||||
|
</li>
|
||||||
|
<li><%= sidebar_item(admins_reversed_keywords_path, '禁用词管理', icon: 'key', controller: 'admins-reversed_keywords') %></li>
|
||||||
<li>
|
<li>
|
||||||
<%= sidebar_item_group('#projects-submenu', '开源项目', icon: 'database') do %>
|
<%= sidebar_item_group('#projects-submenu', '开源项目', icon: 'database') do %>
|
||||||
<li><%= sidebar_item(admins_projects_path, '项目列表', icon: 'database', controller: 'admins-projects') %></li>
|
<li><%= sidebar_item(admins_projects_path, '项目列表', icon: 'database', controller: 'admins-projects') %></li>
|
||||||
|
@ -45,9 +47,6 @@
|
||||||
<li><%= sidebar_item(admins_project_ignores_path, '忽略文件', icon: 'git', controller: 'admins-project_ignores') %></li>
|
<li><%= sidebar_item(admins_project_ignores_path, '忽略文件', icon: 'git', controller: 'admins-project_ignores') %></li>
|
||||||
<% end %>
|
<% end %>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li><%= sidebar_item(admins_reversed_keywords_path, '系统保留关键词', icon: 'key', controller: 'admins-reversed_keywords') %></li>
|
|
||||||
<li><%= sidebar_item(admins_laboratories_path, '云上实验室', icon: 'cloud', controller: 'admins-laboratories') %></li>
|
|
||||||
<li>
|
<li>
|
||||||
<%= sidebar_item_group('#setting-index', '首页配置', icon: 'file') do %>
|
<%= sidebar_item_group('#setting-index', '首页配置', icon: 'file') do %>
|
||||||
<li><%= sidebar_item(admins_topic_banners_path, 'banner管理', icon: 'image', controller: 'admins-topic-banners') %></li>
|
<li><%= sidebar_item(admins_topic_banners_path, 'banner管理', icon: 'image', controller: 'admins-topic-banners') %></li>
|
||||||
|
@ -71,25 +70,26 @@
|
||||||
<% end %>
|
<% end %>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<%= sidebar_item_group('#setting-submenu', '网站建设', icon: 'cogs') do %>
|
<%= sidebar_item_group('#pages-submenu', '个人站点管理', icon: 'cogs') do %>
|
||||||
<li><%= sidebar_item(admins_faqs_path, 'FAQ', icon: 'question-circle', controller: 'admins-faqs') %></li>
|
<li><%= sidebar_item(admins_identity_verifications_path, '身份审核列表', icon: 'user', controller: 'admins-identity_verifications') %></li>
|
||||||
<li><%= sidebar_item(admins_nps_path, 'NPS用户调研', icon: 'question-circle', controller: 'admins-nps') %></li>
|
<li><%= sidebar_item(admins_site_pages_path, '用户站点列表', icon: 'sitemap', controller: 'admins-site_pages') %></li>
|
||||||
<li><%= sidebar_item(admins_feedbacks_path, '用户反馈', icon: 'question-circle', controller: 'admins-feedbacks') %></li>
|
<li><%= sidebar_item(admins_page_themes_path, '站点主题配置', icon: 'cogs', controller: 'admins-page_themes') %></li>
|
||||||
|
|
||||||
<% end %>
|
<% end %>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<%= sidebar_item_group('#setting-system', '系统配置', icon: 'wrench') do %>
|
<%= sidebar_item_group('#rank-submenu', '活跃度排行', icon: 'calendar') do %>
|
||||||
<li><%= sidebar_item(admins_sites_path, 'setting接口配置', icon: 'deaf', controller: 'admins-sites') %></li>
|
<li><%= sidebar_item(admins_users_rank_index_path, '用户活跃度排行', icon: 'user', controller: 'admins-users_rank') %></li>
|
||||||
<li><%= sidebar_item(admins_edu_settings_path, '全局变量配置', icon: 'pencil-square', controller: 'admins-edu_settings') %></li>
|
<li><%= sidebar_item(admins_projects_rank_index_path, '项目活跃度排行', icon: 'database', controller: 'admins-projects_rank') %></li>
|
||||||
<li><%= sidebar_item(admins_system_notifications_path, '系统通知配置', icon: 'bell', controller: 'admins-system_notifications') %></li>
|
|
||||||
<li><%= sidebar_item(admins_message_templates_path, '消息模版配置', icon: 'folder', controller: 'admins-message_templates') %></li>
|
|
||||||
<% end %>
|
<% end %>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
<%= render_admin_statistics_item %>
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<%= sidebar_item('/admins/sidekiq', '定时任务', icon: 'bell', controller: 'root') %>
|
<%= sidebar_item('/admins/sidekiq', '定时任务', icon: 'bell', controller: 'root') %>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<%= render_admin_statistics_item %>
|
|
||||||
|
|
||||||
<li><%= sidebar_item('/', '返回主站', icon: 'sign-out', controller: 'root') %></li>
|
<li><%= sidebar_item('/', '返回主站', icon: 'sign-out', controller: 'root') %></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -7,3 +7,8 @@ delay_expired_issue:
|
||||||
cron: "0 0 * * *"
|
cron: "0 0 * * *"
|
||||||
class: "DelayExpiredIssueJob"
|
class: "DelayExpiredIssueJob"
|
||||||
queue: message
|
queue: message
|
||||||
|
|
||||||
|
create_daily_project_statistics:
|
||||||
|
cron: "0 1 * * *"
|
||||||
|
class: "DailyProjectStatisticsJob"
|
||||||
|
queue: cache
|
|
@ -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
|
Loading…
Reference in New Issue