diff --git a/app/controllers/admins/shixun_feedback_messages_controller.rb b/app/controllers/admins/shixun_feedback_messages_controller.rb new file mode 100644 index 000000000..31fcc468c --- /dev/null +++ b/app/controllers/admins/shixun_feedback_messages_controller.rb @@ -0,0 +1,14 @@ +class Admins::ShixunFeedbackMessagesController < Admins::BaseController + + def index + default_sort('created_at', 'desc') + @params_page = params[:page] || 1 + if params[:keyword] + discusses = Discuss.find_by_sql("select * from discusses join shixuns on discusses.dis_id = shixuns.id where discusses.dis_type='Shixun' AND + shixuns.name like '%#{params[:keyword]}%'") + else + discusses = Discuss.where(:dis_type => 'Shixun').includes(:user, :dis) + end + @discusses = paginate discusses + end +end \ No newline at end of file diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 3f44fdafc..3ec8ad0f7 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -404,25 +404,6 @@ class ApplicationController < ActionController::Base end end - # 处理返回非0就报错的请求 - def interface_post(uri, params, status, message) - begin - uid_logger_dubug("--uri_exec: params is #{params}, url is #{uri}") - uri = URI.parse(URI.encode(uri.strip)) - res = Net::HTTP.post_form(uri, params).body - uid_logger_dubug("--uri_exec: .....res is #{res}") - res = JSON.parse(res) - if (res && res['code'] != 0) - tip_exception(status, message) - else - res - end - rescue Exception => e - uid_logger("--uri_exec: exception #{e.message}") - raise Educoder::TipException.new("实训平台繁忙(繁忙等级:84)") - end - end - # json格式请求 def interface_json_post(uri, params, status, message) begin diff --git a/app/controllers/concerns/login_helper.rb b/app/controllers/concerns/login_helper.rb index 19726c42a..ede7ff071 100644 --- a/app/controllers/concerns/login_helper.rb +++ b/app/controllers/concerns/login_helper.rb @@ -29,7 +29,7 @@ module LoginHelper Rails.logger.info("id: #{user&.id} Successful authentication start: '#{user.login}' from #{request.remote_ip} at #{Time.now.utc}") # Valid user self.logged_user = user - + session[:"#{default_yun_session}"] = user.id # generate a key and set cookie if autologin set_autologin_cookie(user) diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index bf7f465d5..48554111c 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -610,7 +610,7 @@ class ExercisesController < ApplicationController # 对未提交的用户进行调分 def adjust_score exercise_user = @exercise.exercise_users.find_by!(user_id: params[:user_id]) - tip_exception("已提交的作品请去评阅页进行调分") if exercise_user.commit_status == 1 + tip_exception("已提交的作品请去评阅页进行调分") if exercise_user.commit_status == 1 && exercise_user.commit_method != 5 if @exercise.subjective_score > 0 tip_exception("主观题成绩不能为空") if params[:subjective_score].blank? tip_exception("主观题成绩不能小于零") if params[:subjective_score].to_f < 0 @@ -628,8 +628,13 @@ class ExercisesController < ApplicationController subjective_score = @exercise.subjective_score > 0 ? params[:subjective_score].to_f.round(2) : 0 objective_score = @exercise.objective_score > 0 ? params[:objective_score].to_f.round(2) : 0 score = subjective_score + objective_score - exercise_user.update_attributes!(start_at: start_at_time, end_at: Time.now, status: 1, commit_status: 1, score: score, - subjective_score: subjective_score, objective_score: objective_score, commit_method: 5) + if exercise_user.commit_status == 1 + exercise_user.update_attributes!(score: score, subjective_score: subjective_score, objective_score: objective_score) + else + exercise_user.update_attributes!(start_at: start_at_time, end_at: Time.now, status: 1, commit_status: 1, score: score, + subjective_score: subjective_score, objective_score: objective_score, commit_method: 5) + end + ExerciseUserScore.create!(exercise_id: @exercise.id, exercise_user_id: exercise_user.id, subjective_score: subjective_score, objective_score: objective_score) normal_status("操作成功") diff --git a/app/controllers/hack_user_lastest_codes_controller.rb b/app/controllers/hack_user_lastest_codes_controller.rb index 9602673e5..d03b9bd7d 100644 --- a/app/controllers/hack_user_lastest_codes_controller.rb +++ b/app/controllers/hack_user_lastest_codes_controller.rb @@ -1,9 +1,9 @@ class HackUserLastestCodesController < ApplicationController before_action :require_login, except: [:listen_result] before_action :find_my_hack, only: [:show, :code_debug, :code_submit, :update_code, - :listen_result, :result, :submit_records] + :listen_result, :result, :submit_records, :restore_initial_code] before_action :update_user_hack_status, only: [:code_debug, :code_submit] - before_action :require_auth_identity, only: [:update_code] + before_action :require_auth_identity, only: [:update_code, :restore_initial_code] before_action :require_manager_identity, only: [:update_code] def show @@ -14,6 +14,11 @@ class HackUserLastestCodesController < ApplicationController @my_hack.update_attribute(:code, params[:code]) end + # 回复初始代码 + def restore_initial_code + @my_hack.update_attribute(:code, @hack.code) + end + # 调试代码 def code_debug exec_mode = "debug" @@ -35,7 +40,7 @@ class HackUserLastestCodesController < ApplicationController # 提交结果显示 def result if @my_hack.submit_status == 1 - render json: {status:0, message: "正在评测中"} + render json: {status: 1, message: "正在评测中"} else @mode = params[:mode] @result = @@ -105,7 +110,7 @@ class HackUserLastestCodesController < ApplicationController else [{input: params[:input]}] end - testCases = Base64.urlsafe_encode64(test_sets.to_json) + testCases = Base64.encode64(test_sets.to_json) #codeFileContent = Base64.urlsafe_encode64(@my_hack.code) debug_params = {execMode: exec_mode, tpiID: @my_hack.identifier, diff --git a/app/controllers/hacks_controller.rb b/app/controllers/hacks_controller.rb index f9052de8a..0a8a24f08 100644 --- a/app/controllers/hacks_controller.rb +++ b/app/controllers/hacks_controller.rb @@ -1,8 +1,9 @@ class HacksController < ApplicationController before_action :require_login, except: [:index] + before_action :find_hack, only: [:edit, :update, :publish, :start, :update_set, :delete_set] before_action :require_teacher_identity, only: [:create, :update_set] before_action :require_auth_identity, only: [:update, :edit, :publish, :update_set, :delete_set] - before_action :find_hack, only: [:edit, :update, :publish, :start, :update_set, :delete_set] + # 开启编程,如果第一次开启,创建一条记录,如果已经开启过的话,直接返回标识即可 def start @@ -163,7 +164,7 @@ class HacksController < ApplicationController hacks = Hack.select(select_sql).mine(current_user.id) else # 全部包括已经发布的,和我的未发布的 - hacks = Hack.select(select_sql).published.opening.merge(Hack.select(select_sql).unpublish.mine(current_user.id)) + hacks = Hack.select(select_sql).published.opening.or(Hack.select(select_sql).unpublish.mine(current_user.id)) end # 搜索 if params[:search] @@ -181,9 +182,14 @@ class HacksController < ApplicationController 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]}) + hacks = hacks.joins(:hack_user_lastest_codes).where(hack_user_lastest_codes: {status: params[:status]}) end end + # 分类 + if params[:category] + hacks = hacks.where(category: params[:category]) + end + # 排序 sort_by = params[:sort_by] || "hack_user_lastest_codes_count" sort_direction = params[:sort_direction] || "desc" diff --git a/app/controllers/oauth/base_controller.rb b/app/controllers/oauth/base_controller.rb index 327f21845..11ac69d71 100644 --- a/app/controllers/oauth/base_controller.rb +++ b/app/controllers/oauth/base_controller.rb @@ -2,6 +2,7 @@ class Oauth::BaseController < ActionController::Base include RenderHelper include LoginHelper include ControllerRescueHandler + include LaboratoryHelper skip_before_action :verify_authenticity_token @@ -24,4 +25,9 @@ class Oauth::BaseController < ActionController::Base Rails.logger.info("[OAuth2] omniauth.auth -> #{request.env['omniauth.auth'].inspect}") request.env['omniauth.auth'] end + + def default_yun_session + @_default_yun_session = "#{request.subdomain.split('.').first}_user_id" + # @_default_yun_session = "#{current_laboratory.try(:identifier).split('.').first}_user_id" + end end \ No newline at end of file diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb index 5a3fda7a4..068a0dafd 100644 --- a/app/controllers/polls_controller.rb +++ b/app/controllers/polls_controller.rb @@ -198,14 +198,14 @@ class PollsController < ApplicationController def common_header ActiveRecord::Base.transaction do begin + @poll_status = @poll.get_poll_status(current_user) if @user_course_identity > Course::ASSISTANT_PROFESSOR @is_teacher_or = 0 - @user_poll_answer = @poll.check_user_votes_status(current_user) + @user_poll_answer = @poll.check_user_votes_status(current_user, @poll_status) else @is_teacher_or = 1 @user_poll_answer = 3 #教师页面 end - @poll_status = @poll.get_poll_status(current_user) poll_id_array = [@poll.id] @poll_publish_count = get_user_permission_course(poll_id_array,2).count #是否存在已发布的 @poll_unpublish_count = get_user_permission_course(poll_id_array,1).count #是否存在未发布的 diff --git a/app/controllers/subjects_controller.rb b/app/controllers/subjects_controller.rb index d38293a8f..917f3ad8e 100644 --- a/app/controllers/subjects_controller.rb +++ b/app/controllers/subjects_controller.rb @@ -2,7 +2,7 @@ class SubjectsController < ApplicationController before_action :require_login, :check_auth, except: [:index, :show, :right_banner] # before_action :check_auth, except: [:index] before_action :check_account, except: [:index, :show, :right_banner] - before_action :find_subject, except: [:index, :create, :new, :append_to_stage] + before_action :find_subject, except: [:index, :create, :new, :append_to_stage, :add_shixun_to_stage] before_action :allowed, only: [:update, :edit, :destroy, :publish, :cancel_publish, :cancel_has_publish, :search_members, :add_subject_members, :statistics, :shixun_report, :school_report, :up_member_position, :down_member_position, :update_team_title] @@ -212,6 +212,16 @@ class SubjectsController < ApplicationController @shixuns = Shixun.where(id: params[:shixun_id]).order("id desc") end + # 添加实训项目 + def add_shixun_to_stage + identifier = generate_identifier Shixun, 8 + ActiveRecord::Base.transaction do + @shixun = Shixun.create!(name: params[:name], user_id: current_user.id, identifier: identifier) + # 添加合作者 + @shixun.shixun_members.create!(user_id: current_user.id, role: 1) + end + end + def choose_course course_ids = Course.find_by_sql("SELECT c.id FROM courses c, course_members m WHERE m.course_id = c.id AND m.role in (1,2,3) diff --git a/app/controllers/tidings_controller.rb b/app/controllers/tidings_controller.rb index 9324b2755..5acffcb16 100644 --- a/app/controllers/tidings_controller.rb +++ b/app/controllers/tidings_controller.rb @@ -6,6 +6,7 @@ class TidingsController < ApplicationController def index tidings = current_user.tidings + @onclick_time = current_user.click_time tiding_types = case params[:type] @@ -18,11 +19,13 @@ class TidingsController < ApplicationController end tidings = tidings.where(tiding_type: tiding_types) if tiding_types.present? + tidings = tidings.where(container_type: 'JoinCourse') if params[:type] == 'course_apply' + @course_apply_count = tidings.where("created_at > '#{@onclick_time}'").where(container_type: 'JoinCourse').count + tidings = tidings.where(container_type: 'ProjectPackage') if params[:type] == 'project_package' @count = tidings.count @tidings = paginate(tidings.order(created_at: :desc), per_page: 10) - @onclick_time = current_user.click_time end private diff --git a/app/controllers/weapps/code_sessions_controller.rb b/app/controllers/weapps/code_sessions_controller.rb index 887e97eed..2dbd08e82 100644 --- a/app/controllers/weapps/code_sessions_controller.rb +++ b/app/controllers/weapps/code_sessions_controller.rb @@ -15,6 +15,8 @@ class Weapps::CodeSessionsController < Weapps::BaseController logged = true else # 根据 code没拿到 unionid + Rails.logger.info("[Weapp] session_key: #{result['session_key']}") + Rails.logger.info("[Weapp] code: #{params[:code]}") user_info = Wechat::Weapp.decrypt(result['session_key'], params[:encrypted_data], params[:iv]) # 老用户,已绑定 diff --git a/app/controllers/weapps/courses_controller.rb b/app/controllers/weapps/courses_controller.rb index 8716e6b28..c2335998e 100644 --- a/app/controllers/weapps/courses_controller.rb +++ b/app/controllers/weapps/courses_controller.rb @@ -1,6 +1,6 @@ class Weapps::CoursesController < Weapps::BaseController before_action :require_login - before_action :user_course_identity, except: [:create] + before_action :set_course, :user_course_identity, except: [:create] before_action :teacher_allowed, only: [:edit, :update] before_action :teacher_or_admin_allowed, only: [:change_member_roles, :delete_course_teachers] @@ -35,6 +35,9 @@ class Weapps::CoursesController < Weapps::BaseController # 教师列表 def teachers @course = current_course + @page = (params[:page] || 1).to_i + @limit = (params[:limit] || 20).to_i + search = params[:search].present? ? params[:search].strip : "" if @course.try(:id) != 1309 || current_user.admin? || current_user.try(:id) == 15582 @teacher_list = @course.course_members.joins(:user).where("course_members.role in (1, 2, 3)") else @@ -42,17 +45,26 @@ class Weapps::CoursesController < Weapps::BaseController and course_members.role = 2))") end + if search.present? + @teacher_list = @teacher_list.joins(:user).where("LOWER(CONCAT(users.lastname, users.firstname)) like ?", "%#{search}%") + end + @teacher_list_size = @teacher_list.size @applications_size = CourseMessage.unhandled_join_course_requests_by_course(@course).size - @teacher_list = @teacher_list.preload(user: [user_extension: :school]) + @teacher_list = @teacher_list.includes(user: [user_extension: :school]) + # 中英文混合排序(忽略大小写) + @teacher_list = @teacher_list.sort {|x, y| Pinyin.t(x.user&.real_name, splitter: '').upcase <=> Pinyin.t(y.user&.real_name, splitter: '').upcase} + @teacher_list = @teacher_list[(@page-1)*@limit ... @page*@limit] end # 批量删除教师或助教 def delete_course_teachers begin @course = current_course + @page = (params[:page] || 1).to_i + @limit = (params[:limit] || 20).to_i course_members = @course.course_members.where(id: params[:course_member_ids], role: %i[PROFESSOR ASSISTANT_PROFESSOR]) user_ids = course_members.pluck(:user_id) course_members.destroy_all @@ -67,10 +79,18 @@ class Weapps::CoursesController < Weapps::BaseController def students @course = current_course + @page = (params[:page] || 1).to_i + @limit = (params[:limit] || 20).to_i + search = params[:search].present? ? params[:search].strip : nil course_group_id = params[:course_group_id].present? ? params[:course_group_id].to_i : nil @students = CourseMember.students(@course) + if search.present? + @students = @students.joins(user: :user_extension).where("LOWER(CONCAT(users.lastname, users.firstname)) like ? or + user_extensions.student_id like ?", "%#{search}%", "%#{search}%") + end + if course_group_id.present? course_group = CourseGroup.find(course_group_id) if course_group_id != 0 @students = @students.where(course_group_id: course_group&.id.to_i) @@ -78,6 +98,9 @@ class Weapps::CoursesController < Weapps::BaseController @students_count = @students.size @students = @students.includes(user: :user_extension) + # 中英文混合排序(忽略大小写) + @students = @students.sort {|x, y| Pinyin.t(x.user&.real_name, splitter: '').upcase <=> Pinyin.t(y.user&.real_name, splitter: '').upcase} + @students = @students[(@page-1)*@limit ... @page*@limit] end # 批量修改角色 @@ -167,4 +190,9 @@ class Weapps::CoursesController < Weapps::BaseController tip_exception(403, "..") end end + + def set_course + @course = Course.find_by!(id: params[:id]) + tip_exception(404, "") if @course.is_delete == 1 && !current_user.admin? + end end \ No newline at end of file diff --git a/app/controllers/weapps/registers_controller.rb b/app/controllers/weapps/registers_controller.rb index fde0f0583..de48ebd54 100644 --- a/app/controllers/weapps/registers_controller.rb +++ b/app/controllers/weapps/registers_controller.rb @@ -51,7 +51,7 @@ class Weapps::RegistersController < Weapps::BaseController # session[:user_id] = @user.id session[:"#{default_yun_session}"] = @user.id - render_ok + # render_ok(user_id: @user.id) end private diff --git a/app/helpers/polls_helper.rb b/app/helpers/polls_helper.rb index 866d28254..7ae4470e2 100644 --- a/app/helpers/polls_helper.rb +++ b/app/helpers/polls_helper.rb @@ -77,7 +77,7 @@ module PollsHelper ex_pb_time = poll.get_poll_times(user.id,false) poll_publish_time = ex_pb_time[:publish_time] poll_end_time = ex_pb_time[:end_time] - current_status = poll.check_user_votes_status(user) + current_status = poll.check_user_votes_status(user, poll_status) lock_icon = 0 #不显示锁图标 else poll_users_list = poll.get_poll_exercise_users diff --git a/app/helpers/weapps/courses_helper.rb b/app/helpers/weapps/courses_helper.rb index 94769fc2e..32de8f253 100644 --- a/app/helpers/weapps/courses_helper.rb +++ b/app/helpers/weapps/courses_helper.rb @@ -20,10 +20,10 @@ module Weapps::CoursesHelper end end end - data = data.sort do |a, b| - [a[:letter]] <=> [b[:letter]] - end - data.push(data.shift) if data.select{|a|a[:letter]=='#'}.first.present? # '#'排在最后 + # data = data.sort do |a, b| + # [a[:letter]] <=> [b[:letter]] + # end + # data.push(data.shift) if data.select{|a|a[:letter]=='#'}.first.present? # '#'排在最后 return data end @@ -47,10 +47,10 @@ module Weapps::CoursesHelper end end end - data = data.sort do |a, b| - [a[:letter]] <=> [b[:letter]] - end - data.push(data.shift) if data.select{|a|a[:letter]=='#'}.first.present? # '#'排在最后 + # data = data.sort do |a, b| + # [a[:letter]] <=> [b[:letter]] + # end + # data.push(data.shift) if data.select{|a|a[:letter]=='#'}.first.present? # '#'排在最后 return data end diff --git a/app/models/hack.rb b/app/models/hack.rb index 814debef5..80724d3d4 100644 --- a/app/models/hack.rb +++ b/app/models/hack.rb @@ -26,9 +26,11 @@ class Hack < ApplicationRecord def code if hack_codes.count == 1 - tran_base64_decode64(hack_codes.first.code) + #tran_base64_decode64(hack_codes.first.code) + hack_codes.first.code else - tran_base64_decode64(hack_codes.pluck(:code)) + #tran_base64_decode64(hack_codes.pluck(:code)) + hack_codes.pluck(:code) end end diff --git a/app/models/poll.rb b/app/models/poll.rb index 9cb860f61..5c1a9a64c 100644 --- a/app/models/poll.rb +++ b/app/models/poll.rb @@ -128,7 +128,7 @@ class Poll < ApplicationRecord en_time = end_time else poll_group_setting = poll_group_settings - user_group = course.course_members.where(user_id: user_id).select(:course_group_id) + user_group = course.students.where(user_id: user_id).select(:course_group_id) if user_group.exists? user_group_id = user_group.first&.course_group_id user_p_group_setting = poll_group_setting.where(course_group_id: user_group_id).select(:publish_time,:end_time) @@ -146,12 +146,22 @@ class Poll < ApplicationRecord end #判断当前用户的答题状态 - def check_user_votes_status(user) + def check_user_votes_status(user, poll_status) poll_answer_user = poll_users.where(user_id: user.id).select(:start_at,:end_at,:commit_status) user_status = 2 if poll_answer_user.exists? && (poll_answer_user.first&.start_at.present? || poll_answer_user.first&.end_at.present?) #学生有过答题的,或者立即截止,但学生未做试卷的 user_status = poll_answer_user.first.commit_status end + # 问卷已截止时学生的答题状态需要考虑问卷的状态 + if poll_status > 2 + # 问卷如果还是继续答题状态则自动提交 + if user_status == 0 + poll_end_time = get_poll_times(user.id,false)[:end_time] + poll_answer_user.first.update_attributes!(:commit_status => 1, :end_at => poll_end_time) + user_status = 1 + end + user_status = user_status == 1 ? 1 : 4 + end user_status end diff --git a/app/views/admins/shared/_sidebar.html.erb b/app/views/admins/shared/_sidebar.html.erb index f78b52ac7..7b1f5db7a 100644 --- a/app/views/admins/shared/_sidebar.html.erb +++ b/app/views/admins/shared/_sidebar.html.erb @@ -65,6 +65,12 @@ <% end %> +
序号 | +实训名称 | +评论内容 | +评论者 | +评论时间 | +
---|---|---|---|---|
<%= (@params_page.to_i - 1) * 20 + index + 1 %> | + <% identifier = Game.find_by(challenge_id: discuss.challenge_id, user_id: discuss.user_id)&.identifier %> +<%= link_to discuss.dis.name, "/tasks/#{identifier}", target: '_blank'%> | +<%= content_safe discuss.content %> | +<%= discuss.user.show_real_name %> | +<%= format_time discuss.created_at %> | +