From 3e68b5a652eaff290b9bb992d357d045935d0005 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Wed, 13 Nov 2019 19:09:38 +0800 Subject: [PATCH] =?UTF-8?q?OJ=E9=97=A8=E6=88=B7=E9=A6=96=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/hacks_controller.rb | 49 +++++++++++++++++-- app/controllers/shixuns_controller.rb | 3 -- app/models/hack.rb | 9 +++- app/models/hack_user_code.rb | 1 + app/models/hack_user_lastest_code.rb | 4 ++ app/views/hacks/index.json.jbuilder | 13 +++++ ...12010611_create_hack_user_lastest_codes.rb | 1 - ...tus_end_time_for_hack_user_lastest_code.rb | 11 +++++ 8 files changed, 83 insertions(+), 8 deletions(-) create mode 100644 app/views/hacks/index.json.jbuilder create mode 100644 db/migrate/20191113061854_add_status_end_time_for_hack_user_lastest_code.rb diff --git a/app/controllers/hacks_controller.rb b/app/controllers/hacks_controller.rb index 031c7ec72..a9a1db44a 100644 --- a/app/controllers/hacks_controller.rb +++ b/app/controllers/hacks_controller.rb @@ -4,9 +4,19 @@ class HacksController < ApplicationController before_action :require_auth_identity, only: [:update, :edit, :publish] before_action :find_hack, only: [:edit, :update] - + # 首页 def index - render_ok + # 筛选过滤与排序 + params_filter_or_order + # 我解决的编程题数 + user_codes = HackUserLastestCode.mine(current_user).passed.joins(:hack) + @simple_count = user_codes.where(hacks: {difficult: 1}).count + @medium_count = user_codes.where(hacks: {difficult: 2}).count + @diff_count = user_codes.where(hacks: {difficult: 3}).count + @pass_count = @simple_count + @medium_count + @diff_count + + @hacks_count = @hacks.count("hacks.id") + @hacks = paginate @hacks end def create @@ -92,7 +102,6 @@ class HacksController < ApplicationController params.require(:hack).permit(:difficult, :category, :open_or_not, :time_limit, :score) end - def param_update_sets sets, all_sets_id delete_set_ids = all_sets_id - sets.map{|set|set[:id]} @hack.hack_sets.where(id: delete_set_ids).destroy_all @@ -104,4 +113,38 @@ class HacksController < ApplicationController end end + def params_filter_or_order + # 如果有来源,就不管发布公开私有 + select_sql = "hacks.*, if(hacks.hack_user_lastest_codes_count=0, 0, hacks.pass_num/hacks.hack_user_lastest_codes_count) passed_rate" + if params[:come_from] + hacks = Hack.select(select_sql).mine(current_user.id) + else + hacks = Hack.select(select_sql).published.opening + end + # 搜索 + if params[:search] + hacks = hacks.where("name like ?", "%#{params[:search]}%") + end + # 难度 + if params[:difficult] + hacks = hacks.where(difficult: params[:difficult]) + end + # 状态 + if params[:status] + user_hacks = HackUserLastestCode.where(user_id: current_user.id) + if params[:status].to_i == -1 + if user_hacks.present? + hacks = hacks.where.not(id: user_hacks.pluck(:hack_id)) + end + else + hacks = hacks.joins(:hack_user_lastest_code).where(hack_user_lastest_code: {status: params[:status]}) + end + end + # 排序 + sort_by = params[:sort_by] || "hack_user_lastest_codes_count" + sort_direction = params[:sort_direction] || "desc" + @hacks = hacks.order("#{sort_by} #{sort_direction}") + end + + end diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index 05c3500ee..98239380f 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -478,10 +478,7 @@ class ShixunsController < ApplicationController ShixunMirrorRepository.create(:shixun_id => @shixun.id, :mirror_repository_id => mirror) end end - logger.info("#########shixun_params#{shixun_params}") @shixun.update_attributes(shixun_params) - logger.info("##########shixun_info_params: #{shixun_info_params}") - logger.info("##########params[:shixun_info][:evaluate_script]: #{params[:shixun_info][:evaluate_script]}") @shixun.shixun_info.update_attributes(shixun_info_params) @shixun.shixun_schools.delete_all # scope_partment: 高校的名称 diff --git a/app/models/hack.rb b/app/models/hack.rb index 2feecaab1..89c55a529 100644 --- a/app/models/hack.rb +++ b/app/models/hack.rb @@ -1,11 +1,18 @@ class Hack < ApplicationRecord + # status: 0 未发布; 1已发布 + # diffcult: 难度 1:简单;2:中等; 3:困难 # 编程题 validates_length_of :name, maximum: 60 # 测试集 has_many :hack_sets, ->{order("position asc")}, :dependent => :destroy - # 代码 has_many :hack_codes, :dependent => :destroy + has_many :hack_user_codes, :dependent => :destroy + has_one :hack_user_lastest_code, :dependent => :destroy + + scope :published, -> { where(status: 1) } + scope :opening, -> {where(open_or_not: 1)} + scope :mine, -> (author_id){ where(user_id: author_id) } def language if hack_codes.count == 1 diff --git a/app/models/hack_user_code.rb b/app/models/hack_user_code.rb index c72efd447..d9d2dff77 100644 --- a/app/models/hack_user_code.rb +++ b/app/models/hack_user_code.rb @@ -1,3 +1,4 @@ class HackUserCode < ApplicationRecord # 用户编程题的信息 + belongs_to :hack end diff --git a/app/models/hack_user_lastest_code.rb b/app/models/hack_user_lastest_code.rb index 8ca86c7cd..4d0fd47e1 100644 --- a/app/models/hack_user_lastest_code.rb +++ b/app/models/hack_user_lastest_code.rb @@ -1,4 +1,8 @@ class HackUserLastestCode < ApplicationRecord # 编程题最新代码 + belongs_to :hack, counter_cache: true + + scope :mine, ->(author_id){ where(user_id: author_id)} + scope :passed, -> {where(status: 1)} end diff --git a/app/views/hacks/index.json.jbuilder b/app/views/hacks/index.json.jbuilder new file mode 100644 index 000000000..c86884a41 --- /dev/null +++ b/app/views/hacks/index.json.jbuilder @@ -0,0 +1,13 @@ +json.top_data do + json.passed_count @pass_count + json.simple_count @simple_count + json.medium_count @medium_count + json.diff_count @diff_count +end + +json.hacks_count @hacks_count +json.hacks_list do + json.array! @hacks do |hack| + json.(hack,:identifier, :name , :hack_user_lastest_codes_count, :difficult, :passed_rate, :category) + end +end \ No newline at end of file diff --git a/db/migrate/20191112010611_create_hack_user_lastest_codes.rb b/db/migrate/20191112010611_create_hack_user_lastest_codes.rb index 1b3f07809..9c5227a54 100644 --- a/db/migrate/20191112010611_create_hack_user_lastest_codes.rb +++ b/db/migrate/20191112010611_create_hack_user_lastest_codes.rb @@ -7,7 +7,6 @@ class CreateHackUserLastestCodes < ActiveRecord::Migration[5.2] t.timestamps end - add_index :hack_user_lastest_codes, [:user_id, :hack_id], unique: true end end diff --git a/db/migrate/20191113061854_add_status_end_time_for_hack_user_lastest_code.rb b/db/migrate/20191113061854_add_status_end_time_for_hack_user_lastest_code.rb new file mode 100644 index 000000000..65af428b8 --- /dev/null +++ b/db/migrate/20191113061854_add_status_end_time_for_hack_user_lastest_code.rb @@ -0,0 +1,11 @@ +class AddStatusEndTimeForHackUserLastestCode < ActiveRecord::Migration[5.2] + def change + add_column :hack_user_lastest_codes, :passed, :boolean, :default => false + add_column :hack_user_lastest_codes, :pass_time, :timestamp + add_column :hack_user_lastest_codes, :status, :integer, :default => 0 + add_column :hacks, :hack_user_lastest_codes_count, :integer, :default => 0 + add_column :hacks, :pass_num, :integer, :default => 0 + add_index :hack_user_lastest_codes, :user_id, name: "user_index" + add_index :hack_user_lastest_codes, :hack_id, name: "hack_index" + end +end