diff --git a/app/controllers/admins/laboratory_settings_controller.rb b/app/controllers/admins/laboratory_settings_controller.rb index 283afc175..b22122831 100644 --- a/app/controllers/admins/laboratory_settings_controller.rb +++ b/app/controllers/admins/laboratory_settings_controller.rb @@ -16,7 +16,7 @@ class Admins::LaboratorySettingsController < Admins::BaseController def form_params params.permit(:identifier, :name, - :nav_logo, :login_logo, :tab_logo, :oj_banner, + :nav_logo, :login_logo, :tab_logo, :oj_banner, :shixun_banner, :subject_banner, :course_banner, :competition_banner, :moop_cases_banner, :footer, navbar: %i[name link hidden]) end diff --git a/app/controllers/challenges_controller.rb b/app/controllers/challenges_controller.rb index c7fcb4423..103c33aab 100644 --- a/app/controllers/challenges_controller.rb +++ b/app/controllers/challenges_controller.rb @@ -230,7 +230,7 @@ class ChallengesController < ApplicationController logger.info("############shixun_publiced:#{@shixun.public == 0}") if @shixun.public == 0 script = modify_shixun_script @shixun, @shixun.evaluate_script - @shixun.shixun_info.update_column(:evaluate_script, script) + @shixun.shixun_info.update_column(:evaluate_script, script) if script.present? end # TODO: # if path != params[:challenge][:path] diff --git a/app/controllers/concerns/controller_rescue_handler.rb b/app/controllers/concerns/controller_rescue_handler.rb index 6ff15cfbc..4ab5d3276 100644 --- a/app/controllers/concerns/controller_rescue_handler.rb +++ b/app/controllers/concerns/controller_rescue_handler.rb @@ -6,10 +6,12 @@ module ControllerRescueHandler Util.logger_error e render json: {status: -1, message: e.message} end + rescue_from ActiveRecord::StatementInvalid do |e| Util.logger_error e render json: {status: -1, message: "接口数据异常"} end + rescue_from NoMethodError do |e| Util.logger_error e render json: {status: -1, message: "接口方法异常"} @@ -18,6 +20,7 @@ module ControllerRescueHandler rescue_from ActionController::UnknownFormat do |e| render json: {status: -1, message: "接口调用非JSON格式"} end + # rescue_from ActionView::MissingTemplate, with: :object_not_found # rescue_from ActiveRecord::RecordNotFound, with: :object_not_found rescue_from Educoder::TipException, with: :tip_show @@ -32,6 +35,7 @@ module ControllerRescueHandler rescue_from ActiveRecord::RecordInvalid do |ex| render_error(ex.record.errors.full_messages.join(',')) end + # rescue_from RuntimeError do |ex| # Util.logger_error "#######ex:#{ex}" # render_error(ex.message) diff --git a/app/controllers/concerns/git_helper.rb b/app/controllers/concerns/git_helper.rb index d8479d458..db99f9da5 100644 --- a/app/controllers/concerns/git_helper.rb +++ b/app/controllers/concerns/git_helper.rb @@ -13,7 +13,7 @@ module GitHelper content = GitService.file_content(repo_path: repo_path, path: path) - Rails.logger.info("git file content: content is #{content}") + #Rails.logger.info("git file content: content is #{content}") decode_content = nil if content.present? content = content["content"] #6.24 -hs 这个为新增,因为当实训题里含有选择题时,这里会报错,undefined method `[]' for nil:NilClass @@ -25,6 +25,8 @@ module GitHelper decode_content = if cd["encoding"] == 'GB18030' && cd['confidence'] > 0.8 content.encode('UTF-8', 'GBK', {:invalid => :replace, :undef => :replace, :replace => ' '}) + elsif cd['encoding'].blank? + raise("ERROR_UTF8") else content.force_encoding('UTF-8') end @@ -34,7 +36,9 @@ module GitHelper rescue Exception => e Rails.logger.error(e.message) - raise Educoder::TipException.new("文档内容获取异常") + error_msg = e.message == "ERROR_UTF8" ? "文件无法预览" : "文档内容获取异常" + error_status = e.message == "ERROR_UTF8" ? -2 : -1 + raise Educoder::TipException.new(error_status, error_msg) end end @@ -53,13 +57,17 @@ module GitHelper end # 添加目录 - def git_add_folder(folder_path, author_name, author_email, message) - GitService.add_tree(file_path: folder_path, message: message, author_name: author_name, author_email: author_email) + def git_add_folder(repo_path, tree_path, author_name, author_email, message) + Rails.logger.info("#####repo_path:#{repo_path}, tree_path: #{tree_path}") + GitService.add_tree(repo_path: repo_path, tree_path: tree_path, message: message, author_name: author_name, + author_email: author_email) end # 删除文件 - def git_delete_file(file_path, author_name, author_email, message) - GitService.delete_file(file_path: file_path, message: message, author_name: author_name, author_email: author_email) + def git_delete_file(repo_path, tree_path, author_name, author_email, message) + Rails.logger.info("#####repo_path:#{repo_path}, tree_path: #{tree_path}") + GitService.delete_file(repo_path: repo_path, tree_path: tree_path, message: message, author_name: author_name, + author_email: author_email) end # 版本库Fork功能 diff --git a/app/controllers/ecloud_controller.rb b/app/controllers/ecloud_controller.rb new file mode 100644 index 000000000..f091356eb --- /dev/null +++ b/app/controllers/ecloud_controller.rb @@ -0,0 +1,378 @@ +#encoding=utf-8 +# 云启训练场(EduCoder)个人版 产品编码(appId) 9200108 +# 产品名称 计费类型 套餐编码 +# 云启训练场(EduCoder)个人版 固定包月 9200108001 +# 固定包月 9200108002 +# 固定包月 9200108003 +# --------------------------------------------------- +# 产品名称 计费类型 套餐编码 +# 云启训练场(EduCoder))院校版 包月+按license 9200109001 +# 包月+按license 9200109002 + +# 云启训练场(EduCoder))院校版 产品编码(appId) 9200109 + +require 'net/http' +require 'digest' + +class EcloudController < ApplicationController + + before_action :save_para + before_action :check_sign_key, only: [:ps_new, :ps_update, :bs_new, :bs_update] + + + def index + render file: 'public/react-oschina/build/index.html', :layout => false + end + + def trustie_login + end + + # 测试环境 + # CLIENT_ID = '1022' + # CLIENT_SECRET = '2112037a-6d7a-432b-9081-feb1153d8668' + # SERVER_URL = "https://221.176.54.92:9081/restful/services/" + # + + # 正式环境 + CLIENT_ID = '1056' + CLIENT_SECRET = '2e84256a-3de4-4713-9e02-10ee88a14592' + SERVER_URL = "https://221.176.53.130:44390/services/" + + + ## 签名 + def sign(timestamp) + Digest::MD5.hexdigest("client_id=#{CLIENT_ID}client_key=#{CLIENT_SECRET}timestamp=#{timestamp}").upcase + end + + + # 企业/个人业务开通 + # applyno 申请单号,唯一 + # ecordercode 唯一标志一个企业的订购关系 + # params['opttype']:操作类型。0开通;1变更;2试用转商用;4再次开通 + # 业务列表opttype: 0新增;1注销;2修改 + # serviceparas: 但是由于企业版是按成员收费的,所以serviceparas里面会传成员数;个人版是包月计费的,serviceparas不会传成员数 + def bs_new + ActiveRecord::Base.transaction do + begin + if params['opttype'] == 0 # 开通企业/个人业务 + ecloud = Ecloud.create!(eloud_params) + create_service(params['services'], ecloud.try(:id)) if params['services'].present? + create_product_params(params['productparas'], ecloud.try(:id)) if params['productparas'].present? + # 为管理员添加一条记录 + # 开通的时候都是用户的opttype也是0 + # 如果管理员已经存在,则不用重复开通 + euser = EcloudUser.where(userid: params['userid'], custid: params['custid']).first + unless euser + EcloudUser.create!(custid: params['custid'], opttype: params['opttype'], userid: params['userid'], + username: params['username'], useralias: params['useralias'], + mobile: params['mobile'], email: params['email'], begintime: params['begintime'], + endtime: params['endtime']) + end + elsif params['opttype'] == 2 # 试用转商用 # 变更企业/个人业务 + # 业务列表:注销业务(注销试用的套餐),另一个业务项的操作代码是:新增业务(开通商用的套餐) + # 需要通过产品服务编号和业务编码来区分哪个产品 + ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode'], productcode: params['productcode'], trial: true).first + + # 注销试用的套餐 + ## 需要注销的套餐; 试用转商用是不会有批量操作的,所以可以使用first + des_service = params['services'].select{|s| s['opttype'] == 1}.first + esd = EcloudService.where(ecloud_id: ecloud.try(:id), code: des_service['code']).first + ecloud.update_attribute(:trial, params['trial']) + esd.update_attributes!(opttype: des_service['opttype'], begintime: des_service['begintime'], endtime: des_service['endtime']) + + # 试用转商用是不会有批量操作的 + # 新增业务 + add_service = params['services'].select{|s| s['opttype'] == 0} + create_service(add_service, ecloud.try(:id)) + # + + elsif params['opttype'] == 1 # 业务变更 + ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode'], productcode: params['productcode']).first + # 套餐变更 + # 操作代码 0:新增业务,1:注销业务2:修改业务 + # # 新增服务 + add_service = params['services'].select{|s| s['opttype'] == 0} + create_service(add_service, ecloud.try(:id)) if add_service.present? + + # 如果有注销业务,注销业务 + des_services = params['services'].select{|s| s['opttype'] == 1} + if des_services.present? + des_services.each do |ds| + + logger.info("666666#{ecloud.try(:id)}, 55555555#{ds['code']}") + esd = EcloudService.where(ecloud_id: ecloud.try(:id), code: ds['code']).first + esd.update_attributes!(opttype: ds['opttype'], begintime: ds['begintime'], endtime: ds['endtime']) + end + end + + # 变更业务 + edt_services = params['services'].select{|s| s['opttype'] == 2} + if edt_services.present? + edt_services.each do |es| + ese = EcloudService.where(ecloud_id: ecloud.try(:id), code: es['code']).first + ese.update_attributes!(opttype: es['opttype'], begintime: es['begintime'], endtime: es['endtime']) if ese.present? + create_serviceparas(es['serviceparas'].first, ese.id) if ese.present? + end + end + + + # ecloud = Ecloud.where(bossorderid: params['bossorderid']).first + # ecloud.update_attributes!(eloud_params) + # ecloud.ecloud_productparas.destroy + # ecloud.ecloud_services.destroy + # + # ecloud_id = ecloud.try(:id) + + elsif params['opttype'] == 4 # 再次重复开通 + # 再次申请开通,这种情况就是累加时间 + ecloud = Ecloud.where(custid: params['custid'], custcode: params['custcode'], productcode: params['productcode']).first + create_service(params['services'], ecloud.try(:id)) + create_product_params(params['productparas'], ecloud.try(:id)) if params['productparas'].present? + end + + # + # # 非试用情况下,为管理员单独创建一条账号,企业账号 + # unless params['trial'] + # EcloudUser.create!(ecloud_id: ecloud.try(:id), opttype: params['opttype'], userid: params['userid'], + # username: params['username'], useralias: params['useralias'], + # mobile: params['mobile'], email: params['email']) + # end + + 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 + + # 企业/个人业务变更、注销 + # 处理业务平台退订、暂停(欠费暂停,信控暂停等)、暂停后恢复应用业务 + # 这个接口是不会新增业务的 + # 试用退订的时候bossorderid传空字符 + def bs_update + ActiveRecord::Base.transaction do + begin + case params['opttype'] + when 0 # 退订 + opttype = 6 + when 1 # 暂停 + opttype = 7 + when 2 # 恢复 + opttype = 8 + end + if params['bossorderid'].present? + ecloud = Ecloud.where(bossorderid: params['bossorderid']).first + ecloud.update_attribute(:opttype, opttype) + else + # 试用退订 + params['services'].each do |service| + ecloud_id = EcloudService.where(code: service['packagecode']).first.try(:ecloud_id) + Ecloud.find(ecloud_id).update_attribute(:opttype, opttype) + end + end + 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 + + # 用户业务开通与变更接口 + # 授权statu为1,取消授权status为0 + # user['opttype']: 操作类型0:开通;1:变更;3: 取消授权;4:暂停;5:恢复; + + def ps_new + ActiveRecord::Base.transaction do + begin + user_params = params['users'] + user_params.each do |user_param| + if user_param['opttype'] == 0 # 开通 + 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) + elsif user_param['opttype'] == 1 # 变更 + ecloud_user = EcloudUser.where(custid: params['custid'], userid: user_param['userid']).first + ecloud_user.update_attributes!(opttype: user_param['opttype'], 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) + end + end + + render :json => {success: true, errmsg: ""} + # end + rescue Exception => e + logger.error(e.message) + render :json => {code: 500, msg: "#{e.message}"} + raise ActiveRecord::Rollback + end + end + end + + # 用户业务状态变更 + # user['opttype']: 操作类型0:开通;1:变更;3: 取消授权;4:暂停;5:恢复; + def ps_update + begin + user_params = params['users'] + user_params.each do |user_param| + case user_param['opttype'] + when 0 # 取消授权 + opttype = 3 + when 1 # 暂停 + opttype = 4 + when 2 # 恢复 + opttype = 5 + end + ecloud_user = EcloudUser.where(custid: params['custid'], userid: user_param['userid']).first + ecloud_user.update_attributes!(opttype: opttype, operatime: params['operatime'], effecttime: params['effecttime']) + end + + render :json => {success: true, errmsg: ""} + rescue Exception => e + logger.error(e.message) + render :json => {code: 500, msg: "#{e.message}"} + end + end + + def ecloud_login_callback + if params[:test] + user_info = decode '{"userid":2147,"custid":2104,"custcode":"E0002018042810010054","custtype":2,"status":2,"username":"15111030087@QW_er","useralias":"15111030087","isadmin":true,"entprise":"04**004","departments":"","departmentnames":"","mobile":"15365386520","email":"15111030087@139.com"}' + else + res = request_ecloud_authorization + + logger.info "oauth2 authorization resp: #{res}" + raise '登录失败' unless res["access_token"] + + user_info = decode get_ecloud_user(res) + logger.info "oauth2 get user info: #{user_info}" + end + + open_user = OpenUsers::Ecloud.find_or_initialize_by(uid: user_info['userid']) do |u| + u.extra = user_info + end + + redirect_to "/users/#{open_user.user.login}/courses" and return if open_user.persisted? + + ActiveRecord::Base.transaction do + user = User.find_or_initialize_by(phone: user_info["mobile"]) do |u| + u.login = "ecoder_#{user_info['mobile']}" + u.type ='User' + u.status = User::STATUS_ACTIVE + u.nickname = user_info[:username] + u.lastname = user_info['username'] + end + + if !user.persisted? + user.mail = user_info["email"] unless user_info["email"].blank? || User.find_by_mail(user_info["email"]) + user.save! + user.create_user_extension! + end + + open_user.user = user + open_user.save! + successful_authentication(user) + + redirect_to "/users/#{user.login}/courses" + end + rescue Exception => e + render :json => {code: 500, msg: "#{e.message}"} + end + + private + + def request_ecloud_authorization + url = "#{SERVER_URL}/oauth2/authorization?grant_type=authorization_code&client_id=#{CLIENT_ID}&scope=&redirect_uri=&code=#{params[:code]}" + decode post(url) + end + + def get_ecloud_user(body) + res = get("#{SERVER_URL}/user/info?access_token=#{body['access_token']}&userid=#{body['uid']}") + end + + def get(url) + uri = URI(url) + + http = Net::HTTP.new(uri.host, uri.port) + http.use_ssl = url.start_with?('https') + http.verify_mode = OpenSSL::SSL::VERIFY_NONE + request = Net::HTTP::Get.new(uri.request_uri) + request['Content-Type'] = 'application/json' + request['Accept'] = 'application/json' + response = http.request(request) + + response.body + end + + def post(url) + uri = URI(url) + + http = Net::HTTP.new(uri.host, uri.port) + http.use_ssl = url.start_with?('https') + http.verify_mode = OpenSSL::SSL::VERIFY_NONE + request = Net::HTTP::Post.new(uri.request_uri) + request['Content-Type'] = 'application/json' + request['Accept'] = 'application/json' + response = http.request(request) + + response.body + end + + def decode(s) + begin + obj = ActiveSupport::JSON.decode(s) + rescue ActiveSupport::JSON.parse_error + logger.error("Attempted to decode invalid JSON: #{s}") + end + end + + private + def eloud_params + return {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']} + end + + # 新增套餐 + def create_service services, ecloud_id + services.each do |service| + ese = EcloudService.create!(opttype: service['opttype'], code: service['code'], begintime: service['begintime'], + endtime: service['endtime'], ecloud_id: ecloud_id) + if service['serviceparas'].present? + create_serviceparas(service['serviceparas'].first, ese.id) + end + end + end + + def create_serviceparas params_serviceparas, ese_id + if params_serviceparas.present? + EcloudServieceServicepara.create(key: params_serviceparas['key'], value: params_serviceparas['value'], ecloud_service_id: ese_id) + end + end + + def create_product_params params, ecloud_id + params.each do |p| + EcloudProductpara.create(key: p['key'], value: p['value'], ecloud_id: ecloud_id) + end + end + + def check_sign_key + sign = sign(params['timestamp']) + if sign != params['sign'] + render :json => {code: 501, msg: "sign的值错误"} + return + end + end + + def save_para + EcloudLog.create(url: request.url, para_value: params, applyno: params['applyno'], custid: params['custid'], + custcode: params['custcode'], userid: params['userid'], username: params['username']) + end + +end diff --git a/app/controllers/games_controller.rb b/app/controllers/games_controller.rb index 1649e3eb9..cfcf92e4c 100644 --- a/app/controllers/games_controller.rb +++ b/app/controllers/games_controller.rb @@ -749,6 +749,8 @@ class GamesController < ApplicationController # 针对web类型的实训 web_route = game_challenge.try(:web_route) + server_url = @game.get_server_url if web_route.present? + mirror_name = @shixun.mirror_name e_record = EvaluateRecord.where(:identifier => sec_key).first @@ -776,7 +778,7 @@ class GamesController < ApplicationController @base_date = {grade: grade, gold: score, experience: experience, status: game_status, had_done: had_done, position: game_challenge.position, port: port, record_consume_time: record_consume_time, mirror_name: mirror_name, picture: picture, web_route: web_route, star: @game.star, - next_game: next_game, prev_game: prev_game, max_mem: max_mem} + next_game: next_game, prev_game: prev_game, max_mem: max_mem, server_url: server_url} end # 记录实训花费的时间 @@ -961,7 +963,7 @@ class GamesController < ApplicationController begin shixun = game.myshixun.shixun shixun_tomcat = edu_setting('cloud_bridge') - service_host = edu_setting('vnc_url') + #service_host = edu_setting('vnc_url') tpiGitURL = "#{edu_setting('git_address_domain')}/#{game.myshixun.repo_path}" uri = "#{shixun_tomcat}/bridge/vnc/getvnc" @@ -971,14 +973,14 @@ class GamesController < ApplicationController if res && res['code'].to_i != 0 raise("实训云平台繁忙(繁忙等级:99)") end - @vnc_url = - if request.subdomain == "pre-newweb" || request.subdomain == "test-newweb" - # 无域名版本 - "http://#{service_host}:#{res['port']}/vnc_lite.html?password=headless" - else - # 有域名版本 - "https://#{res['port']}.#{service_host}/vnc_lite.html?password=headless" - end + @vnc_url = res['showServer'] + # if request.subdomain == "pre-newweb" || request.subdomain == "test-newweb" + # # 无域名版本 + # "http://#{service_host}:#{res['port']}/vnc_lite.html?password=headless" + # else + # # 有域名版本 + # "https://#{res['port']}.#{service_host}/vnc_lite.html?password=headless" + # end @vnc_evaluate = shixun.vnc_evaluate rescue Exception => e Rails.logger.error(e.message) diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index 83bcaf37a..fb327ec78 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -1433,7 +1433,7 @@ class HomeworkCommonsController < ApplicationController def require_id_params tip_exception("请至少选择一个作业") if params[:homework_ids].blank? - tip_exception("批量设置不能超过15个") if params[:homework_ids].length > 15 + tip_exception("批量设置不能超过15个") if params[:homework_ids].length > 15 && params[:type].blank? end def validate_min_max_num diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb index 893bf28d7..29a9a9730 100644 --- a/app/controllers/myshixuns_controller.rb +++ b/app/controllers/myshixuns_controller.rb @@ -99,6 +99,7 @@ class MyshixunsController < ApplicationController status = jsonTestDetails['status'] game_id = jsonTestDetails['buildID'] sec_key = jsonTestDetails['sec_key'] + server_url = jsonTestDetails['showServer'] #uid_logger_dubug("training_task_status start-#{game_id}-1#{Time.now.strftime("%Y-%m-%d %H:%M:%S.%L")}") resubmit = jsonTestDetails['resubmit'] @@ -117,6 +118,10 @@ class MyshixunsController < ApplicationController pics = params[:tpiRepoPath] game.update_column(:picture_path, pics) end + # 如果启动了服务,则存在redis中,供前端访问 + if server_url.present? + game.set_server_key(server_url) + end max_query_index = game.outputs ? (game.outputs.first.try(:query_index).to_i + 1) : 1 test_set_score = 0 unless jenkins_testsets.blank? diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index c40010be2..4a402fd8e 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -3,6 +3,7 @@ class ShixunsController < ApplicationController include ApplicationHelper include ElasticsearchAble include CoursesHelper + include GitCommon before_action :require_login, :check_auth, except: [:download_file, :index, :menus, :show, :show_right, :ranking_list, :discusses, :collaborators, :fork_list, :propaedeutics] @@ -16,7 +17,7 @@ class ShixunsController < ApplicationController :propaedeutics, :departments, :apply_shixun_mirror, :jupyter_exec, :get_mirror_script, :download_file, :shixun_list, :batch_send_to_course] before_action :find_repo_name, only: [:repository, :commits, :file_content, :update_file, :shixun_exec, :copy, - :add_file, :jupyter_exec] + :add_file, :jupyter_exec, :upload_git_file, :delete_git_file, :upload_git_folder] before_action :allowed, only: [:update, :close, :update_propaedeutics, :settings, :publish, :apply_public, :upload_git_folder, :shixun_members_added, :change_manager, :collaborators_delete, :upload_git_file, @@ -86,11 +87,11 @@ class ShixunsController < ApplicationController @shixuns = @shixuns.includes(:tag_repertoires, :challenges).page(page).per(limit) - @tag_name_map = TagRepertoire.joins(:shixun_tag_repertoires) - .where(shixun_tag_repertoires: { shixun_id: @shixuns.map(&:id) }) - .group('shixun_tag_repertoires.shixun_id') - .select('shixun_id, tag_repertoires.name') - .each_with_object({}) { |r, obj| obj[r.shixun_id] = r.name } + #@tag_name_map = TagRepertoire.joins(:shixun_tag_repertoires) + # .where(shixun_tag_repertoires: { shixun_id: @shixuns.map(&:id) }) + # .group('shixun_tag_repertoires.shixun_id') + # .select('shixun_id, tag_repertoires.name') + # .each_with_object({}) { |r, obj| obj[r.shixun_id] = r.name } end def shixun_list @@ -878,7 +879,7 @@ class ShixunsController < ApplicationController end end - include GitCommon + def update_file content = params[:content] @@ -897,7 +898,8 @@ class ShixunsController < ApplicationController author_email = current_user.git_mail message = params[:message] || "upload file by browser" uid_logger("-----author_email: #{author_email}") - update_file_base64_content(content, @repo_path, @path, author_email, author_name, message) + path = @path.present? ? "#{@path}/#{upload_file.original_filename}" : "#{upload_file.original_filename}" + update_file_base64_content(content, @repo_path, path, author_email, author_name, message) render_ok end @@ -906,7 +908,7 @@ class ShixunsController < ApplicationController author_name = current_user.real_name author_email = current_user.git_mail message = params[:message] || "upload folder by browser" - git_add_folder(@path, author_name, author_email, message) + git_add_folder(@repo_path, @path, author_name, author_email, message) render_ok end @@ -914,7 +916,7 @@ class ShixunsController < ApplicationController author_name = current_user.real_name author_email = current_user.git_mail message = params[:message] || "delete file by browser" - git_delete_file(@path, author_name, author_email, message) + git_delete_file(@repo_path, @path, author_name, author_email, message) render_ok end @@ -1096,9 +1098,8 @@ private @repo_path = if params[:secret_repository] @shixun.shixun_secret_repository&.repo_path else - @shixun.try(:repo_path) + @shixun.repo_path end - logger.info("######{@repo_path}") @path = params[:path] end diff --git a/app/controllers/subjects_controller.rb b/app/controllers/subjects_controller.rb index da88e3258..c78eff35a 100644 --- a/app/controllers/subjects_controller.rb +++ b/app/controllers/subjects_controller.rb @@ -17,76 +17,9 @@ class SubjectsController < ApplicationController include CustomSortable def index - @tech_system = current_laboratory.subject_repertoires - select = params[:select] # 路径导航类型 - reorder = params[:order] || "publish_time" - search = params[:search] - - ## 分页参数 - page = params[:page] || 1 - limit = params[:limit] || 16 - offset = (page.to_i-1) * limit - - # 最热排序 - if reorder == "myshixun_count" - subject_ids = current_laboratory.subjects.pluck(:id) - subject_ids = subject_ids.length > 0 ? "(" + subject_ids.join(",") + ")" : "(-1)" - laboratory_join = " AND subjects.id in #{subject_ids} " - - if select - @subjects = Subject.find_by_sql("SELECT subjects.id, subjects.user_id, subjects.name, subjects.stages_count, subjects.repertoire_id, subjects.status, subjects.public, - subjects.shixuns_count, subjects.excellent, sum(shixuns.myshixuns_count) AS myshixun_member_count FROM subjects join stage_shixuns - on stage_shixuns.subject_id = subjects.id join shixuns on shixuns.id = stage_shixuns.shixun_id where - subjects.hidden = 0 AND subjects.public = 2 AND subjects.name like '%#{search}%' #{laboratory_join} - AND subjects.repertoire_id = #{select} GROUP BY subjects.id ORDER BY myshixun_member_count DESC") - else - @subjects = Subject.find_by_sql("SELECT subjects.id, subjects.user_id, subjects.name, subjects.stages_count, subjects.repertoire_id, subjects.status, subjects.public, - subjects.shixuns_count, subjects.excellent, sum(shixuns.myshixuns_count) AS myshixun_member_count FROM subjects join stage_shixuns - on stage_shixuns.subject_id = subjects.id join shixuns on shixuns.id = stage_shixuns.shixun_id where - subjects.hidden = 0 AND subjects.public = 2 AND subjects.name like '%#{search}%' #{laboratory_join} - GROUP BY subjects.id ORDER BY myshixun_member_count DESC") - end - else - @subjects = current_laboratory.subjects - # 我的路径 - if reorder == "mine" - tip_exception(401, "..") unless current_user.logged? - - mine_subject_id = StageShixun.find_by_sql("select DISTINCT(subject_id) from stage_shixuns where shixun_id in - (select distinct(shixun_id) from myshixuns where user_id=#{current_user.id})").map(&:subject_id) - manage_subject_id = SubjectMember.where(user_id: current_user.id).pluck(:subject_id) - total_subject_id = (mine_subject_id + manage_subject_id).uniq - @subjects = @subjects.where(id: total_subject_id) - elsif reorder == "publish_time" - @subjects = @subjects.unhidden - else - @subjects = @subjects.publiced.unhidden - end - - # 类型 - if select - @subjects = @subjects.where(repertoire_id: select) - end - - if search.present? - @subjects = @subjects.where("name like ?", "%#{search}%") - end - - # 排序 - order_str = (reorder == "publish_time" ? "homepage_show desc, excellent desc, public = 2 desc, publish_time asc" : "homepage_show desc, excellent desc, updated_at desc") - @subjects = @subjects.reorder(order_str) - end - - @total_count = @subjects.size - - if reorder != "myshixun_count" - @subjects = @subjects.page(page).per(limit).includes(:shixuns, :repertoire) - else - @subjects = @subjects[offset, limit] - subject_ids = @subjects.pluck(:id) - order_ids = subject_ids.size > 0 ? subject_ids.join(',') : -1 - @subjects = Subject.where(id: subject_ids).order("field(id,#{order_ids})").includes(:shixuns, :repertoire) - end + subjects = Weapps::SubjectQuery.call(current_laboratory, params) + @subject_count = subjects.map(&:id).size + @subjects = paginate subjects.includes(:shixuns, :repertoire) end def show diff --git a/app/models/ecloud.rb b/app/models/ecloud.rb new file mode 100644 index 000000000..f2648093c --- /dev/null +++ b/app/models/ecloud.rb @@ -0,0 +1,11 @@ +#encoding=utf-8 +class Ecloud < ActiveRecord::Base + # attr_accessible :applyno, :begintime, :bossorderid, :custcode, :custid, :custname, :custtype, :ecordercode, :endtime, + # :mobile, :opttype, :productcode, :registersource, :string, :trial, :useralias, :userid, :username, :email, + # :effecttime, :operatime + + has_many :ecloud_services, :dependent => :destroy # 业务列表 + has_many :ecloud_productparas, :dependent => :destroy # 开通参数列表 + + has_one :ecloud_user +end diff --git a/app/models/ecloud_log.rb b/app/models/ecloud_log.rb new file mode 100644 index 000000000..a1ac3636b --- /dev/null +++ b/app/models/ecloud_log.rb @@ -0,0 +1,3 @@ +class EcloudLog < ActiveRecord::Base + +end diff --git a/app/models/ecloud_productpara.rb b/app/models/ecloud_productpara.rb new file mode 100644 index 000000000..a88fc9d6c --- /dev/null +++ b/app/models/ecloud_productpara.rb @@ -0,0 +1,4 @@ +class EcloudProductpara < ActiveRecord::Base + # attr_accessible :key, :value, :ecloud_id + belongs_to :ecloud +end diff --git a/app/models/ecloud_service.rb b/app/models/ecloud_service.rb new file mode 100644 index 000000000..cb171b297 --- /dev/null +++ b/app/models/ecloud_service.rb @@ -0,0 +1,6 @@ +# 操作代码 0:新增业务,1:注销业务2:修改业务 +class EcloudService < ActiveRecord::Base + # attr_accessible :begintime, :code, :endtime, :opttype, :ecloud_id, :packagecode, :bossorderid + belongs_to :ecloud + has_many :ecloud_serviece_serviceparas +end diff --git a/app/models/ecloud_serviece_servicepara.rb b/app/models/ecloud_serviece_servicepara.rb new file mode 100644 index 000000000..f73a3f712 --- /dev/null +++ b/app/models/ecloud_serviece_servicepara.rb @@ -0,0 +1,5 @@ +# ket值,license表示人数,对应企业版;duration表示月数,对应个人版; +class EcloudServieceServicepara < ActiveRecord::Base + # attr_accessible :key, :value, :ecloud_service_id + belongs_to :ecloud_service +end diff --git a/app/models/ecloud_user.rb b/app/models/ecloud_user.rb new file mode 100644 index 000000000..fad6f4702 --- /dev/null +++ b/app/models/ecloud_user.rb @@ -0,0 +1,3 @@ +class EcloudUser < ActiveRecord::Base + has_many :ecloud_user_paras +end diff --git a/app/models/ecloud_user_para.rb b/app/models/ecloud_user_para.rb new file mode 100644 index 000000000..3f4ddc5c2 --- /dev/null +++ b/app/models/ecloud_user_para.rb @@ -0,0 +1,3 @@ +class EcloudUserPara < ActiveRecord::Base + belongs_to :ecloud_user +end diff --git a/app/models/ecloud_users.rb b/app/models/ecloud_users.rb new file mode 100644 index 000000000..8f29c8e2d --- /dev/null +++ b/app/models/ecloud_users.rb @@ -0,0 +1,4 @@ +class EcloudUser < ActiveRecord::Base + # opttype: # user['opttype']: 操作类型0:开通;1:变更;3: 取消授权;4:暂停;5:恢复; + # attr_accessible :begintime, :email, :endtime, :mobile, :opttype, :paras, :useralias, :userid, :username, :custid +end diff --git a/app/models/game.rb b/app/models/game.rb index 062ad15cc..144dbced2 100644 --- a/app/models/game.rb +++ b/app/models/game.rb @@ -29,6 +29,19 @@ class Game < ApplicationRecord validates :identifier, uniqueness: true + # 服务器uri+port的redis的key + def server_key + "game_server_url_#{id}" + end + + def set_server_key(server_url) + Rails.cache.write("#{server_key}", server_url, expires_in: 5.minute) + end + + def get_server_url + Rails.cache.read(server_key) + end + # 根据得分比例来算实际得分(试卷、实训作业) def real_score score ((final_score < 0 ? 0 : final_score).to_f / challenge.score) * score diff --git a/app/models/laboratory_setting.rb b/app/models/laboratory_setting.rb index e53b54cd3..63949f4ef 100644 --- a/app/models/laboratory_setting.rb +++ b/app/models/laboratory_setting.rb @@ -30,6 +30,10 @@ class LaboratorySetting < ApplicationRecord image_url('_subject_banner') end + def shixun_banner_url + image_url('_shixun_banner') + end + def course_banner_url image_url('_course_banner') end @@ -62,7 +66,7 @@ class LaboratorySetting < ApplicationRecord name: nil, navbar: [ { 'name' => '实践课程', 'link' => '/paths', 'hidden' => false }, - { 'name' => '翻转课堂', 'link' => '/courses', 'hidden' => false }, + { 'name' => '教学课堂', 'link' => '/courses', 'hidden' => false }, { 'name' => '实训项目', 'link' => '/shixuns', 'hidden' => false }, { 'name' => '在线竞赛', 'link' => '/competitions', 'hidden' => false }, { 'name' => '教学案例', 'link' => '/moop_cases', 'hidden' => false }, diff --git a/app/models/shixun_info.rb b/app/models/shixun_info.rb index c2498067f..3d3f40c92 100644 --- a/app/models/shixun_info.rb +++ b/app/models/shixun_info.rb @@ -2,10 +2,12 @@ class ShixunInfo < ApplicationRecord belongs_to :shixun validates_uniqueness_of :shixun_id validates_length_of :fork_reason, maximum: 60, message: "不能超过60个字符" + validates_presence_of :evaluate_script, message: "实训脚本不能为空" after_commit :create_diff_record validates :description, length: { maximum: 5000, too_long: "不能超过5000个字符" } + private def create_diff_record diff --git a/app/queries/weapps/subject_query.rb b/app/queries/weapps/subject_query.rb index e2f5625e1..b50c2a104 100644 --- a/app/queries/weapps/subject_query.rb +++ b/app/queries/weapps/subject_query.rb @@ -8,7 +8,7 @@ class Weapps::SubjectQuery < ApplicationQuery end def call - subjects = @current_laboratory.subjects.unhidden.publiced.show_moblied + subjects = @current_laboratory.subjects.unhidden.publiced # 课程体系的过滤 if params[:sub_discipline_id].present? @@ -19,8 +19,8 @@ class Weapps::SubjectQuery < ApplicationQuery subjects = subjects.joins(:sub_discipline_containers).where(sub_discipline_containers: {container_type: "Subject"}) end - subjects = subjects.left_joins(:shixuns).select('subjects.id, subjects.name, subjects.excellent, subjects.stages_count, subjects.status, subjects.homepage_show, - subjects.shixuns_count, subjects.updated_at, IFNULL(sum(shixuns.myshixuns_count), 0) myshixuns_count') + subjects = subjects.left_joins(:shixuns, :repertoire).select('subjects.id, subjects.name, subjects.excellent, subjects.stages_count, subjects.status, subjects.homepage_show, + subjects.shixuns_count, subjects.repertoire_id, subjects.updated_at, IFNULL(sum(shixuns.myshixuns_count), 0) myshixuns_count') .group('subjects.id').order("subjects.homepage_show #{sort_type}, #{order_type} #{sort_type}") subjects end diff --git a/app/services/admins/save_laboratory_setting_service.rb b/app/services/admins/save_laboratory_setting_service.rb index c29e374bd..89dfbb0e0 100644 --- a/app/services/admins/save_laboratory_setting_service.rb +++ b/app/services/admins/save_laboratory_setting_service.rb @@ -40,6 +40,7 @@ class Admins::SaveLaboratorySettingService < ApplicationService save_image_file(params[:login_logo], 'login') save_image_file(params[:tab_logo], 'tab') save_image_file(params[:subject_banner], '_subject_banner') + save_image_file(params[:shixun_banner], '_shixun_banner') save_image_file(params[:course_banner], '_course_banner') save_image_file(params[:competition_banner], '_competition_banner') save_image_file(params[:moop_cases_banner], '_moop_cases_banner') diff --git a/app/views/admins/laboratory_settings/show.html.erb b/app/views/admins/laboratory_settings/show.html.erb index ee9880fbb..415f7077c 100644 --- a/app/views/admins/laboratory_settings/show.html.erb +++ b/app/views/admins/laboratory_settings/show.html.erb @@ -100,9 +100,19 @@ +
+