dev_SaaS
caishi 6 years ago
commit 2627a5da13

@ -65,6 +65,16 @@ class ApplicationController < ActionController::Base
include Redmine::MenuManager::MenuController
helper Redmine::MenuManager::MenuHelper
def ec_public_auth major_school
unless User.current.admin? || major_school.template_major || major_school.school.users.where(:id => User.current.id).count > 0 ||
major_school.ec_major_school_users.where(:user_id => User.current.id).count > 0 ||
EcCourseUser.where(:user_id => User.current.id, :ec_course_id => EcCourse.where(:ec_year_id => major_school.ec_years.pluck(:id)).pluck(:id)).count > 0
render_403
else
true
end
end
def user_agent
logger.info "HTTP_USER_AGENT #{request.env["HTTP_USER_AGENT"]}"
end
@ -274,6 +284,7 @@ class ApplicationController < ActionController::Base
true
end
def require_admin
return unless require_login
if !User.current.admin?

@ -2,6 +2,7 @@
class EcCourseAchievementMethodsController < ApplicationController
before_filter :find_target, :only => [:edit_course_target, :create_evaluation_methods]
skip_before_filter :verify_authenticity_token, :only => [:create_evaluation_methods, :sync_course_data]
before_filter :find_ec_course, :only => [:index]
include ApplicationHelper
@ -59,11 +60,9 @@ class EcCourseAchievementMethodsController < ApplicationController
###############################################################
def index
achievement_list = []
# 具体工程课程
ec_course = EcCourse.find params[:ec_course_id]
# 课程的所有目标
targets = ec_course.ec_course_targets
targets = @ec_course.ec_course_targets
targets.each do |target|
evaluate_data = []
# 评价环节
@ -95,7 +94,7 @@ class EcCourseAchievementMethodsController < ApplicationController
end
achievement_list << {target_id: target.id, target_evaluate_data: evaluate_data}
end
render :json => {achievement_list: achievement_list}
render :json => {achievement_list: achievement_list, is_manager: @is_manager}
end
@ -306,4 +305,13 @@ class EcCourseAchievementMethodsController < ApplicationController
@target = EcCourseTarget.find params[:ec_course_target_id]
end
def find_ec_course
@ec_course = EcCourse.find(params[:ec_course_id])
@year = @ec_course.ec_year
@ec_major_school = @year.ec_major_school
@template_major = User.current.admin? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) ||
@ec_major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id)
@is_manager = @template_major || @ec_course.ec_course_users.pluck(:user_id).include?(User.current.id)
end
end

@ -2,6 +2,8 @@
class EcCourseSupportsController < ApplicationController
before_filter :find_year, :except => [:edit_require_vs_course, :destroy_require_vs_course]
skip_before_filter :verify_authenticity_token, :only => [:create, :edit_require_vs_course, :destroy_require_vs_course]
before_filter :require_login
before_filter :ec_auth, :except => [:edit_require_vs_course, :destroy_require_vs_course]
###############################################################################
# 毕业要求vs课程体系
@ -47,6 +49,8 @@ class EcCourseSupportsController < ApplicationController
course_support_data = []
max_support_count = 0
subitems_count = 0
major_school = @year.ec_major_school
is_manager = User.current.admin? || major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id)
ec_graduation_requirements.each_with_index do |gr, i|
logger.info("#############index:#{i}#####_ec_gradiation_reqiorements: #{gr.id}")
subitems_count += gr.ec_graduation_subitems.count
@ -60,7 +64,12 @@ class EcCourseSupportsController < ApplicationController
course_data << { name: name, top_relation: cs.top_relation, weigths: cs.weigths}
end
gs.ec_course_supports.count > max_support_count && max_support_count = gs.ec_course_supports.count
course_support_data << {sequence_num: sequence_num, ec_graduation_subitem_id: gs.id, course_data: course_data, num_total: gs.ec_course_supports.count, weights_total: weigths_sum}
course_support_data << {sequence_num: sequence_num,
sequence_title: gs.content,
ec_graduation_subitem_id: gs.id,
course_data: course_data,
num_total: gs.ec_course_supports.count,
weights_total: weigths_sum}
end
end
render :json => {ec_year_id: @year.id,
@ -69,7 +78,8 @@ class EcCourseSupportsController < ApplicationController
subitems_url: "#{graduation_requirement_ec_major_school_ec_year_path(@year, :ec_major_school_id => @year.ec_major_school_id)}",
course_count: @year.ec_courses.count,
course_url: "#{ec_course_setting_ec_major_school_ec_year_path(@year, :ec_major_school_id => @year.ec_major_school_id)}",
max_support_count: max_support_count}
max_support_count: max_support_count,
is_manager: is_manager}
end
# 毕业要求vs课程体系 详情页面
@ -208,4 +218,9 @@ class EcCourseSupportsController < ApplicationController
def find_year
@year = EcYear.find(params[:ec_year_id])
end
# 职业认证的权限判断
def ec_auth
ec_public_auth @year.ec_major_school
end
end

@ -3,6 +3,8 @@ class EcCoursesController < ApplicationController
layout 'base_ec'
before_filter :find_ec_course, :except => [:create, :get_calculation_data, :sync_all_course_data]
before_filter :find_year, :only => [:create, :get_calculation_data]
before_filter :require_login
before_filter :ec_auth, :except => [:sync_all_course_data]
skip_before_filter :verify_authenticity_token, :only => [:crud_targets, :crud_score_level, :sync_all_course_data, :search_courses,
:correlation_course, :delete_course]
@ -77,7 +79,8 @@ class EcCoursesController < ApplicationController
end
calculation_data << {first_level: first_level, first_leval_data: first_leval_data}
end
render :json => {calculation_data: calculation_data, calculation_value: @year.calculation_value, course_ids: course_ids.uniq}
render :json => {calculation_data: calculation_data, calculation_value: @year.calculation_value, course_ids: course_ids.uniq,
is_manager: @template_major}
end
# 课程目标配置
@ -100,6 +103,12 @@ class EcCoursesController < ApplicationController
end
end
def ec_course_support_setting_data
course_targets = @ec_course.ec_course_targets.includes(:ec_graduation_subitems)
json_data = target_list_data(course_targets)
render :json => json_data
end
# 课程目标配置的更新操作()
# /ec_courses/1/crud_targets
def crud_targets
@ -414,6 +423,8 @@ class EcCoursesController < ApplicationController
def score_level
respond_to do |format|
format.html{
Rails.logger.info("1111111111111111111template_major: #{@template_major}")
Rails.logger.info("1111111111111111111is_manager: #{@is_manager}")
render "/common/index", :layout => false
}
format.json{
@ -429,11 +440,27 @@ class EcCoursesController < ApplicationController
{score: 70, level: ""},
{score: 60, level: ""}]
end
render :json => {levels: ls}
render :json => {levels: ls, is_manager: @is_manager}
}
end
end
def score_level_data
levels = @ec_course.ec_score_levels
ls = []
if levels.present?
levels.each do |l|
ls << {score: l.score, level: l.level}
end
else
ls = [{score: 90, level: ""},
{score: 80, level: ""},
{score: 70, level: ""},
{score: 60, level: ""}]
end
render :json => {levels: ls, is_manager: @is_manager}
end
def crud_score_level
levels = params[:levels]
render :json => {status: -1, message: "参数不能为空"} if levels.blank?
@ -574,6 +601,11 @@ class EcCoursesController < ApplicationController
#@is_manager = @template_major || @ec_course.ec_course_users.pluck(:user_id).include?(User.current.id)
end
# 职业认证的权限判断
def ec_auth
ec_public_auth @ec_major_school
end
def target_list_data course_targets
targets = []
course_targets.each do |ct|
@ -595,6 +627,10 @@ class EcCoursesController < ApplicationController
end
end
Rails.logger.info("111111111111111user_id: #{User.current.try(:id)}")
Rails.logger.info("template_major: #{@template_major}")
Rails.logger.info("is_manager: #{@is_manager}")
return {ec_year_id: @ec_course.ec_year_id, ec_course_id: @ec_course.id, course_targets: targets,
requirements: requirements, is_manager: @is_manager}
end
@ -630,7 +666,7 @@ class EcCoursesController < ApplicationController
# 遍历学生成绩统计数据
student_scores.each do |sc|
sub_ecss = EcCourseStudentScore.where(:ec_course_id => @ec_course.id, :ec_year_student_id => sc.ec_year_student_id).first
sub_score = base_score == 0 ? 0 : ((sc.try(:score).to_f/base_score) * percentage).round(3)
sub_score = base_score == 0 || sc.try(:score).nil? ? 0 : ((sc.try(:score).to_f/base_score) * percentage).round(3)
if sub_ecss
ess_target = sub_ecss.ec_student_score_targets.where(:ec_course_target_id => target.id,

@ -2,7 +2,10 @@
class EcMajorSchoolsController < ApplicationController
layout "base_ec"
before_filter :require_login
before_filter :find_major_school, :except => [:get_navigation_data]
before_filter :ec_auth, :except => [:get_navigation_data]
def show
@years = @major_school.ec_years
@ -125,7 +128,8 @@ class EcMajorSchoolsController < ApplicationController
evaluation_methods_url: evaluation_methods_url,
competition_calculation_info_url: competition_calculation_info_url,
score_level_setting_url: score_level_setting_url,
example_major: example_major
example_major: example_major,
allow_visit: User.current.admin? || (User.current.ec_school.present? && User.current.ec_school == major.school.id)
}
end
@ -181,4 +185,9 @@ class EcMajorSchoolsController < ApplicationController
# 管理员权限
@major_manager = User.current.admin? || @major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || @major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id)
end
# 职业认证的权限判断
def ec_auth
ec_public_auth @major_school
end
end

@ -3,6 +3,9 @@ class EcYearsController < ApplicationController
layout "base_ec"
before_filter :find_major_and_year, except: [:create]
before_filter :require_login
before_filter :ec_auth, except: [:create]
#before_filter :find_year, only: [:set_calculation_value]
skip_before_filter :verify_authenticity_token, :only => [:import_students, :set_calculation_value, :destroy_students]
require 'simple_xlsx_reader'
@ -54,37 +57,38 @@ class EcYearsController < ApplicationController
format.html {
render "/common/index", :layout => false
}
format.json {
template_file = EcTemplate.find_by_name "学生列表导入模板"
if template_file.present?
file = template_file.attachments.first
template_url = "/attachments/download/#{file.id}/#{file.filename}"
else
template_url = "javascript:void(0);"
end
students = @year.ec_year_students
show_name = @year.ec_year_students.where(:name => nil).count == 0
end
end
page = params[:page] || 1
total_student = students.count
total_page = (total_student / 50.0).ceil
students = paginateHelper students, 50
def student_lists_data
template_file = EcTemplate.find_by_name "学生列表导入模板"
if template_file.present?
file = template_file.attachments.first
template_url = "/attachments/download/#{file.id}/#{file.filename}"
else
template_url = "javascript:void(0);"
end
ec_students = []
students.each_with_index do |student, index|
student = {index: (50*(page.to_i - 1) + index + 1),
student_name: student.name,
student_id: student.student_id}
ec_students << student
end
students = @year.ec_year_students
show_name = @year.ec_year_students.where(:name => nil).count == 0
import_url = "/ec_major_schools/#{@ec_major_school.id}/academic_years/#{@year.id}/import_students"
page = params[:page] || 1
total_student = students.count
total_page = (total_student / 50.0).ceil
students = paginateHelper students, 50
render :json => {template_url: template_url, ec_students: ec_students, total_page: total_page, import_url: import_url,
show_name: show_name, :total_student => total_student}
}
ec_students = []
students.each_with_index do |student, index|
student = {index: (50*(page.to_i - 1) + index + 1),
student_name: student.name,
student_id: student.student_id}
ec_students << student
end
import_url = "/ec_major_schools/#{@ec_major_school.id}/academic_years/#{@year.id}/import_students"
render :json => {template_url: template_url, ec_students: ec_students, total_page: total_page, import_url: import_url,
show_name: show_name, :total_student => total_student, :is_manager => @template_major}
end
# DELETE: /ec_major_schools/:major_id/academic_years/:year_id/destroy_students
@ -346,6 +350,11 @@ class EcYearsController < ApplicationController
@template_major = User.current.admin? || @ec_major_school.school.ec_school_users.pluck(:user_id).include?(User.current.id) || @ec_major_school.ec_major_school_users.pluck(:user_id).include?(User.current.id)
end
# 职业认证的权限判断
def ec_auth
ec_public_auth @ec_major_school
end
def find_year
@year = EcYear.find(params[:id])
end
@ -387,6 +396,14 @@ class EcYearsController < ApplicationController
new_egs.save!
# 记录新旧对应关系,为之后的中间表做记录
egs_record << [pre_egs.id, new_egs.id]
prev_ersvss = EcRequireSubVsStandard.where(:ec_graduation_subitem_id => pre_egs.id)
prev_ersvss.each do |prev_ersvs|
new_ersvss = EcRequireSubVsStandard.new
new_ersvss.attributes = prev_ersvs.attributes.dup.except("id", "ec_graduation_subitem_id")
new_ersvss.ec_graduation_subitem_id = new_egs.id
new_ersvss.save!
end
end
end
@ -397,12 +414,30 @@ class EcYearsController < ApplicationController
new_eto.attributes = pre_eto.attributes.dup.except("id", "ec_year_id")
new_eto.ec_year_id = ec_year.id
new_eto.save!
# 复制 "培养目标分项"
pre_eto.ec_training_subitems.try(:each) do |pre_ets|
new_ets = EcTrainingSubitem.new
new_ets.attributes = pre_ets.attributes.dup.except("id", "ec_training_objective_id")
new_ets.ec_training_objective_id = new_eto.id
new_ets.save!
# 复制 "毕业要去 vs 培养目标"
pre_ervsos = EcRequirementVsObjective.where(:ec_training_objective_id => pre_ets.id)
pre_ervsos.each do |ervso|
new_ervso = EcRequirementVsObjective.new
new_ervso.attributes = ervso.attributes.dup.except("id", "ec_training_objective_id", "ec_graduation_requirement_id")
new_ervso.ec_training_objective_id = new_ets.id
new_egr_id = -1
egr_record.each do |egr_id|
if egr_id[0] == ervso.ec_graduation_requirement_id
new_egr_id = egr_id[1]
end
end
raise("找不对应的毕业要求") if new_egr_id == -1
new_ervso.ec_graduation_requirement_id = new_egr_id
new_ervso.save!
end
end
end

@ -1,83 +1,115 @@
#encoding=utf-8
require 'net/http'
require 'digest'
class EcloudController < ApplicationController
skip_before_filter :verify_authenticity_token
before_filter :check_sign, only: [:ps_new, :ps_update, :bs_new, :bs_update]
before_filter :user_setup
before_filter :require_login, only: [:authorize]
# before_filter :require_login, only: [:authorize]
skip_before_filter :verify_authenticity_token, only: [:ps_new, :ps_edit]
skip_before_filter :verify_authenticity_token, only: [:ps_new, :ps_update, :bs_new, :bs_update, :ecloud_login_callback]
def index
render file: 'public/react-oschina/build/index.html', :layout => false
end
def trustie_login
end
CLIENT_ID = 'e5da9855f89bc724a335d100cb63cf02a03a592bd3151bbc84acf7b2e222ddb8'
CLIENT_SECRET = '4f2f291fac1d3dae338c18a3e3544814be5a1c4ade9e72d62f45ceab914c89f5'
CLIENT_ID = '1022'
CLIENT_SECRET = '2112037a-6d7a-432b-9081-feb1153d8668'
ROOT_URl = 'http://localhost:3000'
SERVER_URL = "https://221.176.54.92:9081/restful/services/"
def oschina_login
# 根据session看看有没有存access_token去刷新下。
# 1. 如果过期,则跳转
# 2. 未过期,直接用
redirect_to "https://gitee.com/oauth/authorize?client_id=#{CLIENT_ID}&redirect_uri=#{ROOT_URl}/oschina/login_cb&response_type=code"
## 签名
def sign(timestamp)
Digest::MD5.hexdigest("client_id=#{CLIENT_ID}client_key=#{CLIENT_SECRET}timestamp=#{timestamp}").upcase
end
# 企业开通
# applyno 申请单号,唯一
# ecordercode 唯一标志一个企业的订购关系
def bs_new
begin
Ecloud.create!(applyno: params['applyno'], ecordercode: params['ecordercode'], opttype: params['opttype'], trial: params['trial'],
bossorderid: params['bossorderid'], custid: params['custid'], custcode: params['custcode'])
render :json => {result: true, errmsg: ""}
rescue Exception => e
logger.error(e.message)
render :json => {code: 500, msg: "#{e.message}"}
ActiveRecord::Base.transaction do
begin
ecloud = Ecloud.create!(applyno: params['applyno'], ecordercode: params['ecordercode'], opttype: params['opttype'],
trial: params['trial'], bossorderid: params['bossorderid'], custid: params['custid'], custtype: params['custtype'],
custcode: params['custcode'], registersource: params['registersource'], custname: params['custname'],
userid: params['userid'], username: params['username'], useralias: params['useralias'], mobile: params['mobile'],
email: params['email'], productcode: params['productcode'], begintime: params['begintime'],
endtime: params['endtime'])
services = params['services'].first
EcloudService.create(opttype: services['opttype'], code: services['code'], begintime: services['begintime'],
endtime: services['endtime'], ecloud_id: ecloud.try(:id))
render :json => {result: true, errmsg: ""}
rescue Exception => e
logger.error(e.message)
render :json => {code: 500, msg: "#{e.message}"}
raise ActiveRecord::Rollback
end
end
end
# 企业更新
def bs_update
ActiveRecord::Base.transaction do
begin
ecloud = Ecloud.where(applyno: params['applyno']).first
ecloud.update_attributes!(applyno: params['applyno'], ecordercode: params['ecordercode'], opttype: params['opttype'],
custid: params['custid'], custcode: params['custcode'], productcode: params['productcode'],
operatime: params['operatime'], effecttime: params['effecttime'])
services = params['services'].first
ecloud.ecloud_service.update_attributes!(packagecode: services['packagecode'], bossorderid: services['bossorderid'])
render :json => {result: true, errmsg: ""}
rescue Exception => e
logger.error(e.message)
render :json => {code: 500, msg: "#{e.message}"}
raise ActiveRecord::Rollback
end
end
end
# 用户业务开通接口
# 用户业务开通与变更接口
def ps_new
begin
logger.info("11111######params")
ecloud_user = EcloudUser.where(:custid => params['custid'], :user_id => params['users']['userid']).first
if ecloud_user.present?
render :json => {code: 501, msg: "你已开通过该业务"}
else
EcloudUser.create!(custid: params['custid'], opttype: params['users']['opttype'], userid: params['users']['userid'],
username: params['users']['username'], useralias: params['users']['useralias'],
mobile: params['users']['mobile'], email: params['users']['email'], begintime: params['users']['begintime'].to_s,
endtime: params['users']['endtime'].to_s)
user_param = params['users'].first
# ecloud_user = EcloudUser.where(:custid => params['custid'], :userid => user_param['userid']).first
# if ecloud_user.present?
# render :json => {code: 500, msg: "你已开通过该业务"}
# else
EcloudUser.create!(custid: params['custid'], opttype: user_param['opttype'], userid: user_param['userid'],
username: user_param['username'], useralias: user_param['useralias'],
mobile: user_param['mobile'], email: user_param['email'], begintime: user_param['begintime'].to_s,
endtime: user_param['endtime'].to_s)
render :json => {success: true, errmsg: ""}
end
# end
rescue Exception => e
logger.error(e.message)
render :json => {code: 500, msg: "#{e.message}"}
end
end
# 用户业务变更、销毁接口
# 用户业务状态变更
def ps_update
begin
ecloud_user = EcloudUser.where(:custid => params['custid'], :user_id => params['users']['userid']).first
if ecloud_user.present?
ecloud_user.update_attributes(opttype: params['users']['opttype'])
render :json => {code: 501, msg: "你已开通过该业务"}
else
render :json => {code: 404, errmsg: ""}
end
ecloud = Ecloud.where(applyno: params['applyno']).first
user_param = params['users'].first
ecloud_user = EcloudUser.where(ecloud_id: ecloud.id).first
ecloud_user.update_attributes(opttype: user_param['opttype'], userid: user_param['userid'])
render :json => {success: true, errmsg: ""}
# else
# render :json => {code: 404, msg: "企业ID不存在"}
# end
rescue Exception => e
logger.error(e.message)
render :json => {code: 500, msg: "#{e.message}"}
@ -86,16 +118,15 @@ class EcloudController < ApplicationController
def ecloud_login_callback
#获取code
#
#
logger.debug params
url = "https://221.176.54.92:9081/restful/services/oauth2/authorization?grant_type=authorization_code" +
logger.info "oauth2 login_callback: #{params}"
raise "没有code" unless params[:code]
url = "#{SERVER_URL}/oauth2/authorization?grant_type=authorization_code" +
"&client_id=#{CLIENT_ID}&scope=&redirect_uri=&code=#{params[:code]}"
# url = "https://gitee.com/oauth/token?grant_type=authorization_code"+
# "&code=#{params[:code]}&client_id=#{CLIENT_ID}&redirect_uri=#{ROOT_URl}/oschina/login_cb&client_secret=#{CLIENT_SECRET}"
res = post(url)
logger.debug res
logger.info "oauth2 authorization resp: #{res}"
body = decode(res)
#{"access_token":"21a80f20ff736b54aecd002b60210943","token_type":"bearer","expires_in":86400,"refresh_token":"be92e2c137a8c6dd22f0d8c4a622b3aeceb054087a95d293130f04ec60fd3e3f","scope":"user_info","created_at":1542684088}
@ -105,17 +136,18 @@ class EcloudController < ApplicationController
#获取此用户信息
# res = get("https://gitee.com/api/v5/user?access_token=#{body["access_token"]}")
res = get("https://221.176.54.92:9081/restful/services/user/info?access_token=#{body["access_token"]}&userid=%7bUSERID%7d")
logger.debug res
info = decode(res)
res = get("#{SERVER_URL}/user/info?access_token=#{body['access_token']}&userid=#{body['uid']}")
logger.info "oauth2 get user info: #{res}"
user = User.find_by_oschina_user_id(info["id"])
unless user
user = User.create_with_oschina!(info)
end
@current_user = user
# 同步用户
# info = decode(res)
#
# user = User.find_by_oschina_user_id(info["id"])
# unless user
# user = User.create_with_oschina!(info)
# end
#
# @current_user = user
render :index
end
@ -157,7 +189,12 @@ class EcloudController < ApplicationController
end
private
def ecloudeuser_params
{}
def check_sign
sign = sign(params['timestamp'])
if sign != params['sign']
render :json => {code: 501, msg: "sign的值错误"}
return
end
end
end

@ -1,5 +1,7 @@
class EcsController < ApplicationController
before_filter :require_login
before_filter :find_school, :except => [:get_navigation_url]
before_filter :school_manager, :except => [:department, :get_navigation_url]
layout 'base_ec'
def department
@ -10,26 +12,30 @@ class EcsController < ApplicationController
@major_schools = @school.ec_major_schools.where(:template_major => false)
unless @is_school_manager
ec_major_school_ids = EcMajorSchoolUser.where(:user_id => User.current.id).pluck(:ec_major_school_id)
ec_course_major_ids = EcYear.where(:id => EcCourseUser.where(:user_id => User.current.id).pluck(:ec_year_id)).pluck(:ec_major_school_id)
ec_course_major_ids = EcYear.where(:id => EcCourse.where(:id => EcCourseUser.where(:user_id => User.current.id).pluck(:ec_course_id)).pluck(:ec_year_id)).pluck(:ec_major_school_id)
@major_schools = @major_schools.where(:id => (ec_major_school_ids + ec_course_major_ids).uniq)
end
@major_count = @major_schools.count
if params[:search].present?
major_ids = EcMajor.where("name like '%#{params[:search]}%' or code like '%#{params[:search]}%'").pluck(:id)
@major_schools = @major_schools.where(:ec_major_id => major_ids)
end
if @major_count == 0
render_403
else
if params[:search].present?
major_ids = EcMajor.where("name like '%#{params[:search]}%' or code like '%#{params[:search]}%'").pluck(:id)
@major_schools = @major_schools.where(:ec_major_id => major_ids)
end
@obj_count = @major_schools.count
@limit = 10
@is_remote = true
@obj_pages = Paginator.new @obj_count, @limit, params['page'] || 1
@offset ||= @obj_pages.offset
@major_schools = paginateHelper @major_schools, @limit
respond_to do |format|
format.js
format.html
@obj_count = @major_schools.count
@limit = 10
@is_remote = true
@obj_pages = Paginator.new @obj_count, @limit, params['page'] || 1
@offset ||= @obj_pages.offset
@major_schools = paginateHelper @major_schools, @limit
respond_to do |format|
format.js
format.html
end
end
end
@ -62,4 +68,10 @@ class EcsController < ApplicationController
def find_school
@school = School.find(params[:school_id])
end
def school_manager
unless User.current.admin? || @school.users.where(:id => User.current.id).count > 0
render_403
end
end
end

@ -219,10 +219,10 @@ class GamesController < ApplicationController
@had_passed_testsests_public_count = had_test.blank? ? 0 : had_test.select{|had_test| had_test.result == true && had_test.is_public == true}.count
@mirror_name = @myshixun.mirror_name
@final_score = ((@shixun.status <= 1) ? 0 : @game.final_score.to_i)
if @myshixun.shixun.status <= 1 || (@game.final_score != 0 && @game.answer_open?)
if @myshixun.shixun.status <= 1 || (@game.final_score != 0 && @game.answer_open > 0)
@gold = 0
else
if @game.answer_open? && @game.final_score ==0
if @game.answer_open > 0 && @game.final_score ==0
@gold = -@game_challenge.score.to_i
else
@gold = @game.final_score.to_i

@ -1,6 +1,6 @@
#encoding: utf-8
class OauthController < ApplicationController
require
include ApplicationHelper
before_filter :user_setup

@ -2968,7 +2968,7 @@ module ApplicationHelper
title << ("关于我们")
end
elsif params[:controller] == "courses" && params[:action] == "index"
title << ("课堂")
title << ("翻转课堂")
elsif params[:controller] == "competitions" && params[:action] == "index"
title << ("竞赛")
elsif @competition
@ -2976,11 +2976,11 @@ module ApplicationHelper
elsif @contest
title << (@contest.name.nil? ? "创新源于实践" : @contest.name)
elsif @shixun
title << (@shixun.name.nil? ? "精选实训" : @shixun.name)
title << (@shixun.name.nil? ? "开发社区" : @shixun.name)
elsif @my_shixun
title << ("我的实训")
elsif params[:controller] == "shixuns" && params[:action] == "index"
title << ("精选实训")
title << ("开发社区")
elsif @subject
title << (@subject.name.nil? ? "实训课程" : @subject.name)
elsif params[:controller] == "subjects" && params[:action] == "index"

@ -1,5 +1,7 @@
class Ecloud < ActiveRecord::Base
attr_accessible :applyno, :begintime, :bossorderid, :custcode, :custid, :custname, :custtype, :ecordercode, :endtime, :mobile, :opttype, :productcode, :registersource, :string, :trial, :useralias, :userid, :username
has_many :ecloud_users
has_many :ecloud_services
attr_accessible :applyno, :begintime, :bossorderid, :custcode, :custid, :custname, :custtype, :ecordercode, :endtime,
:mobile, :opttype, :productcode, :registersource, :string, :trial, :useralias, :userid, :username, :email,
:effecttime, :operatime
has_one :ecloud_user
has_one :ecloud_service
end

@ -1,3 +1,3 @@
class EcloudService < ActiveRecord::Base
attr_accessible :begintime, :code, :endtime, :opttype
attr_accessible :begintime, :code, :endtime, :opttype, :ecloud_id, :packagecode, :bossorderid
end

@ -64,7 +64,7 @@ class Myshixun < ActiveRecord::Base
time = 0
self.games.each do |game|
if game.status == 2
time += (game.end_time.to_i - game.open_time.to_i) > 0 ? (game.end_time.to_i - game.open_time.to_i) : 0
time += game.cost_time.to_i
end
end
time

@ -245,6 +245,8 @@ class User < Principal
has_many :ec_major_schools, :through => :ec_major_school_users
has_many :ec_major_school_users, :dependent => :destroy
has_many :ec_course_users
#####
scope :logged, lambda { where("#{User.table_name}.status <> #{STATUS_ANONYMOUS}") }
@ -344,6 +346,21 @@ class User < Principal
end
end
}
# 工程认证的学校
def ec_school
school_id = self.ec_school_users.pluck(:school_id).first ||
self.ec_major_schools.pluck(:school_id).first ||
(self.ec_course_users.first && self.ec_course_users.first.try(:ec_course).try(:ec_year).try(:ec_major_school).try(:school_id))
end
# 工程认证的权限
def ec_school_auth school_id
# self.ec_school_users.where(:school_id => school_id).count > 0 ||
# self.ec_major_schools.where(:school_id => school_id).count > 0 ||
#
end
def challenge_tags
games = self.games.where(:id => self.experiences.map(&:container_id), :status => 2)
challenge_tags = ChallengeTag.where(:challenge_id => games.map(&:challenge_id)).where("name != ''")

@ -43,7 +43,7 @@ class GamesService
# 高性能取上一关、下一关
prev_game = Game.prev_identifier(shixun.id, game.myshixun_id, game_challenge.position)
next_game = if current_user.is_certification_teacher || shixun_manager(shixun, current_user) || game.status == 2
next_game = if current_user.is_certification_teacher || shixun_manager(shixun, current_user) || game.status || shixun.task_pass
Game.next_game(shixun.id, game.myshixun_id, game_challenge.position).try(:identifier)
end
@ -697,7 +697,7 @@ class GamesService
if had_passed && !game.had_passed?
game.update_attributes(:status => 2, :end_time => Time.now)
# TPM实训已发布并且没有查看答案
if shixun.is_published? && !game.answer_open
if shixun.is_published? && game.answer_open == 0
# 查看答案的时候处理final_scor和扣分记录
experience = score
reward_grade(myshixun.owner, game.id, 'Game', score)
@ -930,7 +930,8 @@ class GamesService
end
#end
myshixun_job = Base64.urlsafe_encode64("myshixun_#{myshixun.id}")
StudentWork.where(:myshixun_id => myshixun.id).update_all(:myshixun_id => nil, :work_status => 0)
StudentWork.where(:myshixun_id => myshixun.id).update_all(:myshixun_id => 0, :work_status => 0, :work_score => nil, :final_score => nil,
:cost_time => 0, :update_time => nil, :compelete_status => 0, :commit_time => nil)
# myshixun.destroy
myshixun.delete
# 主从复制出现脏读的情况

@ -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.80b6ec5e.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.2958c8ba.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.c95e49c6.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.ea3ca4b2.js"></script></body></html>

@ -26,7 +26,7 @@
<% end %>
</li>
<% end %>
<% else %>
<% elsif @template_major %>
<form id="form_data_for_requirements">
<div class="clearfix ml30 mr30 pt20 pb20 bor-top-greyE" id="requirementNew">
<p class="df mb20"><input type="hidden" name="year_id" value="<%= @year.id %>">

@ -49,13 +49,13 @@
<!--</span>-->
</span>
<span class="column-2 fr edu-txt-center">
<% if @major_manager && !@major_school.template_major %>
<% if @major_manager && !@major_school.template_major || User.current.admin? %>
<a href="javascript:void(0);" onclick="delete_confirm_box_3('<%= ec_major_school_ec_year_path(year, :ec_major_school_id => @major_school) %>','您确定要删除吗?')" class="mr15 color-grey-c">删除</a>
<% end %>
<%#= link_to '删除', ec_major_school_ec_year_path(year, :ec_major_school_id => @major_school), method: :delete, :class => "mr15 color-grey-c", data: { confirm: '您确定要删除吗' } %>
<% if @major_manager || @major_school.template_major %>
<a href="javascript:void(0)" data-tip-down="导出本学年所有数据" class="mr15 color-blue">导出</a>
<% end %>
<%# if @major_manager || @major_school.template_major %>
<!--<a href="javascript:void(0)" data-tip-down="导出本学年所有数据" class="mr15 color-blue">导出</a>-->
<%# end %>
<%= link_to @btn_text, training_objectives_ec_major_school_ec_year_path(year, :ec_major_school_id => @major_school) %>
</span>

@ -86,7 +86,7 @@
</span>
<% end %>
<span class="column-5 fr">
<% if course_manager || @template_major %>
<% if @template_major %>
<a href="javascript:void(0)" onclick="delete_confirm_box_2('<%= ec_course_path(course) %>','是否确定删除当前课程?');" class="color-grey-c mr15 DelCorrelationCourse">删除</a>
<% end %>
<% redirect_url = course_targets == 0 ? ec_course_support_setting_ec_course_path(course) : (

@ -13,7 +13,7 @@
</li>
<% end %>
</ul>
<% elsif @ec_training_objective.present? %>
<% elsif @ec_training_objective.present? && @template_major && @sub_training_objectives.count == 0 %>
<form id="edit_training_subitems">
<ul class="edu-back-white padding10-30" id="SubentryNewPanel">
<li class="df mb10">

@ -12,7 +12,7 @@
<a href="javascript:void(0)" class="defalutCancelbtn mr20 fr" onclick="CancelEditBtn();">取消</a>
</p>
</div>
<% else %>
<% elsif @template_major %>
<div class="clearfix" id="targetEdit">
<textarea class="winput-100-130 mb10" id="training_obejctive"></textarea>
<p class="clearfix">

@ -29,7 +29,7 @@
</p>
</span>
<span class="column-5">
<% if major_manager %>
<% if @is_school_manager %>
<a href="javascript:void(0)" class="mr15 color-grey-c" onclick="delete_confirm_box_2('<%= ec_major_school_path(major_school) %>','是否确认删除')">删除</a>
<% end %>
<a href="<%= ec_major_school_path(major_school) %>" class="color-blue"><%= major_manager ? "配置" : "查看" %></a>

@ -2,8 +2,11 @@
<%= link_to image_tag("/images/educoder/headNavLogo.png", alt:"高校智能化教学与实训平台", class:"logoimg"), home_path %>
<div class="head-nav pr">
<ul id="header-nav">
<li class="pr<%= params[:action] == "index" && params[:controller] == "shixuns" ? " active" : "" %>"><%= link_to "精选实训", shixuns_path %><img src="/images/educoder/hot-h.png" class="nav-img" /></li>
<li class="<%= params[:action] == "index" && params[:controller] == "subjects" ? " active" : "" %>"><%= link_to "实训课程", subjects_path %></li>
<li class="<%= params[:action] == "index" && params[:controller] == "courses" ? " active" : "" %>"><%= link_to "翻转课堂", courses_path %></li>
<!-- 精选实训 -->
<li class="pr<%= params[:action] == "index" && params[:controller] == "shixuns" ? " active" : "" %>"><%= link_to "开发社区", shixuns_path %><img src="/images/educoder/hot-h.png" class="nav-img" /></li>
<% careers = Career.published.order("created_at asc") %>
<% if careers.present? %>
<li class="fl edu-menu-panel headIcon careershover <%= params[:action] == "index" && params[:controller] == "careers" ? " active" : "" %>" style="cursor: auto;">
@ -15,12 +18,12 @@
</ul>
</li>
<% end %>
<li class="<%= params[:action] == "index" && params[:controller] == "courses" ? " active" : "" %>"><%= link_to "课堂", courses_path %></li>
<li class="<%= params[:action] == "index" && params[:controller] == "competitions" ? " active" : "" %>"><%= link_to "竞赛", competitions_path %></li>
<li class="<%= params[:action] == "index" && params[:controller] == "forums" ? " active" : "" %>"><%= link_to "问答", forums_path %></li>
<% ec_user = EcSchoolUser.where(:user_id => User.current.id).first %>
<% if ec_user %>
<li class="<%= params[:controller] == "ecs" ? " active" : "" %>" id="ec_banner"><%= link_to "认证", department_ecs_path(:school_id => ec_user.school_id) %></li>
<% if User.current.ec_school.present? %>
<li class="<%= params[:controller] == "ecs" ? " active" : "" %>" id="ec_banner">
<%= link_to "认证", department_ecs_path(:school_id => User.current.ec_school) %>
</li>
<% end %>
</ul>
<div class="posi-search" id="posi-search" style="display: none">

@ -3,11 +3,13 @@
<div class="head-nav pr">
<ul id="header-nav">
<li class="active" style="display: none"><%= link_to "首页", home_path %></li>
<li><%= link_to "实训课程", subjects_path %></li>
<li><%= link_to "翻转课堂", courses_path %></li>
<li class="pr">
<%= link_to "精选实训", shixuns_path %>
<%= link_to "开发社区", shixuns_path %>
<img src="/images/educoder/hot-h.png" class="nav-img" />
</li>
<li><%= link_to "实训课程", subjects_path %></li>
<% careers = Career.published.order("created_at asc") %>
<% if careers.present? %>
<li class="fl edu-menu-panel headIcon careershover" style="cursor: auto;">
@ -19,7 +21,6 @@
</ul>
</li>
<% end %>
<li><%= link_to "课堂", courses_path %></li>
<li><%= link_to "竞赛", competitions_path %></li>
<li><%= link_to "问答", forums_path %></li>
<!--<li><%#= link_to "活动竞赛", competitions_path %></li>-->

@ -55,7 +55,7 @@
<tr>
<td>第<%= index + 1 %>关</td>
<td class="<%= game.status == 2 && game.end_time > @homework.end_time ? 'color-red' : '' %>"><%= game.status == 2 ? format_time(game.end_time) : '- -' %></td>
<td><%= game.status == 2 ? game_spend_time(game.end_time.to_i - game.open_time.to_i) : '- -' %></td>
<td><%= game.consumes_time %></td>
<td><%= game.status == 2 ? (game.final_score < 0 ? 0 : cha.score) : '- -' %></td>
</tr>
<% end %>

@ -1,9 +0,0 @@
Gitlab.configure do |config|
# config.endpoint = 'http://192.168.41.130:3000/trustie/api/v3' # API endpoint URL, default: ENV['GITLAB_API_ENDPOINT']
# config.private_token = 'cK15gUDwvt8EEkzwQ_63' # user's private token, default: ENV['GITLAB_API_PRIVATE_TOKEN']
config.endpoint = 'http://testbdgit.trustie.net/api/v3' # API endpoint URL, default: ENV['GITLAB_API_ENDPOINT']
config.private_token = 's89kqsMPtF8YLZSLyVmF' # user's private token, default: ENV['GITLAB_API_PRIVATE_TOKEN']
# Optional
# config.user_agent = 'Custom User Agent' # user agent, default: 'Gitlab Ruby Gem [version]'
# config.sudo = 'user' # username for sudo mode, default: nil
end

@ -33,11 +33,11 @@ RedmineApp::Application.routes.draw do ## oauth相关
match 'oauth/cb', to: 'oauth#test_callback', :via => :get
match 'oauth/userinfo', to: 'oauth#get_userinfo', :via => :get
match 'ecloud/ecloud_login_callback', to: 'ecloud#ecloud_login_callback', :via => :get
match 'ecloud/bs_new', to: 'ecloud#bs_new', :via => :post
match 'ecloud/bs_edit', to: 'ecloud#bs_edit', :via => :post
match 'ecloud/ps_new', to: 'ecloud#ps_new', :via => :post
match 'ecloud/ps_edit', to: 'ecloud#ps_edit', :via => :post
get 'ecloud/ecloud_login', to: 'ecloud#ecloud_login_callback'
post 'ecloud/bs_new', to: 'ecloud#bs_new'
post 'ecloud/bs_update', to: 'ecloud#bs_update'
post 'ecloud/ps_new', to: 'ecloud#ps_new'
post 'ecloud/ps_update', to: 'ecloud#ps_update'
resources :ec_course_evaluations do
@ -68,6 +68,7 @@ RedmineApp::Application.routes.draw do ## oauth相关
post 'add_manager'
delete 'delete_manager'
get "ec_course_support_setting"
get "ec_course_support_setting_data"
get "ec_course_reach_setting"
get "evaluation_methods"
match "search_courses", :via => [:get, :post]
@ -81,6 +82,7 @@ RedmineApp::Application.routes.draw do ## oauth相关
post 'crud_targets'
post 'crud_score_level'
get 'score_level'
get 'score_level_data'
end
collection do
get 'get_calculation_data'
@ -143,6 +145,7 @@ RedmineApp::Application.routes.draw do ## oauth相关
resources :ec_years, :path => "academic_years" do
member do
get 'student_lists'
get 'student_lists_data'
match 'import_students', :via => [:post]
get 'training_objectives'
get 'graduation_requirement'

@ -0,0 +1,40 @@
class AddPassedScoreForUsers < ActiveRecord::Migration
def up
games = Game.where("final_score = 0 and status = 2 and answer_open = 0 and created_at > '2019-03-09 00:00:00'").includes(:challenge)
puts "game_count: #{games.count}"
games.find_each do |game|
puts "#{game.id}"
challenge = game.challenge
# 选择题和实践题的分数
score = challenge.choose_score
user = game.user
game.update_column(:final_score, score)
# 奖励金币和提供记录
grade = Grade.where(:user_id => user.id, :container_id => game.id, :container_type => "Game").first
if grade.nil?
Grade.create!(:user_id => user.id,
:container_id => game.id,
:container_type => "Game",
:score => score,
:created_at => game.end_time || Time.now,
:updated_at => game.end_time || Time.now)
user.update_column(:grade, (score + user.grade.to_i))
end
# 经验奖励
experience = Experience.where(:user_id => user.id, :container_id => game.id, :container_type => "Game").first
if experience.nil?
Experience.create!(:user_id => user.id,
:container_id => game.id,
:container_type => "Game",
:score => score,
:created_at => game.end_time || Time.now,
:updated_at => game.end_time || Time.now)
user.update_column(:experience, (score + user.experience.to_i))
end
end
end
def down
end
end

@ -0,0 +1,5 @@
class AddEmailToEcloud < ActiveRecord::Migration
def change
add_column :eclouds, :email, :string
end
end

@ -0,0 +1,6 @@
class AddPackagecodeToEcloudServices < ActiveRecord::Migration
def change
add_column :ecloud_services, :packagecode, :string
add_column :ecloud_services, :bossorderid, :string
end
end

@ -0,0 +1,6 @@
class AddOperatimeToEcloud < ActiveRecord::Migration
def change
add_column :eclouds, :operatime, :string
add_column :eclouds, :effecttime, :string
end
end

@ -0,0 +1,5 @@
class RemoveIndexFromEcloud < ActiveRecord::Migration
def change
remove_index :eclouds, :name => 'ecorder_cust_code'
end
end

@ -0,0 +1,5 @@
class AddEcloudIdToEcloudUser < ActiveRecord::Migration
def change
add_column :ecloud_users, :ecloud_id, :integer
end
end

@ -1,88 +1,88 @@
{
"./static/js/0.f26528b1.chunk.js": "./static/js/0.f26528b1.chunk.js",
"./static/js/0.f26528b1.chunk.js.map": "./static/js/0.f26528b1.chunk.js.map",
"./static/js/1.cc33d6fc.chunk.js": "./static/js/1.cc33d6fc.chunk.js",
"./static/js/1.cc33d6fc.chunk.js.map": "./static/js/1.cc33d6fc.chunk.js.map",
"./static/js/10.ab08ae3d.chunk.js": "./static/js/10.ab08ae3d.chunk.js",
"./static/js/10.ab08ae3d.chunk.js.map": "./static/js/10.ab08ae3d.chunk.js.map",
"./static/js/11.c1a78f08.chunk.js": "./static/js/11.c1a78f08.chunk.js",
"./static/js/11.c1a78f08.chunk.js.map": "./static/js/11.c1a78f08.chunk.js.map",
"./static/js/12.fedd75c3.chunk.js": "./static/js/12.fedd75c3.chunk.js",
"./static/js/12.fedd75c3.chunk.js.map": "./static/js/12.fedd75c3.chunk.js.map",
"./static/js/13.a7e92c4a.chunk.js": "./static/js/13.a7e92c4a.chunk.js",
"./static/js/13.a7e92c4a.chunk.js.map": "./static/js/13.a7e92c4a.chunk.js.map",
"./static/js/14.97e6fd74.chunk.js": "./static/js/14.97e6fd74.chunk.js",
"./static/js/14.97e6fd74.chunk.js.map": "./static/js/14.97e6fd74.chunk.js.map",
"./static/js/15.05fc7db4.chunk.js": "./static/js/15.05fc7db4.chunk.js",
"./static/js/15.05fc7db4.chunk.js.map": "./static/js/15.05fc7db4.chunk.js.map",
"./static/js/16.efbbac6a.chunk.js": "./static/js/16.efbbac6a.chunk.js",
"./static/js/16.efbbac6a.chunk.js.map": "./static/js/16.efbbac6a.chunk.js.map",
"./static/js/17.6e20f18f.chunk.js": "./static/js/17.6e20f18f.chunk.js",
"./static/js/17.6e20f18f.chunk.js.map": "./static/js/17.6e20f18f.chunk.js.map",
"./static/js/18.ee48530e.chunk.js": "./static/js/18.ee48530e.chunk.js",
"./static/js/18.ee48530e.chunk.js.map": "./static/js/18.ee48530e.chunk.js.map",
"./static/js/19.cadd2a48.chunk.js": "./static/js/19.cadd2a48.chunk.js",
"./static/js/19.cadd2a48.chunk.js.map": "./static/js/19.cadd2a48.chunk.js.map",
"./static/js/2.9a1bdcfa.chunk.js": "./static/js/2.9a1bdcfa.chunk.js",
"./static/js/2.9a1bdcfa.chunk.js.map": "./static/js/2.9a1bdcfa.chunk.js.map",
"./static/js/20.5086cbe2.chunk.js": "./static/js/20.5086cbe2.chunk.js",
"./static/js/20.5086cbe2.chunk.js.map": "./static/js/20.5086cbe2.chunk.js.map",
"./static/js/21.d3d939d5.chunk.js": "./static/js/21.d3d939d5.chunk.js",
"./static/js/21.d3d939d5.chunk.js.map": "./static/js/21.d3d939d5.chunk.js.map",
"./static/js/22.234575f5.chunk.js": "./static/js/22.234575f5.chunk.js",
"./static/js/22.234575f5.chunk.js.map": "./static/js/22.234575f5.chunk.js.map",
"./static/js/23.67ab77f0.chunk.js": "./static/js/23.67ab77f0.chunk.js",
"./static/js/23.67ab77f0.chunk.js.map": "./static/js/23.67ab77f0.chunk.js.map",
"./static/js/24.27d7be07.chunk.js": "./static/js/24.27d7be07.chunk.js",
"./static/js/24.27d7be07.chunk.js.map": "./static/js/24.27d7be07.chunk.js.map",
"./static/js/25.c8a915ae.chunk.js": "./static/js/25.c8a915ae.chunk.js",
"./static/js/25.c8a915ae.chunk.js.map": "./static/js/25.c8a915ae.chunk.js.map",
"./static/js/26.488c5233.chunk.js": "./static/js/26.488c5233.chunk.js",
"./static/js/26.488c5233.chunk.js.map": "./static/js/26.488c5233.chunk.js.map",
"./static/js/27.ba45f1d3.chunk.js": "./static/js/27.ba45f1d3.chunk.js",
"./static/js/27.ba45f1d3.chunk.js.map": "./static/js/27.ba45f1d3.chunk.js.map",
"./static/js/28.8071de5d.chunk.js": "./static/js/28.8071de5d.chunk.js",
"./static/js/28.8071de5d.chunk.js.map": "./static/js/28.8071de5d.chunk.js.map",
"./static/js/29.67275bf0.chunk.js": "./static/js/29.67275bf0.chunk.js",
"./static/js/29.67275bf0.chunk.js.map": "./static/js/29.67275bf0.chunk.js.map",
"./static/js/3.935bae8c.chunk.js": "./static/js/3.935bae8c.chunk.js",
"./static/js/3.935bae8c.chunk.js.map": "./static/js/3.935bae8c.chunk.js.map",
"./static/js/30.4964944f.chunk.js": "./static/js/30.4964944f.chunk.js",
"./static/js/30.4964944f.chunk.js.map": "./static/js/30.4964944f.chunk.js.map",
"./static/js/31.5a1072f1.chunk.js": "./static/js/31.5a1072f1.chunk.js",
"./static/js/31.5a1072f1.chunk.js.map": "./static/js/31.5a1072f1.chunk.js.map",
"./static/js/32.2ff1fc95.chunk.js": "./static/js/32.2ff1fc95.chunk.js",
"./static/js/32.2ff1fc95.chunk.js.map": "./static/js/32.2ff1fc95.chunk.js.map",
"./static/js/4.017bf48d.chunk.js": "./static/js/4.017bf48d.chunk.js",
"./static/js/4.017bf48d.chunk.js.map": "./static/js/4.017bf48d.chunk.js.map",
"./static/js/5.27b42764.chunk.js": "./static/js/5.27b42764.chunk.js",
"./static/js/5.27b42764.chunk.js.map": "./static/js/5.27b42764.chunk.js.map",
"./static/js/6.1d80a66b.chunk.js": "./static/js/6.1d80a66b.chunk.js",
"./static/js/6.1d80a66b.chunk.js.map": "./static/js/6.1d80a66b.chunk.js.map",
"./static/js/7.03d1beb1.chunk.js": "./static/js/7.03d1beb1.chunk.js",
"./static/js/7.03d1beb1.chunk.js.map": "./static/js/7.03d1beb1.chunk.js.map",
"./static/js/8.ea688812.chunk.js": "./static/js/8.ea688812.chunk.js",
"./static/js/8.ea688812.chunk.js.map": "./static/js/8.ea688812.chunk.js.map",
"./static/js/9.2971266e.chunk.js": "./static/js/9.2971266e.chunk.js",
"./static/js/9.2971266e.chunk.js.map": "./static/js/9.2971266e.chunk.js.map",
"main.css": "./static/css/main.80b6ec5e.css",
"main.css.map": "./static/css/main.80b6ec5e.css.map",
"main.js": "./static/js/main.2958c8ba.js",
"main.js.map": "./static/js/main.2958c8ba.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",
"static\\media\\courses.jpg": "static/media/courses.7b27495b.jpg",
"static\\media\\group.png": "static/media/group.2f91e9cd.png",
"static\\media\\introduceback.jpg": "static/media/introduceback.3d75d3db.jpg",
"static\\media\\logo.svg": "static/media/logo.ee7cd8ed.svg",
"static\\media\\match_ad.jpg": "static/media/match_ad.4e957369.jpg",
"static\\media\\message.svg": "static/media/message.a7af2a8f.svg",
"static\\media\\messagegrey.svg": "static/media/messagegrey.8c1dff55.svg",
"static\\media\\nodata.png": "static/media/nodata.cde5b659.png",
"static\\media\\passall.png": "static/media/passall.46817e26.png",
"static\\media\\passpart.png": "static/media/passpart.4aaf3e6b.png",
"static\\media\\rc-tree.png": "static/media/rc-tree.776c7fe6.png",
"static\\media\\search.svg": "static/media/search.0e1dcc19.svg",
"static\\media\\vedio.png": "static/media/vedio.6a98b4f1.png"
"./static/js/0.6b9d3c60.chunk.js": "./static/js/0.6b9d3c60.chunk.js",
"./static/js/0.6b9d3c60.chunk.js.map": "./static/js/0.6b9d3c60.chunk.js.map",
"./static/js/1.5f152c98.chunk.js": "./static/js/1.5f152c98.chunk.js",
"./static/js/1.5f152c98.chunk.js.map": "./static/js/1.5f152c98.chunk.js.map",
"./static/js/10.2464b0fd.chunk.js": "./static/js/10.2464b0fd.chunk.js",
"./static/js/10.2464b0fd.chunk.js.map": "./static/js/10.2464b0fd.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.ec0ef070.chunk.js": "./static/js/12.ec0ef070.chunk.js",
"./static/js/12.ec0ef070.chunk.js.map": "./static/js/12.ec0ef070.chunk.js.map",
"./static/js/13.8575d630.chunk.js": "./static/js/13.8575d630.chunk.js",
"./static/js/13.8575d630.chunk.js.map": "./static/js/13.8575d630.chunk.js.map",
"./static/js/14.29e80958.chunk.js": "./static/js/14.29e80958.chunk.js",
"./static/js/14.29e80958.chunk.js.map": "./static/js/14.29e80958.chunk.js.map",
"./static/js/15.0dcec662.chunk.js": "./static/js/15.0dcec662.chunk.js",
"./static/js/15.0dcec662.chunk.js.map": "./static/js/15.0dcec662.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.d11660e2.chunk.js": "./static/js/17.d11660e2.chunk.js",
"./static/js/17.d11660e2.chunk.js.map": "./static/js/17.d11660e2.chunk.js.map",
"./static/js/18.5fe45ac4.chunk.js": "./static/js/18.5fe45ac4.chunk.js",
"./static/js/18.5fe45ac4.chunk.js.map": "./static/js/18.5fe45ac4.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.eb0d1091.chunk.js": "./static/js/2.eb0d1091.chunk.js",
"./static/js/2.eb0d1091.chunk.js.map": "./static/js/2.eb0d1091.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.e3927d38.chunk.js": "./static/js/26.e3927d38.chunk.js",
"./static/js/26.e3927d38.chunk.js.map": "./static/js/26.e3927d38.chunk.js.map",
"./static/js/27.d2f21a4d.chunk.js": "./static/js/27.d2f21a4d.chunk.js",
"./static/js/27.d2f21a4d.chunk.js.map": "./static/js/27.d2f21a4d.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.123eae7e.chunk.js": "./static/js/3.123eae7e.chunk.js",
"./static/js/3.123eae7e.chunk.js.map": "./static/js/3.123eae7e.chunk.js.map",
"./static/js/30.92e2f4a6.chunk.js": "./static/js/30.92e2f4a6.chunk.js",
"./static/js/30.92e2f4a6.chunk.js.map": "./static/js/30.92e2f4a6.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.a563b706.chunk.js": "./static/js/4.a563b706.chunk.js",
"./static/js/4.a563b706.chunk.js.map": "./static/js/4.a563b706.chunk.js.map",
"./static/js/5.459a49ba.chunk.js": "./static/js/5.459a49ba.chunk.js",
"./static/js/5.459a49ba.chunk.js.map": "./static/js/5.459a49ba.chunk.js.map",
"./static/js/6.83516b55.chunk.js": "./static/js/6.83516b55.chunk.js",
"./static/js/6.83516b55.chunk.js.map": "./static/js/6.83516b55.chunk.js.map",
"./static/js/7.accad232.chunk.js": "./static/js/7.accad232.chunk.js",
"./static/js/7.accad232.chunk.js.map": "./static/js/7.accad232.chunk.js.map",
"./static/js/8.69fefc71.chunk.js": "./static/js/8.69fefc71.chunk.js",
"./static/js/8.69fefc71.chunk.js.map": "./static/js/8.69fefc71.chunk.js.map",
"./static/js/9.e77edf45.chunk.js": "./static/js/9.e77edf45.chunk.js",
"./static/js/9.e77edf45.chunk.js.map": "./static/js/9.e77edf45.chunk.js.map",
"main.css": "./static/css/main.c95e49c6.css",
"main.css.map": "./static/css/main.c95e49c6.css.map",
"main.js": "./static/js/main.ea3ca4b2.js",
"main.js.map": "./static/js/main.ea3ca4b2.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",
"static/media/courses.jpg": "static/media/courses.7b27495b.jpg",
"static/media/group.png": "static/media/group.2f91e9cd.png",
"static/media/introduceback.jpg": "static/media/introduceback.3d75d3db.jpg",
"static/media/logo.svg": "static/media/logo.5d5d9eef.svg",
"static/media/match_ad.jpg": "static/media/match_ad.4e957369.jpg",
"static/media/message.svg": "static/media/message.c4f86b97.svg",
"static/media/messagegrey.svg": "static/media/messagegrey.31dd74f4.svg",
"static/media/nodata.png": "static/media/nodata.cde5b659.png",
"static/media/passall.png": "static/media/passall.46817e26.png",
"static/media/passpart.png": "static/media/passpart.4aaf3e6b.png",
"static/media/rc-tree.png": "static/media/rc-tree.776c7fe6.png",
"static/media/search.svg": "static/media/search.0e1dcc19.svg",
"static/media/vedio.png": "static/media/vedio.6a98b4f1.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.80b6ec5e.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.2958c8ba.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.c95e49c6.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.ea3ca4b2.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

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