diff --git a/app/assets/javascripts/admin.js b/app/assets/javascripts/admin.js
index 12b89804b..3e9601bf8 100644
--- a/app/assets/javascripts/admin.js
+++ b/app/assets/javascripts/admin.js
@@ -12,6 +12,7 @@
//= require jquery.cxselect
//= require bootstrap-datepicker
//= require bootstrap.viewer
+//= require jquery.mloading
//= require echarts
//= require lib/codemirror
diff --git a/app/assets/javascripts/admins/message-modal.js b/app/assets/javascripts/admins/message-modal.js
new file mode 100644
index 000000000..227d75776
--- /dev/null
+++ b/app/assets/javascripts/admins/message-modal.js
@@ -0,0 +1,14 @@
+$(document).on('turbolinks:load', function() {
+ var $modal = $('.modal.admin-message-modal');
+ if ($modal.length > 0) {
+ $modal.on('hide.bs.modal', function(){
+ $modal.find('.modal-body').html('');
+ });
+ }
+});
+
+function showMessageModal(html) {
+ var $modal = $('.modal.admin-message-modal');
+ $modal.find('.modal-body').html(html);
+ $modal.modal('show');
+}
\ No newline at end of file
diff --git a/app/assets/javascripts/admins/users/index.js b/app/assets/javascripts/admins/users/index.js
index f0ddf1e0f..4d4f0f945 100644
--- a/app/assets/javascripts/admins/users/index.js
+++ b/app/assets/javascripts/admins/users/index.js
@@ -117,5 +117,73 @@ $(document).on('turbolinks:load', function(){
});
}
});
+
+
+ // 导入学生
+ var $importUserModal = $('.modal.admin-import-user-modal');
+ var $importUserForm = $importUserModal.find('form.admin-import-user-form')
+
+ $importUserModal.on('show.bs.modal', function(){
+ $importUserModal.find('.file-names').html('选择文件');
+ $importUserModal.find('.upload-file-input').trigger('click');
+ });
+ $importUserModal.find('.upload-file-input').on('change', function(e){
+ var file = $(this)[0].files[0];
+
+ $importUserModal.find('.file-names').html(file ? file.name : '请选择文件');
+ })
+
+ var importUserFormValid = function(){
+ if($importUserForm.find('input[name="file"]').val() == undefined || $importUserForm.find('input[name="file"]').val().length == 0){
+ $importUserForm.find('.error').html('请选择文件');
+ return false;
+ }
+
+ return true;
+ };
+
+ var buildResultMessage = function(data){
+ var messageHtml = "
导入结果:成功" + data.success + "条,失败"+ data.fail.length + "条
";
+
+ if(data.fail.length > 0){
+ messageHtml += '数据 失败原因 ';
+
+ data.fail.forEach(function(item){
+ messageHtml += '' + item.data + ' ' + item.message + ' ';
+ });
+
+ messageHtml += '
'
+ }
+
+ return messageHtml;
+ }
+
+ $importUserModal.on('click', '.submit-btn', function(){
+ $importUserForm.find('.error').html('');
+
+ if (importUserFormValid()) {
+ $('body').mLoading({ text: '正在导入...' });
+
+ $.ajax({
+ method: 'POST',
+ dataType: 'json',
+ url: '/admins/import_users',
+ data: new FormData($importUserForm[0]),
+ processData: false,
+ contentType: false,
+ success: function(data){
+ $('body').mLoading('destroy');
+ $importUserModal.modal('hide');
+
+ showMessageModal(buildResultMessage(data));
+ },
+ error: function(res){
+ $('body').mLoading('destroy');
+ var data = res.responseJSON;
+ $importUserForm.find('.error').html(data.message);
+ }
+ });
+ }
+ });
}
});
\ No newline at end of file
diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js
index 07a3c90d4..839fadb57 100644
--- a/app/assets/javascripts/application.js
+++ b/app/assets/javascripts/application.js
@@ -16,4 +16,3 @@
//= require jquery3
//= require popper
//= require bootstrap-sprockets
-//= require_tree .
diff --git a/app/assets/javascripts/jquery.mloading.js b/app/assets/javascripts/jquery.mloading.js
new file mode 100644
index 000000000..6230186ab
--- /dev/null
+++ b/app/assets/javascripts/jquery.mloading.js
@@ -0,0 +1,202 @@
+/* Author:mingyuhisoft@163.com
+ * Github:https://github.com/imingyu/jquery.mloading
+ * Npm:npm install jquery.mloading.js
+ * Date:2016-7-4
+ */
+
+;(function (root, factory) {
+ 'use strict';
+
+ if (typeof module === 'object' && typeof module.exports === 'object') {
+ factory(require('jquery'),root);
+ } if(typeof define ==="function"){
+ if(define.cmd){
+ define(function(require, exports, module){
+ var $ = require("jquery");
+ factory($,root);
+ });
+ }else{
+ define(["jquery"],function($){
+ factory($,root);
+ });
+ }
+ }else {
+ factory(root.jQuery,root);
+ }
+} (typeof window !=="undefined" ? window : this, function ($, root, undefined) {
+ 'use strict';
+ if(!$){
+ $ = root.jQuery || null;
+ }
+ if(!$){
+ throw new TypeError("必须引入jquery库方可正常使用!");
+ }
+
+ var arraySlice = Array.prototype.slice,
+ comparison=function (obj1,obj2) {
+ var result=true;
+ for(var pro in obj1){
+ if(obj1[pro] !== obj2[obj1]){
+ result=true;
+ break;
+ }
+ }
+ return result;
+ }
+
+ function MLoading(dom,options) {
+ options=options||{};
+ this.dom=dom;
+ this.options=$.extend(true,{},MLoading.defaultOptions,options);
+ this.curtain=null;
+ this.render().show();
+ }
+ MLoading.prototype={
+ constructor:MLoading,
+ initElement:function () {
+ var dom=this.dom,
+ ops=this.options;
+ var curtainElement=dom.children(".mloading"),
+ bodyElement = curtainElement.children('.mloading-body'),
+ barElement = bodyElement.children('.mloading-bar'),
+ iconElement = barElement.children('.mloading-icon'),
+ textElement = barElement.find(".mloading-text");
+ if (curtainElement.length == 0) {
+ curtainElement = $('
');
+ dom.append(curtainElement);
+ }
+ if (bodyElement.length == 0) {
+ bodyElement = $('
');
+ curtainElement.append(bodyElement);
+ }
+ if (barElement.length == 0) {
+ barElement = $('
');
+ bodyElement.append(barElement);
+ }
+ if (iconElement.length == 0) {
+ var _iconElement=document.createElement(ops.iconTag);
+ iconElement = $(_iconElement);
+ iconElement.addClass("mloading-icon");
+ barElement.append(iconElement);
+ }
+ if (textElement.length == 0) {
+ textElement = $(' ');
+ barElement.append(textElement);
+ }
+
+ this.curtainElement=curtainElement;
+ this.bodyElement = bodyElement;
+ this.barElement = barElement;
+ this.iconElement = iconElement;
+ this.textElement = textElement;
+ return this;
+ },
+ render:function () {
+ var dom=this.dom,
+ ops=this.options;
+ this.initElement();
+ if(dom.is("html") || dom.is("body")){
+ this.curtainElement.addClass("mloading-full");
+ }else{
+ this.curtainElement.removeClass("mloading-full");
+
+ if(!dom.hasClass("mloading-container")){
+ dom.addClass("mloading-container");
+ }
+ }
+ if(ops.mask){
+ this.curtainElement.addClass("mloading-mask");
+ }else{
+ this.curtainElement.removeClass("mloading-mask");
+ }
+ if(ops.content!="" && typeof ops.content!="undefined"){
+ if(ops.html){
+ this.bodyElement.html(ops.content);
+ }else{
+ this.bodyElement.text(ops.content);
+ }
+ }else{
+ this.iconElement.attr("src",ops.icon);
+ if(ops.html){
+ this.textElement.html(ops.text);
+ }else{
+ this.textElement.text(ops.text);
+ }
+ }
+
+ return this;
+ },
+ setOptions:function (options) {
+ options=options||{};
+ var oldOptions = this.options;
+ this.options = $.extend(true,{},this.options,options);
+ if(!comparison(oldOptions,this.options)) this.render();
+ },
+ show:function () {
+ var dom=this.dom,
+ ops=this.options,
+ barElement=this.barElement;
+ this.curtainElement.addClass("active");
+ barElement.css({
+ "marginTop":"-"+barElement.outerHeight()/2+"px",
+ "marginLeft":"-"+barElement.outerWidth()/2+"px"
+ });
+
+ return this;
+ },
+ hide:function () {
+ var dom=this.dom,
+ ops=this.options;
+ this.curtainElement.removeClass("active");
+ if(!dom.is("html") && !dom.is("body")){
+ dom.removeClass("mloading-container");
+ }
+ return this;
+ },
+ destroy:function () {
+ var dom=this.dom,
+ ops=this.options;
+ this.curtainElement.remove();
+ if(!dom.is("html") && !dom.is("body")){
+ dom.removeClass("mloading-container");
+ }
+ dom.removeData(MLoading.dataKey);
+ return this;
+ }
+ };
+ MLoading.dataKey="MLoading";
+ MLoading.defaultOptions = {
+ text:"加载中...",
+ iconTag:"img",
+ icon:"data:image/gif;base64,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",
+ html:false,
+ content:"",//设置content后,text和icon设置将无效
+ mask:true//是否显示遮罩(半透明背景)
+ };
+
+ $.fn.mLoading=function (options) {
+ var ops={},
+ funName="",
+ funArgs=[];
+ if(typeof options==="object"){
+ ops = options;
+ }else if(typeof options ==="string"){
+ funName=options;
+ funArgs = arraySlice.call(arguments).splice(0,1);
+ }
+ return this.each(function (i,element) {
+ var dom = $(element),
+ plsInc=dom.data(MLoading.dataKey);
+ if(!plsInc){
+ plsInc=new MLoading(dom,ops);
+ }
+
+ if(funName){
+ var fun = plsInc[funName];
+ if(typeof fun==="function"){
+ fun.apply(plsInc,funArgs);
+ }
+ }
+ });
+ }
+}));
\ No newline at end of file
diff --git a/app/assets/stylesheets/admin.scss b/app/assets/stylesheets/admin.scss
index d3a298dcf..30fd635a6 100644
--- a/app/assets/stylesheets/admin.scss
+++ b/app/assets/stylesheets/admin.scss
@@ -5,6 +5,7 @@
@import "select2-bootstrap4.min";
@import "bootstrap-datepicker";
@import "bootstrap-datepicker.standalone";
+@import "jquery.mloading";
@import "lib/codemirror";
@import "common";
diff --git a/app/assets/stylesheets/jquery.mloading.scss b/app/assets/stylesheets/jquery.mloading.scss
new file mode 100644
index 000000000..a347b928c
--- /dev/null
+++ b/app/assets/stylesheets/jquery.mloading.scss
@@ -0,0 +1,94 @@
+/* Author:mingyuhisoft@163.com
+ * Github:https://github.com/imingyu/jquery.mloading
+ * Npm:npm install jquery.mloading.js
+ * Date:2016-7-4
+ */
+.mloading-container {
+ position: relative;
+ min-height: 70px;
+ -webkit-transition: height 0.6s ease-in-out;
+ -o-transition: height 0.6s ease-in-out;
+ transition: height 0.6s ease-in-out;
+}
+.mloading {
+ position: absolute;
+ background: #E9E9E8;
+ font: normal 12px/22px "Microsoft Yahei", "微软雅黑", "宋体";
+ display: none;
+ z-index: 1600;
+ background: rgba(233, 233, 232, 0);
+}
+.mloading.active {
+ display: block;
+}
+.mloading.mloading-mask {
+ background: rgba(233, 233, 232, 0.75);
+ filter: progid:DXImageTransform.Microsoft.Alpha(opacity=75);
+}
+.mloading-full {
+ position: fixed;
+ width: 100%;
+ height: 100%;
+ top: 0;
+ left: 0;
+}
+.mloading-container > .mloading {
+ top: 0px;
+ left: 0px;
+ width: 100%;
+ height: 100%;
+}
+.mloading-body {
+ width: 100%;
+ height: 100%;
+ position: relative;
+}
+.mloading-bar {
+ width: 250px;
+ min-height: 22px;
+ text-align: center;
+ background: #fff;
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.27);
+ border-radius: 7px;
+ padding: 20px 15px;
+ font-size: 14px;
+ color: #999;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ margin-left: -140px;
+ margin-top: -30px;
+ word-break: break-all;
+}
+@media (max-width: 300px) {
+ .mloading-bar {
+ width: 62px;
+ height: 56px;
+ margin-left: -30px !important;
+ margin-top: -30px !important;
+ padding: 0;
+ line-height: 56px;
+ }
+ .mloading-bar > .mloading-text {
+ display: none;
+ }
+}
+.mloading-bar-sm {
+ width: 62px;
+ height: 56px;
+ margin-left: -30px !important;
+ margin-top: -30px !important;
+ padding: 0;
+ line-height: 56px;
+}
+.mloading-bar-sm > .mloading-text {
+ display: none;
+}
+.mloading-icon {
+ width: 16px;
+ height: 16px;
+ vertical-align: middle;
+}
+.mloading-text {
+ margin-left: 10px;
+}
\ No newline at end of file
diff --git a/app/controllers/admins/import_users_controller.rb b/app/controllers/admins/import_users_controller.rb
new file mode 100644
index 000000000..5d8a60ce6
--- /dev/null
+++ b/app/controllers/admins/import_users_controller.rb
@@ -0,0 +1,10 @@
+class Admins::ImportUsersController < Admins::BaseController
+ def create
+ return render_error('请上传正确的文件') if params[:file].blank? || !params[:file].is_a?(ActionDispatch::Http::UploadedFile)
+
+ result = Admins::ImportUserService.call(params[:file].to_io)
+ render_ok(result)
+ rescue Admins::ImportUserService::Error => ex
+ render_error(ex)
+ end
+end
\ No newline at end of file
diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb
index a26b1c23b..b10147462 100644
--- a/app/controllers/courses_controller.rb
+++ b/app/controllers/courses_controller.rb
@@ -144,9 +144,12 @@ class CoursesController < ApplicationController
@course.course_list_id = new_course_list.id
end
else
+ subject = Subject.find_by!(id: params[:subject_id])
@course.start_date = params[:start_date]
- @course.subject_id = params[:subject_id]
+ @course.subject_id = subject.id
@course.excellent = true
+ course_list = CourseList.find_by(name: subject.name) || CourseList.create!(name: subject.name, user_id: current_user.id, is_admin: 0)
+ @course.course_list_id = course_list.id
end
@course.is_end = @course.end_date.present? && @course.end_date < Date.today
diff --git a/app/imports/admins/import_user_excel.rb b/app/imports/admins/import_user_excel.rb
new file mode 100644
index 000000000..a1d13e356
--- /dev/null
+++ b/app/imports/admins/import_user_excel.rb
@@ -0,0 +1,33 @@
+class Admins::ImportUserExcel < BaseImportXlsx
+ UserData = Struct.new(:student_id, :name, :department_name, :identity, :technical_title, :phone)
+
+ def read_each(&block)
+ sheet.each_row_streaming(pad_cells: true, offset: 3) do |row|
+ data = row.map(&method(:cell_value))[0..5]
+ block.call UserData.new(*data)
+ end
+ end
+
+ def school
+ @school ||= begin
+ school_id = sheet.cell(1, 1).to_s.strip
+ school_name = sheet.cell(1, 2).to_s.strip
+
+ School.find_by(id: school_id, name: school_name)
+ end
+ end
+
+ def identifier
+ @_identifier ||= sheet.cell(2, 1).to_s.strip
+ end
+
+ private
+
+ def check_sheet_valid!
+ raise_import_error('请按照模板格式导入') if school.blank?
+ end
+
+ def cell_value(obj)
+ obj&.cell_value
+ end
+end
diff --git a/app/imports/application_import.rb b/app/imports/application_import.rb
index cd2e8734c..abb6b623f 100644
--- a/app/imports/application_import.rb
+++ b/app/imports/application_import.rb
@@ -1,5 +1,11 @@
class ApplicationImport
+ Error = Class.new(StandardError)
+
def logger(msg)
Rails.logger.error(msg)
end
+
+ def raise_import_error(message)
+ raise Error, message
+ end
end
\ No newline at end of file
diff --git a/app/imports/base_import_xlsx.rb b/app/imports/base_import_xlsx.rb
new file mode 100644
index 000000000..e96ef7efc
--- /dev/null
+++ b/app/imports/base_import_xlsx.rb
@@ -0,0 +1,23 @@
+class BaseImportXlsx < ApplicationImport
+
+ attr_reader :sheet
+
+ def initialize(path)
+ raise Error, '只支持xlsx格式' unless !path.is_a?(String) || path.end_with?('.xlsx')
+
+ begin
+ @sheet = Roo::Excelx.new(path)
+ rescue Exception => ex
+ Util.logger_error(ex)
+ raise Error, '打开文件失败'
+ end
+
+ check_sheet_valid!
+ end
+
+ def read_each(&block);end
+
+ private
+
+ def check_sheet_valid!;end
+end
\ No newline at end of file
diff --git a/app/services/admins/import_user_service.rb b/app/services/admins/import_user_service.rb
new file mode 100644
index 000000000..e5e7abfe6
--- /dev/null
+++ b/app/services/admins/import_user_service.rb
@@ -0,0 +1,89 @@
+class Admins::ImportUserService < ApplicationService
+ Error = Class.new(StandardError)
+
+ attr_reader :file, :school, :prefix, :result
+
+ def initialize(file)
+ @file = file
+ @result = { success: 0, fail: [] }
+ end
+
+ def call
+ raise Error, '文件不存在' if file.blank?
+
+ excel = Admins::ImportUserExcel.new(file)
+ @school = excel.school
+ @prefix = excel.identifier
+
+ excel.read_each(&method(:save_user))
+
+ result
+ rescue ApplicationImport::Error => ex
+ raise Error, ex.message
+ end
+
+ private
+
+ def save_user(data)
+ user = find_user(data)
+
+ if user.blank?
+ create_user(data)
+ else
+ user.update_column(:certification, 1)
+ end
+
+ result[:success] += 1
+ 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
+
+ def create_user(data)
+ department = school.departments.find_by(name: data.department_name)
+
+ attr = {
+ status: User::STATUS_ACTIVE,
+ login: "#{prefix}#{data.student_id}",
+ firstname: '',
+ lastname: data.name,
+ nickname: data.name,
+ professional_certification: 1,
+ certification: 1,
+ password: '12345678',
+ phone: data.phone
+ }
+ ActiveRecord::Base.transaction do
+ user = User.create!(attr)
+
+ extension_attr = {
+ school_id: school.id, location: school.province, location_city: school.city,
+ gender: 0, identity: data.identity.to_i, department_id: department&.id, student_id: data.student_id
+ }
+
+ extension_attr[:technical_title] =
+ case data.identity.to_i
+ when 0 then %w(教授 副教授 讲师 助教).include?(data.technical_title) || '讲师'
+ when 2 then %w(企业管理者 部门管理者 高级工程师 工程师 助理工程师).include?(data.technical_title) || '助理工程师'
+ else nil
+ end
+
+ user.create_user_extension!(extension_attr)
+ end
+ end
+
+ def find_user(data)
+ users = User.joins(:user_extension).where(user_extensions: { identity: data.identity, school_id: school.id })
+
+ if data.identity.to_i == 1
+ users = users.where(user_extensions: { student_id: data.student_id })
+ else
+ users = users.where(user_extensions: { technical_title: data.technical_title }).where('CONCAT(users.lastname,users.firstname) = ?', data.name)
+ end
+
+ users.first
+ end
+end
\ No newline at end of file
diff --git a/app/services/ecs/import_course_service.rb b/app/services/ecs/import_course_service.rb
index 016336940..93adfc532 100644
--- a/app/services/ecs/import_course_service.rb
+++ b/app/services/ecs/import_course_service.rb
@@ -9,7 +9,7 @@ class Ecs::ImportCourseService < ApplicationService
end
def call
- raise_import_error('文件不存在') if attachment.blank?
+ raise Error, '文件不存在' if attachment.blank?
path = attachment.diskfile
excel = Ecs::ImportCourseExcel.new(path)
diff --git a/app/services/ecs/import_student_service.rb b/app/services/ecs/import_student_service.rb
index daa384d58..9014e221c 100644
--- a/app/services/ecs/import_student_service.rb
+++ b/app/services/ecs/import_student_service.rb
@@ -9,7 +9,7 @@ class Ecs::ImportStudentService < ApplicationService
end
def call
- raise_import_error('文件不存在') if attachment.blank?
+ raise Error, '文件不存在' if attachment.blank?
path = attachment.diskfile
excel = Ecs::ImportStudentExcel.new(path)
diff --git a/app/views/admins/shared/modal/_message_modal.html.erb b/app/views/admins/shared/modal/_message_modal.html.erb
new file mode 100644
index 000000000..94454ca2d
--- /dev/null
+++ b/app/views/admins/shared/modal/_message_modal.html.erb
@@ -0,0 +1,18 @@
+
\ No newline at end of file
diff --git a/app/views/admins/users/index.html.erb b/app/views/admins/users/index.html.erb
index b145edd24..fa6d67a64 100644
--- a/app/views/admins/users/index.html.erb
+++ b/app/views/admins/users/index.html.erb
@@ -3,7 +3,7 @@
<% end %>
- <%= form_tag(admins_users_path, method: :get, class: 'form-inline search-form', remote: true) do %>
+ <%= form_tag(admins_users_path, method: :get, class: 'form-inline search-form flex-1', remote: true) do %>
状态:
<% status_options = [['全部', ''], ['正常', User::STATUS_ACTIVE], ['未激活', User::STATUS_REGISTERED], ['已锁定', User::STATUS_LOCKED]] %>
@@ -26,10 +26,13 @@
<%= text_field_tag(:school_name, params[:school_name], class: 'form-control col-sm-2', placeholder: '学校/单位检索') %>
<%= submit_tag('搜索', class: 'btn btn-primary ml-3', 'data-disable-with': '搜索中...') %>
<% end %>
+
+ <%= javascript_void_link '导入用户', class: 'btn btn-secondary btn-sm', data: { toggle: 'modal', target: '.admin-import-user-modal'} %>
<%= render partial: 'admins/users/shared/user_list', locals: { users: @users } %>
-<%= render partial: 'admins/users/shared/reward_grade_modal' %>
\ No newline at end of file
+<%= render partial: 'admins/users/shared/reward_grade_modal' %>
+<%= render partial: 'admins/users/shared/import_user_modal' %>
\ No newline at end of file
diff --git a/app/views/admins/users/shared/_import_user_modal.html.erb b/app/views/admins/users/shared/_import_user_modal.html.erb
new file mode 100644
index 000000000..ff3c725b9
--- /dev/null
+++ b/app/views/admins/users/shared/_import_user_modal.html.erb
@@ -0,0 +1,30 @@
+
\ No newline at end of file
diff --git a/app/views/layouts/admin.html.erb b/app/views/layouts/admin.html.erb
index fc16c0beb..330ca8fc0 100644
--- a/app/views/layouts/admin.html.erb
+++ b/app/views/layouts/admin.html.erb
@@ -35,5 +35,8 @@
+
+
+ <%= render 'admins/shared/modal/message_modal' %>