From 9492c32c5b7e29ced58ade7eb94fc4c8a185bf20 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 27 Dec 2019 17:47:27 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E8=AF=95=E5=8D=B7=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../examination_banks_controller.rb | 26 +++++++++++++++++++ config/routes.rb | 4 ++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/app/controllers/examination_banks_controller.rb b/app/controllers/examination_banks_controller.rb index 9d5732fdc..98dfc57bb 100644 --- a/app/controllers/examination_banks_controller.rb +++ b/app/controllers/examination_banks_controller.rb @@ -1,5 +1,8 @@ class ExaminationBanksController < ApplicationController + include PaginateHelper before_action :require_login + before_action :find_exam, except: [:index, :create] + before_action :edit_auth, only: [:update, :destroy, :set_public] def index exams = ExaminationBankQuery.call(params) @@ -43,9 +46,32 @@ class ExaminationBanksController < ApplicationController end + def update + + end + + def destroy + @exam.destroy! + render_ok + end + + def set_public + tip_exception(-1, "该试卷已公开") if @exam.public? + @exam.update_attributes!(public: 1) + render_ok + end + private def form_params params.permit(:discipline_id, :sub_discipline_id, :difficulty, :name, :duration, tag_discipline_id: []) end + + def find_exam + @exam = ExaminationBank.find_by!(id: params[:id]) + end + + def edit_auth + current_user.admin_or_business? || @exam.user == current_user + end end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index c36d78741..5ad8f8211 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -76,7 +76,9 @@ Rails.application.routes.draw do end resources :examination_banks do - + member do + post :set_public + end end resources :hacks, path: :problems, param: :identifier do From eb92fdbe038d75142f164a0ea715b261cbcd6c05 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Mon, 30 Dec 2019 10:05:05 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E9=A2=98=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/examination_banks/show.json.jbuilder | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 app/views/examination_banks/show.json.jbuilder diff --git a/app/views/examination_banks/show.json.jbuilder b/app/views/examination_banks/show.json.jbuilder new file mode 100644 index 000000000..e69de29bb From 1d14840b9fbceceee88e6bd6d23273e66ae45d70 Mon Sep 17 00:00:00 2001 From: daiao <358551898@qq.com> Date: Tue, 31 Dec 2019 09:29:33 +0800 Subject: [PATCH 3/5] fixbug --- app/controllers/hacks_controller.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/hacks_controller.rb b/app/controllers/hacks_controller.rb index e5ca0dc1d..3eaac0648 100644 --- a/app/controllers/hacks_controller.rb +++ b/app/controllers/hacks_controller.rb @@ -44,12 +44,13 @@ class HacksController < ApplicationController begin logger.info("##########{hack_params}") hack = Hack.new(hack_params) + hack.user_id = current_user.id + hack.identifier = generate_identifier Hack, 8 ActiveRecord::Base.transaction do - hack.user_id = current_user.id - hack.identifier = generate_identifier Hack, 8 hack.save! # 创建测试集与代码 hack.hack_sets.create!(hack_sets_params) + # 新建知识点 hack_codes = hack.hack_codes.new(hack_code_params) hack_codes.modify_time = Time.now hack_codes.save! From 1b5e3ee9fddd17407b90650569e43f74c2fa8da2 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 31 Dec 2019 09:35:47 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E5=AF=BC=E5=85=A5=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E4=BD=93=E7=B3=BB=E5=9F=BA=E7=A1=80=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javascripts/admins/disciplines/index.js | 59 +++++++++++++++++++ .../admins/import_disciplines_controller.rb | 10 ++++ app/imports/admins/import_discipline_excel.rb | 16 +++++ .../admins/import_discipline_service.rb | 52 ++++++++++++++++ app/views/admins/disciplines/index.html.erb | 8 ++- .../shared/_import_discipline_modal.html.erb | 30 ++++++++++ config/routes.rb | 1 + 7 files changed, 174 insertions(+), 2 deletions(-) create mode 100644 app/controllers/admins/import_disciplines_controller.rb create mode 100644 app/imports/admins/import_discipline_excel.rb create mode 100644 app/services/admins/import_discipline_service.rb create mode 100644 app/views/admins/disciplines/shared/_import_discipline_modal.html.erb diff --git a/app/assets/javascripts/admins/disciplines/index.js b/app/assets/javascripts/admins/disciplines/index.js index a593eec6f..e5153516a 100644 --- a/app/assets/javascripts/admins/disciplines/index.js +++ b/app/assets/javascripts/admins/disciplines/index.js @@ -61,5 +61,64 @@ $(document).on('turbolinks:load', function() { data: json }); }); + + // 导入学生 + var $importDisciplineModal = $('.modal.admin-import-discipline-modal'); + var $importDisciplineForm = $importDisciplineModal.find('form.admin-import-discipline-form'); + + $importDisciplineModal.on('show.bs.modal', function(){ + resetFileInputFunc($importDisciplineModal.find('.upload-file-input')); + $importDisciplineModal.find('.file-names').html('选择文件'); + $importDisciplineModal.find('.upload-file-input').trigger('click'); + }); + $importDisciplineModal.on('change', '.upload-file-input', function(e){ + var file = $(this)[0].files[0]; + $importDisciplineModal.find('.file-names').html(file ? file.name : '请选择文件'); + }); + + var importDisciplineFormValid = function(){ + if($importDisciplineForm.find('input[name="file"]').val() == undefined || $importDisciplineForm.find('input[name="file"]').val().length == 0){ + $importDisciplineForm.find('.error').html('请选择文件'); + return false; + } + + return true; + }; + + var buildResultMessage = function(data){ + var messageHtml = "
导入结果:成功" + data.success + "条,失败"+ data.fail.length + "条
"; + + return messageHtml; + }; + + $importDisciplineModal.on('click', '.submit-btn', function(){ + $importDisciplineForm.find('.error').html(''); + + if (importDisciplineFormValid()) { + $('body').mLoading({ text: '正在导入...' }); + + $.ajax({ + method: 'POST', + dataType: 'json', + url: '/admins/import_disciplines', + data: new FormData($importDisciplineForm[0]), + processData: false, + contentType: false, + success: function(data){ + $('body').mLoading('destroy'); + $importDisciplineModal.modal('hide'); + + showMessageModal(buildResultMessage(data), function(){ + window.location.reload(); + }); + }, + error: function(res){ + $('body').mLoading('destroy'); + var data = res.responseJSON; + $importDisciplineForm.find('.error').html(data.message); + } + }); + } + }); } }); \ No newline at end of file diff --git a/app/controllers/admins/import_disciplines_controller.rb b/app/controllers/admins/import_disciplines_controller.rb new file mode 100644 index 000000000..bf0f324b9 --- /dev/null +++ b/app/controllers/admins/import_disciplines_controller.rb @@ -0,0 +1,10 @@ +class Admins::ImportDisciplinesController < Admins::BaseController + def create + return render_error('请上传正确的文件') if params[:file].blank? || !params[:file].is_a?(ActionDispatch::Http::UploadedFile) + + result = Admins::ImportDisciplineService.call(params[:file].to_io) + render_ok(result) + rescue Admins::ImportDisciplineService::Error => ex + render_error(ex) + end +end \ No newline at end of file diff --git a/app/imports/admins/import_discipline_excel.rb b/app/imports/admins/import_discipline_excel.rb new file mode 100644 index 000000000..b457f4818 --- /dev/null +++ b/app/imports/admins/import_discipline_excel.rb @@ -0,0 +1,16 @@ +class Admins::ImportDisciplineExcel < BaseImportXlsx + DisciplineData = Struct.new(:discipline_name, :sub_discipline_name) + + def read_each(&block) + sheet.each_row_streaming(pad_cells: true, offset: 2) do |row| + data = row.map(&method(:cell_value))[1..2] + block.call DisciplineData.new(*data) + end + end + + private + + def cell_value(obj) + obj&.cell_value + end +end diff --git a/app/services/admins/import_discipline_service.rb b/app/services/admins/import_discipline_service.rb new file mode 100644 index 000000000..08f571470 --- /dev/null +++ b/app/services/admins/import_discipline_service.rb @@ -0,0 +1,52 @@ +class Admins::ImportDisciplineService < ApplicationService + Error = Class.new(StandardError) + + attr_reader :file, :result + + def initialize(file) + @file = file + @result = { success: 0, fail: [] } + end + + def call + raise Error, '文件不存在' if file.blank? + + excel = Admins::ImportDisciplineExcel.new(file) + excel.read_each(&method(:save_discipline)) + + result + rescue ApplicationImport::Error => ex + raise Error, ex.message + end + + private + + def save_discipline(data) + count = 0 + discipline_name = data.discipline_name.to_s.strip + sub_discipline_name = data.sub_discipline_name.to_s.strip + + return unless discipline_name.present? + discipline = Discipline.find_by(name: discipline_name) + if discipline.blank? + discipline = Discipline.create!(name: discipline_name) + count += 1 + end + + if sub_discipline_name.present? + sub_discipline = SubDiscipline.find_by(name: discipline_name, discipline: discipline) + if sub_discipline.blank? + SubDiscipline.create!(name: sub_discipline_name, discipline: discipline) + count += 1 + end + end + + result[:success] += 1 if count > 0 + rescue Exception => ex + fail_data = data.as_json + fail_data[:data] = fail_data.values.join(',') + fail_data[:message] = ex.message + + result[:fail] << fail_data + end +end \ No newline at end of file diff --git a/app/views/admins/disciplines/index.html.erb b/app/views/admins/disciplines/index.html.erb index 26fa6b2eb..f4b116b93 100644 --- a/app/views/admins/disciplines/index.html.erb +++ b/app/views/admins/disciplines/index.html.erb @@ -2,8 +2,11 @@ <% add_admin_breadcrumb('课程方向', admins_disciplines_path) %> <% end %> -
- <%= javascript_void_link '新增', class: 'btn btn-primary', data: { toggle: 'modal', target: '.admin-create-discipline-modal' } %> +
+
+ <%= javascript_void_link '新增', class: 'btn btn-primary', data: { toggle: 'modal', target: '.admin-create-discipline-modal' } %> +
+ <%= javascript_void_link '导入数据', class: 'btn btn-primary', data: { toggle: 'modal', target: '.admin-import-discipline-modal'} %>
@@ -11,3 +14,4 @@
<%= render 'admins/disciplines/shared/create_discipline_modal' %> +<%= render partial: 'admins/disciplines/shared/import_discipline_modal' %> diff --git a/app/views/admins/disciplines/shared/_import_discipline_modal.html.erb b/app/views/admins/disciplines/shared/_import_discipline_modal.html.erb new file mode 100644 index 000000000..de54fd758 --- /dev/null +++ b/app/views/admins/disciplines/shared/_import_discipline_modal.html.erb @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 5ad8f8211..cdb604f2f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1076,6 +1076,7 @@ Rails.application.routes.draw do post :reset_login_times end end + resource :import_disciplines, only: [:create] resource :import_users, only: [:create] resource :import_course_members, only: [:create] resources :user_statistics, only: [:index] do From fd2531561e476aa242412b4d94d9186008ff9651 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 31 Dec 2019 09:37:26 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=AF=BC=E5=85=A5=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E4=BD=93=E7=B3=BB=E5=9F=BA=E7=A1=80=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/admins/import_discipline_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/admins/import_discipline_service.rb b/app/services/admins/import_discipline_service.rb index 08f571470..bd284b6af 100644 --- a/app/services/admins/import_discipline_service.rb +++ b/app/services/admins/import_discipline_service.rb @@ -41,7 +41,7 @@ class Admins::ImportDisciplineService < ApplicationService end end - result[:success] += 1 if count > 0 + result[:success] += count rescue Exception => ex fail_data = data.as_json fail_data[:data] = fail_data.values.join(',')