# encoding=utf-8 # 外部数据分析专用 class SourcesService include ApplicationHelper include GamesHelper LIMIT = 10 # shixuns start ############################################ def shixun_index params #offset = params[:page].to_i * 15 #Shixun.select([:id, :identifier]).offset(offset).limit(15) Shixun.select([:id, :name,:identifier, :created_at]).where("created_at < ?", params[:time]) end def shixun_detail params shixun = Shixun.select([:id, :identifier, :name, :description, :user_id, :myshixuns_count, :evaluate_script, :propaedeutics, :challenges_count, :gpid, :created_at, :updated_at]).find_by_identifier(params[:identifier]) return {:status => 404} unless shixun.present? g = Gitlab.client git_url = "#{Redmine::Configuration['gitlab_address']}/#{g.project(shixun.try(:gpid)).try(:path_with_namespace)}.git" language = shixun.mirror_repositories.first.try(:type_name) homework_common_ids = HomeworkCommonsShixuns.where(:shixun_id => shixun.id).pluck(:homework_common_id) course_ids = HomeworkCommon.where(:id => homework_common_ids).pluck(:course_id) course_info =[] course_ids.each do |id| course= Course.select([:name]).find id course_info << {course_id: id, course_name: course.name} end list = shixun.try(:attributes).merge({:git_url => git_url, :language => language, :course_info => course_info}) return list end def shixun_challenges params list = [] shixun = Shixun.find_by_identifier(params[:identifier]) return {:status => 404} unless shixun.present? shixun.challenges.each do |challenge| sets = [] challenge.test_sets.each do |set| sets << {input: set.input, output: set.output} end list << {:id => challenge.id, :name => challenge.subject, :shixun_id => challenge.shixun_id, :task_pass => challenge.task_pass, :position => challenge.position, :answer => challenge.answer, :score => challenge.score, :path => challenge.path, :difficulty => challenge.difficulty, :user_id => shixun.user_id, :sets => sets} end return list end def get_tpi_info params shixun = Shixun.find_by_identifier params[:identifier] page = params[:page].to_i offset = page * 10 challenge_paths = shixun.challenges.pluck(:path) myshixuns = shixun.myshixuns.select([:id, :user_id, :gpid, :shixun_id]).offset(offset).limit(10) g = Gitlab.client tpi_info = [] myshixuns.each do |myshixun| code_info = [] challenge_paths.each do |paths| x_paths = paths.split(";") x_paths.each do |path| Rails.logger.info("############################gpid: #{myshixun.gpid}") Rails.logger.info("############################path: #{path}") code = g.files(myshixun.gpid, path, "master").try(:content) code = tran_base64_decode64(code) # 取begin和end之间的代码 if code.present? user_code = code.match(/\/\*+ Begin \*+\/(\S*)\/\*+ End \*+\//) coder = user_code[1] if code.length == 2 end code_info << {path: path, code: code} end end tpi_info << {user_id: myshixun.user_id, code: code_info} end {tpi_info: tpi_info} end # paths start ########################### def get_paths_info params path = Subject.find params[:id] stages = path.stages.order("position asc") path_info = [] stages.each do |stage| chapter_name = stage.name chapter_shixuns = [] stage.stage_shixuns.each do |stage_shixun| challenges = stage_shixun.shixun.challenges challenge_info = [] challenges.each do |challenge| challenge_info << {challenge_id: challenge.id, challenge_name: challenge.subject} end chapter_shixuns << {name: stage_shixun.shixun.name, identifier: stage_shixun.shixun.identifier, challenge_info: challenge_info} end path_info << {chapter_name: chapter_name, chapter_shixuns: chapter_shixuns} end { path_info: path_info} end # games start ############################################ def myshixuns_index params endTime = Time.parse(params[:time].to_s) beginTime = Time.parse(params[:begin_time].to_s) offset = ((params[:page] || 1).to_i - 1) * 50 Myshixun.select([:id, :user_id, :shixun_id]).where("created_at < ? and created_at > ?", endTime, beginTime).offset(offset).limit(50) end def search_myshixun params myshixun = Myshixun.where(:shixun_id => params[:shixun_id], :user_id => params[:user_id]).first return {:status => 404} unless myshixun.present? g = Gitlab.client git_url = "#{Redmine::Configuration['gitlab_address']}/#{g.project(myshixun.try(:gpid)).try(:path_with_namespace)}.git" {:status => myshixun.status, :git_url => git_url, :shixun_id => myshixun.shixun_id, :user_id => myshixun.user_id} end def games params time = Time.parse(params[:time].to_s) offset = ((params[:page] || 1).to_i - 1) * 50 Game.select([:id, :identifier, :user_id, :myshixun_id]).where("created_at < ?", time).offset(offset).limit(50) end # 关卡详情 def game_detail params game = Game.min.find_by_identifier(params[:identifier]) myshixun = game.myshixun return {:status => 404} unless game.present? challenge = Challenge.min.find(game.challenge_id) outputs_commit_count = Output.find_by_sql("select count(*) as commit_count from outputs where game_id=#{game.id} and test_set_position=1").first.try(:commit_count) right = game.status == 2 ? true : false type = challenge.st g = Gitlab.client last_code = game.game_codes.pluck(:new_code) commit_status = [] game.outputs.group(:query_index).each_with_index do |output, index| result = output.code == 0 ? true : false commit_status << {commit_time: output.created_at, commit_result: result} end git_url = "#{Redmine::Configuration['gitlab_address']}/#{g.project(myshixun.try(:gpid)).try(:path_with_namespace)}.git" {:id => game.id, :identifier => game.identifier, :commit_count => outputs_commit_count, :right => right, :type => type, :myshixun_id => game.myshixun_id, :final_Score => game.final_score, :git_url => git_url, shixun_id: myshixun.shixun_id, challenge_id: challenge.id, :last_commit_code => last_code, commit_status: commit_status} end # 搜索学员开启的关卡 def search_game params shixun_id = Challenge.where(:id => params[:challenge_id]).pluck(:shixun_id).first myshixun_id = Myshixun.where(:shixun_id => shixun_id, :user_id => params[:user_id]).pluck(:id).first game = Game.where(:myshixun_id => myshixun_id, :challenge_id => params[:challenge_id]).first if game.present? return {:id => game.id, :identifier => game.identifier} else return {:status => 404} end end # users start ############################################ def users params time = Time.parse("#{params[:time]}") users = User.select([:id, :login, :created_on, :firstname, :lastname, :nickname]).includes(user_extensions: :school).where("created_on < ?", time) users = users.map{|user| {id: user.id, login: user.login, username: user.show_real_name, school: user.school_name, work: user.identity, sex: user.sex, created_on: user.created_on}} end def login params user, last_login_on = User.try_to_login(params[:username], params[:password]) return {status: -1, message: '账号或密码错误!'} if user.blank? {status: 1, user_id: user.id, message: "登陆成功!"} end def get_user_info params user = User.find params[:id] mail = user.mail.presence || "login@educoder.net" {username: user.show_real_name, user_id: user.id, email: mail, phone: user.phone, sex: user.sex, school_name: user.school_name} end # courses start ############################################ def course_detail params course = Course.select([:id, :name, :tea_id, :time, :term, :class_period, :school_id, :description, :end_time, :end_term, :visits, :credit, :end_date, :members_count, :homework_commons_count]).find(params[:id]) if course.present? return course.try(:attributes) else return {:status => 404} end end def courses params time = Time.parse("#{params[:time]}") Course.select([:id, :name, :created_at]).where("created_at < ?", time) end def exercises params time = Time.parse("#{params[:time]}") Exercise.select([:id, :exercise_name, :created_at]).where("created_at < ?", time) end def exercise_detail params exercise = Exercise.find params[:id] if exercise.present? return exercise.try(:attributes) else return {:status => 404} end end def get_exercise_questions params exercise = Exercise.find params[:id] exercise_list = [] exercise.exercise_questions.each do |question| title = if question.question_type == 1 || question.question_type == 2 question.exercise_choices.pluck(:choice_text) else [] end right_answer = if question.question_type == 1 || question.question_type == 2 choice_id = question.exercise_standard_answers.first.try(:exercise_choice_id) choice_ids = choice_id.to_s.split("") if choice_id question.exercise_choices.where(:choice_position => choice_ids).pluck(:choice_text) elsif question.question_type == 5 [] else question.exercise_standard_answers.pluck(:answer_text) end exercise_list << {choice_id: choice_id, id: question.id, name: question.question_title, type: question.question_type_name, title: title, right_answer: right_answer, score: question.question_score} end {exercise_id: exercise.id, exercise_name: exercise.exercise_name, course_id: exercise.course_id, course_name: exercise.course.name, exercise_list: exercise_list} end # 竞赛相关 ################################################### def get_competition_members params comp = Competition.find_by_identifier params[:identifier] team_ids = comp.competition_teams.pluck(:id) user_team = TeamMember.where(:competition_team_id => team_ids, :user_id => params[:user_id]).first users =TeamMember.where(:competition_team_id => user_team.try(:competition_team_id)) {team_user_ids: users.as_json(only: [:user_id, :role])} end def get_team_ids params comp = Competition.find_by_identifier params[:identifier] team_ids = comp.competition_teams.pluck(:id) {team_ids: team_ids} end def get_team_user_ids params comp = CompetitionTeam.find params[:team_id] user_ids = comp.team_members.pluck(:user_id) {user_ids: user_ids} end def get_user_competition_id params competition_ids = Competition.where(:identifier => params[:identifier]).pluck(:id) team_id = TeamMember.where(:user_id => params[:educoder_userid], :competition_id => competition_ids).pluck(:competition_team_id) {team_id: team_id} end def get_team_info params comp = Competition.find_by_identifier(params[:identifier]) if comp team_info = [] teams = comp.competition_teams teams.each do |t| team_member = [] t.team_members.each do |m| user = User.find m.user_id team_member << {user_id: m.user_id, user_name: user.show_real_name} end team_info << {team_id: t.id, team_name: t.name, team_member: team_member} end {team_info: team_info} end end def shixun_homework_commons params HomeworkCommon.where(:homework_type => 4, :course_id => params[:id]) end end