OJ门户首页

dev_daiao
daiao 5 years ago
parent 310a628363
commit 3e68b5a652

@ -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

@ -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: 高校的名称

@ -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

@ -1,3 +1,4 @@
class HackUserCode < ApplicationRecord
# 用户编程题的信息
belongs_to :hack
end

@ -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

@ -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

@ -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

@ -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
Loading…
Cancel
Save