Merge branch 'dev_aliyun' of https://bdgit.educoder.net/Hjqreturn/educoder into dev_aliyun

dev_oauth
杨树林 5 years ago
commit f0500b4c61

@ -12,6 +12,7 @@
//= require jquery.cxselect
//= require bootstrap-datepicker
//= require bootstrap.viewer
//= require jquery.mloading
//= require echarts
//= require lib/codemirror

@ -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');
}

@ -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 = "<div>导入结果:成功" + data.success + "条,失败"+ data.fail.length + "条</div>";
if(data.fail.length > 0){
messageHtml += '<table class="table"><thead class="thead-light"><tr><th>数据</th><th>失败原因</th></tr></thead><tbody>';
data.fail.forEach(function(item){
messageHtml += '<tr><td>' + item.data + '</td><td>' + item.message + '</td></tr>';
});
messageHtml += '</tbody></table>'
}
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);
}
});
}
});
}
});

@ -16,4 +16,3 @@
//= require jquery3
//= require popper
//= require bootstrap-sprockets
//= require_tree .

@ -0,0 +1,202 @@
/* Authormingyuhisoft@163.com
* Github:https://github.com/imingyu/jquery.mloading
* Npm:npm install jquery.mloading.js
* Date2016-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 = $('<div class="mloading"></div>');
dom.append(curtainElement);
}
if (bodyElement.length == 0) {
bodyElement = $('<div class="mloading-body"></div>');
curtainElement.append(bodyElement);
}
if (barElement.length == 0) {
barElement = $('<div class="mloading-bar"></div>');
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 = $('<span class="mloading-text"></span>');
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);
}
}
});
}
}));

@ -5,6 +5,7 @@
@import "select2-bootstrap4.min";
@import "bootstrap-datepicker";
@import "bootstrap-datepicker.standalone";
@import "jquery.mloading";
@import "lib/codemirror";
@import "common";

@ -0,0 +1,94 @@
/* Authormingyuhisoft@163.com
* Github:https://github.com/imingyu/jquery.mloading
* Npm:npm install jquery.mloading.js
* Date2016-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;
}

@ -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

@ -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
@ -1238,7 +1241,7 @@ class CoursesController < ApplicationController
tip_exception("开始时间不能为空") if params[:start_date].blank?
tip_exception("结束时间不能为空") if params[:end_date].blank?
tip_exception("结束时间必须晚于开始时间") if strf_date(params[:end_date]) <= strf_date(params[:start_date])
tip_exception("开始时间和结束时间不能与往期开课时间重叠") if @course.nil? && @subject.max_course_end_date && strf_date(params[:start_date]) <= strf_date(@subject.max_course_end_date)
tip_exception("开始时间和结束时间不能早于往期开课时间") if @course.nil? && @subject.max_course_end_date && strf_date(params[:start_date]) <= strf_date(@subject.max_course_end_date)
validate_start_end_date if @course.present?
tip_exception("开放课堂必须包含公告栏和在线学习模块") unless params[:course_module_types].include?("announcement") && params[:course_module_types].include?("online_learning")
end

@ -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

@ -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

@ -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

@ -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

@ -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)

@ -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)

@ -0,0 +1,18 @@
<div class="modal fade admin-message-modal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">消息</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body" style="max-height: 300px; overflow-y: scroll;">
保存成功
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" data-dismiss="modal">确认</button>
</div>
</div>
</div>
</div>

@ -3,7 +3,7 @@
<% end %>
<div class="box search-form-container user-list-form">
<%= 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 %>
<div class="form-group mr-2">
<label for="status">状态:</label>
<% 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'} %>
</div>
<div class="box users-list-container">
<%= render partial: 'admins/users/shared/user_list', locals: { users: @users } %>
</div>
<%= render partial: 'admins/users/shared/reward_grade_modal' %>
<%= render partial: 'admins/users/shared/reward_grade_modal' %>
<%= render partial: 'admins/users/shared/import_user_modal' %>

@ -0,0 +1,30 @@
<div class="modal fade admin-import-user-modal" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">导入用户</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<form class="admin-import-user-form" enctype="multipart/form-data">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">文件</span>
</div>
<div class="custom-file">
<input type="file" name="file" class="upload-file-input" id="upload-file-input" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet">
<label class="custom-file-label file-names" for="upload-file-input">选择文件</label>
</div>
</div>
<div class="error text-danger"></div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary submit-btn">确认</button>
</div>
</div>
</div>
</div>

@ -35,5 +35,8 @@
</div>
<div class="admin-modal-container"></div>
<!-- message modal -->
<%= render 'admins/shared/modal/message_modal' %>
</body>
</html>

@ -8,7 +8,7 @@ json.question_banks @question_banks do |question_bank|
json.is_public question_bank.is_public
json.quotes_count question_bank.quotes
json.creator_name question_bank.user.name
json.course_list_name question_bank.course_list.name
json.course_list_name question_bank.course_list&.name
json.updated_at question_bank.updated_at
json.solve_count @solve_count_map.fetch(question_bank.id, 0)
end

@ -803,6 +803,7 @@ Rails.application.routes.draw do
post :active
end
end
resource :import_users, only: [:create]
resources :library_applies, only: [:index] do
member do

@ -0,0 +1,12 @@
class MigrateExcellentCourseCourseList < ActiveRecord::Migration[5.2]
def change
courses = Course.where(excellent: true)
courses.each do |course|
if !course.course_list.present? && course.subject
subject = course.subject
course_list = CourseList.find_by(name: subject.name) || CourseList.create!(name: subject.name, user_id: course.tea_id, is_admin: 0)
course.update_attributes(course_list_id: course_list.id)
end
end
end
end

Binary file not shown.

File diff suppressed because one or more lines are too long

@ -27613,6 +27613,209 @@ $.fn.bootstrapViewer.defaults = {
src: 'src'
}
;
/* Authormingyuhisoft@163.com
* Github:https://github.com/imingyu/jquery.mloading
* Npm:npm install jquery.mloading.js
* Date2016-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 = $('<div class="mloading"></div>');
dom.append(curtainElement);
}
if (bodyElement.length == 0) {
bodyElement = $('<div class="mloading-body"></div>');
curtainElement.append(bodyElement);
}
if (barElement.length == 0) {
barElement = $('<div class="mloading-bar"></div>');
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 = $('<span class="mloading-text"></span>');
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);
}
}
});
}
}));
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
@ -128220,6 +128423,21 @@ $(document).on('turbolinks:load', function() {
}
})
;
$(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');
}
;
$(document).on('turbolinks:load', function() {
if ($('body.admins-mirror-repositories-edit-page, body.admins-mirror-repositories-update-page').length > 0) {
var $form = $('form.edit-mirror');
@ -129182,6 +129400,74 @@ $(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 = "<div>导入结果:成功" + data.success + "条,失败"+ data.fail.length + "条</div>";
if(data.fail.length > 0){
messageHtml += '<table class="table"><thead class="thead-light"><tr><th>数据</th><th>失败原因</th></tr></thead><tbody>';
data.fail.forEach(function(item){
messageHtml += '<tr><td>' + item.data + '</td><td>' + item.message + '</td></tr>';
});
messageHtml += '</tbody></table>'
}
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);
}
});
}
});
}
});
$(document).on('turbolinks:load', function() {
@ -129226,6 +129512,7 @@ $(document).on('turbolinks:load', function() {
$.ajaxSetup({

File diff suppressed because one or more lines are too long

@ -1,6 +1,7 @@
import React, { Component } from 'react';
import { SnackbarHOC } from 'educoder';
import {BrowserRouter as Router,Route,Switch} from 'react-router-dom';
import { withRouter } from 'react-router'
import Loadable from 'react-loadable';
import Loading from '../../Loading';
import axios from 'axios';
@ -309,6 +310,13 @@ class CoursesIndex extends Component{
componentDidMount(){
// this.updataleftNav()
this.historyArray = []
this.props.history.listen( location => {
console.log(location)
this.historyArray.unshift(location.pathname)
this.historyArray.length = 2;
//Do your stuff here
});
}
updataleftNav=()=>{
@ -443,6 +451,7 @@ class CoursesIndex extends Component{
render() {
const common = {
previousPathName: this.historyArray && this.historyArray[1]
// isAdmin: this.isAdmin,
// isStudent: this.isStudent,
// isAdminOrStudent: this.isAdminOrStudent,
@ -464,47 +473,47 @@ class CoursesIndex extends Component{
{/*毕设任务题库详情*/}
<Route path="/banks/gtopic_topics/:workid"
render={
(props) => (<Completetaskpage {...this.props} {...props} {...this.state} />)
(props) => (<Completetaskpage {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*毕设内容题库详情*/}
<Route path="/banks/gtask_topics/:workid"
render={
(props) => (<CompletetopicdePage {...this.props} {...props} {...this.state} />)
(props) => (<CompletetopicdePage {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*分组作业题库详情*/}
<Route path="/banks/group_topics/:workid"
render={
(props) => (<GroupjobbankPage {...this.props} {...props} {...this.state} />)
(props) => (<GroupjobbankPage {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 普通作业题库详情*/}
<Route path="/banks/normal_topics/:workid"
render={
(props) => (<Generaljobbankdetails {...this.props} {...props} {...this.state} />)
(props) => (<Generaljobbankdetails {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 资源列表页 */}
<Route path="/courses/:coursesId/file/:Id" exact
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
<Route path="/courses/:coursesId/files/:main_id"
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
<Route exact path="/courses/:coursesId/boards/:boardId"
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*课堂讨论*/}
<Route path="/courses/:coursesId/boards/:boardId"
render={
(props) => (<BoardIndex {...this.props} {...props} {...this.state} />)
(props) => (<BoardIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
@ -512,19 +521,19 @@ class CoursesIndex extends Component{
{/* 毕设问答 */}
<Route path="/courses/:coursesId/graduation_topics/postwork/new"
render={
(props) => (<GraduateTopicPostWorksNew {...this.props} {...props} {...this.state} />)
(props) => (<GraduateTopicPostWorksNew {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 毕设选题新建页 */}
<Route path="/courses/:coursesId/graduation_topics/new"
render={
(props) => (<GraduateTopicNew {...this.props} {...props} {...this.state} />)
(props) => (<GraduateTopicNew {...this.props} {...props} {...this.state} {...common}/>)
}></Route>
{/* 毕设选题编辑页*/}
<Route path="/courses/:coursesId/graduation_topics/:topicId/edit"
render={
(props) => (<GraduateTopicNew {...this.props} {...props} {...this.state} />)
(props) => (<GraduateTopicNew {...this.props} {...props} {...this.state} {...common}/>)
}></Route>
{/* 毕设选题详情页 */}
@ -537,7 +546,7 @@ class CoursesIndex extends Component{
{/* 毕设选题列表 */}
<Route path="/courses/:coursesId/graduation_topics/:Id" exact
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}></Route>
@ -545,21 +554,21 @@ class CoursesIndex extends Component{
{/* 作品评阅 https://www.trustie.net/issues/19981 */}
<Route path="/courses/:coursesId/graduation_tasks/:category_id/appraise"
render={
(props) => (<GraduationTasksappraise {...this.props} {...props} {...this.state} />)
(props) => (<GraduationTasksappraise {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 新建作品 */}
<Route path="/courses/:coursesId/graduation_tasks/:category_id/:task_Id/works/new"
render={
(props) => (<GraduationTasksSubmitnewApp {...this.props} {...props} {...this.state} />)
(props) => (<GraduationTasksSubmitnewApp {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 修改作品 */}
<Route path="/courses/:coursesId/graduation_tasks/:category_id/:work_Id/works/edit"
render={
(props) => (<GraduationTasksSubmiteditApp {...this.props} {...props} {...this.state} />)
(props) => (<GraduationTasksSubmiteditApp {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
@ -567,20 +576,20 @@ class CoursesIndex extends Component{
<Route path="/courses/:coursesId/graduation_tasks/:category_id/:task_Id/setting"
render={
(props) => (<GraduationTaskssetting {...this.props} {...props} {...this.state} />)
(props) => (<GraduationTaskssetting {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
<Route path="/courses/:coursesId/graduation_tasks/:category_id/:task_Id/questions"
render={
(props) => (<GraduationTasksquestions {...this.props} {...props} {...this.state} />)
(props) => (<GraduationTasksquestions {...this.props} {...props} {...this.state} {...common}/>)
}></Route>
<Route path="/courses/:coursesId/graduation_tasks/:category_id/:task_Id/list"
render={
(props) => (<GraduationTaskssettinglist {...this.props} {...props} {...this.state} />)
(props) => (<GraduationTaskssettinglist {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
@ -589,7 +598,7 @@ class CoursesIndex extends Component{
{/* 修改毕设任务 https://www.trustie.net/issues/19981 */}
<Route path="/courses/:coursesId/graduation_tasks/:category_id/edit"
render={
(props) => (<GraduationTaskseditApp {...this.props} {...props} {...this.state} />)
(props) => (<GraduationTaskseditApp {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
@ -597,7 +606,7 @@ class CoursesIndex extends Component{
{/* 新建毕设任务 https://www.trustie.net/issues/19981 */}
<Route path="/courses/:coursesId/graduation_tasks/:category_id/new"
render={
(props) => (<GraduationTasksnewApp {...this.props} {...props} {...this.state} />)
(props) => (<GraduationTasksnewApp {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
@ -605,87 +614,87 @@ class CoursesIndex extends Component{
{/* 毕设任务列表 https://www.trustie.net/issues/19981 */}
<Route path="/courses/:coursesId/graduation_tasks/:Id" exact
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*/!* 毕业设计主 https://www.trustie.net/issues/19981 *!/*/}
{/*<Route path="/courses/:coursesId/graduation"*/}
{/*render={*/}
{/*(props) => (<GraduationTopics {...this.props} {...props} {...this.state} />)*/}
{/*(props) => (<GraduationTopics {...this.props} {...props} {...this.state} {...common}/>)*/}
{/*}*/}
{/*></Route>*/}
{/*/!* 资源子目录 https://www.trustie.net/issues/19917 *!/*/}
{/*<Route path="/courses/:coursesId/attachment/attachment/:attachmentId"*/}
{/*render={*/}
{/*(props) => (<Files {...this.props} {...props} {...this.state} />)*/}
{/*(props) => (<Files {...this.props} {...props} {...this.state} {...common}/>)*/}
{/*}*/}
{/*></Route>*/}
{/* 教师列表*/}
<Route path="/courses/:coursesId/teachers"
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 学生列表*/}
<Route path="/courses/:coursesId/students"
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 分班列表 */}
<Route path="/courses/:coursesId/course_groups/:course_group_id"
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 普通作业 */}
<Route path="/courses/:coursesId/common_homeworks/:category_id" exact
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 分组作业 */}
<Route path="/courses/:coursesId/group_homeworks/:category_id" exact
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 普通作业 */}
<Route path="/courses/:coursesId/common_homeworks/" strict
render={
(props) => (<CommonWork {...this.props} {...props} {...this.state} />)
(props) => (<CommonWork {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 分组作业 */}
<Route path="/courses/:coursesId/group_homeworks/" strict
render={
(props) => (<GroupWork {...this.props} {...props} {...this.state} />)
(props) => (<GroupWork {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 问卷答题 */}
<Route path="/courses/:coursesId/polls/:pollId/users/:login"
render={
(props) => (<PollInfo {...this.props} {...props} {...this.state} />)
(props) => (<PollInfo {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 问卷详情 */}
<Route path="/courses/:coursesId/polls/:pollId/detail"
render={
(props) => (<PollDetail {...this.props} {...props} {...this.state} />)
(props) => (<PollDetail {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 问卷新建 */}
<Route path="/courses/:coursesId/polls/:pollid/:news"
render={
(props) => (<PollNew {...this.props} {...props} {...this.state} />)
(props) => (<PollNew {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*/!* 问卷编辑 *!/*/}
@ -697,7 +706,7 @@ class CoursesIndex extends Component{
{/* 问卷 */}
<Route path="/courses/:coursesId/polls/:Id"
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
@ -705,20 +714,20 @@ class CoursesIndex extends Component{
{/* 试卷查看/评阅 */}
<Route exact path="/courses/:coursesId/exercises/:Id/users/:userId"
render={
(props)=>(<ExerciseReviewAndAnswer {...this.props} {...props} {...this.state} />)
(props)=>(<ExerciseReviewAndAnswer {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*试卷新建 */}
<Route exact path="/courses/:coursesId/exercises/new"
render={
(props) => (<ExerciseNew {...this.props} {...props} {...this.state} />)
(props) => (<ExerciseNew {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*试卷新建 */}
<Route exact path="/courses/:coursesId/exercises/:Id/edit"
render={
(props) => (<ExerciseNew {...this.props} {...props} {...this.state} />)
(props) => (<ExerciseNew {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
@ -726,7 +735,7 @@ class CoursesIndex extends Component{
<Route path="/courses/:coursesId/exercises/:Id/student_exercise_list"
render={
(props) => (<Testpapersettinghomepage {...this.props} {...props} {...this.state} />)
(props) => (<Testpapersettinghomepage {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
@ -735,14 +744,14 @@ class CoursesIndex extends Component{
<Route
path="/courses/:coursesId/exercises/:Id/Studentshavecompletedthelist"
render={
(props) => (<Studentshavecompletedthelist {...this.props} {...props} {...this.state} />)
(props) => (<Studentshavecompletedthelist {...this.props} {...props} {...this.state} {...common}/>)
}
>
</Route>
{/* 试卷 */}
<Route path="/courses/:coursesId/exercises/:Id"
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
@ -750,65 +759,65 @@ class CoursesIndex extends Component{
{/*实训查重详情*/}
<Route path="/courses/:coursesId/shixun_homeworks/:homeworkid/review_detail/:userid"
render={
(props) => (<ShixunWorkDetails {...this.props} {...props} {...this.state} />)
(props) => (<ShixunWorkDetails {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
<Route path="/courses/:coursesId/shixun_homework/:homeworkid/review_detail/:userid"
render={
(props) => (<ShixunWorkDetails {...this.props} {...props} {...this.state} />)
(props) => (<ShixunWorkDetails {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*实训查重列表*/}
<Route path="/courses/:coursesId/shixun_homeworks/:homeworkid/student_work"
render={
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} />)
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
<Route path="/courses/:coursesId/shixun_homework/:homeworkid/student_work"
render={
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} />)
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*实训报告*/}
<Route path="/courses/:coursesId/shixun_homeworks/:homeworkid/shixun_work_report"
render={
(props) => (<ShixunWorkReport {...this.props} {...props} {...this.state} />)
(props) => (<ShixunWorkReport {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
<Route path="/courses/:coursesId/shixun_homework/:homeworkid/shixun_work_report"
render={
(props) => (<ShixunWorkReport {...this.props} {...props} {...this.state} />)
(props) => (<ShixunWorkReport {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*教师列表*/}
<Route path="/courses/:coursesId/shixun_homeworks/:homeworkid/list"
render={
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} />)
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
<Route path="/courses/:coursesId/shixun_homework/:homeworkid/list"
render={
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} />)
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*实训作业page*/}
<Route path="/courses/:coursesId/shixun_homeworks/:homeworkid/Page"
render={
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} />)
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*实训作业设置*/}
<Route path="/courses/:coursesId/shixun_homeworks/:homeworkid/settings"
render={
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} />)
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
<Route path="/courses/:coursesId/shixun_homework/:homeworkid/settings"
render={
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} />)
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*/!*实训作品列表教师*!/*/}
@ -847,21 +856,21 @@ class CoursesIndex extends Component{
{/*实训作业问答主目录*/}
<Route path="/courses/:coursesId/shixun_homeworks/:homeworkid/questions"
render={
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} />)
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*实训作业问答子目录*/}
<Route path="/courses/:coursesId/shixun_homework/:homeworkid/questions"
render={
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} />)
(props) => (<ShixunHomeworkPage {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*新建课堂*/}
<Route path="/courses/new"
render={
(props) => (<WrappedCoursesNewApp {...this.props} {...props} {...this.state} />)
(props) => (<WrappedCoursesNewApp {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*新建精品课堂*/}
@ -869,47 +878,47 @@ class CoursesIndex extends Component{
{/*id 是否是私有或者公有*/}
<Route path="/courses/news/:subjectid/newgold/:id"
render={
(props) => (<WrappedCoursesNewAppGoldclass {...this.props} {...props} {...this.state} />)
(props) => (<WrappedCoursesNewAppGoldclass {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*修改精品课堂*/}
<Route path="/courses/:coursesId/newgolds/settings"
render={
(props) => (<WrappedCoursesNewAppGoldclass {...this.props} {...props} {...this.state} />)
(props) => (<WrappedCoursesNewAppGoldclass {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*修改课堂*/}
<Route path="/courses/:coursesId/settings"
render={
(props) => (<WrappedCoursesNewApp {...this.props} {...props} {...this.state} />)
(props) => (<WrappedCoursesNewApp {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 实训作业子页面*/}
<Route path="/courses/:coursesId/shixun_homework/:category_id"
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/* 实训作业页面*/}
<Route path="/courses/:coursesId/shixun_homeworks/:main_id"
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*/!*实训作业and课堂详情页*!/*/}
<Route path="/courses/:coursesId"
render={
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} />)
(props) => (<ListPageIndex {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*课堂首页*/}
<Route path="/courses"
render={
(props) => (<CoursesHome {...this.props} {...props} {...this.state} />)
(props) => (<CoursesHome {...this.props} {...props} {...this.state} {...common}/>)
}
></Route>
{/*<Route exact path="/courses" component={CoursesHome} {...this.props} {...props} {...this.state} ></Route>*/}
@ -919,4 +928,4 @@ class CoursesIndex extends Component{
}
}
export default ImageLayerOfCommentHOC({imgSelector: '.imageLayerParent img, .imageLayerParent .imageTarget', parentSelector: '.newMain'}) (CNotificationHOC() ( SnackbarHOC() ( TPMIndexHOC(CoursesIndex) )));
export default withRouter(ImageLayerOfCommentHOC({imgSelector: '.imageLayerParent img, .imageLayerParent .imageTarget', parentSelector: '.newMain'}) (CNotificationHOC() ( SnackbarHOC() ( TPMIndexHOC(CoursesIndex) ))));

@ -81,11 +81,7 @@ class CommonWorkQuestion extends Component{
let category_id=this.props.match.params.category_id;
let task_Id=this.props.match.params.task_Id;
const isGroup = this.props.isGroup()
/**
<React.Fragment>
<a className={"fr color-blue font-16"} href={exportResultUrl}>导出成绩</a>
</React.Fragment>
*/
return(
<React.Fragment>

@ -112,8 +112,13 @@ class CommonWorkAppraiseReply extends Component{
cancelText: '取消',
onOk: () => {
let category_id= this.props.match.params.category_id;
const url = `/graduation_works/${category_id}/delete_score.json?comment_id=${item.id}`
axios.delete(url).then((result)=>{
const task_id = this.props.task_id
// 作业是使用 task_id
const url = `/student_works/${task_id}/destroy_score.json`
axios.delete(url, { data: {
score_id: item.id
}
}).then((result)=>{
if(result.data.status == 0){
this.props.showNotification('删除成功')
this.fetchAllComments()

@ -258,6 +258,7 @@ class CCommentItem extends Component{
const isAnonymous = homework_status && homework_status.indexOf('匿评中') != -1
const isAppealing = homework_status && homework_status.indexOf('申诉中') != -1
const attachments = item.attachments;
const isAdmin = this.props.isAdmin()
return(
<div className="ccomment comment_item_cont df clearfix" key={item.id}>
@ -302,23 +303,29 @@ class CCommentItem extends Component{
{item.score !== null && <span className="score_area fl">{item.score}</span>}
{/* !item.is_invalid && */}
{/* { item.delete && <Tooltip title={ "" } >
{/* item.is_invalid && */}
{/* { item.delete && isAdmin && <Tooltip title={ "" } >
<i className="iconfont icon-shanchu mr5 fr" style={{marginLeft: '6px'}}
onClick={() => this.props.onDelete(item)}>
</i>
</Tooltip>} */}
{/* fr */}
{/* <WordsBtn style="blue" className="fr">回复</WordsBtn> */}
{ item.is_invalid ? <span className="validate_area fr">失效</span> :
<React.Fragment>
<WordsBtn style="blue" className="fr" onClick={this.state.show_reply ? this.cancelReply : this.showReply}>回复</WordsBtn>
{(isAppealing || isAnonymous) && item.can_appeal && item.appeal_status == 0 && <WordsBtn style="blue" className="fr mr20" onClick={this.state.show_appeal ? this.cancelAppeal : this.showAppeal}>申诉</WordsBtn>}
{(isAppealing || isAnonymous) && item.can_appeal && item.appeal_status == 0 &&
<WordsBtn style="blue" className="fr mr20" onClick={this.state.show_appeal ? this.cancelAppeal : this.showAppeal}>申诉</WordsBtn>}
</React.Fragment>
}
{item.delete && isAdmin
&& <WordsBtn style="blue" className="fr mr12"
onClick={() => this.props.onDelete(item)}>删除</WordsBtn>}
</div>
</div>

@ -151,8 +151,8 @@ class GraduationTasksappraiseMainEditor extends Component{
}
this.setState({ score: val })
}
same_score_change = (val) => {
this.setState({ same_score: !this.state.same_score })
same_score_change = (e) => {
this.setState({ same_score: e.target.checked }) //!this.state.same_score
}
render(){
let { total_count, comments, pageCount, fileList, score, same_score, errorMessage, numberErrorMessage } = this.state
@ -209,7 +209,7 @@ class GraduationTasksappraiseMainEditor extends Component{
<TPMMDEditor ref={this.mdRef} mdID={'appraiseEditor'} placeholder={placeholder || "请在此输入对本作品的评语最大限制2000个字符"}
watch={false} height={160} className={errorMessage ? 'editorInputError' : ''}></TPMMDEditor>
{ showSameScore == true && <div>
<Checkbox value={same_score} onChange={this.same_score_change}>整组同评</Checkbox>
<Checkbox checked={same_score} onChange={this.same_score_change}>整组同评</Checkbox>
<span className={"font-14 color-grey-9"}>(选中则本次评阅对象指小组全部成员否则仅评阅此成员1人 )</span>
</div> }
<Upload {...commentUploadProp} className="upload_mainEditor upload_1 newuploads">

@ -77,6 +77,7 @@ class CoursesNew extends Component {
this.setState({
datatime: data.end_date,
dataname:data.name,
is_public: data.is_public === 1 ? true : false,
Realnamecertification: data.authentication,
Professionalcertification:data.professional_certification,
@ -326,7 +327,7 @@ class CoursesNew extends Component {
}
goback = () => {
goback = (id) => {
// if(this.props.match.params.coursesId===undefined){
// this.props.history.push("/courses");
@ -334,7 +335,12 @@ class CoursesNew extends Component {
// this.props.history.push(this.props.current_user.first_category_url);
// }
// window.history.go(-1)
this.props.history.goBack()
if(id===undefined){
this.props.history.goBack()
}else{
this.props.history.push(this.props.current_user.first_category_url);
}
}
onCheckAllChange = (e) => {
@ -494,7 +500,7 @@ class CoursesNew extends Component {
this.applyForAddOrgForm.setVisible(true)
}
render() {
let {datatime,school,searchlistscholl,bordebool} = this.state;
let {datatime,school,searchlistscholl,bordebool,dataname} = this.state;
const {getFieldDecorator} = this.props.form;
const propsWithoutForm = Object.assign({}, this.props)
delete propsWithoutForm.form
@ -504,7 +510,7 @@ class CoursesNew extends Component {
// form合并了
// console.log("获取到的数据");
// console.log(this.state);
// console.log(this.props);
//console.log(this.props.current_user.first_category_url);
// console.log(this.props.current_user);
var addonAfterone=this.props.form&&this.props.form.getFieldValue('period');
var addonAfteronelen=0;
@ -537,7 +543,7 @@ class CoursesNew extends Component {
.color-green-light {
color: #45E660!important;
}
.line15{line-height: 15px;}
`
}
</style>
@ -562,15 +568,19 @@ class CoursesNew extends Component {
{/*</Breadcrumb>*/}
<p className="clearfix mb20 mt10">
<a className="btn colorgrey fl hovercolorblue " href="/courses">翻转课堂</a>
<a className="btn colorgrey fl hovercolorblue "
href={this.props.match.params.coursesId === undefined ?"/courses":this.props.current_user&&this.props.current_user.first_category_url}
>
{this.props.match.params.coursesId === undefined ?"翻转课堂":dataname}
</a>
<span className="color-grey-9 fl ml3 mr3">&gt;</span>
<WordsBtn className="fl">{this.props.match.params.coursesId === undefined ?"新建课堂":"编辑课堂"}</WordsBtn>
<WordsBtn className="fl cdefault">{this.props.match.params.coursesId === undefined ?"新建课堂":"编辑课堂"}</WordsBtn>
</p>
<div style={{width: '100%', height: '70px'}}>
<p className=" fl color-black mt18 summaryname">{this.props.match.params.coursesId === undefined ? "新建课堂" : "编辑课堂"}</p>
<a onClick={this.goback} className="color-grey-6 fr font-16 ml30 mt18 mr20">返回</a>
<div style={{width: '100%', height: '50px'}}>
<p className=" fl color-black summaryname">{this.props.match.params.coursesId === undefined ? "新建课堂" : "编辑课堂"}</p>
<a onClick={()=>this.goback(this.props.match.params.coursesId)} className="color-grey-6 fr font-16 ml30 line15 mr20">返回</a>
</div>
<style>
{`

@ -628,7 +628,7 @@ class Goldsubject extends Component {
this.applyForAddOrgForm.setVisible(true)
}
render() {
let {datatime,datatimetwo,school,bordebool,searchlistscholl,Whethertocreateanewclassroom,addonAfteronelenone,addonAfteronelentwo} = this.state;
let {datatime,datatimetwo,school,bordebool,searchlistscholl,Whethertocreateanewclassroom,addonAfteronelenone,addonAfteronelentwo,name} = this.state;
const {getFieldDecorator} = this.props.form;
const propsWithoutForm = Object.assign({}, this.props)
delete propsWithoutForm.form
@ -664,11 +664,11 @@ class Goldsubject extends Component {
{
`
.color-green-light {
color: #45E660!important;
}
`
.color-green-light {
color: #45E660!important;
}
.line15{line-height: 15px;}
`
}
</style>
<ApplyForAddOrgModal ref="applyForAddOrgModal" wrappedComponentRef={(form) => this.applyForAddOrgForm = form} schoolName={school}
@ -693,47 +693,50 @@ class Goldsubject extends Component {
{/* <Breadcrumb.Item>{Whethertocreateanewclassroom===true?"新建课堂":"编辑课堂"}</Breadcrumb.Item>*/}
{/*</Breadcrumb>*/}
<p className="clearfix mb20 mt10">
<a className="btn colorgrey fl hovercolorblue " href="/courses">翻转课堂</a>
<a className="btn colorgrey fl hovercolorblue " href={Whethertocreateanewclassroom===true?"/courses":this.props.current_user&&this.props.current_user.first_category_url}
>{Whethertocreateanewclassroom===true?"翻转课堂":name}</a>
<span className="color-grey-9 fl ml3 mr3">&gt;</span>
<WordsBtn className="fl">{Whethertocreateanewclassroom===true?"新建课堂":"编辑课堂"}</WordsBtn>
<WordsBtn className="fl cdefault">{Whethertocreateanewclassroom===true?"新建课堂":"编辑课堂"}</WordsBtn>
</p>
<div style={{width: '100%', height: '70px'}}>
<p className=" fl color-black mt18 summaryname">{Whethertocreateanewclassroom===true ? "新建课堂" : "编辑课堂"}</p>
<a onClick={this.goback} className="color-grey-6 fr font-16 ml30 mt18 mr20"></a>
<div style={{width: '100%', height: '50px'}}>
<p className=" fl color-black summaryname">{Whethertocreateanewclassroom===true ? "新建课堂" : "编辑课堂"}</p>
<a onClick={this.goback} className="color-grey-6 fr font-16 ml30 line15 mr20"></a>
</div>
<style>
{`
.ant-col-12{
width:800px;
}
`}
.ant-col-12{
width:800px;
}
`}
</style>
<Form onSubmit={this.handleSubmit} className={"edu-back-white newcourses"}>
{/*内容*/}
<style>
{`
.ant-select-dropdown{
// top: 221px !important;
// left: 115px !important;
height: 160px;
}
.ant-select-dropdown-menu{
height: 160px;
}
.construction .ant-input{
margin-left: 0px !important;
}
.construction {
margin-left: 11px;
}
.construction .ant-select-selection__placeholder, .ant-select-search__field__placeholder {
line-height: 28px;
z-index: 2000;
}
`}
.ant-select-dropdown{
// top: 221px !important;
// left: 115px !important;
height: 160px;
}
.ant-select-dropdown-menu{
height: 160px;
}
.construction .ant-input{
margin-left: 0px !important;
}
.construction {
margin-left: 11px;
}
.construction .ant-select-selection__placeholder, .ant-select-search__field__placeholder {
line-height: 28px;
z-index: 2000;
}
.line15{line-height: 15px;}
`}
</style>
{/*<div className="stud-class-set bor-bottom-greyE padding10200 ">*/}
@ -772,30 +775,30 @@ class Goldsubject extends Component {
<style>
{
`
.ml19{
margin-left:19px;
} }
`
.ml19{
margin-left:19px;
}
`
}
</style>
<div className="stud-class-set bor-bottom-greyE padding1020 ">
<style>{
`
.yslzxueshis .ant-input{
border-right: none !important;
height: 40px !important;
width: 655px !important;
}
.yslzxueshisy span .ant-input-group-addon{
width: 65px !important;
background-color: #fafafa!important;
}
.yslzxueshisy .ant-input-group-addon{
width: 65px !important;
background-color: #fafafa!important;
}
`
.yslzxueshis .ant-input{
border-right: none !important;
height: 40px !important;
width: 655px !important;
}
.yslzxueshisy span .ant-input-group-addon{
width: 65px !important;
background-color: #fafafa!important;
}
.yslzxueshisy .ant-input-group-addon{
width: 65px !important;
background-color: #fafafa!important;
}
`
}</style>
<style>
{bordebool===false?
@ -845,27 +848,27 @@ class Goldsubject extends Component {
<div className="stud-class-set bor-bottom-greyE padding1020 coursenavbox coursenavboxtow yslinputcourput">
<style>
{`
.ant-form-item{
margin-bottom: 10px !important;
}
`}
.ant-form-item{
margin-bottom: 10px !important;
}
`}
</style>
<style>{
`
.yslzxueshi .ant-input{
border-right: none !important;
height: 40px !important;
width: 236px !important
}
.yslzxueshi .ant-input-group {
width: 280px !important;
}
.yslzxueshi .ant-input-group-addon{
width: 44px !important;
background-color: #fafafa!important;
}
`
.yslzxueshi .ant-input{
border-right: none !important;
height: 40px !important;
width: 236px !important
}
.yslzxueshi .ant-input-group {
width: 280px !important;
}
.yslzxueshi .ant-input-group-addon{
width: 44px !important;
background-color: #fafafa!important;
}
`
}</style>
<Form.Item
label="总学时"
@ -911,19 +914,19 @@ class Goldsubject extends Component {
rules: [{type: 'object',required: true, message: "开始时间不能为空"}],
})(
<span className="fl mt5">
<DatePicker
showToday={false}
placeholder="请选择开始时间"
// showTime={{format: 'HH:mm'}}
locale={locale}
format={dateFormat}
width={"210px"}
value={datatimetwo === undefined ? "" :datatimetwo === null ? "" : moment(datatimetwo, dateFormat)}
disabledTime={disabledDateTime}
dropdownClassName="hideDisable"
onChange={this.onChangeTimepublishstwo}
/>
</span>
<DatePicker
showToday={false}
placeholder="请选择开始时间"
// showTime={{format: 'HH:mm'}}
locale={locale}
format={dateFormat}
width={"210px"}
value={datatimetwo === undefined ? "" :datatimetwo === null ? "" : moment(datatimetwo, dateFormat)}
disabledTime={disabledDateTime}
dropdownClassName="hideDisable"
onChange={this.onChangeTimepublishstwo}
/>
</span>
)}
</Form.Item>
<Form.Item
@ -934,19 +937,19 @@ class Goldsubject extends Component {
required: true, message: "结束时间不能为空"}],
})(
<span className="fl mt5">
<DatePicker
showToday={false}
placeholder="请选择结束时间"
// showTime={{format: 'HH:mm'}}
locale={locale}
format={dateFormat}
width={"210px"}
value={datatime === undefined ? "" :datatime === null ? "" : moment(datatime, dateFormat)}
disabledTime={disabledDateTime}
dropdownClassName="hideDisable"
onChange={this.onChangeTimepublishs}
/>
</span>
<DatePicker
showToday={false}
placeholder="请选择结束时间"
// showTime={{format: 'HH:mm'}}
locale={locale}
format={dateFormat}
width={"210px"}
value={datatime === undefined ? "" :datatime === null ? "" : moment(datatime, dateFormat)}
disabledTime={disabledDateTime}
dropdownClassName="hideDisable"
onChange={this.onChangeTimepublishs}
/>
</span>
)}
</Form.Item>
</div>

@ -92,8 +92,8 @@ class PollListItem extends Component{
{
IsAdmin &&
<ul className="fr">
<WordsBtn style="blue" className="mr20 font-16" to={`/courses/${coursesId}/polls/${item.id}/detail?tab=3`}>设置</WordsBtn>
<WordsBtn style="blue" className="font-16" to={`/courses/${coursesId}/polls/${item.id}/${"edit"}`}>编辑</WordsBtn>
<WordsBtn style="blue" className="ml20 font-16" to={`/courses/${coursesId}/polls/${item.id}/detail?tab=3`}>设置</WordsBtn>
</ul>
}
</p>

Loading…
Cancel
Save