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/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/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!
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..bd284b6af
--- /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] += count
+ 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 %>
-