diff --git a/app/controllers/competition_teams_controller.rb b/app/controllers/competition_teams_controller.rb index 817de9be..fb41d3f8 100644 --- a/app/controllers/competition_teams_controller.rb +++ b/app/controllers/competition_teams_controller.rb @@ -38,9 +38,13 @@ class CompetitionTeamsController < ApplicationController end def create + teacher_limited = @competition.teacher_enroll_mutiple_limited + member_limited = @competition.member_enroll_mutiple_limited + # 判断用户是否已创建过战队 - if @competition.competition_teams.where(:user_id => User.current.id).count > 0 && !User.current.is_teacher - @status, @message = -1, '您已创建过战队,不能重复创建' + if @competition.team_members.where(user_id: User.current.id).count > 0 && + ((User.current.is_teacher && teacher_limited) || (!User.current.is_teacher && member_limited)) + @status, @message = -1, '您已经在战队中了' return end @@ -52,6 +56,11 @@ class CompetitionTeamsController < ApplicationController is_teacher = User.current.user_extensions.identity == 0 return unless member_and_teacher_count_valid?(is_teacher) + # 检查老师多次报名限制 + return unless check_teacher_enroll_limited?(@competition, (params[:teacher_ids].presence || []).map(&:to_i) - [User.current.id]) + # 检查成员多次报名限制 + return unless check_member_enroll_limited?(@competition, (params[:member_ids].presence || []).map(&:to_i) - [User.current.id]) + ActiveRecord::Base.transaction do invite_code = generate_team_code new_team = CompetitionTeam.create(:competition_id => @competition.id, :name => params[:name], @@ -104,8 +113,12 @@ class CompetitionTeamsController < ApplicationController # 删除的成员 delete_member_ids = team_member_ids - new_member_ids @team.team_members.where(role: 2, user_id: delete_member_ids).delete_all + # 新增加的成员 - (new_member_ids - team_member_ids).each do |user_id| + ids = new_member_ids - team_member_ids + raise @message unless check_member_enroll_limited?(@competition, ids) # 有成员已经加入其他战队,并且只能一次报名 + + ids.each do |user_id| next if user_id.to_i == @team.user_id @team.team_members.create!(user_id: user_id, role: 2, competition_id: @competition.id) end @@ -117,12 +130,19 @@ class CompetitionTeamsController < ApplicationController # 删除的老师 delete_teacher_ids = teacher_ids - new_teacher_ids @team.team_members.where(role: 3, user_id: delete_teacher_ids).delete_all + # 新增加的老师 - (new_teacher_ids - teacher_ids).each do |user_id| + ids = new_teacher_ids - teacher_ids + raise @message unless check_teacher_enroll_limited?(@competition, ids) # 有老师已经加入其他战队,并且只能一次报名 + + ids.each do |user_id| next if user_id.to_i == @team.user_id @team.team_members.create!(user_id: user_id, role: 3, competition_id: @competition.id, is_teacher: true) end end + rescue => ex + @status = -1 + @message = ex.message end # @status:提示语标志(0:加入成功;1:邀请码错误;2:已经加入了其他队, 3:超过人数限制,4:已有指导老师,5:只有学生和老师身份的用户才能加入战队) @@ -133,7 +153,8 @@ class CompetitionTeamsController < ApplicationController return end - if TeamMember.where(:user_id => User.current.id, :competition_team_id => @competition.competition_teams.map(&:id), :is_teacher => 0).count > 0 + enroll_limited = (User.current.is_teacher ? @competition.teacher_enroll_mutiple_limited : @competition.member_enroll_mutiple_limited) + if enroll_limited && @competition.team_members.exists?(user_id: User.current.id) @status, @message = -1, '您已加入战队,不能重复加' return end @@ -243,4 +264,30 @@ class CompetitionTeamsController < ApplicationController true end + + def check_teacher_enroll_limited?(competition, user_ids) + teacher_limited = competition.teacher_enroll_mutiple_limited + return true unless teacher_limited && user_ids.present? + + repeat_teachers = competition.team_members.where(user_id: user_ids).includes(:user).to_a + if repeat_teachers.size > 0 + @status, @message = -1, "导师#{repeat_teachers.map{|t| t.user.show_real_name}}已经加入其它战队了" + return false + end + + true + end + + def check_member_enroll_limited?(competition, user_ids) + member_limited = competition.member_enroll_mutiple_limited + return true unless member_limited && user_ids.present? + + repeat_members = competition.team_members.where(user_id: user_ids).includes(:user).to_a + if repeat_members.size > 0 + @status, @message = -1, "成员#{repeat_members.map{|t| t.user.show_real_name}}已经加入其它战队了" + return false + end + + true + end end diff --git a/app/controllers/competitions_controller.rb b/app/controllers/competitions_controller.rb index c890ff6b..0e9fb376 100644 --- a/app/controllers/competitions_controller.rb +++ b/app/controllers/competitions_controller.rb @@ -111,6 +111,7 @@ class CompetitionsController < ApplicationController @search_teams_count = @teams.count @team_members_count = TeamMember.where(:competition_team_id => @teams.pluck(:id)).count + @can_enroll = !(@user.is_teacher ? @competition.teacher_enroll_mutiple_limited : @competition.member_enroll_mutiple_limited) || !@competition.team_members.exists?(user_id: User.current.id) @is_enroll = CompetitionTeam.where(:id => TeamMember.where(:user_id => @user, :competition_team_id => @competition.competition_teams.map(&:id)).pluck(:competition_team_id)).reorder("created_at desc") @show_notice = (@competition.identifier == "gcc-dev-2018" || @competition.identifier == "gcc-annotation-2018") && @competition.competition_teams.joins(:team_members).where(:user_id => User.current.id).group('competition_teams.id').sum('IF(team_members.is_teacher=1, 1, 0)').values.any?(&:zero?) @@ -580,7 +581,7 @@ class CompetitionsController < ApplicationController section_entries.destroy_all else if params[:entry_name].length < section_entries.size - section_entries[params[:entry_name].length, section_entries.size - 1].destroy_all + section_entries[params[:entry_name].length, section_entries.size - 1].each(&:destroy) end params[:entry_name].each_with_index do |name, index| diff --git a/app/models/competition.rb b/app/models/competition.rb index d66aac1a..96747b0b 100644 --- a/app/models/competition.rb +++ b/app/models/competition.rb @@ -32,4 +32,12 @@ class Competition < ActiveRecord::Base def member_count self.team_members.count == 0 ? 0 : self.team_members.count + 268 end + + def teacher_enroll_mutiple_limited + competition_staffs.where(category: 'teacher').first.try(:mutiple_limited) + end + + def member_enroll_mutiple_limited + competition_staffs.where(category: 'student').first.try(:mutiple_limited) + end end diff --git a/app/models/competition_staff.rb b/app/models/competition_staff.rb index 1a949460..6609cdbb 100644 --- a/app/models/competition_staff.rb +++ b/app/models/competition_staff.rb @@ -1,7 +1,7 @@ class CompetitionStaff < ActiveRecord::Base default_scope order: 'position asc' - attr_accessible :minimum, :maximum, :category, :position + attr_accessible :minimum, :maximum, :category, :position, :mutiple_limited belongs_to :competition diff --git a/app/views/competition_teams/_search_member_list.html.erb b/app/views/competition_teams/_search_member_list.html.erb index bf4a9b8d..2bdd8340 100644 --- a/app/views/competition_teams/_search_member_list.html.erb +++ b/app/views/competition_teams/_search_member_list.html.erb @@ -1,5 +1,5 @@ <% @users.each do |user| %> - <% has_enroll = @team.present? ? @competition.team_members.where("user_id = '#{user.id}' and id != #{@team.id}").count > 0 : @competition.team_members.where("user_id = '#{user.id}'").count > 0 %> + <% has_enroll = @competition.member_enroll_mutiple_limited && (@team.present? ? @competition.team_members.where("user_id = '#{user.id}' and id != #{@team.id}").count > 0 : @competition.team_members.where("user_id = '#{user.id}'").count > 0) %>
  • <%= user.show_name %> diff --git a/app/views/competitions/enroll.html.erb b/app/views/competitions/enroll.html.erb index 075bfe40..eca04c58 100644 --- a/app/views/competitions/enroll.html.erb +++ b/app/views/competitions/enroll.html.erb @@ -2,14 +2,14 @@

    <%= @competition.name %>

    - <% if @minimum_staff > 1 %> + <% if @maximum_staff > 1 %>

    <%= @competition.sub_title %>

    <% unless User.current.logged? %> <%= link_to "创建战队", signin_path, :remote => true, :class => "enroll-in-b enroll-in-b-green fr" %> <% else %> <% unless @competition.enroll_end_time.present? && @competition.enroll_end_time < Time.now %> - <% if @is_enroll.present? && !@user.is_teacher %> + <% if !@can_enroll %> 创建战队 <% else %> 创建战队 @@ -23,7 +23,7 @@ <%= link_to "加入战队", signin_path, :remote => true, :class => "enroll-in-b fr" %> <% else %> <% unless @competition.enroll_end_time.present? && @competition.enroll_end_time < Time.now %> - <% if @is_enroll.present? && !@user.is_teacher %> + <% if !@can_enroll %> 加入战队 <% else %> 加入战队 @@ -40,7 +40,7 @@ <% else %>

    <% unless @competition.enroll_end_time.present? && @competition.enroll_end_time < Time.now %> - <% if @is_enroll.present? %> + <% if !@can_enroll %> 立即报名 <% else %> <%= link_to "立即报名", personal_enroll_competition_teams_path(:com_id => @competition.id), :remote => true, :class => "enroll-in-b enroll-in-b-green fr" %> @@ -97,6 +97,10 @@ 退出 <% end %> <% end %> + + <% if @competition.identifier == 'gcc-course-2019' %> + <%= link_to '战队详情', competition_team_path(id: @competition.id) %> + <% end %>

  • <% end %> diff --git a/app/views/managements/_competition_list_page.html.erb b/app/views/managements/_competition_list_page.html.erb index 073d1133..e5f2d6a5 100644 --- a/app/views/managements/_competition_list_page.html.erb +++ b/app/views/managements/_competition_list_page.html.erb @@ -78,12 +78,24 @@
    <% @competition.competition_staffs.each do |staff| %>
    - <%= select_tag('competition_staffs[][category]', options_for_select(CompetitionStaff.category_options, staff.category), class: 'winput-120-30') %> - -   ~   - - 人 - +
    + <%= select_tag('competition_staffs[][category]', options_for_select(CompetitionStaff.category_options, staff.category), class: 'winput-120-30') %> + +   ~   + + 人 +
    + +
    + name="competition_staffs[][mutiple_limited]" class="mutiple-limited-radio" type="checkbox" value="false"> + +
    +
    + name="competition_staffs[][mutiple_limited]" class="mutiple-limited-radio" type="checkbox" value="true"> + +
    + + @@ -167,15 +179,27 @@ @@ -546,5 +570,14 @@ $('.competition-staff-settings').on('click', '.delete-icon', function(){ $(this).parents('.competition-staff-row').remove(); }); + + $('.competition-staff-settings').on('click', '.mutiple-limited-radio', function(){ + var radio = $(this); + if (radio.is(':checked')) { + radio.parent().siblings().find('.mutiple-limited-radio').attr('checked', false) + } else { + radio.parent().siblings().find('.mutiple-limited-radio').attr('checked', true) + } + }) }) diff --git a/db/migrate/20190704063532_add_multiple_limited_to_competition_staffs.rb b/db/migrate/20190704063532_add_multiple_limited_to_competition_staffs.rb new file mode 100644 index 00000000..a4b53c96 --- /dev/null +++ b/db/migrate/20190704063532_add_multiple_limited_to_competition_staffs.rb @@ -0,0 +1,5 @@ +class AddMultipleLimitedToCompetitionStaffs < ActiveRecord::Migration + def change + add_column :competition_staffs, :mutiple_limited, :boolean, default: false + end +end diff --git a/public/stylesheets/educoder/edu-main.css b/public/stylesheets/educoder/edu-main.css index 711a1f96..881f7ed9 100644 --- a/public/stylesheets/educoder/edu-main.css +++ b/public/stylesheets/educoder/edu-main.css @@ -917,4 +917,54 @@ html>body #ajax-indicator { position: fixed; } padding-bottom: 235px; min-width: 1200px; padding-top: 60px; -} \ No newline at end of file +} + +/* css3 radio */ +.radio-check { + position: relative; + height: 35px; +} +.radio-check > input { + position: absolute; + left: 0; + top: 0; + width: 14px; + height: 14px; + opacity: 0; + z-index: 100; +} +.radio-check > label { + position: absolute; + left: 20px; + line-height: 14px; + top: 0px; +} +.radio-check > label:before { + content: ''; + position: absolute; + left: -20px; + top: 0px; + display: inline-block; + width: 14px; + height: 14px; + border-radius: 50%; + border: 1px solid #ddd; +} +.radio-check > label:after { + content: ''; + position: absolute; + left: -20px; + top: 0px; + display: inline-block; + width: 8px; + height: 8px; + border-radius: 50%; + margin-top: 4px; + margin-left: 4px; +} +.radio-check input[type='checkbox']:checked + label:before { + border-color: #29BD8B; +} +.radio-check input[type='checkbox']:checked + label:after { + background: #29BD8B; +}