Merge branch 'develop'

master
jingquan huang 6 years ago
commit acf3296533

@ -15,6 +15,8 @@ unless RUBY_PLATFORM =~ /w32/
gem 'rqrcode_png'
gem 'roo-xls'
gem 'newrelic_rpm'
gem 'seventeen_mon'
gem 'mobinfo'
end
gem 'certified'
gem 'net-ssh', '2.9.1'
@ -22,8 +24,6 @@ unless RUBY_PLATFORM =~ /w32/
gem 'nokogiri'
end
gem 'seventeen_mon'
gem 'mobinfo'
gem 'simple_xlsx_reader'
gem 'wechat',path: 'lib/wechat'
gem 'grack', path:'lib/grack'

@ -24,7 +24,7 @@ class AccountController < ApplicationController
skip_before_filter :check_if_login_required
skip_before_filter :check_authentication, :only => [:login, :logout, :user_join, :avatar, :authentication, :professional_certification, :security_settings, :change_psd, :user_info]
before_filter :auth_login1, :only => [:avatar, :authentication, :professional_certification, :security_settings, :change_psd, :reset_psd, :user_info]
skip_before_filter :verify_authenticity_token, :only =>[:codepedia_login, :login]
skip_before_filter :verify_authenticity_token, :only =>[:codepedia_login, :login, :register]
before_filter :require_login, only: [:avatar, :authentication, :professional_certification, :security_settings, :change_psd, :user_info, :user_auth, :apply_auth, :apply_pro_certification, :check_student_id,
:bind_email, :change_or_bind]
include ApplicationHelper

@ -1,7 +1,7 @@
# encoding: utf-8
class ChallengesController < ApplicationController
layout "base_shixun"
before_filter :check_authentication
before_filter :check_authentication, :except => [:index]
before_filter :find_shixun, :only => [:index, :new, :create, :destroy, :challenge_build, :update_evaluation, :add_choose_question, :new_choose_question,
:choose_type_show, :edit_choose_question, :update_choose_question, :destroy_challenge_choose]
before_filter :find_challenge, :only => [:show, :edit, :update, :challenge_build, :index_up, :index_down, :destroy, :update_evaluation, :add_choose_question,
@ -316,9 +316,12 @@ class ChallengesController < ApplicationController
script = modify_shixun_script @shixun, @shixun.evaluate_script
@shixun.update_column(:evaluate_script, script)
end
if path != params[:challenge][:path]
shixun_modify_status_without_publish(@shixun, 1)
end
# 学员任务文件路径更新不需要重置
# if path != params[:challenge][:path]
# shixun_modify_status_without_publish(@shixun, 1)
# end
Attachment.attach_files(@challenge, params[:attachments])
elsif params[:tab].to_i == 5
@challenge_tags.delete_all unless @challenge_tags.blank?

@ -1533,6 +1533,16 @@ class CoursesController < ApplicationController
end
end
# 删除实训作业子目录
def delete_homework_category
category = @course.course_homework_categories.where(:id => params[:category_id]).first
if category.present?
category.homework_commons.update_all(:course_homework_category_id => nil)
category.destroy
end
redirect_to homework_common_index_path(:course => @course.id, :homework_type => 4)
end
def toggleCourse
@course_prefs = Course.find_by_extra(@course.extra)
unless (User.current.allowed_to?(:as_teacher,@course_prefs) || User.current.admin?)

@ -16,6 +16,50 @@ class ManagementsController < ApplicationController
CODES = %W(2 3 4 5 6 7 8 9 A B C D E F G H J K L N M O P Q R S T U V W X Y Z)
# 更新实训课程的等级
def update_level_for_subject
subject = Subject.find params[:subject_id]
subject.update_attribute(:subject_level_system_id, params[:level_id])
render :json => {status: 1}
end
# 实训课程等级体系
def subject_level_system
@levels = SubjectLevelSystem.all
end
# 创建课程等级体系
def create_subject_level
raise("名称不能为空") if params[:name].blank?
repeat_name = SubjectLevelSystem.where(name: params[:name]).count
raise("名称不能重复") if repeat_name > 0
level = SubjectLevelSystem.pluck(:level).max.to_i + 1
SubjectLevelSystem.create(name: params[:name], level: level)
redirect_to subject_level_system_managements_path(:format => "js")
end
# 重命名课程等级
def rename_subject_level
raise("名称不能为空!") if params[:name].blank?
repeat_name = SubjectLevelSystem.where("name = ? and id != ?", params[:name], params[:id]).count
raise("名称不能重复") if repeat_name > 0
level = SubjectLevelSystem.find params[:id]
level.update_attribute(:name, params[:name])
redirect_to subject_level_system_managements_path(:format => "js")
end
# 删除课程等级
def delete_subject_level
level = SubjectLevelSystem.find params[:id]
Subject.where(:subject_level_system_id => level).update_all(:subject_level_system_id => nil)
levels = SubjectLevelSystem.where("level > ?", level.level)
levels.each do |l|
l.update_attribute(:level, l.level-1)
end
level.delete
redirect_to subject_level_system_managements_path(:format => "js")
end
# 工程认证视频导入模板
def ec_template
@template = EcTemplate.where(nil)
@ -784,31 +828,31 @@ class ManagementsController < ApplicationController
@pod_num = res['sum']
@pod_dis = JSON.parse(res['distr']) if res['distr'].present?
end
@search = params[:search] # 搜索字
@keyword = params[:keyword].blank? ? "u_name" : params[:keyword] # 根据姓名/课程名搜索
if "u_name" == @keyword
if @search.blank?
@evaluate_recods = EvaluateRecord.where("0=0")
page = (params['page'] || 1).to_i
search = params[:search]
keyword = params[:keyword]
limit = 20
if search
if "u_name" == keyword
@evaluate_recods = EvaluateRecord.joins("join users u on evaluate_records.user_id = u.id").where("concat(u.lastname, u.firstname) like '%#{search}%'")
# @evaluate_recods = EvaluateRecord.where(user_id: User.where("concat(lastname, firstname) like '%#{search}%'").pluck(:id))
else
user_id = User.where("concat(lastname, firstname) like '%#{@search}%'")
@evaluate_recods = EvaluateRecord.joins("join users u on evaluate_records.user_id = u.id").where("concat(u.lastname, u.firstname) like '%#{@search}%'")
@evaluate_recods = EvaluateRecord.joins("join user_extensions ue on evaluate_records.user_id = ue.user_id").where("ue.school_id in (select id from schools where name like '%#{search}%')")
# @evaluate_recods = EvaluateRecord.where(user_id: UserExtensions.where(school_id: School.where("name like '%#{search}%'").pluck(:id)).pluck(:user_id))
end
else
school_id = School.where("name like '%#{@search}%'").map(&:id)
user_id = UserExtensions.where(:school_id => school_id).map(&:user_id)
@evaluate_recods = EvaluateRecord.where(:user_id => user_id)
@evaluate_recods = EvaluateRecord.where("0=0")
end
@evaluate_recods_count = @evaluate_recods.count
@page = (params['page'] || 1).to_i
@limit = 20
@is_remote = true
@evaluate_recods_pages = Paginator.new @evaluate_recods_count, @limit, @page
@offset ||= @evaluate_recods_pages.offset
@evaluate_recods = paginateHelper @evaluate_recods, @limit
@evaluate_recods_pages = Paginator.new @evaluate_recods_count, limit, page
@evaluate_recods = @evaluate_recods.page(page).per(limit)
@evaluate_recods = @evaluate_recods.includes(:shixun, :user)
respond_to do |format|
format.js
format.html
end
end
@ -1927,6 +1971,7 @@ end
@audit_class_sx_num=Subject.where(:status => 1).count
@publish_class_sx_num=Subject.where(:status => 2).count
@repertories = Repertoire.where(nil).order("CONVERT( name USING gbk ) COLLATE gbk_chinese_ci ASC")
@levels = SubjectLevelSystem.all
search = params[:search] # 搜索字
keyword = params[:keyword].blank? ? "u_name" : params[:keyword] # 根据姓名/课程名搜索
status = params[:status].to_i
@ -3120,13 +3165,14 @@ end
def update_notice
@menu_type = 12
@sub_type = 8
@notice = SystemUpdateNotice.first
@notice = SystemUpdateNotice.last
end
def edit_update_notice
notice = SystemUpdateNotice.first
if notice.present?
notice = SystemUpdateNotice.last
if notice.present? && notice.end_time > Time.now
notice.update_attributes(:end_time => params[:end_time], :start_time => params[:start_time], :subject => params[:subject], :notes => params[:notes])
UserSystemNotice.where(:notice_type => notice.notice_type).destroy_all
else
notice_type = UserSystemNotice.find_by_sql("select max(notice_type) as max_notice_type from user_system_notices").first.try(:max_notice_type).to_i + 1
SystemUpdateNotice.create(:end_time => params[:end_time], :start_time => params[:start_time], :subject => params[:subject], :notes => params[:notes], :notice_type => notice_type)
@ -4052,7 +4098,7 @@ end
book = Spreadsheet::Workbook.new
sheet1 = book.create_worksheet :name => "已发布实训课程"
count_row = 2
sheet1.row(1).concat(["", "地址", "实训课程名称","章节名称", "实训组成", "关卡数", "状态", "更新时间"])
sheet1.row(1).concat(["", "地址", "实训课程名称","章节名称", "实训组成", "关卡数", "状态", "课程等级", "更新时间", "发布时间", ])
Rails.logger.warn("##########subjects:#{subjects.count}")
subjects.each do |subject|
sheet1[count_row,1] = "paths/"+subject.id.to_s
@ -4066,19 +4112,25 @@ end
sheet1[count_row,5] = shixun.challenges.count
sheet1[count_row,6] = shixun.shixun_status
if s_index == 0 && index == 0
sheet1[count_row,7] = format_time subject.updated_at
sheet1[count_row,7] = subject.subject_level_system.try(:name) || "--"
sheet1[count_row,8] = format_time subject.updated_at
sheet1[count_row,9] = format_time subject.publish_time
end
count_row += 1
end
else
if s_index == 0
sheet1[count_row,7] = format_time subject.updated_at
sheet1[count_row,7] = subject.subject_level_system.try(:name) || "--"
sheet1[count_row,8] = format_time subject.updated_at
sheet1[count_row,9] = format_time subject.publish_time
end
count_row += 1
end
end
else
sheet1[count_row,7] = format_time subject.updated_at
sheet1[count_row,7] = subject.subject_level_system.try(:name) || "--"
sheet1[count_row,8] = format_time subject.updated_at
sheet1[count_row,9] = format_time subject.publish_time
count_row += 1
end
end

@ -321,9 +321,9 @@ class ShixunsController < ApplicationController
@search_name = "#{sub.name} / #{tag.name}"
end
shixun_id = ShixunTagRepertoire.where(:tag_repertoire_id => tag).map(&:shixun_id)
@shixuns = Shixun.select([:id, :name, :user_id, :challenges_count, :visits, :status, :myshixuns_count, :trainee, :use_scope, :identifier, :image_text]).where(:id => shixun_id, :hidden => 0).includes(:challenges, :schools, :shixun_members, :users).order("status = 2 desc, publish_time asc")
@shixuns = Shixun.select([:id, :name, :user_id, :challenges_count, :visits, :status, :myshixuns_count, :trainee, :use_scope, :identifier, :image_text, :averge_star]).where(:id => shixun_id, :hidden => 0).includes(:challenges, :schools, :shixun_members, :users).order("status = 2 desc, publish_time asc")
else
@shixuns = Shixun.select([:id, :name, :user_id, :challenges_count, :visits, :status, :myshixuns_count, :trainee, :use_scope, :identifier, :image_text]).where(:hidden => 0).includes(:challenges, :schools, :shixun_members, :users).order("status = 2 desc, publish_time asc")
@shixuns = Shixun.select([:id, :name, :user_id, :challenges_count, :visits, :status, :myshixuns_count, :trainee, :use_scope, :identifier, :image_text, :averge_star]).where(:hidden => 0).includes(:challenges, :schools, :shixun_members, :users).order("status = 2 desc, publish_time asc")
end
# # 依据tag和语言推荐实训如果tag不够则依据语言推荐语言不够则取系统的三个
# @recommend_shixuns = Shixun.find_by_sql("select challenge_id from challenge_tags where name like
@ -384,7 +384,7 @@ class ShixunsController < ApplicationController
shixun_id = shixun_id & my_shixun_ids
end
@shixuns = Shixun.select([:id, :name, :user_id, :challenges_count, :visits, :status, :myshixuns_count, :trainee, :use_scope, :identifier, :image_text]).where(:id => shixun_id, :hidden => 0, :trainee => diff, :status => status).includes(:challenges, :schools, :shixun_members, :users)
@shixuns = Shixun.select([:id, :name, :user_id, :challenges_count, :visits, :status, :myshixuns_count, :trainee, :use_scope, :identifier, :image_text, :averge_star]).where(:id => shixun_id, :hidden => 0, :trainee => diff, :status => status).includes(:challenges, :schools, :shixun_members, :users)
if search.present?
search_users_id = User.select([:id]).where("concat(lastname, firstname) like '%#{search}%'")

@ -2372,7 +2372,7 @@ class UsersController < ApplicationController
if @user.certification == 3
@user.update_column('certification', 0)
@noticed = true
notice = SystemUpdateNotice.first
notice = SystemUpdateNotice.last
if notice.present? && notice.end_time > Time.now && notice.start_time >= Time.now - 21600 && User.current.user_system_notices.where(:notice_type => notice.notice_type).count == 0
@noticed_update = true
end

@ -30,19 +30,30 @@ class WelcomeController < ApplicationController
require 'simple_xlsx_reader'
def index
@shixuns = Shixun.select([:id, :user_id, :homepage_show, :identifier, :status, :name, :challenges_count, :myshixuns_count, :use_scope,
:trainee]).where(:homepage_show => 1).includes(:users, :shixun_tag_repertoires, challenges: :challenge_chooses).order("myshixuns_count desc").limit(8)
@subjects = Subject.select([:id, :name, :homepage_show, :user_id, :visits, :stages_count, :score_count, :repertoire_id]).where(:homepage_show => 1).includes(:users, stages: :stage_shixuns)
@subjects.each do |subject|
subject[:myshixun_member_count] = Myshixun.where(:shixun_id=>subject.stage_shixuns.map(&:shixun_id)).count
images = PortalImage.where(status: true).order("position asc")
@images_url = []
images.each do |image|
@images_url << {path: image.link, image_url: "/images/avatars/PortalImage/#{image.id}"}
end
@subjects = @subjects.sort{|x,y| y[:myshixun_member_count] <=> x[:myshixun_member_count] }[0, 8]
@tea_users = User.where(:homepage_teacher => 1).includes(:user_extensions).limit(10).order("experience desc")
@eng_users = User.where(:homepage_engineer => 1).includes(:user_extensions).limit(10).order("experience desc")
@eng_users = User.find_by_sql("select u.* from users u join user_extensions ue on ue.user_id = u.id where ue.identity = 1 order by experience desc limit 10") if @eng_users.blank?
@repertoires = Repertoire.includes(sub_repertoires: [:tag_repertoires]).order("updated_at asc")
@images = PortalImage.where(:status => true).order("position asc")
logger.info("########images: #{@images.count}")
# 目录分级
repertoires = Repertoire.includes(sub_repertoires: :tag_repertoires).order("updated_at asc")
@rep_list = []
repertoires.each do |rep|
sub_rep_list = []
rep.sub_repertoires.each do |sub_rep|
tag_rep_list = []
sub_rep.tag_repertoires.each do |tag_rep|
tag_rep_list << {tag_id: tag_rep.id, tag_name: tag_rep.name}
end
sub_rep_list << {sub_rep_id: sub_rep.id, sub_rep_name: sub_rep.name, tag_rep_list: tag_rep_list}
end
@rep_list << {rep_id: rep.id, rep_name: rep.name, sub_rep_list: sub_rep_list}
end
@shixuns = Shixun.select([:id, :user_id, :homepage_show, :identifier, :status, :name, :challenges_count, :myshixuns_count, :use_scope,
:trainee, :averge_star]).where(homepage_show: 1).includes(:tag_repertoires).order("myshixuns_count desc").limit(8)
@subjects = Subject.where(homepage_show: 1).includes(:shixuns).limit(8)
@tea_users = User.where(homepage_teacher: 1).includes(:user_extensions).limit(10).order("experience desc")
@stu_users = User.includes(:user_extensions).where(user_extensions: {identity: 1}).limit(10).order("experience desc")
render :layout => 'educoder'
end

@ -240,7 +240,7 @@ module ApplicationHelper
container = []
mirror_repositories.each do |mr|
if mr.name.present?
container << {:image => mr.name, :cpuLimit => mr.cpu_limit, :memoryLimit => "#{mr.memory_limit}M"}
container << {:image => mr.name, :cpuLimit => mr.cpu_limit, :memoryLimit => "#{mr.memory_limit}M", :type => mr.try(:main_type) == "1" ? "main" : "sub"}
end
end
return container.to_json
@ -318,11 +318,15 @@ module ApplicationHelper
# TPM查看权限
# result一般为页面权限
def shixun_view_allow shixun, result = nil
if User.current.manager_of_shixun?(shixun)
if params[:openi].to_i == 1
result ? false : true
else
if shixun.status == 0 || (shixun.use_scope == 1 && !shixun.schools.map(&:name).include?(User.current.school_name))
result ? true : (render_403)
if User.current.manager_of_shixun?(shixun)
result ? false : true
else
if shixun.status == 0 || (shixun.use_scope == 1 && !shixun.schools.map(&:name).include?(User.current.school_name))
result ? true : (render_403)
end
end
end
end
@ -5012,12 +5016,13 @@ module ApplicationHelper
link_to "开始实战", shixun_path(homework.homework_commons_shixuns.shixun), :class => 'edu-default-btn user_bluebg_btn fr mr20 pl7 pr7',:target => "_blank"
else
myshixun = Myshixun.where(:id => work.myshixun_id).first
is_modify = ShixunModify.where(:myshixun_id => myshixun.try(:id), :shixun_id => myshixun.shixun.try(:id), :status => 1).first
if myshixun && is_modify.blank?
link_to "继续实战", myshixun_game_path(myshixun.current_task, :myshixun_id => myshixun), :class => "edu-default-btn user_orangebg_btn fr mr20 pl7 pr7", :target => "_blank"
elsif myshixun
link_to "继续实战", 'javascript:void(0);', :onclick => "sure_box_redirect('#{myshixun_reset_myshixun_path(myshixun)}', '实训已经更新啦,系统正在为您重置');", :class => "edu-default-btn user_orangebg_btn fr mr20 pl7 pr7"
end
# is_modify = ShixunModify.where(:myshixun_id => myshixun.try(:id), :shixun_id => myshixun.shixun.try(:id), :status => 1).first
link_to "继续实战", shixun_path(myshixun.shixun), :class => "edu-default-btn user_orangebg_btn fr mr20 pl7 pr7", :target => "_blank"
# if myshixun && is_modify.blank?
# link_to "继续实战", myshixun_game_path(myshixun.current_task, :myshixun_id => myshixun), :class => "edu-default-btn user_orangebg_btn fr mr20 pl7 pr7", :target => "_blank"
# elsif myshixun
# link_to "继续实战", 'javascript:void(0);', :onclick => "sure_box_redirect('#{myshixun_reset_myshixun_path(myshixun)}', '实训已经更新啦,系统正在为您重置');", :class => "edu-default-btn user_orangebg_btn fr mr20 pl7 pr7"
# end
end
elsif work.nil? && setting_time.end_time >= Time.now
if homework.homework_type ==3 && project.nil? && homework.homework_detail_group.base_on_project == 1

@ -173,12 +173,13 @@ module StudentWorkHelper
elsif work
if homework.homework_type == 4
myshixun = Myshixun.find work.myshixun_id
is_modify = ShixunModify.where(:myshixun_id => myshixun.try(:id), :shixun_id => myshixun.shixun.try(:id), :status => 1).first
if myshixun && is_modify.blank?
link_to "继续实战", myshixun_game_path(myshixun.current_task, :myshixun_id => myshixun), :class => "white-btn orange-btn fr mr10 mt8", :target => "_blank"
elsif myshixun
link_to "继续实战", 'javascript:void(0);', :onclick => "sure_box_redirect('#{myshixun_reset_myshixun_path(myshixun)}', '实训已经更新啦,系统正在为您重置');", :class => "white-btn orange-btn fr mr10 mt8"
end
# is_modify = ShixunModify.where(:myshixun_id => myshixun.try(:id), :shixun_id => myshixun.shixun.try(:id), :status => 1).first
link_to "继续实战", shixun_path(myshixun.shixun), :class => "white-btn orange-btn fr mr10 mt8", :target => "_blank"
# if myshixun && is_modify.blank?
# link_to "继续实战", myshixun_game_path(myshixun.current_task, :myshixun_id => myshixun), :class => "white-btn orange-btn fr mr10 mt8", :target => "_blank"
# elsif myshixun
# link_to "继续实战", 'javascript:void(0);', :onclick => "sure_box_redirect('#{myshixun_reset_myshixun_path(myshixun)}', '实训已经更新啦,系统正在为您重置');", :class => "white-btn orange-btn fr mr10 mt8"
# end
else
if setting_time.end_time >= Time.now
link_to "修改作品", edit_student_work_url_without_domain(work.id), :class => 'white-btn orange-btn fr mr10 mt8'

@ -1,5 +1,5 @@
class CourseHomeworkCategory < ActiveRecord::Base
belongs_to :course
has_many :shixun_homework_categories
has_many :homework_commons
attr_accessible :name
end

@ -49,7 +49,7 @@ class Shixun < ActiveRecord::Base
has_many :schools, :through => :shixun_schools
has_many :exercise_shixun_challenges, :dependent => :destroy
has_many :exercise_bank_shixun_challenges, :dependent => :destroy
has_many :tag_repertoires, :through => :shixun_tag_repertoires, :order => "tag_repertoires.name ASC"
has_many :tag_repertoires, :through => :shixun_tag_repertoires
has_many :shixun_tag_repertoires, :dependent => :destroy

@ -18,6 +18,7 @@ class Subject < ActiveRecord::Base
has_many :tidings, :as => :container, :dependent => :destroy
belongs_to :repertoire
belongs_to :user
belongs_to :subject_level_system
scope :visible, lambda{where(status: 2)}
@ -39,6 +40,10 @@ class Subject < ActiveRecord::Base
count
end
def member_count
self.shixuns.map(&:myshixuns_count).sum
end
def subject_shixuns
count = 0
self.stage_shixuns.each do |stage_shixun|

@ -0,0 +1,7 @@
class SubjectLevelSystem < ActiveRecord::Base
default_scope :order => 'level'
# attr_accessible :title, :body
has_many :subjects
end

@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="theme-color" content="#000000"><meta name="renderer" content="webkit"/><meta name="force-rendering" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><link rel="manifest" href="/manifest.json"><link rel="shortcut icon" href="/favicon.ico"><title>Educoder</title><script type="text/javascript">window.__isR=!0</script><link rel="stylesheet" href="/react/build/css/css_min_all.css"><link rel="stylesheet" href="/assets/iconfont/iconfont.css"><link href="/react/build/./static/css/main.266ab375.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="md_div" style="display:none"></div><div id="root" class="page -layout-v -fit"></div><div id="picture_display" style="display:none"></div><script type="text/javascript" src="/react/build/js/js_min_all.js"></script><script type="text/javascript" src="/assets/kindeditor/kindeditor.js"></script><script type="text/javascript" src="/react/build/js/create_kindeditor.js"></script><script type="text/javascript" src="/javascripts/educoder/edu_application.js"></script><script type="text/javascript" src="/react/build/./static/js/main.cc568f76.js"></script></body></html>
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="theme-color" content="#000000"><meta name="renderer" content="webkit"/><meta name="force-rendering" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><link rel="manifest" href="/manifest.json"><link rel="shortcut icon" href="/favicon.ico"><title>Educoder</title><script type="text/javascript">window.__isR=!0</script><link rel="stylesheet" href="/react/build/css/css_min_all.css"><link rel="stylesheet" href="/assets/iconfont/iconfont.css"><link href="/react/build/./static/css/main.3274c43b.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="md_div" style="display:none"></div><div id="root" class="page -layout-v -fit"></div><div id="picture_display" style="display:none"></div><script type="text/javascript" src="/react/build/js/js_min_all.js"></script><script type="text/javascript" src="/assets/kindeditor/kindeditor.js"></script><script type="text/javascript" src="/react/build/js/create_kindeditor.js"></script><script type="text/javascript" src="/javascripts/educoder/edu_application.js"></script><script type="text/javascript" src="/react/build/./static/js/main.9f01900e.js"></script></body></html>

@ -11,6 +11,7 @@
<%= link_to '选用实训', shixuns_homework_common_index_path(:course => @course.id, :category_id => @category.try(:id)), :remote => true, :class => "white-btn edu-orangeback-btn fr mr20 mt2", :title => "新建作业" %>
<% if @category.present? %>
<a href="<%= rename_homework_category_course_path(@course, :category_id => @category.id) %>" data-remote="true" class="white-btn edu-orangeline-btn mr10 fr mt2">子栏目重命名</a>
<a href="javascript:void(0);" class="white-btn edu-greyshallowline-btn mr10 mt2 fr" onclick="delete_confirm_box_3('<%= delete_homework_category_course_path(@course, :category_id => @category.id) %>', '该子目录下的作业将被移动到父目录中<br/>确定要删除吗?')">删除子目录</a>
<% else %>
<a href="javascript:void(0)" class="white-btn edu-orangeline-btn mr10 fr mt2" onclick="addSubColumn();">添加子栏目</a>
<% end %>

@ -117,13 +117,13 @@
<% end %>
<% notice = SystemUpdateNotice.first %>
<% notice = SystemUpdateNotice.last %>
<% if @noticed_update || ((User.current.certification == 1 || params[:controller] != "welcome") && notice.present? && notice.end_time > Time.now && notice.start_time >= (Time.now - 21600) && User.current.user_system_notices.where(:notice_type => notice.notice_type).count == 0) %>
var htmlvalue = "<%= escape_javascript(render :partial => 'account/user_update_notice', :locals => {:notice => notice})%>";
pop_box_new(htmlvalue, 500, 380);
<% UserSystemNotice.create(:user_id => User.current.id, :notice_type => notice.notice_type) %>
<% elsif notice.present? && notice.end_time < Time.now %>
<% notice.destroy %>
<%# elsif notice.present? && notice.end_time < Time.now %>
<%# notice.destroy %>
<% end %>
});

@ -55,9 +55,10 @@
</li>
<li class="fl edu-admin-nav-li edu-position <%= 'active' if @menu_type == 4 %>" style="width: 100px"><a href="javascript:void(0);" class="edu-admin-nav-a" >实训课程+</a>
<ul class="edu-admin-nav-inner edu-absolute">
<li style="width: 100px"><%= link_to "实训课程列表", class_shixuns_managements_path %></li>
<li style="width: 100px"><%= link_to "实训课程配置", subject_setting_list_managements_path %></li>
<li style="width: 100px"><%= link_to "已发布实训课程", class_publish_shixuns_managements_path %></li>
<li style="width: 120px"><%= link_to "实训课程等级体系", subject_level_system_managements_path %></li>
<li style="width: 120px"><%= link_to "实训课程列表", class_shixuns_managements_path %></li>
<li style="width: 120px"><%= link_to "实训课程配置", subject_setting_list_managements_path %></li>
<li style="width: 120px"><%= link_to "已发布实训课程", class_publish_shixuns_managements_path %></li>
</ul>
</li>
<li class="fl edu-admin-nav-li edu-position <%= 'active' if @menu_type == 13 %>"><a href="<%= career_list_managements_path %>" class="edu-admin-nav-a">职业路径</a></li>

@ -0,0 +1,107 @@
<table class="edu-pop-table edu-txt-center" cellpadding="0" cellspacing="0">
<thead>
<th width="10%">等级</th>
<th width="15%" class="edu-txt-left">名称</th>
<th width="45" class="edu-txt-left">实训课程数</th>
<th width="15%">创建时间</th>
<th width="15%">操作</th>
</thead>
<tbody>
<% @levels.each do |l| %>
<tr>
<td class="levelNo"><%= l.level %></td>
<td class="edu-txt-left levelName" data-value="<%= l.id %>"><%= l.name %></td>
<td class="edu-txt-left"><%= l.subjects.size %></td>
<td><%= format_time l.created_at %></td>
<td>
<a href="javascript:void(0)" class="mr15" onclick="delete_confirm_box_4('/managements/delete_subject_level?id=<%= l.id %>', '是否确定删除!');">删除</a>
<a href="javascript:void(0)" class="mr15 renameLine">重命名</a>
</td>
</tr>
<% end %>
<tr>
<td colspan="5">
<a href="javascript:void(0)" class="color-blue" onclick="createLevel();">+ 新建</a>
</td>
</tr>
</tbody>
</table>
<script type="text/html" id="template_newForm">
<div class="bor-grey-e mt20 clearfix padding10-20 edu-back-white" id="newForm">
<span class="fl mt3">名称</span>
<input type="text" class="winput-240-35 fl ml20" id="level_name"/>
<li class="fr mt3">
<a href="javascript:void(0)" class="mr15" onclick="cancelNew();">取消</a>
<a href="javascript:void(0)" class="mr15" onclick="createSubjectLevel()">保存</a>
</li>
</div>
</script>
<script>
//新建
function createLevel(){
if($("#newForm").length==0){
var bt = baidu.template;
bt.LEFT_DELIMITER = '<!';
bt.RIGHT_DELIMITER = '!>';
var html = bt('template_newForm', null);
$("#levelSystem").append(html);
}
}
//新建--取消
function cancelNew(){
$("#newForm").remove();
}
//重命名
var lastHtml="";
$("table").on("click",".renameLine",function(){
var tr=$(this).parents("tr");
lastHtml=$(tr).html();
var value=$(tr).find(".levelName").html();
var id = $(tr).find(".levelName").attr("data-value");
var No=$(tr).find(".levelNo").html();
var html='<td>'+No+'</td>'+
'<td colspan="4" class="edu-txt-left">'+
'<input type="winput-240-35" id="rename" name="name" value="'+value+'"/>'+
'<input type="hidden" id="level_id" value="'+id+'"/>'+
'<a href="javascript:void(0)" class="mr15 ml20" onclick="cancelEdit(this);">取消</a>'+
'<a href="javascript:void(0)" onclick="update_level(this);">保存</a>'+
'</td>';
$(tr).html(html);
})
//重命名--取消
function cancelEdit(item){
$(item).parents("tr").html(lastHtml);
}
// 重命名
function update_level(item){
var name = $(item).siblings("#rename").val();
var id = $(item).siblings("#level_id").val();
$.ajax({
url: "<%= rename_subject_level_managements_path %>",
type: "POST",
data:{id: id, name: name}
})
}
function createSubjectLevel(){
var name = $("#level_name").val()
$.ajax({
url: "<%= create_subject_level_managements_path %>",
type: "POST",
data: {name: name}
})
}
function deleteLevel(id){
$.ajax({
url: "<%= delete_subject_level_managements_path %>",
type: "POST",
data: {id: id}
})
}
</script>

@ -3,9 +3,10 @@
<thead>
<tr>
<th width="9%">ID</th>
<th width="30%" class="edu-txt-left">实训套件名称</th>
<th width="20%" class="edu-txt-left">实训套件名称</th>
<th width="6%">阶段</th>
<th width="10%">技术体系</th>
<th width="10%">等级体系</th>
<th width="13%">上传图片</th>
<th width="8%">创建者</th>
<th width="11%" class="eud-pointer">创建时间<i class="fa <%= @sx_order == "desc" ? "fa-long-arrow-down" : "fa-long-arrow-up" %> color-light-green ml5"></i></th>
@ -26,6 +27,14 @@
<% end %>
</select>
</td>
<td>
<select onchange="select_subject_level(<%= c_shixun.id %>, this.options[this.options.selectedIndex].value)">
<option <%= c_shixun.subject_level_system_id.present? ? "" : "selected='selected'".html_safe %> value="-1" >请选择课程体系</option>
<% @levels.each do |l| %>
<option value="<%= l.id %>" <%= l.id == c_shixun.subject_level_system_id ? "selected='selected'".html_safe : "" %> ><%= l.name %></option>
<% end %>
</select>
</td>
<td>
<%= file_field_tag 'avatar[image]',
:id => "upload_img_#{c_shixun.id}",
@ -134,4 +143,16 @@
});
}
function select_subject_level(subject_id, level_id){
$.ajax({
url: "<%=update_level_for_subject_managements_path %>",
data: {subject_id: subject_id, level_id: level_id},
type: "POST",
success: function(data){
notice_box("关联成功!");
}
});
}
</script>

@ -0,0 +1,3 @@
<div class="mt20" id="levelSystem">
<%= render :partial => "managements/subject_level_list" %>
</div>

@ -0,0 +1 @@
$("#levelSystem").html("<%= j (render :partial => "subject_level_list") %>")

@ -11,8 +11,10 @@
<tr>
<%= form_for '', :url => edit_update_notice_managements_path(), :html => {:id => 'edit_update_notice_form', :method => "post"} do |f| %>
<td>
<input type="text" placeholder="请选择开始时间" readonly name="start_time" value="<%= format_time @notice.try(:start_time) %>" class="winput-240-35 mt10 mb15" id="notice_begin_time"/><br/>
<input type="text" placeholder="请选择结束时间" readonly name="end_time" value="<%= format_time @notice.try(:end_time) %>" class="winput-240-35 mb10" id="notice_end_time"/>
<input type="text" placeholder="请选择开始时间" readonly name="start_time" value="<%= @notice.try(:end_time) && @notice.try(:end_time) > Time.now ? format_time(@notice.try(:start_time)) : "" %>"
class="winput-240-35 mt10 mb15" id="notice_begin_time"/><br/>
<input type="text" placeholder="请选择结束时间" readonly name="end_time" value="<%= @notice.try(:end_time) && @notice.try(:end_time) > Time.now ? format_time(@notice.try(:end_time)) : "" %>"
class="winput-240-35 mb10" id="notice_end_time"/>
</td>
<td>
<input class="winput-240-35" name="subject" value="<%= @notice.try(:subject) ? @notice.try(:subject) : ' educoder系统升级暂停服务通知' %>" id="upgradeTitleText"/>
@ -38,7 +40,8 @@
format:'Y-m-d H:i',
formatTime:'H:i',
formatDate:'Y-m-d',
validateOnBlur:false
validateOnBlur:false,
step:30
});
$('#notice_end_time').datetimepicker({
allowBlank:true,
@ -46,7 +49,8 @@
format:'Y-m-d H:i',
formatTime:'H:i',
formatDate:'Y-m-d',
validateOnBlur:false
validateOnBlur:false,
step:30
});
});

@ -107,7 +107,7 @@
<% end %>
<% end %>
<% notice = SystemUpdateNotice.first %>
<% notice = SystemUpdateNotice.last %>
<% if User.current.certification == 1 && notice.present? && notice.end_time > Time.now && notice.start_time >= (Time.now - 21600) && User.current.user_system_notices.where(:notice_type => notice.notice_type).count == 0 %>
var htmlvalue = "<%= escape_javascript(render :partial => 'account/user_update_notice', :locals => {:notice => notice})%>";
pop_box_new(htmlvalue, 500, 380);

@ -106,7 +106,7 @@
</p>
<div class="clearfix mb20 df">
<span class="mr30 color-orange pt10 fl">*</span>
<div class="flex1">
<div class="flex1" style="width: 0">
<div class="edu-back-greyf5 padding10">
<textarea class="" id="shixun_script" name="shixun[evaluate_script]"><%= @shixun.evaluate_script %></textarea>
</div>

@ -1,14 +1,14 @@
<%# result = User.current.is_certification_teacher || User.current.admin? %>
<% shixuns.each do |shixun| %>
<div class="square-Item">
<% if shixun.tag_repertoires.first.present? %>
<div class="tag-green"><span class="tag-name"><%= shixun.tag_repertoires.first.try(:name) %></span><img src="/images/educoder/tag2.png"></div>
<% end %>
<% if params[:controller] != "welcome" && shixun_view_allow(shixun, true) %>
<div class="closeSquare">
<img src="/images/educoder/icon/lockclose.svg" class="mt80 mb25">
<p class="font-14 color-white">非试用内容,需要授权</p>
</div>
<div class="closeSquare">
<img src="/images/educoder/icon/lockclose.svg" class="mt80 mb25">
<p class="font-14 color-white">暂未公开</p>
</div>
<% end %>
<a href="<%= shixun_path(shixun) %>" class="square-img" target="_blank">
<%= image_tag(url_to_avatar(shixun)) %>
@ -19,7 +19,8 @@
</p>
<!--五星评分-->
<p class="clearfix mt3 mb3"><span class="rateYoStar fl" data-star="<%= shixun.shixun_preference %>" style="padding: 0px;width: 100%;height:20px;line-height:19px;width: 90px;"></span><span class="fl ml10 font-12 color-grey-9 lineh-12 mt3"><%= shixun.shixun_preference %>分</span></p>
<p class="clearfix mt3 mb3"><span class="rateYoStar fl" data-star="<%= shixun.averge_star %>" style="padding: 0px;width: 100%;height:20px;line-height:19px;width: 90px;">
</span><span class="fl ml10 font-12 color-grey-9 lineh-12 mt3"><%= shixun.averge_star %>分</span></p>
<p class="clearfix mt8 font-12 color-grey-B4">
<% if shixun.challenges_count > 0 %>
@ -27,14 +28,9 @@
<i class="iconfont icon-shixunguanqia fl mr3" data-tip-down="关卡"></i><%= shixun.challenges_count %>
</span>
<% end %>
<% if shixun.shixun_score > 0 %>
<span class="mr10 fl squareIconSpan">
<i class="iconfont icon-jingyan fl mr3" data-tip-down="经验值"></i><%= shixun.shixun_score %>
</span>
<% end %>
<% if shixun.myshixuns.count > 0 %>
<% if shixun.myshixuns_count > 0 %>
<span class="mr10 fl squareIconSpan">
<i class="iconfont icon-chengyuan fl mr3" data-tip-down="学习人数"></i><%= shixun.myshixuns.count %>
<i class="iconfont icon-chengyuan fl mr3" data-tip-down="学习人数"></i><%= shixun.myshixuns_count %>
</span>
<% end %>
<span class="fr color-grey-B3 squareIconSpan"><%= shixun.shixun_level %></span>
@ -44,24 +40,24 @@
<% end %>
<script>
$(function(){
$(".rateYoStar").raty({
hints: ['', '', '', '', ''],
readOnly: true,
path:"/images/educoder",
starOff: 'star-off.png',
starHalf:'star-half.png',
starOn: 'star-on.png',
size:'14',
score:function(){
var s=$(this).attr("data-star");
var yu=(s*10)%10;
if(yu>0){
return parseFloat(Math.floor((s*10)/10)+".5");
}else{
return $(this).attr("data-star");
$(function(){
$(".rateYoStar").raty({
hints: ['', '', '', '', ''],
readOnly: true,
path:"/images/educoder",
starOff: 'star-off.png',
starHalf:'star-half.png',
starOn: 'star-on.png',
size:'14',
score:function(){
var s=$(this).attr("data-star");
var yu=(s*10)%10;
if(yu>0){
return parseFloat(Math.floor((s*10)/10)+".5");
}else{
return $(this).attr("data-star");
}
}
}
});
})
});
})
</script>

@ -6,7 +6,7 @@
<% if params[:controller] != "welcome" && subject.status < 2 && !User.current.member_of_subject?(subject) %>
<div class="closeSquare">
<img src="/images/educoder/icon/lockclose.svg" class="mt80 mb25"/>
<p class="font-14 color-white">非试用内容,需要授权</p>
<p class="font-14 color-white">暂未开发</p>
</div>
<% end %>
<a href="<%= subject_path(subject) %>" class="square-img" target="_blank"><%= image_tag(url_to_avatar(subject)) %></a>
@ -19,19 +19,8 @@
<span class="mr10 fl squareIconSpan">
<i class="iconfont icon-shixun fl mr3" data-tip-down="章节"></i><%= subject.stages_count %></span>
<% end %>
<% if params[:controller] == "welcome" %>
<span class="mr10 fl squareIconSpan">
<i class="iconfont icon-jingyan fl mr3" data-tip-down="经验值"></i><%= subject.subject_shixun_score + subject.subject_shixun_choose_score %></span>
<% else %>
<% if (subject.subject_shixun_score + subject.subject_shixun_choose_score) > 0 %>
<span class="mr10 fl squareIconSpan">
<i class="iconfont icon-jingyan fl mr3" data-tip-down="经验值"></i><%= subject.subject_shixun_score + subject.subject_shixun_choose_score %></span>
<% end %>
<% end %>
<% myshixun_member_count = subject.respond_to?("myshixun_member_count") ? subject.myshixun_member_count : Myshixun.where(:shixun_id=>subject.stage_shixuns.map(&:shixun_id)).count %>
<%# REDO这块的关联关系有问题所以这个统计的N+1问题没法避免。可以考虑改关联关系或者写单字段 %>
<% if myshixun_member_count > 0 %>
<span class="mr10 fl squareIconSpan"><i class="iconfont icon-chengyuan fl mr3" data-tip-down="学习人数"></i><%= myshixun_member_count %></span>
<% if subject.try(:member_count).to_i > 0 %>
<span class="mr10 fl squareIconSpan"><i class="iconfont icon-chengyuan fl mr3" data-tip-down="学习人数"></i><%= subject.try(:member_count) %></span>
<% end %>
</p>
</div>

@ -82,12 +82,16 @@
<%= link_to "开始实战", shixun_path(activity.homework_commons_shixuns.shixun), :class => 'edu-filter-btn edu-activity-blue ml15 fl mt5', :target => "_blank" %>
<% elsif work.present? %>
<% myshixun = Myshixun.where(:id => work.myshixun_id).first %>
<% is_modify = ShixunModify.where(:myshixun_id => myshixun.try(:id), :shixun_id => myshixun.shixun.try(:id), :status => 1).first %>
<% if myshixun && is_modify.blank? %>
<%= link_to "继续实战", myshixun_game_path(myshixun.current_task, :myshixun_id => myshixun), :class => "edu-filter-btn edu-activity-blue ml15 fl mt5", :target => "_blank" %>
<% elsif myshixun %>
<%= link_to "继续实战", 'javascript:void(0);', :onclick => "sure_box_redirect('#{myshixun_reset_myshixun_path(myshixun)}', '实训已经更新啦,系统正在为您重置');", :class => "edu-filter-btn edu-activity-blue ml15 fl mt5" %>
<%# is_modify = ShixunModify.where(:myshixun_id => myshixun.try(:id), :shixun_id => myshixun.shixun.try(:id), :status => 1).first %>
<% if myshixun.present? %>
<%= link_to "继续实战", shixun_path(myshixun.shixun), :class => "edu-filter-btn edu-activity-blue ml15 fl mt5", :target => "_blank" %>
<% end %>
<%# if myshixun && is_modify.blank? %>
<%#= link_to "继续实战", shixun_exec_shixun_path(myshixun.shixun), :class => "edu-filter-btn edu-activity-blue ml15 fl mt5", :target => "_blank" %>
<%# elsif myshixun %>
<%#= link_to "继续实战", 'javascript:void(0);', :onclick => "sure_box_redirect('#{myshixun_reset_myshixun_path(myshixun)}', '实训已经更新啦,系统正在为您重置');", :class => "edu-filter-btn edu-activity-blue ml15 fl mt5" %>
<%# end %>
<% else %>
<span class="edu-filter-btn <%= homework_status_color "未开启补交" %> ml15 fl mt5">未开启补交</span>
<% end %>

@ -7,17 +7,17 @@
<div class="banner">
<ul class="img">
<!--<li><a href="https://www.educoder.net/courses/1410" target="_blank"><img src="/images/educoder/recom_1.jpg" id="b-img-1"/></a></li>-->
<% if @images.present? %>
<% @images.each do |image| %>
<li><a href="<%= image.link %>" target="_blank"><img src="/images/avatars/PortalImage/<%= image.id %>" id="b-img-1"/></a></li>
<% end %>
<% if @images_url.present? %>
<% @images_url.each do |image| %>
<li><a href="<%= image[:path] %>" target="_blank"><img src="<%= image[:image_url] %>" id="b-img-1"/></a></li>
<% end %>
<% else %>
<li><a href="<%= competition_path(:id => "gcc-dev-2018") %>" target="_blank"><img src="/images/educoder/recom_1.jpg" id="b-img-1"/></a></li>
<li><a href="<%= competition_path(:id => "gcc-annotation-2018") %>" target="_blank"><img src="/images/educoder/recom_2.jpg" id="b-img-1"/></a></li>
<li><a href="<%= competition_path(:id => "ccf-se-2018") %>" target="_blank"><img src="/images/educoder/recom_3.jpg" id="b-img-1"/></a></li>
<li><a href="https://www.educoder.net/paths/54" target="_blank"><img src="/images/educoder/recom_4.jpg" id="b-img-1"/></a></li>
<li><a href="https://www.educoder.net/paths/11" target="_blank"><img src="/images/educoder/recom_5.jpg" id="b-img-2"/></a></li>
<li><a href="https://www.educoder.net/paths/29" target="_blank"><img src="/images/educoder/recom_6.jpg" id="b-img-3"/></a></li>
<li><a href="<%= competition_path(:id => "gcc-dev-2018") %>" target="_blank"><img src="/images/educoder/recom_1.jpg" id="b-img-1"/></a></li>
<li><a href="<%= competition_path(:id => "gcc-annotation-2018") %>" target="_blank"><img src="/images/educoder/recom_2.jpg" id="b-img-1"/></a></li>
<li><a href="<%= competition_path(:id => "ccf-se-2018") %>" target="_blank"><img src="/images/educoder/recom_3.jpg" id="b-img-1"/></a></li>
<li><a href="https://www.educoder.net/paths/54" target="_blank"><img src="/images/educoder/recom_4.jpg" id="b-img-1"/></a></li>
<li><a href="https://www.educoder.net/paths/11" target="_blank"><img src="/images/educoder/recom_5.jpg" id="b-img-2"/></a></li>
<li><a href="https://www.educoder.net/paths/29" target="_blank"><img src="/images/educoder/recom_6.jpg" id="b-img-3"/></a></li>
<% end %>
</ul>
<ul class="num"></ul>
@ -28,15 +28,17 @@
<div class="user_navlist">
<div class="user_navlist_black">
<ul class="black_nav_list">
<% @repertoires.each do |rep| %>
<li class="welcome_shixun_index" data-id="<%= rep.id %>" data-type="rep">
<span class="black_nav_span clearfix font-12"><%= rep.name %><img src="/images/educoder/icon/downarrowsmall-right.svg" class="fr mt15 transform-90"></span>
<% @rep_list.each do |rep| %>
<li class="welcome_shixun_index" data-id="<%= rep[:rep_id] %>" data-type="rep">
<span class="black_nav_span clearfix font-12"><%= rep[:rep_name] %><img src="/images/educoder/icon/downarrowsmall-right.svg" class="fr mt15 transform-90"></span>
<ul class="user_navlist_white">
<% rep.sub_repertoires.each do |sub| %>
<% rep[:sub_rep_list].each do |sub| %>
<div class="clearfix mt20 mb5 pb10 navlistpanel-line">
<p class="little-title clearfix welcome_shixun_index" data-id="<%= sub.id %>" data-rep-id="<%= rep.id %>" data-type="sub"><%= sub.name %></p>
<% sub.tag_repertoires.each do |tag| %>
<a href="javascript:void(0)" class="welcome_shixun_index" data-id="<%= tag.id %>" data-rep-id="<%= rep.id %>" data-sub-id="<%= sub.id %>" data-type="tag"><%= tag.name %></a>
<p class="little-title clearfix welcome_shixun_index" data-id="<%= sub[:sub_rep_id] %>"
data-rep-id="<%= rep[:id] %>" data-type="sub"><%= sub[:sub_rep_name] %></p>
<% sub[:tag_rep_list].each do |tag| %>
<a href="javascript:void(0)" class="welcome_shixun_index" data-id="<%= tag[:tag_id] %>"
data-rep-id="<%= rep[:id] %>" data-sub-id="<%= sub[:sub_rep_id] %>" data-type="tag"><%= tag[:tag_name] %></a>
<% end %>
</div>
<% end %>
@ -55,7 +57,7 @@
<p class="color-dark edu-txt-center font-24" style="line-height: 30px">精选实训</p>
<p class="color-grey-cd font-12">SELECTED TRAINING</p>
</div>
<a href="<%= shixuns_path() %>" class="moreitem">更多<i class="fa fa-angle-right ml5"></i></a>
<a href="<%= shixuns_path %>" class="moreitem">更多<i class="fa fa-angle-right ml5"></i></a>
<div class="square-list clearfix">
<%= render :partial => "shixuns/shixun_item", :locals => {:shixuns => @shixuns} %>
</div>
@ -85,40 +87,40 @@
<div class="ranking clearfix">
<ul class="grade color-dark">
<% if @tea_users[1] %>
<li class="mt35 pr">
<img src="/images/educoder/huangguan-two.png" class="huangguan"/>
<a href="/users/<%= (@tea_users[1].try(:login)) %>" class="color-dark"><%= image_tag(url_to_avatar(@tea_users[1])) %>
<span class="task-hide rankName"><%= @tea_users[1].try(:show_name) %></span>
</a>
</li>
<li class="mt35 pr">
<img src="/images/educoder/huangguan-two.png" class="huangguan"/>
<a href="/users/<%= (@tea_users[1].try(:login)) %>" class="color-dark"><%= image_tag(url_to_avatar(@tea_users[1])) %>
<span class="task-hide rankName"><%= @tea_users[1].try(:show_name) %></span>
</a>
</li>
<% end %>
<% if @tea_users[0] %>
<li class="pr">
<img src="/images/educoder/huangguan.png" class="huangguan"/>
<a href="/users/<%= (@tea_users[0].try(:login)) %>" class="color-dark"><%= image_tag(url_to_avatar(@tea_users[0])) %>
<span class="task-hide rankName"><%= @tea_users[0].try(:show_name) %></span>
</a>
</li>
<li class="pr">
<img src="/images/educoder/huangguan.png" class="huangguan"/>
<a href="/users/<%= (@tea_users[0].try(:login)) %>" class="color-dark"><%= image_tag(url_to_avatar(@tea_users[0])) %>
<span class="task-hide rankName"><%= @tea_users[0].try(:show_name) %></span>
</a>
</li>
<% end %>
<% if @tea_users[2] %>
<li class="mt35 pr">
<img src="/images/educoder/huangguan-three.png" class="huangguan"/>
<a href="/users/<%=(@tea_users[2].try(:login)) %>" class="color-dark"><%= image_tag(url_to_avatar(@tea_users[2])) %>
<span class="task-hide rankName"><%= @tea_users[2].try(:show_name) %></span>
</a>
</li>
<li class="mt35 pr">
<img src="/images/educoder/huangguan-three.png" class="huangguan"/>
<a href="/users/<%=(@tea_users[2].try(:login)) %>" class="color-dark"><%= image_tag(url_to_avatar(@tea_users[2])) %>
<span class="task-hide rankName"><%= @tea_users[2].try(:show_name) %></span>
</a>
</li>
<% end %>
</ul>
<br/>
<ul class="grade mt30">
<% if @tea_users.size > 3 %>
<% @tea_users[3..@tea_users.size].each do |t_u| %>
<li>
<a href="/users/<%= t_u.try(:login) %>" class="color-dark"><%= image_tag(url_to_avatar(t_u)) %>
<span class="task-hide rankName"><%= t_u.try(:show_name) %></span>
</a>
</li>
<% end %>
<% @tea_users[3..@tea_users.size].each do |t_u| %>
<li>
<a href="/users/<%= t_u.try(:login) %>" class="color-dark"><%= image_tag(url_to_avatar(t_u)) %>
<span class="task-hide rankName"><%= t_u.try(:show_name) %></span>
</a>
</li>
<% end %>
<% end %>
</ul>
</div>
@ -133,41 +135,41 @@
</div>
<div class="ranking clearfix">
<ul class="grade color-dark">
<% if @eng_users[1] %>
<li class="mt35 pr">
<img src="/images/educoder/huangguan-two.png" class="huangguan"/>
<a href="/users/<%= @eng_users[1].try(:login) %>" class="color-dark"><%= image_tag(url_to_avatar(@eng_users[1])) %>
<span class="task-hide rankName"><%= @eng_users[1].try(:show_name) %></span>
</a>
</li>
<% if @stu_users[1] %>
<li class="mt35 pr">
<img src="/images/educoder/huangguan-two.png" class="huangguan"/>
<a href="/users/<%= @stu_users[1].try(:login) %>" class="color-dark"><%= image_tag(url_to_avatar(@stu_users[1])) %>
<span class="task-hide rankName"><%= @stu_users[1].try(:show_name) %></span>
</a>
</li>
<% end %>
<% if @eng_users[0] %>
<li class="pr">
<img src="/images/educoder/huangguan.png" class="huangguan"/>
<a href="/users/<%= @eng_users[0].try(:login) %>" class="color-dark"><%= image_tag(url_to_avatar(@eng_users[0])) %>
<span class="task-hide rankName"><%= @eng_users[0].try(:show_name) %></span>
</a>
</li>
<% if @stu_users[0] %>
<li class="pr">
<img src="/images/educoder/huangguan.png" class="huangguan"/>
<a href="/users/<%= @stu_users[0].try(:login) %>" class="color-dark"><%= image_tag(url_to_avatar(@stu_users[0])) %>
<span class="task-hide rankName"><%= @stu_users[0].try(:show_name) %></span>
</a>
</li>
<% end %>
<% if @eng_users[2] %>
<li class="mt35 pr">
<img src="/images/educoder/huangguan-three.png" class="huangguan"/>
<a href="/users/<%= (@eng_users[2].try(:login)) %>" class="color-dark"><%= image_tag(url_to_avatar(@eng_users[2])) %>
<span class="task-hide rankName"><%= @eng_users[2].try(:show_name) %></span>
</a>
</li>
<% if @stu_users[2] %>
<li class="mt35 pr">
<img src="/images/educoder/huangguan-three.png" class="huangguan"/>
<a href="/users/<%= (@stu_users[2].try(:login)) %>" class="color-dark"><%= image_tag(url_to_avatar(@stu_users[2])) %>
<span class="task-hide rankName"><%= @stu_users[2].try(:show_name) %></span>
</a>
</li>
<% end %>
</ul>
<br/>
<ul class="grade mt30">
<% if @eng_users.size > 3 %>
<% @eng_users[3..@eng_users.size].each do |e_u| %>
<li>
<a href="/users/<%= e_u.try(:login) %>" class="color-dark"><%= image_tag(url_to_avatar(e_u)) %>
<span class="task-hide rankName"><%= e_u.try(:show_name) %></span>
</a>
</li>
<% end %>
<% if @stu_users.size > 3 %>
<% @stu_users[3..@stu_users.size].each do |e_u| %>
<li>
<a href="/users/<%= e_u.try(:login) %>" class="color-dark"><%= image_tag(url_to_avatar(e_u)) %>
<span class="task-hide rankName"><%= e_u.try(:show_name) %></span>
</a>
</li>
<% end %>
<% end %>
</ul>
</div>

@ -673,6 +673,11 @@ RedmineApp::Application.routes.draw do
post 'add_course_info_for_school'
get 'ec_template'
post 'add_template'
get 'subject_level_system'
post 'create_subject_level'
post 'rename_subject_level'
post 'delete_subject_level'
post 'update_level_for_subject'
end
end
# Enable Grack support
@ -2393,6 +2398,7 @@ RedmineApp::Application.routes.draw do
post 'assign_teacher_groups'
post 'create_homework_category'
match 'rename_homework_category', :via => [:get, :post]
delete 'delete_homework_category'
post 'import_course_group'
end
collection do

@ -0,0 +1,67 @@
#encoding: utf-8
class MigrateExerUserScore < ActiveRecord::Migration
def up
exercise = Exercise.where(:id => 1264).first
if exercise.present?
question = exercise.exercise_questions.first
shixun = question.try(:shixun)
if shixun.present?
exercise.exercise_users.where(:commit_status => 0).each do |exercise_user|
myshixun = Myshixun.where(:shixun_id => shixun.id, :user_id => exercise_user.user_id).first
if myshixun.present? && myshixun.created_at > exercise.publish_time
exercise_user.start_at = myshixun.created_at
exercise_user.commit_status = 1
exercise_user.end_at = exercise.end_time
exercise_user.status = 1
s_score = 0
question.exercise_shixun_challenges.each do |exercise_cha|
game = Game.where(:user_id => exercise_user.user_id, :challenge_id => exercise_cha.challenge_id).first
if game.present?
exercise_cha_score = 0
answer_status = 0
cha_path = exercise_cha.challenge.path.present? ? exercise_cha.challenge.path.split("") : []
challeng_path = cha_path.reject(&:blank?)[0].try(:strip)
if game.status == 2 && game.final_score >= 0
exercise_cha_score = exercise_cha.question_score
answer_status = 1
end
if exercise_cha.exercise_shixun_answers.where(:user_id => exercise_user.user_id).empty?
if GameCode.where(:game_id => game.try(:id), :path => challeng_path).first.present?
game_code = GameCode.where(:game_id => game.try(:id), :path => challeng_path).first
code = game_code.try(:new_code)
else
begin
g = Gitlab.client
Rails.logger.info "commit_exercise_path---- #{challeng_path}"
if game.present?
code = g.files(game.myshixun.gpid, challeng_path, "master").try(:content)
else
code = g.files(question.shixun.gpid, challeng_path, "master").try(:content)
end
code = tran_base64_decode64(code)
rescue Exception => e
Rails.logger.info "commit_exercise---- #{@error_messages}"
end
end
ExerciseShixunAnswer.create(:exercise_question_id => question.id, :exercise_shixun_challenge_id => exercise_cha.id, :user_id => exercise_user.user_id,
:score => exercise_cha_score, :answer_text => code, :status => answer_status)
end
s_score += exercise_cha_score
end
end
exercise_user.objective_score = s_score
exercise_user.subjective_score = 0
exercise_user.score = s_score
exercise_user.save
end
end
end
end
end
def down
end
end

@ -0,0 +1,10 @@
class DepartmentDefaultHostCount < ActiveRecord::Migration
def up
change_column :departments, :host_count, :integer, :default => 5
Department.update_all(:host_count => 5)
end
def down
end
end

@ -0,0 +1,9 @@
class CreateSubjectLevelSystems < ActiveRecord::Migration
def change
create_table :subject_level_systems do |t|
t.integer :level
t.string :name
t.timestamps
end
end
end

@ -0,0 +1,9 @@
class AddSubjectLevelSystemIdForSubjects < ActiveRecord::Migration
def up
add_column :subjects, :subject_level_system_id, :integer
add_index :subjects, :subject_level_system_id
end
def down
end
end

@ -0,0 +1,8 @@
class AddIndexOnEvaluateRecords < ActiveRecord::Migration
def up
add_index :evaluate_records, :user_id
end
def down
end
end

@ -1,5 +1,5 @@
#!/usr/bin/env ruby
#
$:.unshift File.expand_path('../../lib', __FILE__)
require 'gitlab/cli'

@ -1,5 +1,6 @@
#! /bin/bash
###
set -e
cd $(dirname "$0")/..

@ -4,7 +4,6 @@ $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
Bundler.require(:default, :development)
require 'grack'
require 'rack'
root = File.absolute_path( File.join( File.dirname(__FILE__), '../examples' ) )

@ -0,0 +1,14 @@
namespace :myshixun do
desc "delete gpid is no"
task :delete_error_myshixuns => :environment do
begin
myshixuns = Myshixun.where("gpid is null and created_at > '#{Time.now.beginning_of_day}'")
myshixuns.find_each do |m|
m.destroy
puts("#myshixun_id: #{m.id}")
end
rescue Exception => e
puts e
end
end
end

@ -1,6 +1,6 @@
#coding=utf-8
#!/usr/bin/env ruby
###
lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
$LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

@ -2075,6 +2075,14 @@ function delete_confirm_box_3(url, str){
pop_box_new(htmlvalue, 300, 140);
}
//点击删除时的确认弹框: 走post方法
function delete_confirm_box_4(url, str){
var htmlvalue = '<div class="task-popup" style="width:480px;"><div class="task-popup-title clearfix"><h3 class="fl color-grey3">提示</h3><a href="javascript:void(0);" class="pop_close"><i class="fa fa-times-circle font-18 link-color-grey fr mt5"></i></a></div>'+
'<div class="task-popup-content"><p class="task-popup-text-center font-16">' + str + '</p></div><div class="task-popup-submit clearfix"><a href="javascript:void(0);" onclick="hideModal();" class="task-btn fl">取消</a>'+
'<a href="'+ url +'" class="task-btn task-btn-orange fr pop_close" data-method="POST" data-remote="true">确定</a></div></div>';
pop_box_new(htmlvalue, 480, 160);
}
//提示框:只有一个按钮,点击关闭弹框
function notice_sure_box(str){
var htmlvalue = '<div id="muban_popup_box" style="width:350px;"><div class="muban_popup_top"><h3 class="fl">提示</h3><a href="javascript:void(0);" class="muban_icons_close fr"></a></div>'+

@ -1,74 +1,74 @@
{
"./static/js/0.f9e1c8d1.chunk.js": "./static/js/0.f9e1c8d1.chunk.js",
"./static/js/0.f9e1c8d1.chunk.js.map": "./static/js/0.f9e1c8d1.chunk.js.map",
"./static/js/1.340cd609.chunk.js": "./static/js/1.340cd609.chunk.js",
"./static/js/1.340cd609.chunk.js.map": "./static/js/1.340cd609.chunk.js.map",
"./static/js/10.9510d46e.chunk.js": "./static/js/10.9510d46e.chunk.js",
"./static/js/10.9510d46e.chunk.js.map": "./static/js/10.9510d46e.chunk.js.map",
"./static/js/11.208cca1c.chunk.js": "./static/js/11.208cca1c.chunk.js",
"./static/js/11.208cca1c.chunk.js.map": "./static/js/11.208cca1c.chunk.js.map",
"./static/js/12.1c9a6050.chunk.js": "./static/js/12.1c9a6050.chunk.js",
"./static/js/12.1c9a6050.chunk.js.map": "./static/js/12.1c9a6050.chunk.js.map",
"./static/js/13.127cb01c.chunk.js": "./static/js/13.127cb01c.chunk.js",
"./static/js/13.127cb01c.chunk.js.map": "./static/js/13.127cb01c.chunk.js.map",
"./static/js/14.a017a952.chunk.js": "./static/js/14.a017a952.chunk.js",
"./static/js/14.a017a952.chunk.js.map": "./static/js/14.a017a952.chunk.js.map",
"./static/js/15.57bfadcd.chunk.js": "./static/js/15.57bfadcd.chunk.js",
"./static/js/15.57bfadcd.chunk.js.map": "./static/js/15.57bfadcd.chunk.js.map",
"./static/js/16.c5a9c976.chunk.js": "./static/js/16.c5a9c976.chunk.js",
"./static/js/16.c5a9c976.chunk.js.map": "./static/js/16.c5a9c976.chunk.js.map",
"./static/js/17.b0126ac4.chunk.js": "./static/js/17.b0126ac4.chunk.js",
"./static/js/17.b0126ac4.chunk.js.map": "./static/js/17.b0126ac4.chunk.js.map",
"./static/js/18.14330a81.chunk.js": "./static/js/18.14330a81.chunk.js",
"./static/js/18.14330a81.chunk.js.map": "./static/js/18.14330a81.chunk.js.map",
"./static/js/19.ac65c798.chunk.js": "./static/js/19.ac65c798.chunk.js",
"./static/js/19.ac65c798.chunk.js.map": "./static/js/19.ac65c798.chunk.js.map",
"./static/js/2.6aab041a.chunk.js": "./static/js/2.6aab041a.chunk.js",
"./static/js/2.6aab041a.chunk.js.map": "./static/js/2.6aab041a.chunk.js.map",
"./static/js/20.c39cd8ba.chunk.js": "./static/js/20.c39cd8ba.chunk.js",
"./static/js/20.c39cd8ba.chunk.js.map": "./static/js/20.c39cd8ba.chunk.js.map",
"./static/js/21.92e7782e.chunk.js": "./static/js/21.92e7782e.chunk.js",
"./static/js/21.92e7782e.chunk.js.map": "./static/js/21.92e7782e.chunk.js.map",
"./static/js/22.8eeb0d90.chunk.js": "./static/js/22.8eeb0d90.chunk.js",
"./static/js/22.8eeb0d90.chunk.js.map": "./static/js/22.8eeb0d90.chunk.js.map",
"./static/js/23.9e6a3949.chunk.js": "./static/js/23.9e6a3949.chunk.js",
"./static/js/23.9e6a3949.chunk.js.map": "./static/js/23.9e6a3949.chunk.js.map",
"./static/js/24.5882f212.chunk.js": "./static/js/24.5882f212.chunk.js",
"./static/js/24.5882f212.chunk.js.map": "./static/js/24.5882f212.chunk.js.map",
"./static/js/25.17100c6d.chunk.js": "./static/js/25.17100c6d.chunk.js",
"./static/js/25.17100c6d.chunk.js.map": "./static/js/25.17100c6d.chunk.js.map",
"./static/js/26.dde6b09a.chunk.js": "./static/js/26.dde6b09a.chunk.js",
"./static/js/26.dde6b09a.chunk.js.map": "./static/js/26.dde6b09a.chunk.js.map",
"./static/js/27.6b67beb1.chunk.js": "./static/js/27.6b67beb1.chunk.js",
"./static/js/27.6b67beb1.chunk.js.map": "./static/js/27.6b67beb1.chunk.js.map",
"./static/js/28.9abd7445.chunk.js": "./static/js/28.9abd7445.chunk.js",
"./static/js/28.9abd7445.chunk.js.map": "./static/js/28.9abd7445.chunk.js.map",
"./static/js/29.b87a8704.chunk.js": "./static/js/29.b87a8704.chunk.js",
"./static/js/29.b87a8704.chunk.js.map": "./static/js/29.b87a8704.chunk.js.map",
"./static/js/3.4d50bfe1.chunk.js": "./static/js/3.4d50bfe1.chunk.js",
"./static/js/3.4d50bfe1.chunk.js.map": "./static/js/3.4d50bfe1.chunk.js.map",
"./static/js/30.679c47f0.chunk.js": "./static/js/30.679c47f0.chunk.js",
"./static/js/30.679c47f0.chunk.js.map": "./static/js/30.679c47f0.chunk.js.map",
"./static/js/31.89477f78.chunk.js": "./static/js/31.89477f78.chunk.js",
"./static/js/31.89477f78.chunk.js.map": "./static/js/31.89477f78.chunk.js.map",
"./static/js/32.cc08633e.chunk.js": "./static/js/32.cc08633e.chunk.js",
"./static/js/32.cc08633e.chunk.js.map": "./static/js/32.cc08633e.chunk.js.map",
"./static/js/4.a6c224c4.chunk.js": "./static/js/4.a6c224c4.chunk.js",
"./static/js/4.a6c224c4.chunk.js.map": "./static/js/4.a6c224c4.chunk.js.map",
"./static/js/5.d8c32925.chunk.js": "./static/js/5.d8c32925.chunk.js",
"./static/js/5.d8c32925.chunk.js.map": "./static/js/5.d8c32925.chunk.js.map",
"./static/js/6.00090554.chunk.js": "./static/js/6.00090554.chunk.js",
"./static/js/6.00090554.chunk.js.map": "./static/js/6.00090554.chunk.js.map",
"./static/js/7.e603caa1.chunk.js": "./static/js/7.e603caa1.chunk.js",
"./static/js/7.e603caa1.chunk.js.map": "./static/js/7.e603caa1.chunk.js.map",
"./static/js/8.ef2ec02b.chunk.js": "./static/js/8.ef2ec02b.chunk.js",
"./static/js/8.ef2ec02b.chunk.js.map": "./static/js/8.ef2ec02b.chunk.js.map",
"./static/js/9.b0761c20.chunk.js": "./static/js/9.b0761c20.chunk.js",
"./static/js/9.b0761c20.chunk.js.map": "./static/js/9.b0761c20.chunk.js.map",
"main.css": "./static/css/main.266ab375.css",
"main.css.map": "./static/css/main.266ab375.css.map",
"main.js": "./static/js/main.cc568f76.js",
"main.js.map": "./static/js/main.cc568f76.js.map",
"./static/js/0.d15cdb8c.chunk.js": "./static/js/0.d15cdb8c.chunk.js",
"./static/js/0.d15cdb8c.chunk.js.map": "./static/js/0.d15cdb8c.chunk.js.map",
"./static/js/1.b37de40f.chunk.js": "./static/js/1.b37de40f.chunk.js",
"./static/js/1.b37de40f.chunk.js.map": "./static/js/1.b37de40f.chunk.js.map",
"./static/js/10.0b59b6d9.chunk.js": "./static/js/10.0b59b6d9.chunk.js",
"./static/js/10.0b59b6d9.chunk.js.map": "./static/js/10.0b59b6d9.chunk.js.map",
"./static/js/11.03d0c22e.chunk.js": "./static/js/11.03d0c22e.chunk.js",
"./static/js/11.03d0c22e.chunk.js.map": "./static/js/11.03d0c22e.chunk.js.map",
"./static/js/12.33ef9274.chunk.js": "./static/js/12.33ef9274.chunk.js",
"./static/js/12.33ef9274.chunk.js.map": "./static/js/12.33ef9274.chunk.js.map",
"./static/js/13.84649bc7.chunk.js": "./static/js/13.84649bc7.chunk.js",
"./static/js/13.84649bc7.chunk.js.map": "./static/js/13.84649bc7.chunk.js.map",
"./static/js/14.57622e23.chunk.js": "./static/js/14.57622e23.chunk.js",
"./static/js/14.57622e23.chunk.js.map": "./static/js/14.57622e23.chunk.js.map",
"./static/js/15.cd2747c4.chunk.js": "./static/js/15.cd2747c4.chunk.js",
"./static/js/15.cd2747c4.chunk.js.map": "./static/js/15.cd2747c4.chunk.js.map",
"./static/js/16.e8e3aa00.chunk.js": "./static/js/16.e8e3aa00.chunk.js",
"./static/js/16.e8e3aa00.chunk.js.map": "./static/js/16.e8e3aa00.chunk.js.map",
"./static/js/17.db50ac9a.chunk.js": "./static/js/17.db50ac9a.chunk.js",
"./static/js/17.db50ac9a.chunk.js.map": "./static/js/17.db50ac9a.chunk.js.map",
"./static/js/18.e8b5b490.chunk.js": "./static/js/18.e8b5b490.chunk.js",
"./static/js/18.e8b5b490.chunk.js.map": "./static/js/18.e8b5b490.chunk.js.map",
"./static/js/19.5f9a9263.chunk.js": "./static/js/19.5f9a9263.chunk.js",
"./static/js/19.5f9a9263.chunk.js.map": "./static/js/19.5f9a9263.chunk.js.map",
"./static/js/2.48f59130.chunk.js": "./static/js/2.48f59130.chunk.js",
"./static/js/2.48f59130.chunk.js.map": "./static/js/2.48f59130.chunk.js.map",
"./static/js/20.6efcbe58.chunk.js": "./static/js/20.6efcbe58.chunk.js",
"./static/js/20.6efcbe58.chunk.js.map": "./static/js/20.6efcbe58.chunk.js.map",
"./static/js/21.6e5a22af.chunk.js": "./static/js/21.6e5a22af.chunk.js",
"./static/js/21.6e5a22af.chunk.js.map": "./static/js/21.6e5a22af.chunk.js.map",
"./static/js/22.7c073e45.chunk.js": "./static/js/22.7c073e45.chunk.js",
"./static/js/22.7c073e45.chunk.js.map": "./static/js/22.7c073e45.chunk.js.map",
"./static/js/23.0abe5b59.chunk.js": "./static/js/23.0abe5b59.chunk.js",
"./static/js/23.0abe5b59.chunk.js.map": "./static/js/23.0abe5b59.chunk.js.map",
"./static/js/24.e1553222.chunk.js": "./static/js/24.e1553222.chunk.js",
"./static/js/24.e1553222.chunk.js.map": "./static/js/24.e1553222.chunk.js.map",
"./static/js/25.7f05ced8.chunk.js": "./static/js/25.7f05ced8.chunk.js",
"./static/js/25.7f05ced8.chunk.js.map": "./static/js/25.7f05ced8.chunk.js.map",
"./static/js/26.00916fb9.chunk.js": "./static/js/26.00916fb9.chunk.js",
"./static/js/26.00916fb9.chunk.js.map": "./static/js/26.00916fb9.chunk.js.map",
"./static/js/27.85a886e8.chunk.js": "./static/js/27.85a886e8.chunk.js",
"./static/js/27.85a886e8.chunk.js.map": "./static/js/27.85a886e8.chunk.js.map",
"./static/js/28.db5cbded.chunk.js": "./static/js/28.db5cbded.chunk.js",
"./static/js/28.db5cbded.chunk.js.map": "./static/js/28.db5cbded.chunk.js.map",
"./static/js/29.95e5a009.chunk.js": "./static/js/29.95e5a009.chunk.js",
"./static/js/29.95e5a009.chunk.js.map": "./static/js/29.95e5a009.chunk.js.map",
"./static/js/3.a357162e.chunk.js": "./static/js/3.a357162e.chunk.js",
"./static/js/3.a357162e.chunk.js.map": "./static/js/3.a357162e.chunk.js.map",
"./static/js/30.3482c43d.chunk.js": "./static/js/30.3482c43d.chunk.js",
"./static/js/30.3482c43d.chunk.js.map": "./static/js/30.3482c43d.chunk.js.map",
"./static/js/31.3edb9173.chunk.js": "./static/js/31.3edb9173.chunk.js",
"./static/js/31.3edb9173.chunk.js.map": "./static/js/31.3edb9173.chunk.js.map",
"./static/js/32.23fc5ec4.chunk.js": "./static/js/32.23fc5ec4.chunk.js",
"./static/js/32.23fc5ec4.chunk.js.map": "./static/js/32.23fc5ec4.chunk.js.map",
"./static/js/4.a72da972.chunk.js": "./static/js/4.a72da972.chunk.js",
"./static/js/4.a72da972.chunk.js.map": "./static/js/4.a72da972.chunk.js.map",
"./static/js/5.1853fe23.chunk.js": "./static/js/5.1853fe23.chunk.js",
"./static/js/5.1853fe23.chunk.js.map": "./static/js/5.1853fe23.chunk.js.map",
"./static/js/6.070d1eab.chunk.js": "./static/js/6.070d1eab.chunk.js",
"./static/js/6.070d1eab.chunk.js.map": "./static/js/6.070d1eab.chunk.js.map",
"./static/js/7.1ad7321f.chunk.js": "./static/js/7.1ad7321f.chunk.js",
"./static/js/7.1ad7321f.chunk.js.map": "./static/js/7.1ad7321f.chunk.js.map",
"./static/js/8.d5642b7b.chunk.js": "./static/js/8.d5642b7b.chunk.js",
"./static/js/8.d5642b7b.chunk.js.map": "./static/js/8.d5642b7b.chunk.js.map",
"./static/js/9.c6b81c3d.chunk.js": "./static/js/9.c6b81c3d.chunk.js",
"./static/js/9.c6b81c3d.chunk.js.map": "./static/js/9.c6b81c3d.chunk.js.map",
"main.css": "./static/css/main.3274c43b.css",
"main.css.map": "./static/css/main.3274c43b.css.map",
"main.js": "./static/js/main.9f01900e.js",
"main.js.map": "./static/js/main.9f01900e.js.map",
"static/media/ERASBD.ttf": "static/media/ERASBD.d5213044.ttf",
"static/media/background1.png": "static/media/background1.a34df396.png",
"static/media/background2.png": "static/media/background2.22ee659e.png",

@ -1 +1 @@
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="theme-color" content="#000000"><meta name="renderer" content="webkit"/><meta name="force-rendering" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><link rel="manifest" href="/manifest.json"><link rel="shortcut icon" href="/favicon.ico"><title>Educoder</title><script type="text/javascript">window.__isR=!0</script><link rel="stylesheet" href="/css/css_min_all.css"><link rel="stylesheet" href="http://testbdweb.educoder.net/assets/iconfont/iconfont.css"><link href="/react/build/./static/css/main.266ab375.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="md_div" style="display:none"></div><div id="root" class="page -layout-v -fit"></div><div id="picture_display" style="display:none"></div><script type="text/javascript" src="/js/js_min_all.js"></script><script type="text/javascript" src="http://testbdweb.educoder.net/assets/kindeditor/kindeditor.js"></script><script type="text/javascript" src="/js/create_kindeditor.js"></script><script type="text/javascript" src="http://testbdweb.educoder.net/javascripts/educoder/edu_application.js"></script><script type="text/javascript" src="/react/build/./static/js/main.cc568f76.js"></script></body></html>
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name="theme-color" content="#000000"><meta name="renderer" content="webkit"/><meta name="force-rendering" content="webkit"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><link rel="manifest" href="/manifest.json"><link rel="shortcut icon" href="/favicon.ico"><title>Educoder</title><script type="text/javascript">window.__isR=!0</script><link rel="stylesheet" href="/css/css_min_all.css"><link rel="stylesheet" href="http://testbdweb.educoder.net/assets/iconfont/iconfont.css"><link href="/react/build/./static/css/main.3274c43b.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="md_div" style="display:none"></div><div id="root" class="page -layout-v -fit"></div><div id="picture_display" style="display:none"></div><script type="text/javascript" src="/js/js_min_all.js"></script><script type="text/javascript" src="http://testbdweb.educoder.net/assets/kindeditor/kindeditor.js"></script><script type="text/javascript" src="/js/create_kindeditor.js"></script><script type="text/javascript" src="http://testbdweb.educoder.net/javascripts/educoder/edu_application.js"></script><script type="text/javascript" src="/react/build/./static/js/main.9f01900e.js"></script></body></html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save