diff --git a/app/controllers/admins/phenglei_users_controller.rb b/app/controllers/admins/phenglei_users_controller.rb new file mode 100644 index 00000000..e1fbff7c --- /dev/null +++ b/app/controllers/admins/phenglei_users_controller.rb @@ -0,0 +1,36 @@ +class Admins::PhengleiUsersController < Admins::BaseController + before_action :phenglei_project, only: [:index] + + def index + if params[:keyword].present? + @phenglei_users = PhengleiUser.ransack(phone_cont: params[:keyword]).result + else + @phenglei_users = PhengleiUser + end + @phenglei_users = @phenglei_users.page(page).per(per_page) + end + + def new + @phenglei_user = PhengleiUser.new + end + + def create + @phenglei_user = PhengleiUser.new(phenglei_user_params) + if @phenglei_user.save + redirect_to admins_phenglei_users_path + flash[:success] = "创建成功" + else + redirect_to admins_phenglei_users_path + flash[:error] = "创建失败" + end + end + + private + def phenglei_project + @phenglei_project = Project.find_by_id(EduSetting.get("sync_phenglei_user_project")) + end + + def phenglei_user_params + params.require(:phenglei_user).permit(:phone) + end +end diff --git a/app/controllers/admins/projects_controller.rb b/app/controllers/admins/projects_controller.rb index 2335db6d..9e33b6ce 100644 --- a/app/controllers/admins/projects_controller.rb +++ b/app/controllers/admins/projects_controller.rb @@ -1,4 +1,5 @@ class Admins::ProjectsController < Admins::BaseController + before_action :load_project, only: [:sync_phenglei_user] def index sort_by = params[:sort_by] ||= 'created_on' @@ -6,7 +7,7 @@ class Admins::ProjectsController < Admins::BaseController search = params[:search].to_s.strip projects = Project.where("name like ?", "%#{search}%").order("#{sort_by} #{sort_direction}") - @projects = paginate projects.includes(:owner, :members, :issues, :versions, :attachments, :project_score) + @projects = paginate projects.includes(:owner, :members, :issues, :versions, :attachments, :project_score, :license) end def destroy @@ -22,4 +23,20 @@ class Admins::ProjectsController < Admins::BaseController redirect_to admins_projects_path flash[:danger] = "删除失败" end + + def sync_phenglei_user + if @project.is_secret + SyncPhengleiUserJob.perform_later(@project.id) + redirect_to admins_phenglei_users_path + flash[:success] = "已开启后台同步任务" + else + redirect_to admins_phenglei_users_path + flash[:danger] = "非风雷协议项目" + end + end + + private + def load_project + @project = Project.find_by!(id: params[:id]) + end end \ No newline at end of file diff --git a/app/controllers/apply_signatures_controller.rb b/app/controllers/apply_signatures_controller.rb index 885249cf..e867c44d 100644 --- a/app/controllers/apply_signatures_controller.rb +++ b/app/controllers/apply_signatures_controller.rb @@ -5,8 +5,9 @@ class ApplySignaturesController < ApplicationController before_action :find_apply_signature, only: [:update] def index + search = params[:search].to_s.downcase @apply_signatures = @project.apply_signatures.with_status(status).includes(user: :user_extension) - @apply_signatures = @apply_signatures.joins(:user).where("LOWER(concat(users.lastname, users.firstname, users.login, users.mail, users.nickname)) LIKE ?", "%#{search.split(" ").join('|')}%") + @apply_signatures = @apply_signatures.joins(:user).where("LOWER(CONCAT_WS(users.lastname, users.firstname, users.login, users.mail, users.nickname)) LIKE ?", "%#{search.split(" ").join('|')}%") if search.present? @apply_signatures = kaminari_paginate(@apply_signatures) end @@ -64,10 +65,6 @@ class ApplySignaturesController < ApplicationController params.permit(:status) end - def search - params.fetch(:search, "").to_s.downcase - end - def status params.fetch(:status, "all") end diff --git a/app/controllers/members_controller.rb b/app/controllers/members_controller.rb index b8c0ea54..302dc624 100644 --- a/app/controllers/members_controller.rb +++ b/app/controllers/members_controller.rb @@ -18,7 +18,7 @@ class MembersController < ApplicationController scope = @project.members.includes(:roles, user: :user_extension) search = params[:search].to_s.downcase role = params[:role].to_s - scope = scope.joins(:user).where("LOWER(concat(users.lastname, users.firstname, users.login, users.mail, users.nickname)) LIKE ?", "%#{search.split(" ").join('|')}%") if search.present? + scope = scope.joins(:user).where("LOWER(CONCAT_WS(users.lastname, users.firstname, users.login, users.mail, users.nickname)) LIKE ?", "%#{search.split(" ").join('|')}%") if search.present? scope = scope.joins(:roles).where("roles.name LIKE ?", "%#{role}%") if role.present? @total_count = scope.size diff --git a/app/helpers/projects_helper.rb b/app/helpers/projects_helper.rb index a9fb3f88..155d220d 100644 --- a/app/helpers/projects_helper.rb +++ b/app/helpers/projects_helper.rb @@ -52,7 +52,7 @@ module ProjectsHelper type: project.numerical_for_project_type, author: render_owner(project), is_secret: project.is_secret, - is_member: !project.members.where(user_id: user.id).blank?, + is_member: project.member?(user.id), user_apply_signatures: project.apply_signatures.with_user_id(user.id).collect{|s| {id: s.id, status: s.status}} }).compact diff --git a/app/jobs/sync_phenglei_user_job.rb b/app/jobs/sync_phenglei_user_job.rb new file mode 100644 index 00000000..6376618b --- /dev/null +++ b/app/jobs/sync_phenglei_user_job.rb @@ -0,0 +1,36 @@ +class SyncPhengleiUserJob < ApplicationJob + queue_as :default + + def perform(project_id=nil) + project_id ||= EduSetting.get("sync_phenglei_user_project") + project = Project.find_by_id(project_id) + return if project.nil? + member_count, success_count, error_count, not_exsit_count = 0, 0, 0, 0 + Rails.logger.info("======begin to sync phenglei user to project#{project.owner.login + "/" + project.identifier}") + PhengleiUser.find_each do |i| + puts "======开始处理#{i.phone}" + user = User.find_by(phone: i.phone) + if user.present? + if project.member?(user.id) + puts "======#{i.phone}用户已经是外围贡献者了" + member_count += 1 + else + interactor = Projects::AddMemberInteractor.call(project.owner, project, user, "read", true) + if interactor.error.nil? + puts "========用户#{i.phone}成功添加为项目的外围贡献者=======" + success_count += 1 + else + puts "========用户#{i.phone}添加失败" + error_count += 1 + end + end + else + puts "=====#{i.phone}用户不存在" + not_exsit_count += 1 + next + end + end + Rails.logger.info("======已存在外围贡献者数量#{member_count}, 成功添加用户数量#{success_count}, 添加失败用户数量#{error_count}, 找不到用户数量#{not_exsit_count}") + Rails.logger.info("======end to sync phenglei user to project#{project.owner.login + "/" + project.identifier}") + end +end \ No newline at end of file diff --git a/app/models/phenglei_user.rb b/app/models/phenglei_user.rb new file mode 100644 index 00000000..5adcfac7 --- /dev/null +++ b/app/models/phenglei_user.rb @@ -0,0 +1,18 @@ +# == Schema Information +# +# Table name: phenglei_users +# +# id :integer not null, primary key +# phone :string(255) +# created_at :datetime not null +# updated_at :datetime not null +# + +class PhengleiUser < ApplicationRecord + + validates :phone, uniqueness: true + + def register + User.find_by(phone: self.phone) + end +end diff --git a/app/queries/projects/list_query.rb b/app/queries/projects/list_query.rb index 7e175cc4..eee99a71 100644 --- a/app/queries/projects/list_query.rb +++ b/app/queries/projects/list_query.rb @@ -15,7 +15,7 @@ class Projects::ListQuery < ApplicationQuery scope = q .with_project_type(params[:project_type]) .with_project_category(params[:category_id]) - .with_project_language(params[:language_id]) + .with_project_language(params[:language_id]).order(order_index: :desc) sort = params[:sort_by] || "updated_on" sort_direction = params[:sort_direction] || "desc" diff --git a/app/views/admins/apply_signatures/index.js.erb b/app/views/admins/apply_signatures/index.js.erb new file mode 100644 index 00000000..17ff03d8 --- /dev/null +++ b/app/views/admins/apply_signatures/index.js.erb @@ -0,0 +1 @@ +$('.apply_signatures-list-container').html("<%= j( render partial: 'admins/apply_signatures/shared/list', locals: { apply_signatures: @apply_signatures } ) %>"); \ No newline at end of file diff --git a/app/views/admins/phenglei_users/index.html.erb b/app/views/admins/phenglei_users/index.html.erb new file mode 100644 index 00000000..7c964e08 --- /dev/null +++ b/app/views/admins/phenglei_users/index.html.erb @@ -0,0 +1,19 @@ +<% define_admin_breadcrumbs do %> + <% add_admin_breadcrumb('风雷意向用户管理', admins_phenglei_users_path) %> +<% end %> + +
序号 | +手机号码 | +状态 | +
---|---|---|
<%= list_index_no((params[:page] || 1).to_i, index) %> | +<%= overflow_hidden_span display_text(user.phone), width: 100 %> | ++ <% if user.register.present? %> + <%= @phenglei_project.member?(user.register.id) ? "已同步" : "未同步" %> + <% else %> + 未注册 + <% end %> + | +