From 8d29c2bd5072b5d536a7c1fccdd1e339b427812a Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Fri, 5 Mar 2021 09:48:47 +0800 Subject: [PATCH 01/10] [FIX]org visit phenglei project --- app/helpers/projects_helper.rb | 2 +- app/views/projects/index.json.jbuilder | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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/views/projects/index.json.jbuilder b/app/views/projects/index.json.jbuilder index 2c02616d..d66c44a3 100644 --- a/app/views/projects/index.json.jbuilder +++ b/app/views/projects/index.json.jbuilder @@ -48,7 +48,7 @@ json.projects @projects do |project| json.name project.project_language.name end end - json.is_member !project.members.where(user_id: current_user.id).blank? + json.is_member project.member?(current_user.id) user_apply_signatures = project.apply_signatures.with_user_id(current_user.id) json.user_apply_signatures user_apply_signatures do |signature| json.id signature.id From 8aefcad510c5ae45ebc0329ab1ff736dc4833543 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Thu, 4 Mar 2021 15:55:26 +0800 Subject: [PATCH 02/10] [ADD]create project member rake --- lib/tasks/create_phenglei_project_member.rake | 28 ++++++++++++++++++ public/phenglei_user.xlsx | Bin 0 -> 19010 bytes 2 files changed, 28 insertions(+) create mode 100644 lib/tasks/create_phenglei_project_member.rake create mode 100644 public/phenglei_user.xlsx diff --git a/lib/tasks/create_phenglei_project_member.rake b/lib/tasks/create_phenglei_project_member.rake new file mode 100644 index 00000000..89399b01 --- /dev/null +++ b/lib/tasks/create_phenglei_project_member.rake @@ -0,0 +1,28 @@ +desc "Create Phenglei project members from excel" +namespace :create_phenglei_project_member do + task init: :environment do + project = Project.find_by_id(477) + doc = SimpleXlsxReader.open("#{Rails.root}/public/phenglei_user.xlsx") + data = doc.sheets.first.rows + err_rows = [] + success_count = 0 + data.each_with_index do |i, index| + next if index == 0 || i[1].nil? + begin + user = User.find_by(phone: i[1]) + next unless user.present? + unless project.member?(user.id) + Projects::AddMemberInteractor.call(project.owner, project, user, "read", true) + success_count += 1 + puts "========成功添加手机号为#{i[1]}的用户为项目#{project.id}的协作者=======" + end + puts "========#{i[0]}数据处理完毕=======" + rescue => e + puts e + err_rows += i + end + end + puts success_count + puts err_rows + end +end \ No newline at end of file diff --git a/public/phenglei_user.xlsx b/public/phenglei_user.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..df47986fac37935a52620c24120bb833a8b708de GIT binary patch literal 19010 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 literal 0 HcmV?d00001 From 0aa75e077eeeffaf7a91171147ba1ae46c445228 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Fri, 5 Mar 2021 16:44:37 +0800 Subject: [PATCH 03/10] [ADD]sync phenglei user job --- app/controllers/admins/projects_controller.rb | 19 +++++++++- app/jobs/sync_phenglei_user_job.rb | 38 +++++++++++++++++++ .../admins/projects/shared/_list.html.erb | 3 ++ config/routes.rb | 6 ++- lib/tasks/create_phenglei_project_member.rake | 28 -------------- 5 files changed, 64 insertions(+), 30 deletions(-) create mode 100644 app/jobs/sync_phenglei_user_job.rb delete mode 100644 lib/tasks/create_phenglei_project_member.rake diff --git a/app/controllers/admins/projects_controller.rb b/app/controllers/admins/projects_controller.rb index 2335db6d..d71468c0 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_projects_path + flash[:success] = "已开启后台同步任务" + else + redirect_to admins_projects_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/jobs/sync_phenglei_user_job.rb b/app/jobs/sync_phenglei_user_job.rb new file mode 100644 index 00000000..1e597ef8 --- /dev/null +++ b/app/jobs/sync_phenglei_user_job.rb @@ -0,0 +1,38 @@ +class SyncPhengleiUserJob < ApplicationJob + queue_as :default + + def perform(project_id) + 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}") + doc = SimpleXlsxReader.open("#{Rails.root}/public/phenglei_user.xlsx") + data = doc.sheets.first.rows + data.each_with_index do |i, index| + next if index == 0 || i[1].nil? + puts "======开始处理#{i[1]}" + user = User.find_by(phone: i[1]) + if user.present? + if project.member?(user.id) + puts "======#{i[1]}用户已经是外围贡献者了" + member_count += 1 + else + interactor = Projects::AddMemberInteractor.call(project.owner, project, user, "read", true) + if interactor.error.nil? + puts "========用户#{i[1]}成功添加为项目的外围贡献者=======" + success_count += 1 + else + puts "========用户#{i[1]}添加失败" + error_count += 1 + end + end + else + puts "=====#{i[1]}用户不存在" + 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/views/admins/projects/shared/_list.html.erb b/app/views/admins/projects/shared/_list.html.erb index d4fa5a42..eafa4d79 100644 --- a/app/views/admins/projects/shared/_list.html.erb +++ b/app/views/admins/projects/shared/_list.html.erb @@ -39,6 +39,9 @@ <%= project.created_on&.strftime('%Y-%m-%d %H:%M') %> + <% if project.is_secret %> + <%= link_to "同步", sync_phenglei_user_admins_project_path(project.id), method: :get, data:{confirm: "确认同步吗?"}, class: "sync-phenglei-user-project-action" %> + <% end %> <%= link_to "删除", admins_project_path(project.id), method: :delete, data:{confirm: "确认删除的吗?"}, class: "delete-project-action" %> diff --git a/config/routes.rb b/config/routes.rb index ee1fedaa..bd071f78 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -824,7 +824,11 @@ Rails.application.routes.draw do resources :courses, only: [:index, :destroy, :update] - resources :projects, only: [:index, :destroy] + resources :projects, only: [:index, :destroy] do + member do + get :sync_phenglei_user + end + end resources :disciplines, only: [:index, :create, :edit, :update, :destroy] do post :adjust_position, on: :member diff --git a/lib/tasks/create_phenglei_project_member.rake b/lib/tasks/create_phenglei_project_member.rake deleted file mode 100644 index 89399b01..00000000 --- a/lib/tasks/create_phenglei_project_member.rake +++ /dev/null @@ -1,28 +0,0 @@ -desc "Create Phenglei project members from excel" -namespace :create_phenglei_project_member do - task init: :environment do - project = Project.find_by_id(477) - doc = SimpleXlsxReader.open("#{Rails.root}/public/phenglei_user.xlsx") - data = doc.sheets.first.rows - err_rows = [] - success_count = 0 - data.each_with_index do |i, index| - next if index == 0 || i[1].nil? - begin - user = User.find_by(phone: i[1]) - next unless user.present? - unless project.member?(user.id) - Projects::AddMemberInteractor.call(project.owner, project, user, "read", true) - success_count += 1 - puts "========成功添加手机号为#{i[1]}的用户为项目#{project.id}的协作者=======" - end - puts "========#{i[0]}数据处理完毕=======" - rescue => e - puts e - err_rows += i - end - end - puts success_count - puts err_rows - end -end \ No newline at end of file From 3e7ae82258af17b00e44e4f1b37201577a12dda0 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Wed, 10 Mar 2021 14:02:41 +0800 Subject: [PATCH 04/10] [ADD]phenglei user list and cron job --- .../admins/phenglei_users_controller.rb | 36 +++++++++++++++++++ app/controllers/admins/projects_controller.rb | 4 +-- app/jobs/sync_phenglei_user_job.rb | 3 +- app/models/phenglei_user.rb | 18 ++++++++++ .../admins/phenglei_users/index.html.erb | 19 ++++++++++ app/views/admins/phenglei_users/index.js.erb | 1 + app/views/admins/phenglei_users/new.js.erb | 2 ++ .../shared/_create_form_modal.html.erb | 21 +++++++++++ .../phenglei_users/shared/_list.html.erb | 30 ++++++++++++++++ .../admins/projects/shared/_list.html.erb | 3 -- app/views/admins/shared/_sidebar.html.erb | 1 + config/routes.rb | 1 + config/sidekiq_cron.yml | 4 +++ .../20210310012914_create_phenglei_users.rb | 15 ++++++++ spec/models/phenglei_user_spec.rb | 5 +++ 15 files changed, 157 insertions(+), 6 deletions(-) create mode 100644 app/controllers/admins/phenglei_users_controller.rb create mode 100644 app/models/phenglei_user.rb create mode 100644 app/views/admins/phenglei_users/index.html.erb create mode 100644 app/views/admins/phenglei_users/index.js.erb create mode 100644 app/views/admins/phenglei_users/new.js.erb create mode 100644 app/views/admins/phenglei_users/shared/_create_form_modal.html.erb create mode 100644 app/views/admins/phenglei_users/shared/_list.html.erb create mode 100644 db/migrate/20210310012914_create_phenglei_users.rb create mode 100644 spec/models/phenglei_user_spec.rb 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 d71468c0..9e33b6ce 100644 --- a/app/controllers/admins/projects_controller.rb +++ b/app/controllers/admins/projects_controller.rb @@ -27,10 +27,10 @@ class Admins::ProjectsController < Admins::BaseController def sync_phenglei_user if @project.is_secret SyncPhengleiUserJob.perform_later(@project.id) - redirect_to admins_projects_path + redirect_to admins_phenglei_users_path flash[:success] = "已开启后台同步任务" else - redirect_to admins_projects_path + redirect_to admins_phenglei_users_path flash[:danger] = "非风雷协议项目" end end diff --git a/app/jobs/sync_phenglei_user_job.rb b/app/jobs/sync_phenglei_user_job.rb index 1e597ef8..4cf56e35 100644 --- a/app/jobs/sync_phenglei_user_job.rb +++ b/app/jobs/sync_phenglei_user_job.rb @@ -1,7 +1,8 @@ class SyncPhengleiUserJob < ApplicationJob queue_as :default - def perform(project_id) + 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 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/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 %> + +
+ <%= form_tag(admins_phenglei_users_path, method: :get, class: 'form-inline search-form flex-1', remote: true) do %> + <%= text_field_tag(:keyword, params[:keyword], class: 'form-control col-sm-2 ml-3', placeholder: '手机号检索') %> + + <%= submit_tag('搜索', class: 'btn btn-primary ml-3', 'data-disable-with': '搜索中...') %> + <%= link_to "同步", sync_phenglei_user_admins_project_path(@phenglei_project.id), method: :get, data: {confirm: "确认同步吗?"}, class: "btn btn-primary pull-right ml-3", "data-disabled-with":"...同步" %> + <% end %> + <%= link_to "新增", new_admins_phenglei_user_path, remote: true, class: "btn btn-primary ml-3", "data-disabled-with":"...新增" %> +
+ +
+ <%= render partial: 'admins/phenglei_users/shared/list', locals: { phenglei_users: @phenglei_users } %> +
+
+
\ No newline at end of file diff --git a/app/views/admins/phenglei_users/index.js.erb b/app/views/admins/phenglei_users/index.js.erb new file mode 100644 index 00000000..57c52106 --- /dev/null +++ b/app/views/admins/phenglei_users/index.js.erb @@ -0,0 +1 @@ +$('.phenglei-users-list-container').html("<%= j( render partial: 'admins/phenglei_users/shared/list', locals: { phenglei_users: @phenglei_users } ) %>"); \ No newline at end of file diff --git a/app/views/admins/phenglei_users/new.js.erb b/app/views/admins/phenglei_users/new.js.erb new file mode 100644 index 00000000..2829f93b --- /dev/null +++ b/app/views/admins/phenglei_users/new.js.erb @@ -0,0 +1,2 @@ +$("#phenglei-users-modals").html("<%= j render(partial: 'admins/phenglei_users/shared/create_form_modal') %>") +$(".phenglei-user-create-modal").modal('show'); \ No newline at end of file diff --git a/app/views/admins/phenglei_users/shared/_create_form_modal.html.erb b/app/views/admins/phenglei_users/shared/_create_form_modal.html.erb new file mode 100644 index 00000000..76198260 --- /dev/null +++ b/app/views/admins/phenglei_users/shared/_create_form_modal.html.erb @@ -0,0 +1,21 @@ + \ No newline at end of file diff --git a/app/views/admins/phenglei_users/shared/_list.html.erb b/app/views/admins/phenglei_users/shared/_list.html.erb new file mode 100644 index 00000000..1f64f044 --- /dev/null +++ b/app/views/admins/phenglei_users/shared/_list.html.erb @@ -0,0 +1,30 @@ + + + + + + + + + + <% if phenglei_users.present? %> + <% phenglei_users.each_with_index do |user, index| %> + + + + + + <% end %> + <% else %> + <%= render 'admins/shared/no_data_for_table' %> + <% 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 %> +
+ +<%= render partial: 'admins/shared/paginate', locals: { objects: phenglei_users } %> diff --git a/app/views/admins/projects/shared/_list.html.erb b/app/views/admins/projects/shared/_list.html.erb index eafa4d79..d4fa5a42 100644 --- a/app/views/admins/projects/shared/_list.html.erb +++ b/app/views/admins/projects/shared/_list.html.erb @@ -39,9 +39,6 @@ <%= project.created_on&.strftime('%Y-%m-%d %H:%M') %> - <% if project.is_secret %> - <%= link_to "同步", sync_phenglei_user_admins_project_path(project.id), method: :get, data:{confirm: "确认同步吗?"}, class: "sync-phenglei-user-project-action" %> - <% end %> <%= link_to "删除", admins_project_path(project.id), method: :delete, data:{confirm: "确认删除的吗?"}, class: "delete-project-action" %> diff --git a/app/views/admins/shared/_sidebar.html.erb b/app/views/admins/shared/_sidebar.html.erb index c72ce593..2524451c 100644 --- a/app/views/admins/shared/_sidebar.html.erb +++ b/app/views/admins/shared/_sidebar.html.erb @@ -17,6 +17,7 @@
  • <%= sidebar_item_group('#user-submenu', '用户', icon: 'user') do %>
  • <%= sidebar_item(admins_users_path, '用户列表', icon: 'user', controller: 'admins-users') %>
  • +
  • <%= sidebar_item(admins_phenglei_users_path, '风雷意向用户列表', icon: 'user', controller: 'admins-phenglei_users') %>
  • <% end %>
  • diff --git a/config/routes.rb b/config/routes.rb index bd071f78..9ca12ef0 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -647,6 +647,7 @@ Rails.application.routes.draw do post :reset_login_times end end + resources :phenglei_users, only: [:index, :new, :create] resource :import_disciplines, only: [:create] resource :import_users, only: [:create] resource :import_course_members, only: [:create] diff --git a/config/sidekiq_cron.yml b/config/sidekiq_cron.yml index 3e807fa1..880843ce 100644 --- a/config/sidekiq_cron.yml +++ b/config/sidekiq_cron.yml @@ -2,3 +2,7 @@ sync_gitea_repo_update_time: cron: "0 0 * * *" class: "SyncRepoUpdateTimeJob" queue: default +sync_phenglei_user: + cron: "0 23 * * *" + class: "SyncPhengleiUserJob" + queue: default \ No newline at end of file diff --git a/db/migrate/20210310012914_create_phenglei_users.rb b/db/migrate/20210310012914_create_phenglei_users.rb new file mode 100644 index 00000000..fee06520 --- /dev/null +++ b/db/migrate/20210310012914_create_phenglei_users.rb @@ -0,0 +1,15 @@ +class CreatePhengleiUsers < ActiveRecord::Migration[5.2] + def change + create_table :phenglei_users do |t| + t.string :phone + + t.timestamps + end + doc = SimpleXlsxReader.open("#{Rails.root}/public/phenglei_user.xlsx") + data = doc.sheets.first.rows + data.each_with_index do |i, index| + next if index == 0 || i[1].nil? + PhengleiUser.find_or_create_by(phone: i[1]) + end + end +end diff --git a/spec/models/phenglei_user_spec.rb b/spec/models/phenglei_user_spec.rb new file mode 100644 index 00000000..9fa273fe --- /dev/null +++ b/spec/models/phenglei_user_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe PhengleiUser, type: :model do + pending "add some examples to (or delete) #{__FILE__}" +end From 8c43f74b694553a854fd137125c422e261d78e43 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Wed, 10 Mar 2021 14:11:56 +0800 Subject: [PATCH 05/10] [ADD]job use model data --- app/jobs/sync_phenglei_user_job.rb | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/app/jobs/sync_phenglei_user_job.rb b/app/jobs/sync_phenglei_user_job.rb index 4cf56e35..6376618b 100644 --- a/app/jobs/sync_phenglei_user_job.rb +++ b/app/jobs/sync_phenglei_user_job.rb @@ -7,28 +7,25 @@ class SyncPhengleiUserJob < ApplicationJob 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}") - doc = SimpleXlsxReader.open("#{Rails.root}/public/phenglei_user.xlsx") - data = doc.sheets.first.rows - data.each_with_index do |i, index| - next if index == 0 || i[1].nil? - puts "======开始处理#{i[1]}" - user = User.find_by(phone: i[1]) + 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[1]}用户已经是外围贡献者了" + puts "======#{i.phone}用户已经是外围贡献者了" member_count += 1 else interactor = Projects::AddMemberInteractor.call(project.owner, project, user, "read", true) if interactor.error.nil? - puts "========用户#{i[1]}成功添加为项目的外围贡献者=======" + puts "========用户#{i.phone}成功添加为项目的外围贡献者=======" success_count += 1 else - puts "========用户#{i[1]}添加失败" + puts "========用户#{i.phone}添加失败" error_count += 1 end end else - puts "=====#{i[1]}用户不存在" + puts "=====#{i.phone}用户不存在" not_exsit_count += 1 next end From 1a8d9bb0ce51275aaebc58a2a5664d7b4569c7c4 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Thu, 11 Mar 2021 10:54:01 +0800 Subject: [PATCH 06/10] [ADD]add police picture --- public/police.png | Bin 0 -> 9899 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/police.png diff --git a/public/police.png b/public/police.png new file mode 100644 index 0000000000000000000000000000000000000000..b361af632006effd3a846238002b999074bc50e7 GIT binary patch literal 9899 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 Date: Wed, 17 Mar 2021 15:47:01 +0800 Subject: [PATCH 07/10] add: project order index --- app/queries/projects/list_query.rb | 2 +- db/migrate/20210317062206_add_order_index_to_project.rb | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20210317062206_add_order_index_to_project.rb 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/db/migrate/20210317062206_add_order_index_to_project.rb b/db/migrate/20210317062206_add_order_index_to_project.rb new file mode 100644 index 00000000..f48a0ec1 --- /dev/null +++ b/db/migrate/20210317062206_add_order_index_to_project.rb @@ -0,0 +1,5 @@ +class AddOrderIndexToProject < ActiveRecord::Migration[5.2] + def change + add_column :projects, :order_index, :integer, default: 0 + end +end From 300658f8dd525a7b19f4920b273b2f529cef2463 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Fri, 2 Apr 2021 11:18:28 +0800 Subject: [PATCH 08/10] fix: apply_signature filter --- app/controllers/apply_signatures_controller.rb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/app/controllers/apply_signatures_controller.rb b/app/controllers/apply_signatures_controller.rb index 885249cf..2903ca94 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(users.lastname, users.firstname, users.login, users.mail, users.nickname)) LIKE ?", "%#{search.split(" ").join('|')}%") unless search.blank? @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 From b8a4c467fe4007ea29f3d46256332f6c7949adfc Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Fri, 2 Apr 2021 11:29:30 +0800 Subject: [PATCH 09/10] fix --- app/controllers/apply_signatures_controller.rb | 2 +- app/views/admins/apply_signatures/index.js.erb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 app/views/admins/apply_signatures/index.js.erb diff --git a/app/controllers/apply_signatures_controller.rb b/app/controllers/apply_signatures_controller.rb index 2903ca94..150b323f 100644 --- a/app/controllers/apply_signatures_controller.rb +++ b/app/controllers/apply_signatures_controller.rb @@ -7,7 +7,7 @@ class ApplySignaturesController < ApplicationController 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('|')}%") unless search.blank? + @apply_signatures = @apply_signatures.joins(:user).where("LOWER(concat(users.lastname, users.firstname, users.login, users.mail, users.nickname)) LIKE ?", "%#{search.split(" ").join('|')}%") if search.present? @apply_signatures = kaminari_paginate(@apply_signatures) end 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 From ce89ce5169268810aab674260dadee7d1ea67802 Mon Sep 17 00:00:00 2001 From: "vilet.yy" Date: Fri, 2 Apr 2021 11:39:55 +0800 Subject: [PATCH 10/10] fix:use concat_ws --- app/controllers/apply_signatures_controller.rb | 2 +- app/controllers/members_controller.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/apply_signatures_controller.rb b/app/controllers/apply_signatures_controller.rb index 150b323f..e867c44d 100644 --- a/app/controllers/apply_signatures_controller.rb +++ b/app/controllers/apply_signatures_controller.rb @@ -7,7 +7,7 @@ class ApplySignaturesController < ApplicationController 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('|')}%") if search.present? + @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 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