diff --git a/app/controllers/add_school_applies_controller.rb b/app/controllers/add_school_applies_controller.rb index 22b3d360a..e0a09665d 100644 --- a/app/controllers/add_school_applies_controller.rb +++ b/app/controllers/add_school_applies_controller.rb @@ -1,5 +1,5 @@ class AddSchoolAppliesController < ApplicationController - before_action :require_login, :check_auth + before_action :require_login def create school = CreateAddSchoolApplyService.call(current_user, create_params) diff --git a/app/controllers/course_second_categories_controller.rb b/app/controllers/course_second_categories_controller.rb index af368a8dc..e5c3366cd 100644 --- a/app/controllers/course_second_categories_controller.rb +++ b/app/controllers/course_second_categories_controller.rb @@ -8,7 +8,7 @@ class CourseSecondCategoriesController < ApplicationController tip_exception("毕设子目录不能重命名") if @category.category_type == "graduation" tip_exception("名称不能为空") if params[:name].blank? tip_exception("已存在同名子目录") if @course_module.course_second_categories.exists?(name: params[:name].strip) - @category.update_attributes(name: params[:name].strip) + @category.update_attributes!(name: params[:name].strip) normal_status(0, "更新成功") end diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index f5830adff..faad02173 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -906,7 +906,6 @@ class CoursesController < ApplicationController CourseAddStudentCreateWorksJob.perform_later(course.id, [current_user.id]) StudentJoinCourseNotifyJob.perform_later(current_user.id, course.id) - logger.info("#####################{course.id}") end end @@ -915,7 +914,7 @@ class CoursesController < ApplicationController teacher_already_exist = current_user.teacher_of_course_non_active? course unless teacher_already_exist existing_course_message = CourseMessage.find_by(course_id: course.id, course_message_id: current_user.id, - course_message_type: "JoinCourseRequest", status: 0, viewed: false) + course_message_type: "JoinCourseRequest", status: 0) if existing_course_message.blank? course_message = CourseMessage.new(course_id: course.id, user_id: course.tea_id, status: 0, course_message_id: current_user.id, course_message_type: "JoinCourseRequest", @@ -925,20 +924,26 @@ class CoursesController < ApplicationController course_message.save! - role = course_message.content == 2 ? '7' : '9' # 7:老师 9:助教 + role = course_message.content == 2 ? '7' : '9' # 7:助教 9:教师 ApplyTeacherRoleJoinCourseNotifyJob.perform_later(current_user.id, course.id, role) + teacher_role = 1 + message = "#{course_message.content == 2 ? '助教' : '教师'}申请已提交,请等待审核" + else + message = "#{existing_course_message.content == 2 ? '助教' : '教师'}申请已提交,请等待审核" end end end - if current_user.student_of_course?(course) || current_user.teacher_of_course?(course) - render json: { status: 0, message: "成功", course_id: course.id} + if teacher_role && current_user.student_of_course?(course) + render json: { status: 0, message: message, course_id: course.id} + elsif current_user.student_of_course?(course) + render json: { status: 0, message: "加入成功", course_id: course.id} else - normal_status("申请已提交,请等待审核") + normal_status(message) end rescue => e uid_logger(e.message) - tip_exception("加入课堂失败") + tip_exception(e.message) raise ActiveRecord::Rollback end end diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index cfc1c4ba5..f92ed8e2e 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -38,7 +38,7 @@ class HomeworkCommonsController < ApplicationController tip_exception("子目录id有误") if !@category.present? @homework_commons = @homework_commons.where(course_second_category_id: params[:category]) elsif @homework_type == 4 - @homework_commons = @homework_commons.where(course_second_category_id: 0) + @homework_commons = @homework_commons end @all_count = @homework_commons.size @@ -246,13 +246,15 @@ class HomeworkCommonsController < ApplicationController student_works = @homework.student_works.where(user_id: user_ids) end - myshixuns = Myshixun.where(shixun_id: @homework.homework_commons_shixun&.shixun_id, user_id: user_ids). - includes(:games).where(games: {challenge_id: @homework.homework_challenge_settings.pluck(:challenge_id)}) + student_works = student_works.includes(:challenge_work_scores) + challenge_settings = @homework.homework_challenge_settings + challenge_setting_ids = challenge_settings.pluck(:challenge_id) + myshixuns = Myshixun.where(shixun_id: @homework.homework_commons_shixun&.shixun_id, user_id: user_ids).includes(:games) myshixuns.find_each(batch_size: 100) do |myshixun| work = student_works.select{|work| work.user_id == myshixun.user_id}.first if work && myshixun - games = myshixun.games.where(challenge_id: challenge_settings.pluck(:challenge_id)) + games = myshixun.games.select{|game| challenge_setting_ids.include?(game.challenge_id)} HomeworksService.new.update_myshixun_work_score work, myshixun, games, @homework, challenge_settings end end @@ -538,7 +540,7 @@ class HomeworkCommonsController < ApplicationController tip_exception("补交结束时间必须晚于截止时间") if params[:late_time] <= strf_time(@homework.end_time) tip_exception("补交结束时间不能晚于课堂结束时间") if @course.end_date.present? && params[:late_time] > strf_time(@course.end_date.end_of_day) - tip_exception("迟交扣分应为正整数") if params[:late_penalty] && params[:late_penalty].to_i < 0 + tip_exception("迟交扣分不能小于0") if params[:late_penalty] && params[:late_penalty].to_i < 0 @homework.allow_late = true @homework.late_time = params[:late_time] @@ -558,7 +560,7 @@ class HomeworkCommonsController < ApplicationController tip_exception("缺少answer_open_evaluation参数") if params[:answer_open_evaluation].nil? tip_exception("缺少work_efficiency参数") if params[:work_efficiency].nil? tip_exception("缺少eff_score参数") if params[:work_efficiency] && params[:eff_score].blank? - tip_exception("效率分应为正整数") if params[:eff_score] && params[:eff_score].to_i < 0 + tip_exception("效率分不能小于等于0") if params[:eff_score] && params[:eff_score].to_i <= 0 tip_exception("缺少shixun_evaluation参数") if params[:shixun_evaluation].blank? tip_exception("缺少challenge_settings参数") if params[:challenge_settings].blank? # tip_exception("缺少challenge_id参数") if params[:challenge_settings][:challenge_id].blank? @@ -732,16 +734,16 @@ class HomeworkCommonsController < ApplicationController if !@homework_detail_manual.final_mode tip_exception("教师评分比例不能为空") if params[:te_proportion].blank? te_proportion = params[:te_proportion].to_f.round(2) - tip_exception("教师评分比例不能小于零") if te_proportion < 0 + tip_exception("教师评分比例不能小于0") if te_proportion < 0 tip_exception("助教评分比例不能为空") if params[:ta_proportion].blank? ta_proportion = params[:ta_proportion].to_f.round(2) - tip_exception("助教评分比例不能小于零") if ta_proportion < 0 + tip_exception("助教评分比例不能小于0") if ta_proportion < 0 if !@homework.anonymous_comment tip_exception("评分比例之和不能大于100") if (te_proportion + ta_proportion) > 1.0 else tip_exception("学生评分比例不能为空") if params[:st_proportion].blank? st_proportion = params[:st_proportion].to_f.round(2) - tip_exception("学生评分比例不能小于零") if st_proportion < 0 + tip_exception("学生评分比例不能小于0") if st_proportion < 0 tip_exception("评分比例之和不能大于100") if (te_proportion + ta_proportion + st_proportion) > 1.0 end diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb index 649516a03..cdeca4871 100644 --- a/app/controllers/myshixuns_controller.rb +++ b/app/controllers/myshixuns_controller.rb @@ -20,28 +20,29 @@ class MyshixunsController < ApplicationController unless (current_user.admin? || current_user.id == @myshixun.user_id) tip_exception("403", "") end + begin + ActiveRecord::Base.transaction do + begin + @shixun = Shixun.select(:id, :identifier).find(@myshixun.shixun_id) + @myshixun.destroy - ActiveRecord::Base.transaction do - begin - @shixun = Shixun.select(:id, :identifier).find(@myshixun.shixun_id) - @myshixun.destroy + StudentWork.where(:myshixun_id => @myshixun.id).update_all(:myshixun_id => 0, :work_status => 0) - # 刪除版本庫 - begin - GitService.delete_repository(repo_path: @repo_path) + # 实训在申请发布前,是否玩过实训,如果玩过需要更改记录,防止二次重置 + shixun_mod = ShixunModify.where(:shixun_id => @shixun.id, :myshixun_id => @myshixun.id, :status => 1).take + shixun_mod.update_column(:status, 0) if shixun_mod rescue Exception => e - uid_logger_error("版本库删除异常,详情:#{e.message}") + logger.error("######reset_my_game_failed:#{e.message}") + raise("ActiveRecord::RecordInvalid") end - - StudentWork.where(:myshixun_id => @myshixun.id).update_all(:myshixun_id => 0, :work_status => 0) - - # 实训在申请发布前,是否玩过实训,如果玩过需要更改记录,防止二次重置 - shixun_mod = ShixunModify.where(:shixun_id => @shixun.id, :myshixun_id => @myshixun.id, :status => 1).take - shixun_mod.update_column(:status, 0) if shixun_mod - rescue Exception => e - uid_logger_error("myshixun reset failed #{e}") - raise ActiveRecord::Rollback end + # 删除版本库 + GitService.delete_repository(repo_path: @repo_path) + rescue Exception => e + if e.message != "ActiveRecord::RecordInvalid" + logger.error("######delete_repository_error:#{e.message}") + end + raise ActiveRecord::Rollback end end diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb index 587ef2cb9..7a2db0666 100644 --- a/app/controllers/shixuns_controller.rb +++ b/app/controllers/shixuns_controller.rb @@ -676,13 +676,13 @@ class ShixunsController < ApplicationController myshixun_params = {user_id: current_user.id, identifier: myshixun_identifier, modify_time: @shixun.modify_time, reset_time: @shixun.reset_time, onclick_time: Time.now, commit_id: commit_id} - myshixun = @shixun.myshixuns.create!(myshixun_params) + @myshixun = @shixun.myshixuns.create!(myshixun_params) # 其它创建关卡等操作 challenges = @shixun.challenges # 之所以增加user_id是为了方便统计查询性能 game_attrs = %i[challenge_id myshixun_id status user_id open_time identifier modify_time created_at updated_at] Game.bulk_insert(*game_attrs) do |worker| - base_attr = {myshixun_id: myshixun.id, user_id: myshixun.user_id} + base_attr = {myshixun_id: @myshixun.id, user_id: @myshixun.user_id} challenges.each_with_index do |challenge, index| status = (index == 0 ? 0 : 3) game_identifier = generate_identifier(Game, 12) @@ -690,7 +690,7 @@ class ShixunsController < ApplicationController identifier: game_identifier, modify_time: challenge.modify_time)) end end - @current_task = myshixun.current_task(myshixun.games) + @current_task = @myshixun.current_task(@myshixun.games) rescue Exception => e logger.error("------ActiveRecord::RecordInvalid: #{e.message}") raise("ActiveRecord::RecordInvalid") @@ -701,12 +701,12 @@ class ShixunsController < ApplicationController unless is_choice_type # fork仓库 cloud_bridge = edu_setting('cloud_bridge') - project_fork(myshixun, @repo_path, current_user.login) + project_fork(@myshixun, @repo_path, current_user.login) rep_url = Base64.urlsafe_encode64(repo_ip_url @repo_path) uid_logger("start openGameInstance") uri = "#{cloud_bridge}/bridge/game/openGameInstance" logger.info("end openGameInstance") - params = {tpiID: "#{myshixun.id}", tpmGitURL: rep_url, tpiRepoName: myshixun.repo_name.split("/").last} + params = {tpiID: "#{@myshixun.id}", tpmGitURL: rep_url, tpiRepoName: @myshixun.repo_name.split("/").last} uid_logger("openGameInstance params is #{params}") interface_post uri, params, 83, "实训云平台繁忙(繁忙等级:83)" end @@ -716,6 +716,7 @@ class ShixunsController < ApplicationController logger.error("##########project_fork error #{e.message}") @current_task.destroy! end + raise ActiveRecord::Rollback end end end diff --git a/app/controllers/stages_controller.rb b/app/controllers/stages_controller.rb index c62832365..3967554aa 100644 --- a/app/controllers/stages_controller.rb +++ b/app/controllers/stages_controller.rb @@ -39,7 +39,7 @@ class StagesController < ApplicationController def update ActiveRecord::Base.transaction do begin - @stage.update_attributes(stage_params) + @stage.update_attributes!(stage_params) @stage.stage_shixuns.destroy_all unless params[:shixun_id].blank? params[:shixun_id].each do |shixun_id| @@ -50,7 +50,7 @@ class StagesController < ApplicationController @subject.update_attributes(updated_at: Time.now) rescue Exception => e uid_logger_error(e.message) - tip_exception("章节更新失败") + tip_exception(e.message) raise ActiveRecord::Rollback end end diff --git a/app/controllers/subjects_controller.rb b/app/controllers/subjects_controller.rb index cc0e06a38..5cbb2a462 100644 --- a/app/controllers/subjects_controller.rb +++ b/app/controllers/subjects_controller.rb @@ -207,7 +207,7 @@ class SubjectsController < ApplicationController end rescue Exception => e uid_logger(e.message) - tip_exception("发送失败") + tip_exception(e.message) raise ActiveRecord::Rollback end end diff --git a/app/helpers/courses_helper.rb b/app/helpers/courses_helper.rb index fa51de6b7..8c2aeb479 100644 --- a/app/helpers/courses_helper.rb +++ b/app/helpers/courses_helper.rb @@ -199,7 +199,8 @@ module CoursesHelper # 获取课堂的作业数 def get_homework_commons_count(course, type, category_id) - HomeworkCommon.where(course_id: course.id, homework_type: type, course_second_category_id: category_id).size + category_id == 0 ? HomeworkCommon.where(course_id: course.id, homework_type: type).size : + HomeworkCommon.where(course_id: course.id, homework_type: type, course_second_category_id: category_id).size end diff --git a/app/models/stage.rb b/app/models/stage.rb index d255cddeb..db7b5c0b3 100644 --- a/app/models/stage.rb +++ b/app/models/stage.rb @@ -6,6 +6,6 @@ class Stage < ApplicationRecord has_many :stage_shixuns, -> { order("stage_shixuns.position ASC") }, dependent: :destroy has_many :shixuns, :through => :stage_shixuns - validates :name, length: { maximum: 30 } + validates :name, length: { maximum: 60 } validates :description, length: { maximum: 300 } end diff --git a/app/services/homeworks_service.rb b/app/services/homeworks_service.rb index b835685a6..ab149403d 100644 --- a/app/services/homeworks_service.rb +++ b/app/services/homeworks_service.rb @@ -286,7 +286,7 @@ class HomeworksService challenge_setting = challenge_settings.select{|setting| setting.challenge_id == game.challenge_id}.first pass_consume_time += (game.cost_time / 60.0).to_f user_total_score += game.final_score.to_i < 0 ? 0 : game.challenge.score.to_i - adjust_score = work.challenge_work_scores.where(:challenge_id => game.challenge_id).last + adjust_score = work.challenge_work_scores.select{|work_score| work_score.challenge_id == game.challenge_id}.last final_score += if adjust_score.present? adjust_score.score elsif homework.homework_detail_manual.answer_open_evaluation @@ -300,19 +300,6 @@ class HomeworksService end myshixun_endtime = games.select{|game| game.status == 2}.size == games.size ? games.map(&:end_time).max : nil - if myshixun_endtime.present? - work.cost_time = myshixun_endtime.to_i - setting_time.publish_time.to_i - - efficiency = (pass_consume_time == 0 ? 0 : Math.log((user_total_score / pass_consume_time.to_f) + 1.0)) - work.efficiency = format("%.2f", efficiency) - - if myshixun_endtime <= homework_end_or_late_time - work.compelete_status = myshixun_endtime < setting_time.publish_time ? 2 : 1 - - # 如果作业的最大效率值有变更则更新所有作品的效率分 - homework.update_column("max_efficiency", work.efficiency) if homework.work_efficiency && homework.max_efficiency < work.efficiency - end - end if work.work_status == 0 is_complete = myshixun_endtime && (myshixun_endtime < setting_time.end_time) @@ -321,18 +308,34 @@ class HomeworksService elsif homework.allow_late && myshixun.created_at < homework.late_time work.work_status = 2 end + end + + if work.work_status != 0 + if myshixun_endtime.present? + work.cost_time = myshixun_endtime.to_i - setting_time.publish_time.to_i + + efficiency = (pass_consume_time == 0 ? 0 : Math.log((user_total_score / pass_consume_time.to_f) + 1.0)) + work.efficiency = format("%.2f", efficiency) + + if myshixun_endtime <= homework_end_or_late_time + work.compelete_status = myshixun_endtime < setting_time.publish_time ? 2 : 1 + + # 如果作业的最大效率值有变更则更新所有作品的效率分 + homework.update_column("max_efficiency", work.efficiency) if homework.work_efficiency && homework.max_efficiency < work.efficiency + end + end + work.late_penalty = work.work_status == 2 ? homework.late_penalty : 0 work.commit_time = myshixun.created_at > setting_time.publish_time ? setting_time.publish_time : myshixun.created_at work.myshixun_id = myshixun.id - end + work.update_time = myshixun.updated_at - work.update_time = myshixun.updated_at - - work.final_score = final_score - score = work.final_score + work.eff_score - work.late_penalty - work.work_score = format("%.2f",(score < 0 ? 0 : score).to_f) unless work.ultimate_score - #logger.info("#############work_score: #{score}") - work.calculation_time = Time.now - work.save! + work.final_score = final_score + score = work.final_score + work.eff_score - work.late_penalty + work.work_score = format("%.2f",(score < 0 ? 0 : score).to_f) unless work.ultimate_score + #logger.info("#############work_score: #{score}") + work.calculation_time = Time.now + work.save! + end end end \ No newline at end of file diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 000000000..a799840b1 Binary files /dev/null and b/dump.rdb differ diff --git a/public/react/public/css/edu-all.css b/public/react/public/css/edu-all.css index ed44e1f90..ca04aa193 100644 --- a/public/react/public/css/edu-all.css +++ b/public/react/public/css/edu-all.css @@ -289,7 +289,7 @@ label.infolabel{display: block;float: left;width: 56px;text-align: right;margin- .shaiTitle{display: block;padding-right: 20px;} .shaiContent li.shaiItem.active{background-color: #4CACFF!important;color:#fff!important;} .shaiContent li.shaiItem{padding:3px 15px;float: left;border-radius: 4px;color: #4C4C4C;cursor: pointer;margin-right: 15px;display: block} -.shaiContent li.shaiItem:hover{background-color: #F5F5F5} +.shaiContent li.shaiItem:hover{background-color: #4CACFF!important;color:#fff!important;} .shaiAllItem{max-width: 1138px;} .subshaicontent{display: none;box-sizing: border-box;position: absolute;width: 100%;top: 33px;left: 0px;background-color: #fff;box-shadow:0px 1px 4px rgba(76,76,76,0.2);padding:0px 20px;z-index: 99999;border-radius: 4px;max-height: 800px;overflow-y: auto} .subshaicontent-part{border-bottom: 1px solid #eee;} diff --git a/public/react/public/js/editormd/editormd.min.js b/public/react/public/js/editormd/editormd.min.js index 048d95dc5..0b99c713a 100755 --- a/public/react/public/js/editormd/editormd.min.js +++ b/public/react/public/js/editormd/editormd.min.js @@ -4021,7 +4021,10 @@ { var katexHandle = function() { div.find("." + editormd.classNames.tex).each(function(){ - var tex = $(this); + var tex = $(this); + // 和线上的不一样? + // http://editor.md.ipandao.com/examples/html-preview-markdown-to-html-custom-toc-container.html#Editor.md + // katex.render(tex.html().replace(/</g, "<").replace(/>/g, ">"), tex[0]); katex.render(tex.text(), tex[0]); tex.find(".katex").css("font-size", "1.0em"); }); diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index ddef777d6..9c407c82c 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -10,6 +10,7 @@ broadcastChannelOnmessage('refreshPage', () => { }) function locationurl(list){ + debugger if (window.location.port === "3007") { } else { @@ -141,10 +142,7 @@ export function initAxiosInterceptors(props) { // if(response.data.status === 401){ // console.log("401401401") // } - if (response.data.status === 403) { - // props.history.replace('/403') - // 这里会分2个情况,1、刚进入页面发请求返回的403;2、进入页面后,其他用户操作触发请求返回的403; - // TODO 这里做一个403弹框比较好? + if (response.data.status === 403||response.data.status === "403") { locationurl('/403'); } diff --git a/public/react/src/common/components/Cropper.js b/public/react/src/common/components/Cropper.js index 632950434..3ce30a8b5 100644 --- a/public/react/src/common/components/Cropper.js +++ b/public/react/src/common/components/Cropper.js @@ -102,7 +102,7 @@ class Cropper extends Component { setTimeout(() => { const image = document.getElementById(this.props.imageId || '__image'); this.cropper = new window.Cropper(image, this.options); - }, 1000) + }, 1200) } renew = (image) => { diff --git a/public/react/src/common/components/DragValidator.js b/public/react/src/common/components/DragValidator.js index 7d707def0..69e91f604 100644 --- a/public/react/src/common/components/DragValidator.js +++ b/public/react/src/common/components/DragValidator.js @@ -1,114 +1,115 @@ -import React, { Component } from 'react'; - -const $ = window.jQuery -const jQuery = $; -if (!$.drag) { - (function($){ - $.fn.dragValidator = function(options){ - var x, drag = this, isMove = false, defaults = { - }; - var options = $.extend(defaults, options); - //添加背景,文字,滑块 - var html = '
'+ - '
拖动滑块验证
'+ - '
'; - this.append(html); - - var handler = drag.find('.handler'); - var drag_bg = drag.find('.drag_bg'); - var text = drag.find('.drag_text'); - var maxWidth = text.width() - handler.width(); //能滑动的最大间距 - //鼠标按下时候的x轴的位置 - handler.mousedown(function(e){ - isMove = true; - x = e.pageX - parseInt(handler.css('left'), 10); - }); - - //鼠标指针在上下文移动时,移动距离大于0小于最大间距,滑块x轴位置等于鼠标移动距离 - $(document).mousemove(function(e){ - var _x = e.pageX - x; - var handler_offset = handler.offset(); - var lastX = e.clientX -x; - lastX = Math.max(0,Math.min(maxWidth,lastX)); - if(isMove){ - if(_x > 0 && _x <= maxWidth){ - handler.css({'left': lastX}); - drag_bg.css({'width': lastX}); - } - else if(lastX > maxWidth - 5 && lastX < maxWidth + 5 ){ //鼠标指针移动距离达到最大时清空事件 - dragOk(); - } - } - }); - handler.mouseup(function(e){ - isMove = false; - var _x = e.pageX - x; - if(text.text() != '验证通过' && _x < maxWidth){ //鼠标松开时,如果没有达到最大距离位置,滑块就返回初始位置 - handler.animate({'left': 0}); - drag_bg.animate({'width': 0}); - } - }); - - //清空事件 - function dragOk(){ - options.dragOkCallback && options.dragOkCallback() - var kuaiwidth=drag.width() - handler.width() - 2; - handler.removeClass('handler_bg').addClass('handler_ok_bg'); - handler.css({'left':kuaiwidth+'px'}) - text.css({'width':kuaiwidth+'px'}); - text.text('验证通过'); - drag.css({'color': '#fff'}); - drag_bg.css({'width':kuaiwidth+'px'}) - handler.unbind('mousedown'); - $(document).unbind('mousemove'); - $(document).unbind('mouseup'); - $("#user_verification_notice").html(""); - $('#user_verification_notice').parent().hide(); - } - }; - })(jQuery); -} - -class DragValidator extends Component { - componentDidMount () { - // if($("#reg-drag").length>0 && IsPC()){ - $("#reg-drag").dragValidator({ - height: this.props.height, - dragOkCallback: () => { - this.props.dragOkCallback && this.props.dragOkCallback() - } - }); - // }else{ - // $("#reg-drag").empty(); - // } - } - empty() { - $("#reg-drag").empty(); - } - render() { - const height = this.props.height || 45; - const className = this.props.className - const successGreenColor = this.props.successGreenColor || '#29bd8b' - // newMain clearfix - return ( -
- - -
- ); - } -} - +import React, { Component } from 'react'; + +const $ = window.jQuery +const jQuery = $; +if (!$.drag) { + (function($){ + $.fn.dragValidator = function(options){ + var x, drag = this, isMove = false, defaults = { + }; + var options = $.extend(defaults, options); + //添加背景,文字,滑块 + var html = '
'+ + '
拖动滑块验证
'+ + '
'; + this.append(html); + + var handler = drag.find('.handler'); + var drag_bg = drag.find('.drag_bg'); + var text = drag.find('.drag_text'); + var maxWidth = text.width() - handler.width(); //能滑动的最大间距 + //鼠标按下时候的x轴的位置 + handler.mousedown(function(e){ + isMove = true; + x = e.pageX - parseInt(handler.css('left'), 10); + }); + + //鼠标指针在上下文移动时,移动距离大于0小于最大间距,滑块x轴位置等于鼠标移动距离 + $(document).mousemove(function(e){ + var _x = e.pageX - x; + var handler_offset = handler.offset(); + var lastX = e.clientX -x; + lastX = Math.max(0,Math.min(maxWidth,lastX)); + if(isMove){ + if(_x > 0 && _x <= maxWidth){ + handler.css({'left': lastX}); + drag_bg.css({'width': lastX}); + } + else if(lastX > maxWidth - 5 && lastX < maxWidth + 5 ){ //鼠标指针移动距离达到最大时清空事件 + dragOk(); + + } + } + }); + handler.mouseup(function(e){ + isMove = false; + var _x = e.pageX - x; + if(text.text() != '验证通过' && _x < maxWidth){ //鼠标松开时,如果没有达到最大距离位置,滑块就返回初始位置 + handler.animate({'left': 0}); + drag_bg.animate({'width': 0}); + } + }); + + //清空事件 + function dragOk(){ + options.dragOkCallback && options.dragOkCallback() + var kuaiwidth=drag.width() - handler.width() - 2; + handler.removeClass('handler_bg').addClass('handler_ok_bg'); + handler.css({'left':kuaiwidth+'px'}) + text.css({'width':kuaiwidth+'px'}); + text.text('验证通过'); + drag.css({'color': '#fff'}); + drag_bg.css({'width':kuaiwidth+'px'}) + handler.unbind('mousedown'); + $(document).unbind('mousemove'); + $(document).unbind('mouseup'); + $("#user_verification_notice").html(""); + $('#user_verification_notice').parent().hide(); + } + }; + })(jQuery); +} + +class DragValidator extends Component { + componentDidMount () { + // if($("#reg-drag").length>0 && IsPC()){ + $("#reg-drag").dragValidator({ + height: this.props.height, + dragOkCallback: () => { + this.props.dragOkCallback && this.props.dragOkCallback() + } + }); + // }else{ + // $("#reg-drag").empty(); + // } + } + empty() { + $("#reg-drag").empty(); + } + render() { + const height = this.props.height || 45; + const className = this.props.className + const successGreenColor = this.props.successGreenColor || '#29bd8b' + // newMain clearfix + return ( +
+ + +
+ ); + } +} + export default ( DragValidator ); \ No newline at end of file diff --git a/public/react/src/common/components/DragValidatortwo.js b/public/react/src/common/components/DragValidatortwo.js deleted file mode 100644 index 2b789063e..000000000 --- a/public/react/src/common/components/DragValidatortwo.js +++ /dev/null @@ -1,114 +0,0 @@ -import React, { Component } from 'react'; - -const $ = window.jQuery -const jQuery = $; -if (!$.drag) { - (function($){ - $.fn.dragValidator = function(options){ - var x, drag = this, isMove = false, defaults = { - }; - var options = $.extend(defaults, options); - //添加背景,文字,滑块 - var html = '
'+ - '
拖动滑块验证
'+ - '
'; - this.append(html); - - var handler = drag.find('.handler'); - var drag_bg = drag.find('.drag_bg'); - var text = drag.find('.drag_text'); - var maxWidth = text.width() - handler.width(); //能滑动的最大间距 - //鼠标按下时候的x轴的位置 - handler.mousedown(function(e){ - isMove = true; - x = e.pageX - parseInt(handler.css('left'), 10); - }); - - //鼠标指针在上下文移动时,移动距离大于0小于最大间距,滑块x轴位置等于鼠标移动距离 - $(document).mousemove(function(e){ - var _x = e.pageX - x; - var handler_offset = handler.offset(); - var lastX = e.clientX -x; - lastX = Math.max(0,Math.min(maxWidth,lastX)); - if(isMove){ - if(_x > 0 && _x <= maxWidth){ - handler.css({'left': lastX}); - drag_bg.css({'width': lastX}); - } - else if(lastX > maxWidth - 5 && lastX < maxWidth + 5 ){ //鼠标指针移动距离达到最大时清空事件 - dragOk(); - } - } - }); - handler.mouseup(function(e){ - isMove = false; - var _x = e.pageX - x; - if(text.text() != '验证通过' && _x < maxWidth){ //鼠标松开时,如果没有达到最大距离位置,滑块就返回初始位置 - handler.animate({'left': 0}); - drag_bg.animate({'width': 0}); - } - }); - - //清空事件 - function dragOk(){ - options.dragOkCallback && options.dragOkCallback() - var kuaiwidth=drag.width() - handler.width() - 2; - handler.removeClass('handler_bg').addClass('handler_ok_bg'); - handler.css({'left':kuaiwidth+'px'}) - text.css({'width':kuaiwidth+'px'}); - text.text('验证通过'); - drag.css({'color': '#fff'}); - drag_bg.css({'width':kuaiwidth+'px'}) - handler.unbind('mousedown'); - $(document).unbind('mousemove'); - $(document).unbind('mouseup'); - $("#user_verification_notice").html(""); - $('#user_verification_notice').parent().hide(); - } - }; - })(jQuery); -} - -class DragValidator extends Component { - componentDidMount () { - // if($("#reg-drag").length>0 && IsPC()){ - $("#reg-drag").dragValidator({ - height: this.props.height, - dragOkCallback: () => { - this.props.dragOkCallback && this.props.dragOkCallback() - } - }); - // }else{ - // $("#reg-drag").empty(); - // } - } - empty() { - $("#reg-drag").empty(); - } - render() { - const height = this.props.height || 45; - const className = this.props.className - const successGreenColor = this.props.successGreenColor || '#29bd8b' - // newMain clearfix - return ( -
- - -
- ); - } -} - -export default ( DragValidator ); \ No newline at end of file diff --git a/public/react/src/modules/courses/boards/BoardsNew.js b/public/react/src/modules/courses/boards/BoardsNew.js index 9833e9eb3..8d9db7c3f 100644 --- a/public/react/src/modules/courses/boards/BoardsNew.js +++ b/public/react/src/modules/courses/boards/BoardsNew.js @@ -239,6 +239,7 @@ class BoardsNew extends Component{ render() { let { addGroup, fileList, course_id, title_num } = this.state; const { getFieldDecorator } = this.props.form; + const { current_user } = this.props const formItemLayout = { labelCol: { @@ -299,7 +300,7 @@ class BoardsNew extends Component{ `}
diff --git a/public/react/src/modules/courses/boards/TopicDetail.js b/public/react/src/modules/courses/boards/TopicDetail.js index 6309ac491..7aaecdd16 100644 --- a/public/react/src/modules/courses/boards/TopicDetail.js +++ b/public/react/src/modules/courses/boards/TopicDetail.js @@ -546,7 +546,7 @@ class TopicDetail extends Component { } `} diff --git a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js index 5960406e3..ff8e3e3a2 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js @@ -145,6 +145,7 @@ class CommonWorkDetailIndex extends Component{ , end_immediately, publish_immediately, work_statuses, accessoryVisible } =this.state; + const { current_user } = this.props let courseId=this.props.match.params.coursesId; let category_id= category && category.category_id; @@ -197,15 +198,15 @@ class CommonWorkDetailIndex extends Component{ background: #fff; } `} - + ]}>}
36 ? homework_name : ''}`} diff --git a/public/react/src/modules/courses/busyWork/CommonWorkPost.js b/public/react/src/modules/courses/busyWork/CommonWorkPost.js index 4c5578d2c..f2b92b47d 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkPost.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkPost.js @@ -481,6 +481,7 @@ render(){ course_name, homework_name, memberNumMax, memberNumMin } =this.state; + const { current_user } = this.props let courseId=this.props.match.params.coursesId; let workId=this.props.match.params.workId; @@ -522,7 +523,6 @@ render(){ const moduleName = this.props.getModuleName() const moduleCHName = this.props.getModuleName(true) const isGroup = this.props.isGroup() - const { current_user } = this.props; return( @@ -540,7 +540,7 @@ render(){

- {course_name} + {course_name} > {moduleCHName} > diff --git a/public/react/src/modules/courses/busyWork/NewWork.js b/public/react/src/modules/courses/busyWork/NewWork.js index 3bb77dfb5..2519f95e2 100644 --- a/public/react/src/modules/courses/busyWork/NewWork.js +++ b/public/react/src/modules/courses/busyWork/NewWork.js @@ -313,6 +313,7 @@ class NewWork extends Component{ init_max_num, init_min_num, title_num, course_name, category, has_commit, has_project }=this.state + const { current_user } = this.props const courseId = this.state.course_id || this.props.match.params.coursesId ; const isEdit = this.isEdit; @@ -369,7 +370,7 @@ class NewWork extends Component{ {pageType==="new"?"新建":"编辑"}

*/} 20){ this.setState({ NavmodalValuetype:true, - NavmodalValues:"名称不能超过20个字" + NavmodalValues:"名称不能超过60个字" }) return } diff --git a/public/react/src/modules/courses/coursesPublic/AddcoursesNav.js b/public/react/src/modules/courses/coursesPublic/AddcoursesNav.js index 74c03808a..756ae62a6 100644 --- a/public/react/src/modules/courses/coursesPublic/AddcoursesNav.js +++ b/public/react/src/modules/courses/coursesPublic/AddcoursesNav.js @@ -1,74 +1,74 @@ -import React,{ Component } from "react"; -import { Modal,Checkbox,Input,Select} from "antd"; -const Option = Select.Option; - -class AddcoursesNav extends Component{ - constructor(props){ - super(props); - this.state={ - StudentList_value:"" - } - } - - - - render(){ - // let {StudentList_value}=this.state; - // let {child}=this.props; - // - return( -
- - - - {this.props.addnametab===2? -
-
目录名称:
- -
- 取消 - 确定 -
-
- : this.props.addnametab===4? -
-
选择目录名称:
- - - -
- 取消 - 确定 -
-
- :""} -
- -
- ) - } -} -export default AddcoursesNav; - - +import React,{ Component } from "react"; +import { Modal,Checkbox,Input,Select} from "antd"; +const Option = Select.Option; + +class AddcoursesNav extends Component{ + constructor(props){ + super(props); + this.state={ + StudentList_value:"" + } + } + + + + render(){ + // let {StudentList_value}=this.state; + // let {child}=this.props; + // + return( +
+ + + + {this.props.addnametab===2? +
+
目录名称:
+ +
+ 取消 + 确定 +
+
+ : this.props.addnametab===4? +
+
选择目录名称:
+ + + +
+ 取消 + 确定 +
+
+ :""} +
+ +
+ ) + } +} +export default AddcoursesNav; + + diff --git a/public/react/src/modules/courses/coursesPublic/ModalsRename.js b/public/react/src/modules/courses/coursesPublic/ModalsRename.js index 61d0c1cd7..1398c50ff 100644 --- a/public/react/src/modules/courses/coursesPublic/ModalsRename.js +++ b/public/react/src/modules/courses/coursesPublic/ModalsRename.js @@ -1,63 +1,63 @@ -import React,{ Component } from "react"; -import { Modal,Checkbox,Upload,Button,Icon,message,Input} from "antd"; -import axios from 'axios'; - -class ModalsRename extends Component{ - constructor(props){ - super(props); - this.state={ - name:this.props.NavmodalValue - } - } - - saveNavmoda=()=>{ - let{url}=this.props; - let{name}=this.state; - - axios.post(url, {name:name}).then((result) => { - if(result.data.status===0){ - this.props.showNotification(result.data.message); - this.props.cannerNavmoda(); - this.props.coursupdata(); - }} - ) - } - - setNavmodalValue=(e)=>{ - console.log(e.target.value) - this.setState({ - name:e.target.value - }) - } - - render(){ - return( -
- -
{this.props.Navname}名称:
- - -
-
- ) - } -} +import React,{ Component } from "react"; +import { Modal,Checkbox,Upload,Button,Icon,message,Input} from "antd"; +import axios from 'axios'; + +class ModalsRename extends Component{ + constructor(props){ + super(props); + this.state={ + name:this.props.NavmodalValue + } + } + + saveNavmoda=()=>{ + let{url}=this.props; + let{name}=this.state; + + axios.post(url, {name:name}).then((result) => { + if(result.data.status===0){ + this.props.showNotification(result.data.message); + this.props.cannerNavmoda(); + this.props.coursupdata(); + }} + ) + } + + setNavmodalValue=(e)=>{ + console.log(e.target.value) + this.setState({ + name:e.target.value + }) + } + + render(){ + return( +
+ +
{this.props.Navname}名称:
+ + +
+
+ ) + } +} export default ModalsRename; \ No newline at end of file diff --git a/public/react/src/modules/courses/exercise/ExerciseDisplay.js b/public/react/src/modules/courses/exercise/ExerciseDisplay.js index 4da4768d2..bd70bece6 100644 --- a/public/react/src/modules/courses/exercise/ExerciseDisplay.js +++ b/public/react/src/modules/courses/exercise/ExerciseDisplay.js @@ -120,35 +120,35 @@ class ExerciseDisplay extends Component{ return } else if (item.question_type == 2) { return } else if (item.question_type == 3) { return } else if (item.question_type == 4) { return } else if (item.question_type == 5) { return } diff --git a/public/react/src/modules/courses/exercise/ExerciseNew.js b/public/react/src/modules/courses/exercise/ExerciseNew.js index 0e1489c72..f5332d56e 100644 --- a/public/react/src/modules/courses/exercise/ExerciseNew.js +++ b/public/react/src/modules/courses/exercise/ExerciseNew.js @@ -369,6 +369,7 @@ class ExerciceNew extends Component{ }, }; + const { current_user } = this.props const isAdmin = this.props.isAdmin() const courseId=this.props.match.params.coursesId; const exercise_id = this.props.match.params.Id @@ -406,11 +407,11 @@ class ExerciceNew extends Component{ } `}
- + ]}> }

{this.isEdit ? "编辑" : "新建"}试卷 diff --git a/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js b/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js index eb8143c03..cd3355082 100644 --- a/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js +++ b/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js @@ -509,7 +509,7 @@ class ExerciseReviewAndAnswer extends Component{ }=this.state let isAdmin = this.props.isAdmin(); let isStudent =this.props.isStudent(); - + const { current_user } = this.props console.log(data&&data.exercise.user_name) return(

@@ -537,7 +537,7 @@ class ExerciseReviewAndAnswer extends Component{ />

- {courseName} + {courseName} > {data && data.left_banner_name} > diff --git a/public/react/src/modules/courses/graduation/topics/GraduateTopicDetail.js b/public/react/src/modules/courses/graduation/topics/GraduateTopicDetail.js index be3ff7a30..c0e8fe185 100644 --- a/public/react/src/modules/courses/graduation/topics/GraduateTopicDetail.js +++ b/public/react/src/modules/courses/graduation/topics/GraduateTopicDetail.js @@ -96,6 +96,7 @@ class GraduateTopicDetail extends Component{ tablePageSize, tab, }=this.state + const { current_user } = this.props let {course_id,graduation_topic_id}=this.props.match.params; const isStudent =this.props.isStudent(); const isAdmin =this.props.isAdmin(); @@ -104,7 +105,7 @@ class GraduateTopicDetail extends Component{

- {tableData && tableData.course_name} + {tableData && tableData.course_name} > {tableData.graduation_name} > diff --git a/public/react/src/modules/courses/graduation/topics/GraduateTopicNew.js b/public/react/src/modules/courses/graduation/topics/GraduateTopicNew.js index d71cec73b..569c76331 100644 --- a/public/react/src/modules/courses/graduation/topics/GraduateTopicNew.js +++ b/public/react/src/modules/courses/graduation/topics/GraduateTopicNew.js @@ -276,6 +276,7 @@ class GraduateTopicNew extends Component{ course_name, left_banner_name } = this.state; + const { current_user } = this.props const { getFieldDecorator } = this.props.form; let{ topicId,coursesId }=this.props.match.params console.log(this.props); @@ -322,7 +323,7 @@ class GraduateTopicNew extends Component{ `}

- {course_name} + {course_name} > {left_banner_name} > diff --git a/public/react/src/modules/courses/new/CoursesNew.js b/public/react/src/modules/courses/new/CoursesNew.js index c8b090b8b..73c1dded9 100644 --- a/public/react/src/modules/courses/new/CoursesNew.js +++ b/public/react/src/modules/courses/new/CoursesNew.js @@ -301,7 +301,7 @@ class CoursesNew extends Component { if(value!=""){ this.props.form.setFieldsValue({ classroom:value, - course:value + // course:value }); this.Searchvalue(value) } @@ -311,7 +311,7 @@ class CoursesNew extends Component { handleChange=(value)=>{ this.props.form.setFieldsValue({ - course:value, + // course:value, classroom:value }) }; @@ -320,7 +320,7 @@ class CoursesNew extends Component { if(value!="") { this.props.form.setFieldsValue({ - school: value, + // school: value, fetching: true, }); @@ -331,7 +331,7 @@ class CoursesNew extends Component { handleChangeschools=(value)=>{ this.props.form.setFieldsValue({ - school: value, + // school: value, fetching: true, }); } @@ -347,9 +347,9 @@ class CoursesNew extends Component { }; getschool=(value)=>{ - this.props.form.setFieldsValue({ - school: value - }) + // this.props.form.setFieldsValue({ + // school: value + // }) let url="/schools/school_list.json"; axios.get(url,{ params: { @@ -359,7 +359,7 @@ class CoursesNew extends Component { if (result.data.status===0) { this.setState({ searchlistscholl: result.data.school_names, - school: value + // school: value }) } @@ -367,9 +367,9 @@ class CoursesNew extends Component { console.log(error) }) } - showApplyForAddOrgModal = () => { - this.applyForAddOrgForm.setVisible(true) - } + showApplyForAddOrgModal = () => { + this.applyForAddOrgForm.setVisible(true) + } render() { let {datatime,school,searchlistscholl} = this.state; const {getFieldDecorator} = this.props.form; diff --git a/public/react/src/modules/courses/poll/PollDetailIndex.js b/public/react/src/modules/courses/poll/PollDetailIndex.js index 8e3f78d5c..9119b7902 100644 --- a/public/react/src/modules/courses/poll/PollDetailIndex.js +++ b/public/react/src/modules/courses/poll/PollDetailIndex.js @@ -110,7 +110,7 @@ class PollDetailIndex extends Component{ } render(){ let {tab,pollDetail,user_permission}=this.state; - + const { current_user } = this.props; const isAdmin =this.props.isAdmin(); const isStudent = this.props.isStudent(); return( @@ -123,7 +123,7 @@ class PollDetailIndex extends Component{ />

- {this.props.coursedata.name} + {this.props.coursedata.name} > 问卷 > diff --git a/public/react/src/modules/courses/poll/PollInfo.js b/public/react/src/modules/courses/poll/PollInfo.js index fc1d55385..f32d652c2 100644 --- a/public/react/src/modules/courses/poll/PollInfo.js +++ b/public/react/src/modules/courses/poll/PollInfo.js @@ -299,6 +299,7 @@ class PollInfo extends Component{ modalSave, questionPanelFixed }=this.state; + const { current_user } = this.props let isAdmin=this.props.isAdmin(); let isStudent=this.props.isStudent(); return( @@ -314,7 +315,7 @@ class PollInfo extends Component{ >

- {courseName} + {courseName} > 问卷 > diff --git a/public/react/src/modules/courses/poll/PollNew.js b/public/react/src/modules/courses/poll/PollNew.js index 0c4109ceb..cd559b75f 100644 --- a/public/react/src/modules/courses/poll/PollNew.js +++ b/public/react/src/modules/courses/poll/PollNew.js @@ -2320,12 +2320,17 @@ class PollNew extends Component { } gotohome=()=>{ - let courseId=this.props.match.params.coursesId; - if(courseId===undefined){ - this.props.history.push("/courses"); - }else{ - this.props.history.push(this.props.current_user.first_category_url); - } + const { current_user} = this.props + + this.props.history.push(current_user.first_category_url); + + + // let courseId=this.props.match.params.coursesId; + // if(courseId===undefined){ + // this.props.history.push("/courses"); + // }else{ + // this.props.history.push(this.props.current_user.first_category_url); + // } } //试图 render() { diff --git a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js index db58e95fd..8bb2bbcfd 100644 --- a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js +++ b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js @@ -997,10 +997,10 @@ class Listofworksstudentone extends Component { if(result === undefined){ return } - if(result.data.message!==undefined){ - - return; - } + // if(result.data.message!==undefined){ + // + // return; + // } this.setState({ teacherdata: result.data, @@ -1017,6 +1017,7 @@ class Listofworksstudentone extends Component { view_report: result.data.view_report, allow_late:result.data.allow_late, loadingstate: false, + computeTimetype:true, }) this.seacthdatat(result.data,result.data.student_works,result.data.work_efficiency,result.data.course_group_info,1); @@ -1059,9 +1060,6 @@ class Listofworksstudentone extends Component { } axios.post(urll, data).then((result) => { if (result) { - if(result.data.message!==undefined){ - return; - } // console.log("学生未截至未公开的作品列表") // console.log(JSON.stringify(result)) this.setState({ @@ -1482,6 +1480,7 @@ class Listofworksstudentone extends Component { } //计算成绩 setComputeTime=()=>{ + let matchurl = this.props.match.url; let {teacherdata}=this.state; this.setState({ computeTimetype:false @@ -1490,10 +1489,14 @@ class Listofworksstudentone extends Component { let url = "/homework_commons/"+homeworkid+"/update_student_score.json?shixun_id="+teacherdata.shixun_id; axios.get(url).then((response) => { - - this.props.showNotification(`${response.data.message}`); - // var homeworkid = this.props.match.params.homeworkid; - this.Getalistofworks(homeworkid); + if(response){ + if(response.data.status===0) { + this.props.showNotification(`${response.data.message}`); + // var homeworkid = this.props.match.params.homeworkid; + this.Getalistofworks(homeworkid); + // this.props.history.replace(matchurl); + } + } // this.Getalistofworkstwo("", "", "", "", 1, 20); }).catch((error) => { console.log(error) @@ -2147,6 +2150,9 @@ class Listofworksstudentone extends Component { } setComputeTimet=()=>{ + + let matchurl = this.props.match.url; + this.setState({ computeTimetype:false }) @@ -2155,14 +2161,17 @@ class Listofworksstudentone extends Component { axios.get(url).then((response) => { if(response){ - if(response.data.message!==undefined){ - return; - } + if(response.data.status===0){ + // if(response.data.message!==undefined){ + // return; + // } this.setState({ loadingstate: true }) - this.Startsortingt(this.state.orders, this.state.course_groupyslstwo, this.state.checkedValuesineinfo, this.state.searchtext, 1, this.state.limit); + this.Getalistofworks(homeworkid); this.props.showNotification(`${response.data.message}`); + } + // this.props.history.replace( matchurl ); } }).catch((error) => { console.log(error) @@ -2208,9 +2217,6 @@ class Listofworksstudentone extends Component { if(response === undefined){ return } - if(response.data.message!==undefined){ - return; - } if(response.data.status&&response.data.status===-1){ }else if(response.data.status&&response.data.status===-2){ diff --git a/public/react/src/modules/courses/shixunHomework/ShixunHomeworkPage.js b/public/react/src/modules/courses/shixunHomework/ShixunHomeworkPage.js index e2285a7a6..fec98e69b 100644 --- a/public/react/src/modules/courses/shixunHomework/ShixunHomeworkPage.js +++ b/public/react/src/modules/courses/shixunHomework/ShixunHomeworkPage.js @@ -123,9 +123,9 @@ class ShixunHomeworkPage extends Component { let {tab, teacherdatapage, jobsettingsdatapage} = this.state; const isAdmin = this.props.isAdmin(); - console.log(119) - console.log(jobsettingsdatapage); - console.log(teacherdatapage); + // console.log(119) + // console.log(jobsettingsdatapage); + // console.log(teacherdatapage); return (

diff --git a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js index ec45b081c..b07392153 100644 --- a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js +++ b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js @@ -196,8 +196,8 @@ class Trainingjobsetting extends Component { array.push({ course_group_id: result.data.group_settings[i].group_id, course_group_name: result.data.group_settings[i].group_name, - publish_time: result.data.group_settings[i].publish_time, - end_time: result.data.group_settings[i].end_time, + publish_time: moment(result.data.group_settings[i].publish_time).format('YYYY-MM-DD HH:mm'), + end_time: moment(result.data.group_settings[i].end_time).format('YYYY-MM-DD HH:mm'), publish_flag: "", end_flag: "", class_flag: "", @@ -215,8 +215,8 @@ class Trainingjobsetting extends Component { arrays.push({ course_group_id:result.data.group_settings[i].group_id, course_group_name:result.data.group_settings[i].group_name, - publish_time:result.data.group_settings[i].publish_time, - end_time:result.data.group_settings[i].end_time, + publish_time:moment( result.data.group_settings[i].publish_time).format('YYYY-MM-DD HH:mm') , + end_time:moment(result.data.group_settings[i].end_time ).format('YYYY-MM-DD HH:mm'), course_choosed:0, }) @@ -447,8 +447,8 @@ class Trainingjobsetting extends Component { } else { let rulesdata=this.state.rulesdata; - // console.log("pustdate123131312321321321"); - // console.log(rulesdata); + console.log("pustdate123131312321321321"); + console.log(rulesdata); if( rulesdata.length === 0){ this.props.showNotification(`分班发布设置不能为空`); @@ -479,8 +479,8 @@ class Trainingjobsetting extends Component { return; } - if (this.state.latededuction <= 0) { - this.props.showNotification(`迟交扣分数不能小于等于零`); + if (this.state.latededuction <0) { + this.props.showNotification(`迟交扣分数不能小于零`); return; } @@ -577,6 +577,8 @@ class Trainingjobsetting extends Component { this.props.showNotification(`没有关卡不能更新设置`); return; } + + if(this.state.unifiedsetting === true){ console.log("统一设置"); data = { @@ -588,23 +590,37 @@ class Trainingjobsetting extends Component { late_time: moment(this.state.late_time).format('YYYY-MM-DD HH:mm'), //结束时间 answer_open_evaluation: this.state.level === "满分" ? true : false, //扣分项 work_efficiency: this.state.completionefficiencyscore, //完成效率评分占比 - eff_score: this.state.completionefficiencyscore === true ? this.state.latedeductiontwo : 0,//占比分 + eff_score: this.state.completionefficiencyscore === true ? this.state.latedeductiontwo : undefined,//占比分 shixun_evaluation: this.state.proportion === "均分比例" ? 0 : this.state.proportion === "经验值比例" ? 1 : this.state.proportion === "自定义分值" ? 2 : 0, challenge_settings: array, score_open: this.state.publicwork, } }else{ - //非统一配置 - console.log("非统一设置"); + // //非统一配置 + // console.log("非统一设置"); + let rulesdata=this.state.rulesdata; + + let newlist=[] + + rulesdata.map((item,key)=>{ + + if(item.publish_time==="Invalid date"||item.end_time==="Invalid date"||item.publiend_timesh_time==="Invalid date"){ + + }else{ + newlist.push(item) + } + + }) + data = { unified_setting: this.state.unifiedsetting, //非统一配置 - group_settings: this.state.rulesdata, + group_settings: newlist, allow_late: this.state.allowreplenishment, //补交 late_penalty: parseInt(this.state.latededuction), //迟交扣分 late_time: moment(this.state.late_time).format('YYYY-MM-DD HH:mm'), //结束时间 answer_open_evaluation: this.state.level === "满分" ? true : false, //扣分项 work_efficiency: this.state.completionefficiencyscore, //完成效率评分占比 - eff_score: this.state.completionefficiencyscore === true ? this.state.latedeductiontwo : 0,//占比分 + eff_score: this.state.completionefficiencyscore === true ? this.state.latedeductiontwo : undefined,//占比分 shixun_evaluation: this.state.proportion === "均分比例" ? 0 : this.state.proportion === "经验值比例" ? 1 : this.state.proportion === "自定义分值" ? 2 : 0, challenge_settings: array, score_open: this.state.publicwork, @@ -1710,8 +1726,8 @@ class Trainingjobsetting extends Component { } } - console.log(rules) - console.log(datas) + console.log(rules); + console.log(datas); this.setState({ rules, rulesdata:datas, diff --git a/public/react/src/modules/login/EducoderLogin.js b/public/react/src/modules/login/EducoderLogin.js index 713593100..eed3a9add 100644 --- a/public/react/src/modules/login/EducoderLogin.js +++ b/public/react/src/modules/login/EducoderLogin.js @@ -148,7 +148,7 @@ class EducoderLogin extends Component { "align-items": "center", "width": "100%" }}> -
+
this.gohome()} src={educodernet}/>
diff --git a/public/react/src/modules/paths/Index.js b/public/react/src/modules/paths/Index.js index a26228ed5..a7efc43bc 100644 --- a/public/react/src/modules/paths/Index.js +++ b/public/react/src/modules/paths/Index.js @@ -1,52 +1,58 @@ -import React, { Component } from 'react'; - -import { SnackbarHOC } from 'educoder'; - - -import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; -import Loadable from 'react-loadable'; -import Loading from '../../Loading'; -import { TPMIndexHOC } from '../tpm/TPMIndexHOC'; - -const PathsDetail = Loadable({ - loader: () => import('./PathDetail/PathDetailIndex'), - loading:Loading, -}) -const PathsNew = Loadable({ - loader: () => import('./PathNew'), - loading:Loading, -}) -const Statistics = Loadable({ - loader: () => import('./SchoolStatistics/Statistics'), - loading:Loading -}) - -const ShixunPaths = Loadable({ - loader: () => import('./ShixunPaths'), - loading:Loading, -}) - - -class Index extends Component{ - constructor(props) { - super(props) - } - render() { - return ( -
- - - ()} - > - ()} - > - - - -
- ) - } -} +import React, { Component } from 'react'; + +import { SnackbarHOC } from 'educoder'; + + +import {BrowserRouter as Router,Route,Switch} from 'react-router-dom'; +import Loadable from 'react-loadable'; +import Loading from '../../Loading'; +import { TPMIndexHOC } from '../tpm/TPMIndexHOC'; + +const PathsDetail = Loadable({ + loader: () => import('./PathDetail/PathDetailIndex'), + loading:Loading, +}) +const PathsNew = Loadable({ + loader: () => import('./PathNew'), + loading:Loading, +}) +const Statistics = Loadable({ + loader: () => import('./SchoolStatistics/Statistics'), + loading:Loading +}) + +const ShixunPaths = Loadable({ + loader: () => import('./ShixunPaths'), + loading:Loading, +}) + + +class Index extends Component{ + constructor(props) { + super(props) + } + render() { + return ( +
+ + + + ()} + > + ()} + > + + ()} + > + + {/**/} + + +
+ ) + } +} export default SnackbarHOC() ( TPMIndexHOC(Index) ); \ No newline at end of file diff --git a/public/react/src/modules/paths/PathDetail/DetailCards.js b/public/react/src/modules/paths/PathDetail/DetailCards.js index 115f7066c..fc75961ec 100644 --- a/public/react/src/modules/paths/PathDetail/DetailCards.js +++ b/public/react/src/modules/paths/PathDetail/DetailCards.js @@ -314,6 +314,7 @@ class DetailCards extends Component{ showparagraphindex }=this.state; const antIcon = ; + return(
+
{ pathCardsList && pathCardsList.map((item,key)=>{ @@ -374,7 +388,7 @@ class DetailCards extends Component{ - {item.stage_name} + {item.stage_name} { idsum===key&&pathCardsedittype===true?'': @@ -442,20 +456,20 @@ class DetailCards extends Component{ : } - + {key+1}-{index+1}  {line.shixun_name} { - line.shixun_status==="暂未公开"? + this.props.current_user&&this.props.current_user.admin===false&&line.shixun_status==="暂未公开"?
  • 暂未公开
  • :
  • { showparagraphkey===key&&showparagraphindex===index?:"" } diff --git a/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js b/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js index 340505655..912302cb8 100644 --- a/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js +++ b/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js @@ -402,7 +402,7 @@ class DetailCardsEditAndAdd extends Component{
    *
    - +
    名称不能为空
    必填项
    diff --git a/public/react/src/modules/paths/PathDetail/DetailCardsEditAndEdit.js b/public/react/src/modules/paths/PathDetail/DetailCardsEditAndEdit.js index 1bf137016..f91cf0e96 100644 --- a/public/react/src/modules/paths/PathDetail/DetailCardsEditAndEdit.js +++ b/public/react/src/modules/paths/PathDetail/DetailCardsEditAndEdit.js @@ -435,7 +435,7 @@ class DetailCardsEditAndEdit extends Component{
    *
    - +
    名称不能为空
    必填项
    diff --git a/public/react/src/modules/paths/PathDetail/DetailCardsTemp.js b/public/react/src/modules/paths/PathDetail/DetailCardsTemp.js index 4acc28a48..5150d14da 100644 --- a/public/react/src/modules/paths/PathDetail/DetailCardsTemp.js +++ b/public/react/src/modules/paths/PathDetail/DetailCardsTemp.js @@ -1,5 +1,6 @@ import React, { Component } from 'react'; import {getImageUrl} from 'educoder'; +import { Tooltip } from 'antd'; import '../../paths/ShixunPaths.css'; import DetailCardsEditAndAdd from './DetailCardsEditAndAdd'; import axios from 'axios'; @@ -85,16 +86,26 @@ class DetailCards extends Component{ + {item.stage_name} - - - - - - + + + + + + + + - + + + + + + + +

    {item.stage_description}

    diff --git a/public/react/src/modules/paths/PathDetail/DetailTop.js b/public/react/src/modules/paths/PathDetail/DetailTop.js index 50c5c2680..09425df92 100644 --- a/public/react/src/modules/paths/PathDetail/DetailTop.js +++ b/public/react/src/modules/paths/PathDetail/DetailTop.js @@ -1,238 +1,241 @@ -import React,{ Component } from "react"; -import { Modal,Radio,Input,Tooltip } from "antd"; -import { BrowserRouter as Router, Route, Link } from "react-router-dom"; -import SendPanel from "./sendPanel.js"; -import { getImageUrl } from 'educoder'; -import axios from 'axios'; -import Modals from '../../modals/Modals'; -import './DetailTop.css'; - -const Search = Input.Search; -const RadioGroup = Radio.Group; -class DetailTop extends Component{ - constructor(props){ - super(props) - this.state={ - cardsModalcancel:this.cardsModalcancel, - cardsModalsave:this.cardsModalsave, - Modalstype:false, - Modalstopval:"", - Modalsbottomval:'', - loadtype:false, - deletepathtype:false, - cardsModalsavetype:false - } - } - - allow_deletepath=()=>{ - this.setState({ - Modalstype:true, - Modalstopval:"是否删除路径?", - deletepathtype:true - }) - } - - applyissuePath=()=>{ - this.setState({ - Modalstype:true, - Modalstopval:"发布申请已提交,请等待管理员的审核", - Modalsbottomval:"• 我们将在1-2个工作日内完成审核", - loadtype:true - }) - } - - cancelissuePath=()=>{ - let pathId=this.props.match.params.pathId; - let url ="/paths/"+pathId+"/cancel_publish.json"; - axios.get(url).then((result)=>{ - if(result.status===200){ - if(result.data.status===0){ - - }else if(result.data.status===1){ - window.location.href = "/paths/" + result.data.subject_id - } - } - }).catch((error)=>{ - console.log(error); - }) - } - - reovkissuePath=()=>{ - - this.setState({ - Modalstype:true, - Modalstopval:"是否确认撤销发布", - Modalsbottomval:"确认后,回退到编辑状态", - cardsModalsavetype:true, - }) - - } - reovkissuePaths=()=>{ - let pathId=this.props.match.params.pathId; - let url ="/paths/"+pathId+"/cancel_has_publish.json"; - axios.get(url).then((result)=>{ - if(result.status===200){ - if(result.data.status===0){ - - }else if(result.data.status===1){ - this.setState({ - cardsModalsavetype:false, - loadtype:false, - deletepathtype:false - }) - window.location.href = "/paths/" + result.data.subject_id - } - } - }).catch((error)=>{ - console.log(error); - }) - } - - cardsModalcancel=()=>{ - this.setState({ - Modalstype:false, - Modalsbottomval:'', - loadtype:false, - deletepathtype:false - }) - } - - cardsModalsave=()=>{ - let {loadtype,deletepathtype}=this.state; - - //删除路径 - if(deletepathtype===true){ - let pathid=this.props.match.params.pathId; - const deleteUrl = `/paths/`+pathid+`.json`; - axios.delete(deleteUrl).then((response) => { - const status = response.data.status - if (status === 1) { - window.location.href = "/paths"; - } - }).catch((error) => { - console.log(error) - }) - } - - //申请发布 - if(loadtype===true){ - - let pathid=this.props.match.params.pathId; - let url ="/paths/"+pathid+"/publish.json"; - axios.get(url).then((result)=>{ - if(result.status===200){ - if(result.data.status===0){ - this.setState({ - Modalstype:true, - Modalstopval: result.data.message, - }) - }else if(result.data.status===1){ - window.location.reload(); - } - } - }).catch((error)=>{ - console.log(error); - }) - - } - this.setState({ - Modalstype:false, - Modalsbottomval:'' - }) - } - - render(){ - let{detailInfoList}=this.props; - let{Modalstype,Modalstopval,cardsModalcancel,cardsModalsave,Modalsbottomval,cardsModalsavetype,loadtype}=this.state; - const radioStyle = { - display: 'block', - height: '30px', - lineHeight: '30px', - }; - - return( -
    - - - { - detailInfoList && -
    -
    - - {detailInfoList.name} - - - {detailInfoList===undefined?"":detailInfoList.allow_statistics===true? - - - :"" - } - - {detailInfoList===undefined?"":detailInfoList.allow_statistics===true? - - 学习统计 - :"" - } - - { detailInfoList.allow_send === true && - - } - -
    -
    - { - detailInfoList && -
      - { detailInfoList.stages_count!=0 ?
    • 章节{detailInfoList.stages_count}
    • : ""} - { detailInfoList.stage_shixuns_count!=0 ?
    • 实训{ detailInfoList.stage_shixuns_count}
    • : ""} - { detailInfoList.challenge_choose_count!=0 ?
    • 选择题任务{detailInfoList.challenge_choose_count}
    • : ""} - { detailInfoList.challenges_count!=0 ?
    • 实践任务{detailInfoList.challenges_count}
    • : ""} - { detailInfoList.subject_score!=0 ?
    • 经验值{detailInfoList.subject_score}
    • : ""} - { detailInfoList.member_count!=0 ?
    • 学习人数{detailInfoList.member_count}
    • : ""} -
    - } -
    - {detailInfoList===undefined?"":detailInfoList.allow_delete===true?删除路径:""} - - { - detailInfoList.publish_status===0&&detailInfoList.allow_statistics===true? - 申请发布:"" - } - - - { - detailInfoList.publish_status===1 && detailInfoList.allow_statistics===true? - 撤销申请:"" - } - - { - detailInfoList.publish_status===2 && detailInfoList.allow_statistics===true? - 撤销发布:"" - } -
    -
    -
    - } - -
    - ) - } -} +import React,{ Component } from "react"; +import { Modal,Radio,Input,Tooltip } from "antd"; +import { BrowserRouter as Router, Route, Link } from "react-router-dom"; +import SendPanel from "./sendPanel.js"; +import { getImageUrl } from 'educoder'; +import axios from 'axios'; +import Modals from '../../modals/Modals'; +import './DetailTop.css'; + +const Search = Input.Search; +const RadioGroup = Radio.Group; +class DetailTop extends Component{ + constructor(props){ + super(props) + this.state={ + cardsModalcancel:this.cardsModalcancel, + cardsModalsave:this.cardsModalsave, + Modalstype:false, + Modalstopval:"", + Modalsbottomval:'', + loadtype:false, + deletepathtype:false, + cardsModalsavetype:false + } + } + + allow_deletepath=()=>{ + this.setState({ + Modalstype:true, + Modalstopval:"是否删除路径?", + deletepathtype:true + }) + } + + applyissuePath=()=>{ + this.setState({ + Modalstype:true, + Modalstopval:"发布申请已提交,请等待管理员的审核", + Modalsbottomval:"• 我们将在1-2个工作日内完成审核", + loadtype:true + }) + } + + cancelissuePath=()=>{ + let pathId=this.props.match.params.pathId; + let url ="/paths/"+pathId+"/cancel_publish.json"; + axios.get(url).then((result)=>{ + if(result.status===200){ + if(result.data.status===0){ + + }else if(result.data.status===1){ + window.location.href = "/paths/" + result.data.subject_id + } + } + }).catch((error)=>{ + console.log(error); + }) + } + + reovkissuePath=()=>{ + + this.setState({ + Modalstype:true, + Modalstopval:"是否确认撤销发布", + Modalsbottomval:"确认后,回退到编辑状态", + cardsModalsavetype:true, + }) + + } + reovkissuePaths=()=>{ + let pathId=this.props.match.params.pathId; + let url ="/paths/"+pathId+"/cancel_has_publish.json"; + axios.get(url).then((result)=>{ + if(result.status===200){ + if(result.data.status===0){ + + }else if(result.data.status===1){ + this.setState({ + cardsModalsavetype:false, + loadtype:false, + deletepathtype:false + }) + window.location.href = "/paths/" + result.data.subject_id + } + } + }).catch((error)=>{ + console.log(error); + }) + } + + cardsModalcancel=()=>{ + this.setState({ + Modalstype:false, + Modalsbottomval:'', + loadtype:false, + deletepathtype:false + }) + } + + cardsModalsave=()=>{ + let {loadtype,deletepathtype}=this.state; + + //删除路径 + if(deletepathtype===true){ + let pathid=this.props.match.params.pathId; + const deleteUrl = `/paths/`+pathid+`.json`; + axios.delete(deleteUrl).then((response) => { + const status = response.data.status + if (status === 1) { + window.location.href = "/paths"; + } + }).catch((error) => { + console.log(error) + }) + } + + //申请发布 + if(loadtype===true){ + + let pathid=this.props.match.params.pathId; + let url ="/paths/"+pathid+"/publish.json"; + axios.get(url).then((result)=>{ + if(result.status===200){ + if(result.data.status===0){ + this.setState({ + Modalstype:true, + Modalstopval: result.data.message, + }) + }else if(result.data.status===1){ + window.location.reload(); + } + } + }).catch((error)=>{ + console.log(error); + }) + + } + this.setState({ + Modalstype:false, + Modalsbottomval:'' + }) + } + + render(){ + let{detailInfoList}=this.props; + let{Modalstype,Modalstopval,cardsModalcancel,cardsModalsave,Modalsbottomval,cardsModalsavetype,loadtype}=this.state; + const radioStyle = { + display: 'block', + height: '30px', + lineHeight: '30px', + }; + + return( +
    + + + { + detailInfoList && +
    +
    + + {detailInfoList.name} + + + {detailInfoList===undefined?"":detailInfoList.allow_statistics===true? + + + + + + :"" + } + + {detailInfoList===undefined?"":detailInfoList.allow_statistics===true? + + 学习统计 + :"" + } + + { detailInfoList.allow_send === true && + + } + +
    +
    + { + detailInfoList && +
      + { detailInfoList.stages_count!=0 ?
    • 章节{detailInfoList.stages_count}
    • : ""} + { detailInfoList.stage_shixuns_count!=0 ?
    • 实训{ detailInfoList.stage_shixuns_count}
    • : ""} + { detailInfoList.challenge_choose_count!=0 ?
    • 选择题任务{detailInfoList.challenge_choose_count}
    • : ""} + { detailInfoList.challenges_count!=0 ?
    • 实践任务{detailInfoList.challenges_count}
    • : ""} + { detailInfoList.subject_score!=0 ?
    • 经验值{detailInfoList.subject_score}
    • : ""} + { detailInfoList.member_count!=0 ?
    • 学习人数{detailInfoList.member_count}
    • : ""} +
    + } +
    + {detailInfoList===undefined?"":detailInfoList.allow_delete===true?删除路径:""} + + { + detailInfoList.publish_status===0&&detailInfoList.allow_statistics===true? + 申请发布:"" + } + + + { + detailInfoList.publish_status===1 && detailInfoList.allow_statistics===true? + 撤销申请:"" + } + + { + detailInfoList.publish_status===2 && detailInfoList.allow_statistics===true? + 撤销发布:"" + } +
    +
    +
    + } + +
    + ) + } +} export default DetailTop; \ No newline at end of file diff --git a/public/react/src/modules/paths/PathDetail/PathDetailIndex.js b/public/react/src/modules/paths/PathDetail/PathDetailIndex.js index 1731064c0..1ba1a3c13 100644 --- a/public/react/src/modules/paths/PathDetail/PathDetailIndex.js +++ b/public/react/src/modules/paths/PathDetail/PathDetailIndex.js @@ -140,10 +140,13 @@ class PathDetailIndex extends Component{ let url="/paths/"+pathid+".json"; axios.get(url).then((result)=>{ if (result.data.status === 407 || result.data.status === 401) { + debugger return; } if (result.data.status === 403) { + debugger + // window.location.href = "/403"; return; } @@ -165,9 +168,12 @@ class PathDetailIndex extends Component{ axios.get(url).then((result)=>{ // TODO 403 让后台返回status 403 比较好 if (result.data.status == 407 || result.data.status == 401) { + debugger return; } if (result.data.status === 403 ) { + debugger + // window.location.href = "/403"; return; } @@ -337,9 +343,11 @@ class PathDetailIndex extends Component{

    简介 {detailInfoList===undefined?"":detailInfoList.allow_statistics===true? + + :"" }

    @@ -363,9 +371,11 @@ class PathDetailIndex extends Component{

    课程须知 {detailInfoList===undefined?"":detailInfoList.allow_statistics===true? + - + + :"" }

    @@ -391,16 +401,18 @@ class PathDetailIndex extends Component{
    +
    15&&clickdetailInfoListtype===false?"newsubscript mb9 color-grey-9 fr":"newsubscript mb9 color-grey-9 none"} - data-tip-down="显示全部" onClick={()=>this.clickNewsubscript(0)} >...
    +
    +
    this.clickNewsubscript(1)}>
    +
    } diff --git a/public/react/src/modules/tpm/TPMsettings/TPMsettings.js b/public/react/src/modules/tpm/TPMsettings/TPMsettings.js index ed1249f0d..f6af871dd 100644 --- a/public/react/src/modules/tpm/TPMsettings/TPMsettings.js +++ b/public/react/src/modules/tpm/TPMsettings/TPMsettings.js @@ -31,6 +31,30 @@ const Option = Select.Option; const RadioGroup = Radio.Group; +// 处理整点 半点 +// 取传入时间往后的第一个半点 +export function handleDateStrings(dateString) { + if (!dateString) return dateString; + const ar = dateString.split(':') + if (ar[1] == '00' || ar[1] == '30') { + return dateString + } + const miniute = parseInt(ar[1]); + if (miniute < 30 || miniute == 60) { + return [ar[0], '30'].join(':') + } + if (miniute < 60) { + // 加一个小时 + const tempStr = [ar[0], '00'].join(':'); + const format = "YYYY-MM-DD HH:mm"; + const _moment = moment(tempStr, format) + _moment.add(1, 'hours') + return _moment.format(format) + } + + return dateString +} + // 恢复数据 function md_rec_data(k,mdu,id, editor){ if(window.sessionStorage.getItem(k+mdu) !== null){ @@ -1120,7 +1144,7 @@ export default class TPMsettings extends Component { } onChangeTimePicker =(value, dateString)=> { this.setState({ - opening_time:dateString + opening_time:moment(handleDateStrings(dateString)) }) } diff --git a/public/react/src/modules/tpm/component/TPMRightSection.js b/public/react/src/modules/tpm/component/TPMRightSection.js index 8479acd76..a3a7e9820 100644 --- a/public/react/src/modules/tpm/component/TPMRightSection.js +++ b/public/react/src/modules/tpm/component/TPMRightSection.js @@ -117,36 +117,6 @@ class TPMRightSection extends Component { } -
    -

    推荐实训

    -
    - { - TPMRightSectionData===undefined?"":TPMRightSectionData.recommands===undefined?"":TPMRightSectionData.recommands.map((item,key)=>{ - return( -
    - - 69?1526971094 - -
    - - {item.name} - -

    - {item.stu_num} 人学习 -

    -

    {item.level}

    -
    -
    - ) - }) - } -
    -
    - +
    +

    推荐实训

    +
    + { + TPMRightSectionData===undefined?"":TPMRightSectionData.recommands===undefined?"":TPMRightSectionData.recommands.map((item,key)=>{ + return( +
    + + 69?1526971094 + +
    + + {item.name} + +

    + {item.stu_num} 人学习 +

    +

    {item.level}

    +
    +
    + ) + }) + } +
    +
  • } diff --git a/public/react/src/modules/tpm/newshixuns/Newshixuns.js b/public/react/src/modules/tpm/newshixuns/Newshixuns.js index cb0f08c0f..c15269c5a 100644 --- a/public/react/src/modules/tpm/newshixuns/Newshixuns.js +++ b/public/react/src/modules/tpm/newshixuns/Newshixuns.js @@ -2,7 +2,7 @@ import React, {Component} from 'react'; import {TPMIndexHOC} from '../TPMIndexHOC'; -import {SnackbarHOC,handleDateString} from 'educoder'; +import {SnackbarHOC} from 'educoder'; import {Input, Select, Radio, Checkbox, Modal, Icon, DatePicker,Upload,Button,message,Form,notification} from 'antd'; @@ -16,6 +16,8 @@ import './css/Newshixuns.css'; import {getUrl} from 'educoder' +import moment from 'moment'; + let path = getUrl("/editormd/lib/") const $ = window.$; @@ -28,6 +30,34 @@ const Option = Select.Option; const RadioGroup = Radio.Group; const confirm = Modal.confirm; + + +// 处理整点 半点 +// 取传入时间往后的第一个半点 +export function handleDateStrings(dateString) { + if (!dateString) return dateString; + const ar = dateString.split(':') + if (ar[1] == '00' || ar[1] == '30') { + return dateString + } + const miniute = parseInt(ar[1]); + if (miniute < 30 || miniute == 60) { + return [ar[0], '30'].join(':') + } + if (miniute < 60) { + // 加一个小时 + const tempStr = [ar[0], '00'].join(':'); + const format = "YYYY-MM-DD HH:mm"; + const _moment = moment(tempStr, format) + _moment.add(1, 'hours') + return _moment.format(format) + } + + return dateString +} + + + // 恢复数据 function md_rec_data(k, mdu, id, editor) { if (window.sessionStorage.getItem(k + mdu) !== null) { @@ -713,7 +743,7 @@ class Newshixuns extends Component { onChangeTimePicker = (value, dateString) => { this.setState({ - TimePickervalue: handleDateString(dateString) + TimePickervalue: handleDateStrings(dateString) }) } // 附件相关 START diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js index f5d57ae21..65e95319e 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js @@ -293,11 +293,12 @@ class Challenges extends Component {

    简介 + + href={"/shixuns/" + id + "/settings?edit=1"} className="ring-green fr"> +

    {item.st === 0 ? - + + + : - + + + } 第{key+1}关 diff --git a/public/react/src/modules/tpm/shixunchild/Propaedeutics/Propaedeu_tics.js b/public/react/src/modules/tpm/shixunchild/Propaedeutics/Propaedeu_tics.js index a2b20415d..f40e9fa63 100644 --- a/public/react/src/modules/tpm/shixunchild/Propaedeutics/Propaedeu_tics.js +++ b/public/react/src/modules/tpm/shixunchild/Propaedeutics/Propaedeu_tics.js @@ -10,6 +10,8 @@ import classNames from 'classnames'; import { getImageUrl, toPath } from 'educoder'; +import { Tooltip } from 'antd'; + import axios from 'axios'; import { CircularProgress } from 'material-ui/Progress'; @@ -76,8 +78,10 @@ class Propaedeutics extends Component { return (

    - + + + +

    { loadingContent ? diff --git a/public/react/src/modules/user/CheckInputysl.js b/public/react/src/modules/user/CheckInputysl.js new file mode 100644 index 000000000..a057f12d4 --- /dev/null +++ b/public/react/src/modules/user/CheckInputysl.js @@ -0,0 +1,104 @@ +import React, { Component } from 'react'; +import "./secureCode.css"; + +/** + * An TextInput with Icon and check + * 带图标检查的输入框 + */ +class CheckInputysl extends Component { + constructor(){ + super(); + this.state = { + isMove:false, + start:0, + moveLength:0, + clear:false, + move:0, + width:0 + }; + this.onMouseUp = this.onMouseUp.bind(this); + this.onMouseDown = this.onMouseDown.bind(this); + this.onMouseMove = this.onMouseMove.bind(this); + } + componentDidMount() { + let dragHandler = document.getElementById("dragHandler"); + dragHandler.addEventListener("mousedown", this.onMouseDown); + } + onMouseDown(e){ + console.log("28"); + document.addEventListener("mousemove", this.onMouseMove); + document.addEventListener("mouseup", this.onMouseUp); + let event=e||window.event; + this.setState({ + isMove:true, + start:event.pageX + }); + } + onMouseUp(e){ + console.log("38"); + let event=e||window.event; + this.setState({ + isMove:false, + }); + let drag = window.getComputedStyle(this.verifyDOM); + let handler = window.getComputedStyle(this.handlerDOM); + let moveLength = event.clientX-this.verifyDOM.offsetLeft - Number.parseInt(handler.width) / 2; + // console.log(drag.width); + let maxWidth = Number.parseInt(drag.width) - Number.parseInt(handler.width); + console.log("moveLength="+moveLength); + console.log("maxWidth="+maxWidth); + if(moveLength <= maxWidth){ //鼠标松开时,如果没有达到最大距离位置,滑块就返回初始位置 + this.setState({ + move:0, + width:0 + }); + document.removeEventListener("mousemove", this.onMouseMove); + document.removeEventListener("mouseup", this.onMouseUp); + } + if(this.props.onDrag){ + this.props.onDrag(this.state.clear); + } + } + onMouseMove(e){ + console.log("63"); + let event=e||window.event; + let drag = window.getComputedStyle(this.verifyDOM); + let handler = window.getComputedStyle(this.handlerDOM); + let moveLength = event.clientX-this.verifyDOM.offsetLeft - Number.parseInt(handler.width) / 2; + let maxWidth = Number.parseInt(drag.width) - Number.parseInt(handler.width); + if(this.state.isMove){ + if(moveLength<0){ + moveLength=0 + }else if(moveLength >= maxWidth){ + moveLength=maxWidth; + this.removeMouseMove(); + } + this.setState({ + move:moveLength, + width:moveLength + }); + } + } + //清空事件 + removeMouseMove(){ + this.setState({ + clear:true + }); + let dragHandler = document.getElementById("dragHandler"); + dragHandler.removeEventListener("mousedown", this.onMouseDown); + document.removeEventListener("mousemove", this.onMouseMove); + document.removeEventListener("mouseup", this.onMouseUp); + this.props.dragOkCallback(); + } + render(){ + return ( +
    {this.verifyDOM = dom}} style={{"color":this.state.clear ? "#fff" : "#252535"}}> +
    {this.bgDOM = dom}} style={{"width":this.state.width}}>
    +
    {this.state.clear ? "验证通过" : "拖动滑块验证"}
    +
    {this.handlerDOM = dom}}>
    +
    + ); + } +} + +export default ( CheckInputysl ); \ No newline at end of file diff --git a/public/react/src/modules/user/FindPasswordComponent.js b/public/react/src/modules/user/FindPasswordComponent.js index 19b5a7388..3263f7327 100644 --- a/public/react/src/modules/user/FindPasswordComponent.js +++ b/public/react/src/modules/user/FindPasswordComponent.js @@ -2,11 +2,11 @@ import React, {Component} from 'react'; import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom"; -import {getImageUrl, DragValidator} from 'educoder'; - +import {getImageUrl} from 'educoder'; +import CheckInputysl1 from './CheckInputysl'; +import CheckInputysl2 from './CheckInputysl'; import {Tabs, Input, Checkbox, Button, notification} from 'antd'; -import DragValidatortwo from '../../../src/common/components/DragValidatortwo' import ReadPassword from './ReadPassword'; @@ -31,7 +31,7 @@ class LoginRegisterComponent extends Component { seconds: 60, codes: "", getverificationcodes: true, - Phonenumberisnotcobool: false, + Phonenumberisnotcobool: true, Phonenumberisnotco: undefined, Phonenumberisnotcosytdhk:undefined, Phonenumberisnotcosmmm: undefined, @@ -94,14 +94,14 @@ class LoginRegisterComponent extends Component { } //倒计时 getverificationcode = () => { - + debugger if(this.state.login === undefined || this.state.login.length===0){ this.openNotification("请输入手机号或邮箱"); return; } //这是判断是否手机正确 - if(this.state.Phonenumberisnotcobool === true){ + if(this.state.Phonenumberisnotcobool === false){ this.openNotification(this.state.Phonenumberisnotco); this.setState({ Whethertoverify:this.state.Whethertoverify===true?false:true, @@ -109,7 +109,7 @@ class LoginRegisterComponent extends Component { return; } //拖动滑动验证 - if(this.state.dragOk===undefined||this.state.dragOk === false){ + if(this.state.dragOk === false){ this.openNotification("拖动滑块验证"); return; } @@ -179,17 +179,19 @@ class LoginRegisterComponent extends Component { } //找回密码 Retrievepassword = () => { - if (this.state.Phonenumberisnotcobool === false) { - if (this.state.login.length === 0) { - this.setState({ - Phonenumberisnotco:"请输入正确的邮箱或手机号", - }) - return - } + if (this.state.Phonenumberisnotcobool === false&&this.state.Phonenumberisnotco!==undefined) { + this.openNotification(this.state.Phonenumberisnotco); + this.setState({ + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + return; } if (this.state.login === undefined|| this.state.login.length ===0 || this.state.login === "") { this.setState({ Phonenumberisnotco:"账号不能为空", + Phonenumberisnotcobool: false, + dragOk: false, + Whethertoverify: this.state.Whethertoverify === true ? false : true, }) return } @@ -198,6 +200,8 @@ class LoginRegisterComponent extends Component { // this.openNotification(`请拖动滑块完成验证`,2); this.setState({ Phonenumberisnotcosytdhk:"请拖动滑块完成验证", + dragOk: false, + Whethertoverify: this.state.Whethertoverify === true ? false : true, }) return } @@ -365,7 +369,7 @@ class LoginRegisterComponent extends Component { if (value.length === 0) { this.setState({ Phonenumberisnotco: undefined, - Phonenumberisnotcobool: false, + Phonenumberisnotcobool: true, }) return; } @@ -418,33 +422,134 @@ class LoginRegisterComponent extends Component { if(this.state.login===""||this.state.login.length===0){ this.setState({ Phonenumberisnotco: "账号不能为空", - Phonenumberisnotcobool: true, + Phonenumberisnotcobool: false, dragOk:false, Whethertoverify:this.state.Whethertoverify===true?false:true, }) return } - this.setState({ - Phonenumberisnotcosytdhk:undefined, - }) - this.Emailphonenumberverification(e.target.value) + // console.log(e.target.value.length); + // if (e.target.value.length === 0) { + // this.setState({ + // Phonenumberisnotco: undefined, + // Phonenumberisnotcobool: false, + // }) + // return; + // } + // var telephone = $("#telephoneAdd.tianjia_phone").val(); + var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; + // var email = $("#add_email.tianjia_email").val(); + var regemail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; + + // [1]手机号开头必须是1 [3,4,5,6,7,8] 第二位是3-8中的一个 [0-9]{9} 后边9位可以是0-9的任意数字。 + var stringdata = undefined; + if (!regph.test(e.target.value)) { + stringdata = "手机号格式不正确"; + this.setState({ + Phonenumberisnotco: stringdata, + Phonenumberisnotcobool: false, + }) + } else { + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: true, + }) + return + } + + if (!regemail.test(e.target.value)) { + if ((e.target.value.indexOf("@") != -1) === true) { + stringdata = "邮箱格式不正确"; + } else { + stringdata = "手机号格式不正确"; + + } + this.setState({ + Phonenumberisnotco: stringdata, + Phonenumberisnotcobool: false, + }) + return + } else { + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: true, + }) + this.Emailphonenumberverification(e.target.value) + return + } + this.Emailphonenumberverification(e.target.value) } } //是否验证通过 dragOkCallback = () => { console.log(this.state.login); - + this.setState({ + Phonenumberisnotcosytdhk:undefined, + }) if (this.state.login === "" || this.state.login.length === 0) { this.setState({ Phonenumberisnotco: "账号不能为空", - Phonenumberisnotcobool: true, + Phonenumberisnotcobool: false, + Phonenumberisnotcosytdhk:undefined, dragOk: false, Whethertoverify: this.state.Whethertoverify === true ? false : true, }) return } + // var telephone = $("#telephoneAdd.tianjia_phone").val(); + var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; + // var email = $("#add_email.tianjia_email").val(); + var regemail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; + + // [1]手机号开头必须是1 [3,4,5,6,7,8] 第二位是3-8中的一个 [0-9]{9} 后边9位可以是0-9的任意数字。 + var stringdata = undefined; + if (!regph.test(this.state.login)) { + stringdata = "手机号格式不正确"; + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: true, + Phonenumberisnotcosytdhk:undefined, + dragOk: true, + }) + } else { + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: true, + Phonenumberisnotcosytdhk:undefined, + dragOk: true, + + }); + this.Emailphonenumberverification(this.state.login) + + return + } + + if (!regemail.test(this.state.login)) { + if ((this.state.login.indexOf("@") != -1) === true) { + stringdata = "邮箱格式不正确"; + } else { + stringdata = "手机号格式不正确"; + + } + this.setState({ + Phonenumberisnotco: stringdata, + Phonenumberisnotcobool: false, + dragOk:false, + Whethertoverify: this.state.Whethertoverify === true ? false : true, + }) + return + } else { + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: true, + dragOk: true, + }) + this.Emailphonenumberverification(this.state.login) + return + } + this.setState({ Phonenumberisnotcosytdhk: undefined, }) @@ -467,7 +572,7 @@ class LoginRegisterComponent extends Component { console.log(value.length); this.setState({ Phonenumberisnotco: result.data.message, - Phonenumberisnotcobool: true, + Phonenumberisnotcobool: false, dragOk:false, Whethertoverify:this.state.Whethertoverify===true?false:true, }) @@ -475,7 +580,7 @@ class LoginRegisterComponent extends Component { }else { this.setState({ Phonenumberisnotco: undefined, - Phonenumberisnotcobool: false, + Phonenumberisnotcobool: true, dragOk:true, }) return; @@ -597,24 +702,20 @@ class LoginRegisterComponent extends Component { { Whethertoverify===false&&pciphone===true? - this.dragOkCallback()} - className="ysllw100" - > + + : "" } { Whethertoverify===true&&pciphone===true? - this.dragOkCallback()} - className="ysllw100" - > + + : "" } diff --git a/public/react/src/modules/user/LoginRegisterComponent.js b/public/react/src/modules/user/LoginRegisterComponent.js index b27fe8cec..ec9778fc8 100644 --- a/public/react/src/modules/user/LoginRegisterComponent.js +++ b/public/react/src/modules/user/LoginRegisterComponent.js @@ -2,12 +2,13 @@ import React, {Component} from 'react'; import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom"; -import {getImageUrl, DragValidator,broadcastChannelPostMessage} from 'educoder'; +import {getImageUrl,broadcastChannelPostMessage} from 'educoder'; import {Tabs, Input, Checkbox, Button, notification,Menu} from 'antd'; import passopen from '../../../src/images/login/passopen.png'; import passoff from '../../../src/images/login/passoff.png'; import axios from 'axios'; -import DragValidatortwo from '../../../src/common/components/DragValidatortwo' +import CheckInputysl1 from './CheckInputysl'; +import CheckInputysl2 from './CheckInputysl'; import './common.css' import './commontwo.css' const { TabPane } = Tabs; @@ -205,7 +206,72 @@ class LoginRegisterComponent extends Component { } //是否验证通过 dragOkCallback = () => { - console.log(this.state.logins); + this.setState({ + Phonenumberisnotcosytdhk:undefined, + }) + if (this.state.logins.length === 0) { + this.setState({ + Phonenumberisnotcos:"账号不能为空", + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + console.log("s0"); + + return; + } + // var telephone = $("#telephoneAdd.tianjia_phone").val(); + var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; + // var email = $("#add_email.tianjia_email").val(); + var regemail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; + + // [1]手机号开头必须是1 [3,4,5,6,7,8] 第二位是3-8中的一个 [0-9]{9} 后边9位可以是0-9的任意数字。 + var stringdata = undefined; + if (!regph.test(this.state.logins)) { + stringdata = "手机号格式不正确"; + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + dragOk:true, + }) + console.log("s1"); + } else { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + dragOk:true, + }); + this.Emailphonenumberverification(this.state.logins, 2); + return + } + + if (!regemail.test(this.state.logins)) { + if ((this.state.logins.indexOf("@") != -1) === true) { + stringdata = "邮箱格式不正确"; + } else { + stringdata = "手机号格式不正确"; + + } + this.setState({ + Phonenumberisnotcos: stringdata, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }); + console.log("s2"); + + return + } else { + console.log("s222222"); + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + dragOk:true, + }) + this.Emailphonenumberverification(this.state.logins, 2); + return + } + this.setState({ Phonenumberisnotcosytdhk:undefined, }) @@ -314,21 +380,28 @@ class LoginRegisterComponent extends Component { // this.openNotification(`请同意服务协议条款`,2); // return; // } + if (this.state.logins === undefined || this.state.logins === ""||this.state.logins.length===0) { + this.setState({ + Phonenumberisnotcos:"账号不能为空", + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + return + } if(this.state.pciphone===true){ if (this.state.dragOk === false) { // this.openNotification(`请拖动滑块完成验证`,2); this.setState({ Phonenumberisnotcosytdhk:"请拖动滑块完成验证", + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, }) return } } - if (this.state.logins === undefined || this.state.logins === ""||this.state.logins.length===0) { - this.setState({ - Phonenumberisnotcos:"账号不能为空", - }) - return - } else if (this.state.codes === undefined || this.state.codes == ""||this.state.codes.length===0) { + + if (this.state.codes === undefined || this.state.codes == ""||this.state.codes.length===0) { // this.openNotification(`请输入验证码`,2); this.setState({ Phonenumberisnotcosyzm:"验证码不能为空", @@ -402,6 +475,7 @@ class LoginRegisterComponent extends Component { type: 1, } }).then((result) => { + //验证有问题{"status":1,"message":"success"} // console.log(result); // this.setState({dragOk: true}) @@ -409,7 +483,6 @@ class LoginRegisterComponent extends Component { if(result){ if(result.data.status===-2){ if (id === 1) { - console.log(value.length); if(result.data.message==="该手机号码或邮箱已被注册"){ this.setState({ Phonenumberisnotco: undefined, @@ -423,8 +496,10 @@ class LoginRegisterComponent extends Component { dragOk:false, Whethertoverify:this.state.Whethertoverify===true?false:true, }) + console.log("s5"); + } - return; + return; } else if (id === 2) { this.setState({ Phonenumberisnotcos: result.data.message, @@ -432,11 +507,12 @@ class LoginRegisterComponent extends Component { dragOk:false, Whethertoverify:this.state.Whethertoverify===true?false:true, }) - return; + console.log("s6"); + + return; } }else { if (id === 1) { - console.log(value.length); this.setState({ Phonenumberisnotco: undefined, Phonenumberisnotcobool: false, @@ -498,8 +574,9 @@ class LoginRegisterComponent extends Component { //倒计时 getverificationcode = () => { - console.log(this.state.Phonenumberisnotcobool); - console.log(this.state.dragOk); + debugger + // console.log(this.state.Phonenumberisnotcobool); + // console.log(this.state.dragOk); if(this.state.logins === undefined || this.state.logins.length===0){ this.openNotification("请输入手机号或邮箱"); return; @@ -512,7 +589,7 @@ class LoginRegisterComponent extends Component { }) return; } - if(this.state.dragOk===undefined||this.state.dragOk === false){ + if(this.state.dragOk === false){ this.openNotification("拖动滑块验证"); return; } @@ -585,13 +662,118 @@ class LoginRegisterComponent extends Component { } //失去焦点判断 inputOnBlur = (e, id) => { - this.isCorrectname(e.target.value, id); + // this.isCorrectname(e.target.value, id); // this.Emailphonenumberverification(e.target.value, id); + if (e.target.value.length === 0) { + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: false, + }) + return; + } + // var telephone = $("#telephoneAdd.tianjia_phone").val(); + var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; + // var email = $("#add_email.tianjia_email").val(); + var regemail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; + + // [1]手机号开头必须是1 [3,4,5,6,7,8] 第二位是3-8中的一个 [0-9]{9} 后边9位可以是0-9的任意数字。 + var stringdata = undefined; + if (!regph.test(e.target.value)) { + stringdata = "手机号格式不正确"; + this.setState({ + Phonenumberisnotco: stringdata, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + } else { + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: false, + }) + return + } + + if (!regemail.test(e.target.value)) { + if ((e.target.value.indexOf("@") != -1) === true) { + stringdata = "邮箱格式不正确"; + } else { + stringdata = "手机号格式不正确"; + + } + this.setState({ + Phonenumberisnotco: stringdata, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + return + } else { + this.setState({ + Phonenumberisnotco: undefined, + Phonenumberisnotcobool: false, + }) + this.Emailphonenumberverification(e.target.value, 1); + return + } + this.Emailphonenumberverification(e.target.value, 1); } inputOnBlurzhuche = (e, id) => { - if(this.state.pciphone===false) { + if (e.target.value.length === 0) { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + }) + return; + } + // var telephone = $("#telephoneAdd.tianjia_phone").val(); + var regph = /^[1][3,4,5,6,7,8][0-9]{9}$/; + // var email = $("#add_email.tianjia_email").val(); + var regemail = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/; + + // [1]手机号开头必须是1 [3,4,5,6,7,8] 第二位是3-8中的一个 [0-9]{9} 后边9位可以是0-9的任意数字。 + var stringdata = undefined; + if (!regph.test(e.target.value)) { + stringdata = "手机号格式不正确"; + this.setState({ + Phonenumberisnotcos: stringdata, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + } else { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + + }) + return + } + + if (!regemail.test(e.target.value)) { + if ((e.target.value.indexOf("@") != -1) === true) { + stringdata = "邮箱格式不正确"; + } else { + stringdata = "手机号格式不正确"; + + } + this.setState({ + Phonenumberisnotcos: stringdata, + Phonenumberisnotcobool: true, + dragOk:false, + Whethertoverify:this.state.Whethertoverify===true?false:true, + }) + return + } else { + this.setState({ + Phonenumberisnotcos: undefined, + Phonenumberisnotcobool: false, + + }) + this.Emailphonenumberverification(e.target.value, id); + return + } this.Emailphonenumberverification(e.target.value, id); - } } //获取登入密码 passwordonChange = (e) => { @@ -734,7 +916,7 @@ class LoginRegisterComponent extends Component {
    登录 - 注册 + 注册 { @@ -838,27 +1020,24 @@ class LoginRegisterComponent extends Component { } { Whethertoverify===false&&pciphone===true? - + > + : "" } { Whethertoverify===true&&pciphone===true? - + + : "" } +
    { pciphone===true? diff --git a/public/react/src/modules/user/account/AccountBasicEdit.js b/public/react/src/modules/user/account/AccountBasicEdit.js index 1458862a1..38c8fd98c 100644 --- a/public/react/src/modules/user/account/AccountBasicEdit.js +++ b/public/react/src/modules/user/account/AccountBasicEdit.js @@ -274,6 +274,11 @@ class AccountBasic extends Component { return item.name == e; }); if (!arr[0]) { + if (!e) { + this.setState({ + filterSchoolList: [] + }) + } // 没找到学校,清空部门 this.setState({ departments: [], @@ -464,7 +469,7 @@ class AccountBasic extends Component { width:220px; } .basicForm .ant-input-suffix { - line-height: 2.2; + line-height: 2.8; background: transparent !important; } `} diff --git a/public/react/src/modules/user/account/ChangeHeaderPicModal.js b/public/react/src/modules/user/account/ChangeHeaderPicModal.js index abb3d0e12..cef643094 100644 --- a/public/react/src/modules/user/account/ChangeHeaderPicModal.js +++ b/public/react/src/modules/user/account/ChangeHeaderPicModal.js @@ -105,11 +105,16 @@ class ChangeHeaderPicModal extends Component{ .then((response) => { // {"status":0,"message":"success","avatar_url":"avatars/User/15739"} if (response.data.status == 0) { - // this.props.getBasicInfo() - this.props.fetchUser() - // 头像更新后会触发AccountPage的DidUpdate,然后会调用getBasicInfo - this.props.showNotification && this.props.showNotification("修改头像成功") - this.setVisible(false) + // this.props.getBasicInfo() + // https://www.trustie.net/issues/22461 + if ( this.props.current_user.image_url.indexOf('avatars/User/b') != -1 + || this.props.current_user.image_url.indexOf('avatars/User/g') != -1 ) { + this.setTimeout(() => { + this.doAfterUpdated() + }, 1000) + } else { + this.doAfterUpdated(); + } } }) .catch(function (error) { @@ -117,6 +122,12 @@ class ChangeHeaderPicModal extends Component{ }); }); } + doAfterUpdated = () => { + this.props.fetchUser() + // 头像更新后会触发AccountPage的DidUpdate,然后会调用getBasicInfo + this.props.showNotification && this.props.showNotification("修改头像成功") + this.setVisible(false) + } render(){ const { course_lists } = this.state diff --git a/public/react/src/modules/user/secureCode.css b/public/react/src/modules/user/secureCode.css new file mode 100644 index 000000000..e7f171711 --- /dev/null +++ b/public/react/src/modules/user/secureCode.css @@ -0,0 +1,42 @@ +#drag{ + position: relative; + background-color: #e8e8e8; + min-width: 300px; + height: 38px; + line-height: 38px; + text-align: center; +} +#drag .handler{ + position: absolute; + top: 0px; + left: 0px; + width: 40px; + height: 38px; + border: 1px solid #ccc; + cursor: move; +} +.handler_bg{ background: #fff url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTEyNTVEMURGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTEyNTVEMUNGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2MTc5NzNmZS02OTQxLTQyOTYtYTIwNi02NDI2YTNkOWU5YmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+YiRG4AAAALFJREFUeNpi/P//PwMlgImBQkA9A+bOnfsIiBOxKcInh+yCaCDuByoswaIOpxwjciACFegBqZ1AvBSIS5OTk/8TkmNEjwWgQiUgtQuIjwAxUF3yX3xyGIEIFLwHpKyAWB+I1xGSwxULIGf9A7mQkBwTlhBXAFLHgPgqEAcTkmNCU6AL9d8WII4HOvk3ITkWJAXWUMlOoGQHmsE45ViQ2KuBuASoYC4Wf+OUYxz6mQkgwAAN9mIrUReCXgAAAABJRU5ErkJggg==") no-repeat center;} + +.handler_ok_bg{ background: #fff url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDlBRDI3NjVGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDlBRDI3NjRGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDphNWEzMWNhMC1hYmViLTQxNWEtYTEwZS04Y2U5NzRlN2Q4YTEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+k+sHwwAAASZJREFUeNpi/P//PwMyKD8uZw+kUoDYEYgloMIvgHg/EM/ptHx0EFk9I8wAoEZ+IDUPiIMY8IN1QJwENOgj3ACo5gNAbMBAHLgAxA4gQ5igAnNJ0MwAVTsX7IKyY7L2UNuJAf+AmAmJ78AEDTBiwGYg5gbifCSxFCZoaBMCy4A4GOjnH0D6DpK4IxNSVIHAfSDOAeLraJrjgJp/AwPbHMhejiQnwYRmUzNQ4VQgDQqXK0ia/0I17wJiPmQNTNBEAgMlQIWiQA2vgWw7QppBekGxsAjIiEUSBNnsBDWEAY9mEFgMMgBk00E0iZtA7AHEctDQ58MRuA6wlLgGFMoMpIG1QFeGwAIxGZo8GUhIysmwQGSAZgwHaEZhICIzOaBkJkqyM0CAAQDGx279Jf50AAAAAABJRU5ErkJggg==") no-repeat center;} + +#drag .drag_bg{ + background-color: #7ac23c; + height: 38px; + width: 0px; +} +#drag .drag_text{ + position: absolute; + top: 0px; + font-size: 14px; + width: 100%; + -moz-user-select: none; + -webkit-user-select: none; + color: #fff; + user-select: none; + -o-user-select:none; + -ms-user-select:none; +} + +/* }*/ +/*//.handler_bg{ background: #fff url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTEyNTVEMURGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTEyNTVEMUNGMkVFMTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2MTc5NzNmZS02OTQxLTQyOTYtYTIwNi02NDI2YTNkOWU5YmUiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+YiRG4AAAALFJREFUeNpi/P//PwMlgImBQkA9A+bOnfsIiBOxKcInh+yCaCDuByoswaIOpxwjciACFegBqZ1AvBSIS5OTk/8TkmNEjwWgQiUgtQuIjwAxUF3yX3xyGIEIFLwHpKyAWB+I1xGSwxULIGf9A7mQkBwTlhBXAFLHgPgqEAcTkmNCU6AL9d8WII4HOvk3ITkWJAXWUMlOoGQHmsE45ViQ2KuBuASoYC4Wf+OUYxz6mQkgwAAN9mIrUReCXgAAAABJRU5ErkJggg==") no-repeat center;}*/ +/*//.handler_ok_bg{ background: #fff url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA3hpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNS1jMDIxIDc5LjE1NTc3MiwgMjAxNC8wMS8xMy0xOTo0NDowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0ZDhlNWY5My05NmI0LTRlNWQtOGFjYi03ZTY4OGYyMTU2ZTYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NDlBRDI3NjVGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NDlBRDI3NjRGMkQ2MTFFNEI5NDBCMjQ2M0ExMDQ1OUYiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTQgKE1hY2ludG9zaCkiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDphNWEzMWNhMC1hYmViLTQxNWEtYTEwZS04Y2U5NzRlN2Q4YTEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NGQ4ZTVmOTMtOTZiNC00ZTVkLThhY2ItN2U2ODhmMjE1NmU2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+k+sHwwAAASZJREFUeNpi/P//PwMyKD8uZw+kUoDYEYgloMIvgHg/EM/ptHx0EFk9I8wAoEZ+IDUPiIMY8IN1QJwENOgj3ACo5gNAbMBAHLgAxA4gQ5igAnNJ0MwAVTsX7IKyY7L2UNuJAf+AmAmJ78AEDTBiwGYg5gbifCSxFCZoaBMCy4A4GOjnH0D6DpK4IxNSVIHAfSDOAeLraJrjgJp/AwPbHMhejiQnwYRmUzNQ4VQgDQqXK0ia/0I17wJiPmQNTNBEAgMlQIWiQA2vgWw7QppBekGxsAjIiEUSBNnsBDWEAY9mEFgMMgBk00E0iZtA7AHEctDQ58MRuA6wlLgGFMoMpIG1QFeGwAIxGZo8GUhIysmwQGSAZgwHaEZhICIzOaBkJkqyM0CAAQDGx279Jf50AAAAAABJRU5ErkJggg==") no-repeat center;}*/ diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css index 4006fb615..45aea81be 100644 --- a/public/stylesheets/educoder/edu-all.css +++ b/public/stylesheets/educoder/edu-all.css @@ -291,7 +291,7 @@ label.infolabel{display: block;float: left;width: 56px;text-align: right;margin- .shaiTitle{display: block;padding-right: 20px;} .shaiContent li.shaiItem.active{background-color: #4CACFF!important;color:#fff!important;} .shaiContent li.shaiItem{padding:3px 15px;float: left;border-radius: 4px;color: #4C4C4C;cursor: pointer;margin-right: 15px;display: block} -.shaiContent li.shaiItem:hover{background-color: #F5F5F5} +.shaiContent li.shaiItem:hover{background-color: #4CACFF!important;color:#fff!important;} .shaiAllItem{max-width: 1138px;} .subshaicontent{display: none;box-sizing: border-box;position: absolute;width: 100%;top: 33px;left: 0px;background-color: #fff;box-shadow:0px 1px 4px rgba(76,76,76,0.2);padding:0px 20px;z-index: 99999;border-radius: 4px;max-height: 800px;overflow-y: auto} .subshaicontent-part{border-bottom: 1px solid #eee;}