From 383660c778ee1bc08f86e587613583559d4fa829 Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 15 Sep 2022 09:38:28 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E6=9B=B4=E6=94=B9=EF=BC=9A=E7=BB=84?= =?UTF-8?q?=E7=BB=87=E7=BC=93=E5=AD=98=E4=BF=A1=E6=81=AF=E6=96=B9=E5=BC=8F?= =?UTF-8?q?=E6=94=B9=E5=9C=A8=E6=8E=A7=E5=88=B6=E5=99=A8=E9=87=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/organizations/organizations_controller.rb | 2 ++ app/models/organization.rb | 8 ++++---- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/controllers/organizations/organizations_controller.rb b/app/controllers/organizations/organizations_controller.rb index 58aa0d29d..0ae113590 100644 --- a/app/controllers/organizations/organizations_controller.rb +++ b/app/controllers/organizations/organizations_controller.rb @@ -31,6 +31,7 @@ class Organizations::OrganizationsController < Organizations::BaseController Organizations::CreateForm.new(organization_params.merge(original_name: "")).validate! @organization = Organizations::CreateService.call(current_user, organization_params) Util.write_file(@image, avatar_path(@organization)) if params[:image].present? + Cache::V2::OwnerCommonService.new(@organization.id).reset end rescue Exception => e uid_logger_error(e.message) @@ -48,6 +49,7 @@ class Organizations::OrganizationsController < Organizations::BaseController Gitea::Organization::UpdateService.call(current_user.gitea_token, login, @organization.reload) Util.write_file(@image, avatar_path(@organization)) if params[:image].present? + Cache::V2::OwnerCommonService.new(@organization.id).reset end rescue Exception => e uid_logger_error(e.message) diff --git a/app/models/organization.rb b/app/models/organization.rb index 56351a415..adf43a2cd 100644 --- a/app/models/organization.rb +++ b/app/models/organization.rb @@ -81,15 +81,15 @@ class Organization < Owner scope :with_visibility, ->(visibility) { joins(:organization_extension).where(organization_extensions: {visibility: visibility}) if visibility.present? } - after_save :reset_cache_data + # after_save :reset_cache_data def gitea_token team_users.joins(:team).where(teams: {authorize: "owner"}).take&.user&.gitea_token end - def reset_cache_data - Cache::V2::OwnerCommonService.new(self.id).reset - end + # def reset_cache_data + # Cache::V2::OwnerCommonService.new(self.id).reset + # end def self.build(name, nickname, gitea_token=nil) self.create!(login: name, nickname: nickname, gitea_token: gitea_token) From 733f64eaec316717e8bdd26d18ee41ef2748e513 Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 15 Sep 2022 09:44:12 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E6=8E=92=E8=A1=8C=E6=A6=9C=E6=96=B0=E5=A2=9E=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E6=95=B0=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/commit_log.rb | 11 +++++++++++ app/services/cache/v2/project_common_service.rb | 17 ++++++++++++++++- .../cache/v2/project_date_rank_service.rb | 9 +++++++-- app/services/cache/v2/project_rank_service.rb | 10 +++++++--- 4 files changed, 41 insertions(+), 6 deletions(-) diff --git a/app/models/commit_log.rb b/app/models/commit_log.rb index 9b51b0631..326872b36 100644 --- a/app/models/commit_log.rb +++ b/app/models/commit_log.rb @@ -3,4 +3,15 @@ class CommitLog < ApplicationRecord belongs_to :project belongs_to :repository + after_create :incre_project_common + after_destroy :decre_project_common + + def incre_project_common + CacheAsyncSetJob.perform_later("project_common_service", {commits: 1}, self.project_id) + end + + def decre_project_common + CacheAsyncSetJob.perform_later("project_common_service", {commits: -1}, self.project_id) + end + end diff --git a/app/services/cache/v2/project_common_service.rb b/app/services/cache/v2/project_common_service.rb index 8ed0a0636..97023ae29 100644 --- a/app/services/cache/v2/project_common_service.rb +++ b/app/services/cache/v2/project_common_service.rb @@ -1,5 +1,5 @@ class Cache::V2::ProjectCommonService < ApplicationService - attr_reader :project_id, :owner_id, :name, :identifier, :description, :visits, :watchers, :praises, :forks, :issues, :pullrequests + attr_reader :project_id, :owner_id, :name, :identifier, :description, :visits, :watchers, :praises, :forks, :issues, :pullrequests, :commits attr_accessor :project def initialize(project_id, params={}) @@ -14,6 +14,7 @@ class Cache::V2::ProjectCommonService < ApplicationService @forks = params[:forks] @issues = params[:issues] @pullrequests = params[:pullrequests] + @commits = params[:commits] end def read @@ -81,6 +82,10 @@ class Cache::V2::ProjectCommonService < ApplicationService "pullrequests" end + def commits_key + "commits" + end + def project_common result = $redis_cache.hgetall(project_common_key) result.blank? ? reset_project_common : result @@ -149,6 +154,11 @@ class Cache::V2::ProjectCommonService < ApplicationService Cache::V2::ProjectRankService.call(@project_id, {pullrequests: @pullrequests}) Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {pullrequests: @pullrequests}) end + if @commits.present? + $redis_cache.hincrby(project_common_key, commits_key, @commits) + Cache::V2::ProjectRankService.call(@project_id, {commits: @commits}) + Cache::V2::ProjectDateRankService.call(@project_id, Date.today, {commits: @commits}) + end end $redis_cache.hgetall(project_common_key) @@ -194,6 +204,10 @@ class Cache::V2::ProjectCommonService < ApplicationService $redis_cache.hset(project_common_key, pullrequests_key, PullRequest.where(project_id: @project_id).count) end + def reset_project_commits + $redis_cache.hset(project_common_key, commits_key, CommitLog.where(project_id: @project_id).count) + end + def reset_project_common load_project return unless @project.present? @@ -209,6 +223,7 @@ class Cache::V2::ProjectCommonService < ApplicationService reset_project_forks reset_project_issues reset_project_pullrequests + reset_project_commits $redis_cache.hgetall(project_common_key) end diff --git a/app/services/cache/v2/project_date_rank_service.rb b/app/services/cache/v2/project_date_rank_service.rb index 092aff796..08aae6f77 100644 --- a/app/services/cache/v2/project_date_rank_service.rb +++ b/app/services/cache/v2/project_date_rank_service.rb @@ -1,5 +1,6 @@ +# 项目日活跃度计算存储 class Cache::V2::ProjectDateRankService < ApplicationService - attr_reader :project_id, :rank_date, :visits, :praises, :forks, :issues, :pullrequests + attr_reader :project_id, :rank_date, :visits, :praises, :forks, :issues, :pullrequests, :commits attr_accessor :project_common def initialize(project_id, rank_date=Date.today, params={}) @@ -10,6 +11,7 @@ class Cache::V2::ProjectDateRankService < ApplicationService @forks = params[:forks] @issues = params[:issues] @pullrequests = params[:pullrequests] + @commits = params[:commits] end def read @@ -37,7 +39,7 @@ class Cache::V2::ProjectDateRankService < ApplicationService $redis_cache.zincrby(project_rank_key, @praises.to_i * 5, @project_id) end if @forks.present? - $redis_cache.zincrby(project_rank_key, @forks.to_i * 5, @project_id) + $redis_cache.zincrby(project_rank_key, @forks.to_i * 10, @project_id) end if @issues.present? $redis_cache.zincrby(project_rank_key, @issues.to_i * 10, @project_id) @@ -45,6 +47,9 @@ class Cache::V2::ProjectDateRankService < ApplicationService if @pullrequests.present? $redis_cache.zincrby(project_rank_key, @pullrequests.to_i * 10, @project_id) end + if @commits.present? + $redis_cache.zincrby(project_rank_key, @commits.to_i * 1, @project_id) + end $redis_cache.zscore(project_rank_key, @project_id) end diff --git a/app/services/cache/v2/project_rank_service.rb b/app/services/cache/v2/project_rank_service.rb index 7e5d323bf..3265c0a6c 100644 --- a/app/services/cache/v2/project_rank_service.rb +++ b/app/services/cache/v2/project_rank_service.rb @@ -1,5 +1,5 @@ class Cache::V2::ProjectRankService < ApplicationService - attr_reader :project_id, :visits, :praises, :forks, :issues, :pullrequests + attr_reader :project_id, :visits, :praises, :forks, :issues, :pullrequests, :commits attr_accessor :project_common def initialize(project_id, params={}) @@ -9,6 +9,7 @@ class Cache::V2::ProjectRankService < ApplicationService @forks = params[:forks] @issues = params[:issues] @pullrequests = params[:pullrequests] + @commits = params[:commits] end def read @@ -54,7 +55,7 @@ class Cache::V2::ProjectRankService < ApplicationService $redis_cache.zincrby(project_rank_key, @praises.to_i * 5, @project_id) end if @forks.present? - $redis_cache.zincrby(project_rank_key, @forks.to_i * 5, @project_id) + $redis_cache.zincrby(project_rank_key, @forks.to_i * 10, @project_id) end if @issues.present? $redis_cache.zincrby(project_rank_key, @issues.to_i * 10, @project_id) @@ -62,6 +63,9 @@ class Cache::V2::ProjectRankService < ApplicationService if @pullrequests.present? $redis_cache.zincrby(project_rank_key, @pullrequests.to_i * 10, @project_id) end + if @commits.present? + $redis_cache.zincrby(project_rank_key, @commits.to_i * 1, @project_id) + end reset_user_project_rank end @@ -70,7 +74,7 @@ class Cache::V2::ProjectRankService < ApplicationService def reset_project_rank load_project_common - score = @project_common["visits"].to_i * 1 + @project_common["praises"].to_i * 5 + @project_common["forks"].to_i * 5 + @project_common["issues"].to_i * 10 + @project_common["pullrequests"].to_i * 10 + score = @project_common["visits"].to_i * 1 + @project_common["praises"].to_i * 5 + @project_common["forks"].to_i * 10 + @project_common["issues"].to_i * 10 + @project_common["pullrequests"].to_i * 10 + @project_common["commits"].to_i * 1 $redis_cache.zadd(project_rank_key, score, @project_id) reset_user_project_rank From 481d1b7db0f77780c6ba168354a34371a8a0d959 Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 15 Sep 2022 09:57:28 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9Acommit=20log?= =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E8=A7=A6=E5=8F=91=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/commit_logs_controller.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/controllers/commit_logs_controller.rb b/app/controllers/commit_logs_controller.rb index 3be1794a7..cc071340e 100644 --- a/app/controllers/commit_logs_controller.rb +++ b/app/controllers/commit_logs_controller.rb @@ -22,6 +22,8 @@ class CommitLogsController < ApplicationController CommitLog.create(user: user, project: project, repository_id: repository_id, name: repository_name, full_name: repository_full_name, ref: ref, commit_id: commit_id, message: message) + # 统计数据新增 + CacheAsyncSetJob.perform_later("project_common_service", {commits: 1}, project.id) end end From 007b90c28450823ba6517cd1efcc1c036de41e96 Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 15 Sep 2022 10:00:00 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=97=A7=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/commit_log.rb | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/app/models/commit_log.rb b/app/models/commit_log.rb index 326872b36..9b51b0631 100644 --- a/app/models/commit_log.rb +++ b/app/models/commit_log.rb @@ -3,15 +3,4 @@ class CommitLog < ApplicationRecord belongs_to :project belongs_to :repository - after_create :incre_project_common - after_destroy :decre_project_common - - def incre_project_common - CacheAsyncSetJob.perform_later("project_common_service", {commits: 1}, self.project_id) - end - - def decre_project_common - CacheAsyncSetJob.perform_later("project_common_service", {commits: -1}, self.project_id) - end - end From dfc2c6822533a467944223b81ec88cf528a64b61 Mon Sep 17 00:00:00 2001 From: yystopf Date: Thu, 15 Sep 2022 10:21:39 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=90=8E=E5=8F=B0=E6=96=B0=E5=A2=9E=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E7=AD=9B=E9=80=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/queries/admins/user_query.rb | 9 +++++++++ app/views/admins/users/index.html.erb | 6 +++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/app/queries/admins/user_query.rb b/app/queries/admins/user_query.rb index dabfa9c5e..6187f2ecc 100644 --- a/app/queries/admins/user_query.rb +++ b/app/queries/admins/user_query.rb @@ -30,6 +30,15 @@ class Admins::UserQuery < ApplicationQuery users = users.joins(user_extension: :school).where(schools: { auto_users_trial: params[:auto_trial].to_i == 1 }) end + # 第三方账户类型 + if params[:open_user_type].present? + if params[:open_user_type] == "Forge" + users = users.left_joins(:open_users).where(open_users: {id: nil}) + else + users = users.joins(:open_users).where(open_users: {type: params[:open_user_type]}) + end + end + # 关键字检索 keyword = params[:keyword].to_s.strip.presence if keyword diff --git a/app/views/admins/users/index.html.erb b/app/views/admins/users/index.html.erb index 42d85108d..4ba38c39a 100644 --- a/app/views/admins/users/index.html.erb +++ b/app/views/admins/users/index.html.erb @@ -15,7 +15,11 @@ <% identity_options = [['全部', ''], ['教师', 0], ['学生', 1], ['专业人士', 2]] %> <%= select_tag(:identity, options_for_select(identity_options), class: 'form-control') %> - +
+ + <% open_user_type_options = [['所有用户', ''], ['头歌同步', "OpenUsers::Educoder"], ['平台注册', "Forge"],] %> + <%= select_tag(:open_user_type, options_for_select(open_user_type_options), class: 'form-control') %> +
<%= text_field_tag(:keyword, params[:keyword], class: 'form-control col-sm-2 ml-3', placeholder: 'ID/姓名/邮箱/手机号检索') %> From 6d7b7dd0588c4628060ae7cc122aea21387abfd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cxxq250=E2=80=9D?= <“xxq250@qq.com”> Date: Mon, 19 Sep 2022 10:06:49 +0800 Subject: [PATCH 6/8] =?UTF-8?q?fixed=20=E4=BF=AE=E6=94=B9=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/accounts_controller.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 531095b4b..e7b5af5d3 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -111,7 +111,9 @@ class AccountsController < ApplicationController sync_params = { password: params[:password].to_s, - email: @user.mail + email: @user.mail, + login_name: @user.login, + source_id: 0 } interactor = Gitea::User::UpdateInteractor.call(@user.login, sync_params) From ac8959f36f0caa413af45fd27e4a8fcaab109f58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cxxq250=E2=80=9D?= <“xxq250@qq.com”> Date: Mon, 19 Sep 2022 15:51:59 +0800 Subject: [PATCH 7/8] =?UTF-8?q?fixed=20=E4=BF=AE=E6=94=B9=E5=AF=86?= =?UTF-8?q?=E7=A0=81=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/accounts_controller.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index b80282798..a418c5f37 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -111,7 +111,9 @@ class AccountsController < ApplicationController sync_params = { password: params[:password].to_s, - email: @user.mail + email: @user.mail, + login_name: @user.login, + source_id: 0 } interactor = Gitea::User::UpdateInteractor.call(@user.login, sync_params) From bb8e6aeaf8d3581a6f6f3895c2a31016b08dfef6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cxxq250=E2=80=9D?= <“xxq250@qq.com”> Date: Tue, 20 Sep 2022 09:41:27 +0800 Subject: [PATCH 8/8] =?UTF-8?q?nps=E6=95=B0=E6=8D=AE=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/admins/nps_controller.rb | 3 +++ app/views/admins/nps/index.html.erb | 23 +++++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/app/controllers/admins/nps_controller.rb b/app/controllers/admins/nps_controller.rb index 491e62778..8b3d828ff 100644 --- a/app/controllers/admins/nps_controller.rb +++ b/app/controllers/admins/nps_controller.rb @@ -8,6 +8,9 @@ class Admins::NpsController < Admins::BaseController @user_nps = @user_nps.where(sql, keyword: "%#{keyword}%") end @user_nps = @user_nps.where("action_type != 'close'") if params[:done_score].present? + @min_score = @user_nps.where("action_type != 'close'").minimum("score") + @max_score = @user_nps.where("action_type != 'close'").maximum("score") + @score_total_count = UserNp.where("action_type !='close'").count @user_nps = paginate @user_nps.includes(:user) end diff --git a/app/views/admins/nps/index.html.erb b/app/views/admins/nps/index.html.erb index cc3eb94ad..5c083f33c 100644 --- a/app/views/admins/nps/index.html.erb +++ b/app/views/admins/nps/index.html.erb @@ -13,12 +13,31 @@ <%= submit_tag('搜索', class: 'btn btn-primary ml-3', 'data-disable-with': '搜索中...') %> NPS系统开关 - checked<%end %> data-toggle="toggle" data-onstyle="primary" id="nps_toggle" data-on="开" data-off="关" data-size="small"> + checked + <% end %> data-toggle="toggle" data-onstyle="primary" id="nps_toggle" data-on="开" data-off="关" data-size="small"> <% end %> - +
+

数据统计:

+

+ 评分用户数/用户总数:<%= @score_total_count %>/<%= UserNp.count %>, + 平均评分:<%= UserNp.where("action_type !='close'").average(:score).to_f.round(1) %>, + <% @user_nps_mid = @score_total_count % 2 == 0 ? @score_total_count / 2 : (@score_total_count + 1) / 2 %> + 评分中位数:<%= UserNp.where("action_type !='close'").order("score").pluck(:score)[@user_nps_mid - 1].to_i %>, + 最低评分/评分人数:<%=@min_score.to_i %>/<%= UserNp.where("action_type !='close'").where(score: @min_score).count %>, + 最高评分/评分人数:<%=@max_score.to_i %>/<%= UserNp.where("action_type !='close'").where(score: @max_score).count %> +

+

+ 填写意见用户数/用户总数:<%= UserNp.where("memo is not null").count %>/<%= UserNp.count %>, + 期待更加丰富的功能:<%= UserNp.where("memo like '%期待更加丰富的功能%'").count %>, + 希望有新手引导:<%= UserNp.where("memo like '%希望有新手引导%'").count %>, + 提升用户体验:<%= UserNp.where("memo like '%用户体验需进一步提升%'").count %>, + 其他:<%= UserNp.where("memo is not null").where.not(id: UserNp.where("memo like '%期待更加丰富的功能%' or memo like '%希望有新手引导%' or memo like '%用户体验需进一步提升%' ").ids).count %> +

+
<%= render partial: 'admins/nps/user_np_list', locals: { user_nps: @user_nps } %>