From e7c04e8c583500556b1318bdb9389ad47338615f Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Thu, 11 Apr 2019 11:28:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E8=AE=AD=E8=AF=BE=E7=A8=8B=E7=9A=84?= =?UTF-8?q?=E6=95=99=E5=AD=A6=E5=9B=A2=E9=98=9F=E6=96=B0=E5=A2=9E=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E3=80=81=E4=B8=8A=E7=A7=BB=E3=80=81=E4=B8=8B=E7=A7=BB?= =?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/subjects_controller.rb | 48 +++++++++++++++++-- app/models/subject.rb | 2 +- app/views/subjects/_subject_members.html.erb | 22 ++++----- .../subjects/down_member_position.js.erb | 1 + app/views/subjects/up_member_position.js.erb | 1 + config/routes.rb | 2 + ...1022220_add_position_to_subject_members.rb | 11 +++++ 7 files changed, 72 insertions(+), 15 deletions(-) create mode 100644 app/views/subjects/down_member_position.js.erb create mode 100644 app/views/subjects/up_member_position.js.erb create mode 100644 db/migrate/20190411022220_add_position_to_subject_members.rb diff --git a/app/controllers/subjects_controller.rb b/app/controllers/subjects_controller.rb index e526d468..a59747aa 100644 --- a/app/controllers/subjects_controller.rb +++ b/app/controllers/subjects_controller.rb @@ -242,14 +242,56 @@ class SubjectsController < ApplicationController memberships = params[:membership][:user_ids] memberships.each do |member| user = User.find(member) - SubjectMember.create!(:user_id => member, :subject_id => @subject.id, :role => 2) + SubjectMember.create!(:user_id => member, :subject_id => @subject.id, :role => 2, + :position => @subject.subject_members.size + 1) end end end def delete_member - member = @subject.subject_members.where(:user_id => params[:mem_id]).first - member.destroy if member + if User.current.admin? + ActiveRecord::Base.transaction do + member = @subject.subject_members.where(:id => params[:mem_id]).first + if member.present? && member.role != 1 + @subject.subject_members.where("position > #{member.position}").update_all("position = position - 1") + member.destroy + end + end + else + render_403 + end + end + + def up_member_position + if User.current.member_of_subject?(@subject) + ActiveRecord::Base.transaction do + member = @subject.subject_members.where(:id => params[:mem_id]).first + raise "不能再上移了" if member.position == 1 + up_member = @subject.subject_members.where(:position => member.position - 1).first + up_member.update_attribute(:position, member.position) + member.update_attribute(:position, member.position - 1) + end + else + render_403 + end + end + + def down_member_position + if User.current.member_of_subject?(@subject) + ActiveRecord::Base.transaction do + begin + member = @subject.subject_members.where(:id => params[:mem_id]).first + raise "不能再下移了" if member.position == @subject.subject_members.count + down_member = @subject.subject_members.where(:position => member.position + 1).first + down_member.update_attribute(:position, member.position) + member.update_attribute(:position, member.position + 1) + rescue Exception => e + raise ActiveRecord::Rollback + end + end + else + render_403 + end end def statistics diff --git a/app/models/subject.rb b/app/models/subject.rb index af330e85..819d446c 100644 --- a/app/models/subject.rb +++ b/app/models/subject.rb @@ -2,7 +2,7 @@ class Subject < ActiveRecord::Base #status :0 编辑中 1 审核中 2 发布 # belongs_to :user has_many :users, :through => :subject_members - has_many :subject_members, :dependent => :destroy, :order => "subject_members.id DESC" + has_many :subject_members, :dependent => :destroy, :order => "subject_members.position asc" has_many :career_stages, :through => :career_stage_subjects has_many :career_stage_subjects, :dependent => :destroy diff --git a/app/views/subjects/_subject_members.html.erb b/app/views/subjects/_subject_members.html.erb index f0746b46..87c518c7 100644 --- a/app/views/subjects/_subject_members.html.erb +++ b/app/views/subjects/_subject_members.html.erb @@ -14,23 +14,23 @@ - - - - + <% if User.current.admin? && member.role != 1 %> + + + + <% end %> - + <% if User.current.member_of_subject?(@subject) && member.position > 1 %> + + <% end %> - - + <% if User.current.member_of_subject?(@subject) && member.position < @subject.subject_members.size %> + - - - - + <% end %> diff --git a/app/views/subjects/down_member_position.js.erb b/app/views/subjects/down_member_position.js.erb new file mode 100644 index 00000000..c2467836 --- /dev/null +++ b/app/views/subjects/down_member_position.js.erb @@ -0,0 +1 @@ +$("#subject_members").html("<%= j(render :partial => 'subject_members') %>"); \ No newline at end of file diff --git a/app/views/subjects/up_member_position.js.erb b/app/views/subjects/up_member_position.js.erb new file mode 100644 index 00000000..c2467836 --- /dev/null +++ b/app/views/subjects/up_member_position.js.erb @@ -0,0 +1 @@ +$("#subject_members").html("<%= j(render :partial => 'subject_members') %>"); \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 3acb9123..f72d1a56 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -339,6 +339,8 @@ RedmineApp::Application.routes.draw do ## oauth相关 match 'add_collaborators', :via => [:get, :post] post 'add_subject_members' delete 'delete_member' + post 'up_member_position' + post 'down_member_position' end collection do diff --git a/db/migrate/20190411022220_add_position_to_subject_members.rb b/db/migrate/20190411022220_add_position_to_subject_members.rb new file mode 100644 index 00000000..d8dac183 --- /dev/null +++ b/db/migrate/20190411022220_add_position_to_subject_members.rb @@ -0,0 +1,11 @@ +class AddPositionToSubjectMembers < ActiveRecord::Migration + def change + add_column :subject_members, :position, :integer, :default => 1 + + Subject.all.each do |subject| + subject.subject_members.reorder("id asc").each_with_index do |member, index| + member.update_column('position', index + 1) + end + end + end +end