diff --git a/app/controllers/attendances_controller.rb b/app/controllers/attendances_controller.rb new file mode 100644 index 000000000..dc30df7e3 --- /dev/null +++ b/app/controllers/attendances_controller.rb @@ -0,0 +1,59 @@ +class AttendancesController < ApplicationController + + before_action :require_login + before_action :find_course, only: [:index, :statistics] + before_action :user_course_identity + + def index + current_date = Date.current + current_end_time = Time.current.strftime("%H:%M:%S") + + if params[:history] + @attendances = @course.course_attendances.where("attendance_date < '#{current_date}' or + (attendance_date = '#{current_date}' and end_time < '#{current_end_time}')") + if @user_course_identity == Course::STUDENT + member = @course.students.find_by(user_id: current_user.id) + group_ids = [member&.course_group_id.to_i, 0] + @attendances = @attendances.joins(:course_attendance_groups).where(course_attendance_groups: {course_group_id: group_ids}) + + attendance_ids = @attendances.pluck(:id) + @normal_count = @course.course_member_attendances.where(course_member_id: member&.id, course_attendance_id: attendance_ids, attendance_status: "NORMAL").size + @leave_count = @course.course_member_attendances.where(course_member_id: member&.id, course_attendance_id: attendance_ids, attendance_status: "LEAVE").size + @absence_count = @course.course_member_attendances.where(course_member_id: member&.id, course_attendance_id: attendance_ids, attendance_status: "ABSENCE").size + end + else + @attendances = @course.course_attendances.where("attendance_date > '#{current_date}' or + (attendance_date = '#{current_date}' and end_time > '#{current_end_time}')") + end + @attendances_count = @attendances.size + + @attendances = @attendances.order("attendance_date desc, start_time desc") + @attendances = paginate @attendances.includes(:user, :course_member_attendances) + end + + def statistics + current_date = Date.current + current_end_time = Time.current.strftime("%H:%M:%S") + history_attendances = @course.course_attendances.where("attendance_date < '#{current_date}' or + (attendance_date = '#{current_date}' and end_time < '#{current_end_time}')") + all_member_attendances = CourseMemberAttendance.where(course_attendance_id: history_attendances) + if params[:group_id].present? + history_attendances = history_attendances.joins(:course_attendance_groups).where(course_attendance_groups: {course_group_id: [params[:group_id], 0]}) + all_member_attendances = all_member_attendances.joins(:course_member).where(course_members: {course_group_id: params[:group_id]}) + end + + history_attendances = history_attendances.order("attendance_date desc, start_time desc") + data = AttendanceStatisticsService.call history_attendances, all_member_attendances + @all_history_count = data[:all_history_count] + @history_attendances = data[:history_attendances] + @avg_normal_rate = data[:avg_normal_rate] + @avg_absence_rate = data[:avg_absence_rate] + @avg_leave_rate = data[:avg_leave_rate] + end + + private + def find_attendance + @attendance = CourseAttendance.find params[:id] + @course = @attendance.course + end +end \ No newline at end of file diff --git a/app/controllers/challenges_controller.rb b/app/controllers/challenges_controller.rb index 47c8fc68c..e73243b94 100644 --- a/app/controllers/challenges_controller.rb +++ b/app/controllers/challenges_controller.rb @@ -162,7 +162,7 @@ class ChallengesController < ApplicationController #@pass_games_map = @shixun.challenges.joins(:games).where(games: {status:2}).group(:challenge_id).reorder(nil).count #@play_games_map = @shixun.challenges.joins(:games).where(games: {status:[0,1]}).group(:challenge_id).reorder(nil).count - @challenges = @shixun.challenges.joins(join_sql).select(base_columns) + @challenges = @shixun.challenges.joins(join_sql).select(base_columns).uniq #@challenges = @shixun.challenges.fields_for_list @editable = @shixun.status == 0 # before_action:有判断权限,如果没发布,则肯定是管理人员 diff --git a/app/controllers/course_second_categories_controller.rb b/app/controllers/course_second_categories_controller.rb index 62cbf83d9..c59ffbdbe 100644 --- a/app/controllers/course_second_categories_controller.rb +++ b/app/controllers/course_second_categories_controller.rb @@ -43,6 +43,12 @@ class CourseSecondCategoriesController < ApplicationController elsif @course_module.module_type == "video" @course.course_videos.where(course_second_category_id: @category.id).update_all(course_second_category_id: 0) @right_url = "/classrooms/#{@course.id}/course_videos" + elsif @course_module.module_type == "common_homework" + @category.homework_commons.update_all(course_second_category_id: 0) + @right_url = "/classrooms/#{@course.id}/common_homeworks/#{@course_module.id}" + elsif @course_module.module_type == "group_homework" + @category.homework_commons.update_all(course_second_category_id: 0) + @right_url = "/classrooms/#{@course.id}/group_homeworks/#{@course_module.id}" end @category.destroy diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index a102f92de..68211d034 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -560,6 +560,8 @@ class CoursesController < ApplicationController member = CourseMember.create(course_id: @course.id, graduation_group_id: @graduation_group_id, user_id: user_id, role: role, is_active: is_active) member.teacher_course_groups << TeacherCourseGroup.new(course_group_id: @course_group_id, user_id: user_id, course_id: @course.id) if @course_group_id != 0 + + @course.course_messages.join_course_requests.unhandled.where(course_message_id: user_id).update_all(status: :PASSED) end end TeacherInviteJoinCourseNotifyJob.perform_later(current_user.id, @course.id, role, teacher_ids) if teacher_ids.present? diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index 427545716..e40c986ca 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -42,6 +42,10 @@ class FilesController < ApplicationController @unpublish_count = @total_count - @publish_count @attachments = @attachments.by_keywords(params[:search]) + if params[:no_link] + @attachments = @attachments.no_link + end + @attachments = @attachments.page(@page).per(@page_size) end @@ -138,7 +142,7 @@ class FilesController < ApplicationController end def public_with_course_and_project - @attachments = Attachment.publiced.simple_columns + @attachments = Attachment.publiced.no_link.simple_columns .contains_course_and_project .includes(:container, author: :user_extension) .by_filename_or_user_name(params[:search]) @@ -151,7 +155,7 @@ class FilesController < ApplicationController def mine_with_course_and_project @current_user = current_user - @attachments = Attachment.mine(current_user) + @attachments = Attachment.mine(current_user).no_link .simple_columns .contains_course_and_project .by_keywords(params[:search]) diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb index 29a9a9730..e816ab667 100644 --- a/app/controllers/myshixuns_controller.rb +++ b/app/controllers/myshixuns_controller.rb @@ -22,23 +22,17 @@ class MyshixunsController < ApplicationController tip_exception("403", "") end begin + @shixun = Shixun.select(:id, :identifier, :challenges_count).find(@myshixun.shixun_id) ActiveRecord::Base.transaction do - begin - @shixun = Shixun.select(:id, :identifier, :challenges_count).find(@myshixun.shixun_id) @myshixun.destroy! - StudentWork.where(:myshixun_id => @myshixun.id).update_all(myshixun_id: 0, work_status: 0, work_score: nil, - final_score: nil, efficiency: 0, eff_score: 0, calculation_time: nil, cost_time: 0, compelete_status: 0) - rescue Exception => e - 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, work_score: nil, + final_score: nil, efficiency: 0, eff_score: 0, calculation_time: nil, cost_time: 0, compelete_status: 0) end # 删除版本库 GitService.delete_repository(repo_path: @repo_path) unless @shixun.is_choice_type? rescue Exception => e - if e.message != "ActiveRecord::RecordInvalid" - logger.error("######delete_repository_error-:#{e.message}") - end raise "delete_repository_error:#{e.message}" end end diff --git a/app/controllers/weapps/attendances_controller.rb b/app/controllers/weapps/attendances_controller.rb index 6cc2dda4e..da22aa300 100644 --- a/app/controllers/weapps/attendances_controller.rb +++ b/app/controllers/weapps/attendances_controller.rb @@ -37,8 +37,14 @@ class Weapps::AttendancesController < ApplicationController @all_member_attendances = @all_member_attendances.joins(:course_member).where(course_members: {course_group_id: params[:group_id]}) end - @history_attendances = all_attendances.order("id asc") - @all_history_count = @history_attendances.size + all_attendances = all_attendances.order("attendance_date desc, start_time desc") + + data = AttendanceStatisticsService.call all_attendances, @all_member_attendances + @all_history_count = data[:all_history_count] + @history_attendances = data[:history_attendances] + @avg_normal_rate = data[:avg_normal_rate] + @avg_absence_rate = data[:avg_absence_rate] + @avg_leave_rate = data[:avg_leave_rate] end def student_attendances @@ -94,7 +100,9 @@ class Weapps::AttendancesController < ApplicationController @absence_count = @attendance.absence_count @all_count = @attendance.course_member_attendances.size - @_is_current_attendance = @attendance.current_attendance? + a_end_time = "#{@attendance.attendance_date} #{@attendance.end_time}".to_time + + @_is_current_attendance = Time.current < a_end_time if @attendance.course_attendance_groups.first&.course_group_id.to_i == 0 @group_ids = @course.course_groups.pluck(:id) + [0] diff --git a/app/models/attachment.rb b/app/models/attachment.rb index 1a9b50c3b..001883fb6 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -25,6 +25,7 @@ class Attachment < ApplicationRecord scope :search_by_container, -> (ids) {where(container_id: ids)} scope :unified_setting, -> {where("unified_setting = ? ", 1)} scope :published, -> {where(is_publish: 1)} + scope :no_link, -> {where(link: nil)} validates_length_of :description, maximum: 100, message: "不能超过100个字符" diff --git a/app/models/challenge.rb b/app/models/challenge.rb index 31a683760..38aa2812a 100644 --- a/app/models/challenge.rb +++ b/app/models/challenge.rb @@ -75,7 +75,7 @@ class Challenge < ApplicationRecord if identifier.present? shixun.task_pass || self.status != 3 ? "/tasks/#{identifier}" : "" else - self.position == 1 ? "/api/shixuns/#{shixun.identifier}/shixun_exec" : "" + self.position == 1 ? "/shixuns/#{shixun.identifier}/shixun_exec.json" : "" end end @@ -143,7 +143,7 @@ class Challenge < ApplicationRecord # 关卡用户通关数 def user_passed_count #games.map{|g| g.status == 2}.count - self.games.where(status: 1).count + self.games.where(status: 2).count end # 关卡用户正在挑战的人数 diff --git a/app/models/game.rb b/app/models/game.rb index 144dbced2..d0d59c0e3 100644 --- a/app/models/game.rb +++ b/app/models/game.rb @@ -7,6 +7,7 @@ class Game < ApplicationRecord default_scope { order("games.created_at desc") } + #TODO: games表要增加challenge_id与user_id的唯一索引 has_many :outputs, -> { order('query_index DESC') } has_many :challenge_samples, :dependent => :destroy has_many :game_codes, :dependent => :destroy diff --git a/app/services/attendance_statistics_service.rb b/app/services/attendance_statistics_service.rb new file mode 100644 index 000000000..e31049b22 --- /dev/null +++ b/app/services/attendance_statistics_service.rb @@ -0,0 +1,54 @@ +class AttendanceStatisticsService < ApplicationService + + attr_reader :attendances, :member_attendances + + def initialize(attendances, member_attendances) + @attendances = attendances + @member_attendances = member_attendances + end + + def call + all_normal_rate = [] + all_absence_rate = [] + all_leave_rate = [] + + history_attendances = [] + + attendances.each do |attendance| + normal_count = history_member_count(member_attendances, "NORMAL", attendance.id) + absence_count = history_member_count(member_attendances, "ABSENCE", attendance.id) + leave_count = history_member_count(member_attendances, "LEAVE", attendance.id) + all_count = member_attendances.select{|member_attendance| member_attendance.course_attendance_id == attendance.id}.size + + normal_rate = cal_rate(normal_count, all_count) + all_normal_rate << normal_rate + absence_rate = cal_rate(absence_count, all_count) + all_absence_rate << absence_rate + leave_rate = cal_rate(leave_count, all_count) + all_leave_rate << leave_rate + + history_attendances << {name: attendance.name, attendance_date: attendance.attendance_date.strftime("%Y-%m-%d"), + start_time: attendance.start_time.strftime("%H:%M"), end_time: attendance.end_time.strftime("%H:%M"), + normal_rate: normal_rate, absence_rate: absence_rate, leave_rate: leave_rate} + end + + all_history_count = history_attendances.size + history_attendances = history_attendances[0..9].reverse + avg_normal_rate = cal_rate(all_normal_rate.sum, all_history_count) + avg_absence_rate = cal_rate(all_absence_rate.sum, all_history_count) + avg_leave_rate = cal_rate(all_leave_rate.sum, all_history_count) + + {all_history_count: all_history_count, history_attendances: history_attendances, avg_normal_rate: avg_normal_rate, + avg_absence_rate: avg_absence_rate, avg_leave_rate: avg_leave_rate} + end + + private + + def history_member_count member_attendances, status, attendance_id + member_attendances.select{|member_attendance| member_attendance.attendance_status == status && member_attendance.course_attendance_id == attendance_id}.size + end + + def cal_rate base, sum + sum == 0 ? 0 : (base.to_f / sum) + end +end \ No newline at end of file diff --git a/app/views/attendances/index.json.jbuilder b/app/views/attendances/index.json.jbuilder new file mode 100644 index 000000000..8a4dd2bb1 --- /dev/null +++ b/app/views/attendances/index.json.jbuilder @@ -0,0 +1,24 @@ +json.attendances @attendances do |attendance| + json.(attendance, :id, :name, :normal_count, :all_count, :mode) + json.author do + user = attendance.user + json.user_name user.real_name + json.user_login user.login + end + json.attendance_date attendance.attendance_date.strftime("%Y-%m-%d") + json.start_time attendance.start_time.strftime("%H:%M") + json.end_time attendance.end_time.strftime("%H:%M") + json.edit_auth @user_course_identity < Course::PROFESSOR || attendance.user_id == User.current.id + + if @user_course_identity == Course::STUDENT + json.attendance_status student_attendance_status(attendance, User.current) + end +end + +json.attendances_count @attendances_count + +if @user_course_identity == Course::STUDENT + json.normal_count @normal_count + json.leave_count @leave_count + json.absence_count @absence_count +end \ No newline at end of file diff --git a/app/views/attendances/statistics.json.jbuilder b/app/views/attendances/statistics.json.jbuilder new file mode 100644 index 000000000..d07f234d6 --- /dev/null +++ b/app/views/attendances/statistics.json.jbuilder @@ -0,0 +1,10 @@ + +json.history_attendances @history_attendances.each_with_index.to_a do |attendance, index| + json.(attendance, :name, :attendance_date, :start_time, :end_time, :normal_rate, :absence_rate, :leave_rate) + json.index "签到#{index + 1}" +end + +json.all_history_count @all_history_count +json.avg_normal_rate @avg_normal_rate +json.avg_absence_rate @avg_absence_rate +json.avg_leave_rate @avg_leave_rate \ No newline at end of file diff --git a/app/views/weapps/attendances/index.json.jbuilder b/app/views/weapps/attendances/index.json.jbuilder index da8be3c8d..0770bb6f6 100644 --- a/app/views/weapps/attendances/index.json.jbuilder +++ b/app/views/weapps/attendances/index.json.jbuilder @@ -5,25 +5,12 @@ json.current_attendance @current_attendance do |attendance| json.end_time attendance.end_time.strftime("%H:%M") end -all_normal_rate = [] -all_absence_rate = [] -all_leave_rate = [] json.history_attendances @history_attendances.each_with_index.to_a do |attendance, index| - normal_count = history_member_count(@all_member_attendances, "NORMAL", attendance.id) - absence_count = history_member_count(@all_member_attendances, "ABSENCE", attendance.id) - leave_count = history_member_count(@all_member_attendances, "LEAVE", attendance.id) - all_count = @all_member_attendances.select{|member_attendance| member_attendance.course_attendance_id == attendance.id}.size - + json.(attendance, :name, :attendance_date, :start_time, :end_time, :normal_rate, :absence_rate, :leave_rate) json.index index + 1 - json.normal_rate cal_rate(normal_count, all_count) - all_normal_rate << cal_rate(normal_count, all_count) - json.absence_rate cal_rate(absence_count, all_count) - all_absence_rate << cal_rate(absence_count, all_count) - json.leave_rate cal_rate(leave_count, all_count) - all_leave_rate << cal_rate(leave_count, all_count) end json.all_history_count @all_history_count -json.avg_normal_rate @all_history_count == 0 ? 0 : all_normal_rate.sum / @all_history_count -json.avg_absence_rate @all_history_count == 0 ? 0 : all_absence_rate.sum / @all_history_count -json.avg_leave_rate @all_history_count == 0 ? 0 : all_leave_rate.sum / @all_history_count +json.avg_normal_rate @avg_normal_rate +json.avg_absence_rate @avg_absence_rate +json.avg_leave_rate @avg_leave_rate diff --git a/config/routes.rb b/config/routes.rb index bcab93203..6c3efcfe8 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -550,6 +550,10 @@ Rails.application.routes.draw do end end + resources :attendances, shallow: true do + get :statistics, on: :collection + end + resources :polls, only:[:index,:new,:create] do collection do post :publish # 立即发布 diff --git a/lib/tasks/schools.rake b/lib/tasks/schools.rake new file mode 100644 index 000000000..a788d57d1 --- /dev/null +++ b/lib/tasks/schools.rake @@ -0,0 +1,28 @@ +#coding=utf-8 + +desc "合并高校的数据,第一个参数是: 正确高校的id, 第二个参数是: 错误高校需要合并到正确高校的id" +# 命令: bundle exec rake schools:merge_school_data f_school=1 s_school=2,3 +namespace :schools do + task merge_school_data: :environment do + f_school = ENV['f_school'].to_i + school = School.find_by(id: f_school) + return if school.blank? + + s_school = ENV['s_school'].split(",") + merge_schools = School.where(id: s_school) + + # 改变用户的学校id 和 单位 + UserExtension.where(school_id: merge_schools) + .update_all(school_id: f_school, department_id: nil) + + # 改变课堂的学校id + Course.where(school_id: merge_schools).update_all(school_id: f_school) + + # 实训报告表迁移数据 + s_report = SchoolReport.find_by(school_id: f_school) + SchoolReport.where(school_id: merge_schools).each do |sr| + s_report.update_column(:shixun_evaluate_count, (s_report.shixun_evaluate_count+sr.shixun_evaluate_count)) + sr.update(shixun_evaluate_count: 0) + end + end +end \ No newline at end of file diff --git a/lib/tasks/video_transcode.rake b/lib/tasks/video_transcode.rake index 995f9a82f..4fb7c17bd 100644 --- a/lib/tasks/video_transcode.rake +++ b/lib/tasks/video_transcode.rake @@ -2,13 +2,18 @@ namespace :video_transcode do desc "视频转码成h264" task :submit => :environment do - Video.find_each do |v| - if v.uuid && !v.transcoded && !v.file_url.include?('.mp4') && !AliyunVod::Service.get_meta_code_info(v.uuid)[:codecnamne].start_with?("h264", "h265") - p "--- Start submit video trans code #{v.uuid}" - AliyunVod::Service.submit_transcode_job(v.uuid, 'a0277c5c0c7458458e171b0cee6ebf5e') - else + i = [] + Video.where.not(uuid: nil, file_url: nil).where(transcoded: false, status: "published").find_each do |v| + code_info = AliyunVod::Service.get_meta_code_info(v.uuid) + if v.file_url.include?('.mp4') && code_info[:codecnamne]&.include?("h264") v.update(transcoded: true) + else + puts("uuid: #{v.uuid}") + i << "#{v.id}, #{v.file_url}, #{code_info[:codecnamne]}" + AliyunVod::Service.submit_transcode_job(v.uuid, 'a0277c5c0c7458458e171b0cee6ebf5e') end end + puts "###########转码个数:#{i.size}" + puts "###########id,file_url, codecnamne:#{i}" end end \ No newline at end of file diff --git a/public/react/src/common/components/comment/util.js b/public/react/src/common/components/comment/util.js index 2b4f36a85..8694161a3 100644 --- a/public/react/src/common/components/comment/util.js +++ b/public/react/src/common/components/comment/util.js @@ -1,7 +1,7 @@ /* * @Description: quill delta -> html * @Author: tangjiang - * @Github: + * @Github: * @Date: 2019-12-24 08:51:25 * @LastEditors : tangjiang * @LastEditTime : 2019-12-26 09:30:11 @@ -55,7 +55,7 @@ export const formatDelta = (deltas) => { */ export const operate = (text, key, value) => { let operatedText = null; - debugger; + switch (key) { case 'bold': operatedText = `${text}`; @@ -72,7 +72,7 @@ export const operate = (text, key, value) => { case 'link': operatedText = `${text}`; break; - default: + default: operatedText = text; } diff --git a/public/react/src/modules/competitions/Competitioncommon/CompetitionCommonChild/CompetitionContentsMd.js b/public/react/src/modules/competitions/Competitioncommon/CompetitionCommonChild/CompetitionContentsMd.js index 9ea972177..0cae1e2a6 100644 --- a/public/react/src/modules/competitions/Competitioncommon/CompetitionCommonChild/CompetitionContentsMd.js +++ b/public/react/src/modules/competitions/Competitioncommon/CompetitionCommonChild/CompetitionContentsMd.js @@ -34,7 +34,7 @@ class CompetitionContentsMd extends Component{ }else{ chart_rules.rule_contents.map((items,keys)=>{ - debugger + if(parseInt(this.props.tabkey)===items.competition_stage_id){ console.log(items) this.contentMdRef.current.setValue(items.content); diff --git a/public/react/src/modules/courses/Index.js b/public/react/src/modules/courses/Index.js index eef17f420..e11a0c59f 100644 --- a/public/react/src/modules/courses/Index.js +++ b/public/react/src/modules/courses/Index.js @@ -684,12 +684,24 @@ class CoursesIndex extends Component{ (props) => () } > + {/* 子目录普通作业 */} + () + } + > {/* 分组作业 */} () } > + {/* 分组作业 */} + () + } + > {/* 普通作业 */} () } > + {/* 子普通作业 */} + () + } + > {/* 分组作业 */} - {/* 问卷答题 */} + {/* 分组作业 */} + () + } + > + + + {/* 问卷答题 */} () diff --git a/public/react/src/modules/courses/ListPageIndex.js b/public/react/src/modules/courses/ListPageIndex.js index d95ed6739..a780f4dc6 100644 --- a/public/react/src/modules/courses/ListPageIndex.js +++ b/public/react/src/modules/courses/ListPageIndex.js @@ -230,6 +230,12 @@ class ListPageIndex extends Component{ (props) => () } > + {/* 普通作业 */} + () + } + > {/* 作品列表 */} () } > + {/* 作品列表 */} + () + } + > { this.props.showNotification("视频信息修改成功!"); @@ -82,7 +82,7 @@ class Video extends Component { let videoId = { videoId: item.id, title: item.title, - link:item.link + link: item.link } this.setState({ videoId, @@ -118,8 +118,6 @@ class Video extends Component { _clipboard = null; } } else { - // videoEl.current && videoEl.current.play() - setTimeout(() => { if (!_clipboard) { _clipboard = new ClipboardJS('.copybtn'); @@ -148,7 +146,7 @@ class Video extends Component { axios.delete(url, { params: { video_id: item.id, - is_link:item.link ? true : undefined + is_link: item.link ? true : undefined } }).then(result => { if (result) { @@ -168,30 +166,30 @@ class Video extends Component { } // 移动到 - moveVideo=(id,flag)=>{ - if(!flag){ + moveVideo = (id, flag) => { + if (!flag) { this.setState({ - moveVisible:true, - moveVideoId:id + moveVisible: true, + moveVideoId: id }) - }else{ + } else { this.props.define({ - title:'提示', - content:"您不是课堂管理员或者视频发布者,暂不能移动视频。", + title: '提示', + content: "您不是课堂管理员或者视频发布者,暂不能移动视频。", }) } } - setMoveVisible=(flag)=>{ + setMoveVisible = (flag) => { this.setState({ - moveVisible:flag, - moveVideoId:undefined + moveVisible: flag, + moveVideoId: undefined }) } render() { - const { visible, videoVisible, videoId , moveVisible , moveVideoId } = this.state; + const { visible, videoVisible, videoId, moveVisible, moveVideoId } = this.state; const CourseId = this.props.match.params.coursesId; - const VID=this.props.match.params.videoId; + const VID = this.props.match.params.videoId; const login = this.props.user && this.props.user.login; const _inputValue = videoId && this.getCopyText(videoId.file_url, videoId.cover_url); @@ -201,7 +199,7 @@ class Video extends Component { const { videos, upload, uploadVideo, videoData, changePage, pageSize, page } = this.props; const operation = admin || business; - const {course_identity} = this.props.coursedata; + const { course_identity } = this.props.coursedata; const flagMove = parseInt(course_identity) < 5; return ( @@ -214,8 +212,8 @@ class Video extends Component { {...this.props} visible={moveVisible} mainId={videoData && videoData.course_module_id} - setMoveVisible={(flag)=>this.setMoveVisible(flag)} - successFunc={()=>uploadVideo()} + setMoveVisible={(flag) => this.setMoveVisible(flag)} + successFunc={() => uploadVideo()} id={moveVideoId} > - {videoId && } + {videoId && }
0 ? - +

{videoData && videoData.count} 个视频

{ @@ -259,7 +257,7 @@ class Video extends Component { getCopyText={this.getCopyText} operation={operation || item.user_id === user_id} deleteVideo={(admin || item.user_id === user_id) ? this.deleteVideo : undefined} - moveVideo={videoData && videoData.has_category && flagMove ? ()=>this.moveVideo(item.id,(course_identity > 2 && item.user_id !== user_id)):undefined} + moveVideo={videoData && videoData.has_category && flagMove ? () => this.moveVideo(item.id, (course_identity > 2 && item.user_id !== user_id)) : undefined} > ) diff --git a/public/react/src/modules/courses/Video/video-play/flv-player.jsx b/public/react/src/modules/courses/Video/video-play/flv-player.jsx deleted file mode 100644 index 3a36df964..000000000 --- a/public/react/src/modules/courses/Video/video-play/flv-player.jsx +++ /dev/null @@ -1,37 +0,0 @@ -import React, { useEffect, useRef } from 'react' - -export default ({ url }) => { - const ref = useRef() - - useEffect(() => { - let player = null - if (window.flvjs.isSupported) { - player = window.flvjs.createPlayer({ - type: 'flv', - volume: 0.8, - cors: true, - url, - muted: false - }) - - if (ref.current) { - player.attachMediaElement(ref.current) - player.load() - player.play() - } - } - return () => { - if (player) { - player.unload() - player.pause() - player.destroy() - player = null - } - } - - }, [url, ref.current]) - - return ( - - ) -} \ No newline at end of file diff --git a/public/react/src/modules/courses/Video/video-play/index.jsx b/public/react/src/modules/courses/Video/video-play/index.jsx index 61338e202..6cb54fb5b 100644 --- a/public/react/src/modules/courses/Video/video-play/index.jsx +++ b/public/react/src/modules/courses/Video/video-play/index.jsx @@ -1,18 +1,139 @@ -import React, { Fragment } from 'react' -import ReactFlvPlayer from './flv-player' +import React, { useRef, useEffect, useCallback } from 'react' + +const regex = /(android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini)/i +//接口文档 https://www.showdoc.cc/educoder?page_id=4029884447803706 +export default ({ src, videoId, logWatchHistory, courseId = null }) => { -export default ({ src }) => { const suf = src.split('.').pop() const isFlv = suf === 'flv' - return ( - - { - isFlv ? : + const el = useRef() + + const deviceMatch = navigator.userAgent.toLowerCase().match(regex) + const device = deviceMatch ? deviceMatch[0] : 'pc' + + let totalDuration = 0 + let totalTimePlayed = 0 + let sumTimePlayed = 0 + let lastUpdatedTime = 0 + let lastEffectUpdatedTime = 0 + let logId = null + let initLog = false + let timeTick = 20 //记录频率 默认20s + let logCount = 1 + + const log = useCallback((callback) => { + let params = {} + if (logId) { + params['log_id'] = logId + params['watch_duration'] = totalTimePlayed //当前观看视频时长,拖放进度条,重复的视频片段观看时,不会把重复的时长累积进来,最大时长是视频的总时长 + params['total_duration'] = sumTimePlayed //累计观看视频时长,拖放进度条,重复的视频片段观看时,重复观看时长要累积进来 + } else { + if (courseId) { + params['course_video_id'] = videoId + } else { + params['video_id'] = videoId + } + params['duration'] = totalDuration + params['device'] = device + } + async function getLogId() { + let id = await logWatchHistory(params) + logId = id + if (callback) { + callback() + } + } + getLogId() + }, [videoId, courseId]) + + useEffect(() => { + let player = null + if (window.flvjs.isSupported && isFlv) { + player = window.flvjs.createPlayer({ + type: 'flv', + volume: 0.8, + cors: true, + url: src, + muted: false + }) + + if (el.current) { + player.attachMediaElement(el.current) + player.load() + } + } else { + el.current.setAttribute('src', src) + } + return () => { + if (player) { + player.unload() + player.pause() + player.destroy() + player = null + } + } + }, [el, isFlv, src]) + + useEffect(() => { + + function onPlay() { + if (!initLog) { + initLog = true + log() + } + } + + async function onEnded() { + log(() => { + logId = null + logCount = 1 + totalTimePlayed = 0 + lastUpdatedTime = 0 + sumTimePlayed = 0 + initLog = false + lastEffectUpdatedTime = 0 + }) + } + + function onTimeupdate() { + let newTime = el.current.currentTime + let timeDiff = newTime - lastUpdatedTime + let effectTimeDiff = newTime - lastEffectUpdatedTime + if (effectTimeDiff > 0) { + totalTimePlayed += effectTimeDiff + lastEffectUpdatedTime = newTime + } + sumTimePlayed += Math.abs(timeDiff) + lastUpdatedTime = newTime + + if (sumTimePlayed - logCount * timeTick >= 0) { + logCount++ + log() } - + } + function onCanPlay() { + totalDuration = el.current.duration + if (totalDuration <= 20) { + timeTick = totalDuration / 3 + } + el.current.addEventListener('play', onPlay) + } + + el.current.addEventListener('canplay', onCanPlay) + el.current.addEventListener('ended', onEnded) + + el.current.addEventListener('timeupdate', onTimeupdate) + return () => { + el.current.removeEventListener('canplay', onCanPlay) + el.current.removeEventListener('play', onPlay) + el.current.removeEventListener('ended', onEnded) + el.current.removeEventListener('timeupdate', onTimeupdate) + } + }, [el, src]) + + + return ( +
diff --git a/public/react/src/modules/courses/busyWork/CommonWorkItem.js b/public/react/src/modules/courses/busyWork/CommonWorkItem.js index b2f598486..4e8146118 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkItem.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkItem.js @@ -163,7 +163,7 @@ class CommonWorkItem extends Component{ }
this.props.onItemClick(Object.assign({}, item, {id: item.homework_id})) }> -

+

{canNotLink? @@ -199,7 +199,13 @@ class CommonWorkItem extends Component{ } */}

-

+ { + item && item.upper_category_name && + // 22 }> +

所属目录:{item.upper_category_name}
+ // + } +

{ item.author && {item.author} } {item.commit_count===undefined?"":{item.commit_count} 已交} {item.uncommit_count===undefined?"":{item.uncommit_count} 未交} diff --git a/public/react/src/modules/courses/busyWork/Index.js b/public/react/src/modules/courses/busyWork/Index.js index b204a7b47..308950ab6 100644 --- a/public/react/src/modules/courses/busyWork/Index.js +++ b/public/react/src/modules/courses/busyWork/Index.js @@ -68,6 +68,12 @@ class CoursesWorkIndex extends Component{ (props) => () } > + () + } + > + {/* 作品列表 */} () } > + {/* 作品列表 */} + () + } + > + {/* 作业问答 */} () } > + () + } + > + () } > + () + } + > + {/* 评阅 */} () } > + () + } + > + {/* 提交作品 */} () } > + () + } + > + () } > + () + } + > {/* 新建 */} @@ -114,12 +156,23 @@ class CoursesWorkIndex extends Component{ (props) => () } > + () + } + > + () } > + () + } + > {/* 作业列表 */} @@ -128,6 +181,11 @@ class CoursesWorkIndex extends Component{ (props) => () } > + () + } + > {/* --------------------------------------------------------------------- */} diff --git a/public/react/src/modules/courses/busyWork/IndexGroup.js b/public/react/src/modules/courses/busyWork/IndexGroup.js index 932030253..7479366d3 100644 --- a/public/react/src/modules/courses/busyWork/IndexGroup.js +++ b/public/react/src/modules/courses/busyWork/IndexGroup.js @@ -71,6 +71,11 @@ class CoursesWorkIndex extends Component{ (props) => () } > + () + } + > {/* 作品列表 */} () } > + () + } + > {/* 作业问答 */} () } > + () + } + > {/* 参考答案 */} () } > + () + } + > {/* 评阅 */} () } > - + () + } + > () } > + + () + } + > + () } > - + () + } + > {/* 新建 */} {/* http://localhost:3007/classrooms/1309/group_homeworks/9299/edit/1 */} () } > + () + } + > () } > + () + } + > {/* 作业列表 */} () } > + {/* 作业列表 */} + () + } + > diff --git a/public/react/src/modules/courses/busyWork/NewWork.js b/public/react/src/modules/courses/busyWork/NewWork.js index 81ca690b6..4bee890d8 100644 --- a/public/react/src/modules/courses/busyWork/NewWork.js +++ b/public/react/src/modules/courses/busyWork/NewWork.js @@ -34,8 +34,17 @@ class NewWork extends Component{ } } fetchCourseData = (courseId) => { + let newcategory=undefined; + if(this.props.match.path==="/classrooms/:coursesId/common_homework/:workId/:pageType"||this.props.match.path==="/classrooms/:coursesId/group_homework/:workId/:pageType"){ + newcategory=this.props.match.params.workId + } const isGroup = this.props.isGroup() - const url = `/courses/${courseId}/homework_commons/new.json?type=${isGroup ? 3 : 1}` + let url="" + if(newcategory){ + url = `/courses/${courseId}/homework_commons/new.json?type=${isGroup ? 3 : 1}&category=${newcategory}`; + }else{ + url = `/courses/${courseId}/homework_commons/new.json?type=${isGroup ? 3 : 1}` + } axios.get(url, { }) .then((response) => { @@ -54,7 +63,17 @@ class NewWork extends Component{ }); } fetchWork = (workId) => { - const url = `/homework_commons/${workId}/edit.json` + let newcategory=undefined; + if(this.props.match.path==="/classrooms/:coursesId/common_homework/:workId/:pageType"||this.props.match.path==="/classrooms/:coursesId/group_homework/:workId/:pageType"){ + newcategory=this.props.match.params.workId + } + let url="" + if(newcategory){ + url = `/homework_commons/${workId}/edit.json?category=${newcategory}`; + }else{ + url = `/homework_commons/${workId}/edit.json` + } + axios.get(url, { }) .then((response) => { @@ -96,6 +115,9 @@ class NewWork extends Component{ doNew = (params) => { const coursesId = this.props.match.params.coursesId const newUrl = `/courses/${coursesId}/homework_commons.json` + if(this.props.match.path==="/classrooms/:coursesId/common_homework/:workId/:pageType"||this.props.match.path==="/classrooms/:coursesId/group_homework/:workId/:pageType"){ + params.category=this.props.match.params.workId + } axios.post(newUrl, params) .then((response) => { diff --git a/public/react/src/modules/courses/busyWork/PublishRightnow.js b/public/react/src/modules/courses/busyWork/PublishRightnow.js index 1b9c8b0f1..9863a95d6 100644 --- a/public/react/src/modules/courses/busyWork/PublishRightnow.js +++ b/public/react/src/modules/courses/busyWork/PublishRightnow.js @@ -41,10 +41,10 @@ class PublishRightnow extends Component{ this.props.showNotification(`请先选择要立即${showdatatypes? "发布" : "截止"}的作业`) return; } - + this.fetchCourseGroups(); - - + + } showDialog = (course_groups) => { const isPublish = this.props.isPublish; @@ -96,7 +96,7 @@ class PublishRightnow extends Component{ } homeworkstartend=(arg_group_ids,endtime)=>{ - debugger + if (this.usingCheckBeforePost && this.props.checkBeforePost) { const goOn = this.props.checkBeforePost(); if (!goOn) { @@ -104,7 +104,7 @@ class PublishRightnow extends Component{ return; } } - debugger + const isPublish = this.props.isPublish; let group_ids = arg_group_ids if (this.usingCheckBeforePost) { @@ -112,7 +112,7 @@ class PublishRightnow extends Component{ return item.id }) } - debugger + if(this.state.course_groups.length>0){ if (this.state.course_groups.length && (!group_ids || group_ids&&group_ids.length == 0)) { this.props.showNotification('请至少选择一个分班'); diff --git a/public/react/src/modules/courses/busyWork/UseBank.js b/public/react/src/modules/courses/busyWork/UseBank.js index 6c98695ba..bfa9b3520 100644 --- a/public/react/src/modules/courses/busyWork/UseBank.js +++ b/public/react/src/modules/courses/busyWork/UseBank.js @@ -130,9 +130,9 @@ class UseBank extends Component{ }) } onSave = () => { - debugger + const { checkBoxValues } = this.state; - const { object_type } = this.props + const { object_type,category_id } = this.props if(checkBoxValues.length==0){ this.setState({ isChecked:"请先选择"+engNameMap[object_type] @@ -149,7 +149,8 @@ class UseBank extends Component{ , { "object_type": object_type, "bank_id": checkBoxValues, - "course_id": courseId + "course_id": courseId, + "category":category_id } ) .then((response) => { diff --git a/public/react/src/modules/courses/busyWork/common.js b/public/react/src/modules/courses/busyWork/common.js index ebcce2c12..f738af2b4 100644 --- a/public/react/src/modules/courses/busyWork/common.js +++ b/public/react/src/modules/courses/busyWork/common.js @@ -31,7 +31,7 @@ export function RouteHOC(options = {}) { // common_homework group_homework // 是否是分组作业 isGroup = () => { - return window.location.pathname.indexOf('group_homeworks') != -1 + return window.location.pathname.indexOf('group_homeworks') != -1||window.location.pathname.indexOf('group_homework') != -1 } getModuleName = (isChinese) => { const isGroup = this.isGroup() @@ -39,8 +39,29 @@ export function RouteHOC(options = {}) { let chName = isGroup ? '分组作业' : '普通作业' return chName; } - const secondName = isGroup ? 'group_homeworks' : 'common_homeworks' - return secondName; + + if(window.location.pathname.indexOf('group_homeworks') != -1){ + const secondName ='group_homeworks'; + return secondName; + } + + + if(window.location.pathname.indexOf('group_homework') != -1){ + const secondName ='group_homework'; + return secondName; + } + + if(window.location.pathname.indexOf('common_homeworks') != -1){ + const secondName ='common_homeworks'; + return secondName; + } + + if(window.location.pathname.indexOf('common_homework') != -1){ + const secondName ='common_homework'; + return secondName; + } + + } getModuleType = () => { const isGroup = this.isGroup() diff --git a/public/react/src/modules/courses/busyWork/commonWork.js b/public/react/src/modules/courses/busyWork/commonWork.js index 8ba6303fc..c5db27252 100644 --- a/public/react/src/modules/courses/busyWork/commonWork.js +++ b/public/react/src/modules/courses/busyWork/commonWork.js @@ -6,7 +6,7 @@ import '../css/busyWork.css' import CommonWorkItem from './CommonWorkItem' import PublishRightnow from './PublishRightnow' import ConnectProject from './ConnectProject' -import { WordsBtn, on, off } from 'educoder' +import { WordsBtn, on, off ,trigger} from 'educoder' import Modals from '../../modals/Modals' import NoneData from "../coursesPublic/NoneData" import Titlesearchsection from '../common/titleSearch/TitleSearchSection'; @@ -34,7 +34,9 @@ class commonWork extends Component{ totalCount:0, checkAll:false, checkBoxValues:[], - isSpin:false + isSpin:false, + category_id:undefined, + course_module:[] } } //输入搜索条件 @@ -45,8 +47,8 @@ class commonWork extends Component{ } //搜索查询 searchStudent=()=>{ - let {page,search,order}=this.state; - this.getList(1,search,order); + let {category_id,search,order}=this.state; + this.getList(1,search,order,category_id); } openConnectionProject = (work) => { this.refs['connectProject'].openConnectionProject(work) @@ -54,7 +56,7 @@ class commonWork extends Component{ // 新建 createCommonWork=(type)=>{ - this.props.toNewPage(this.props.match.params) + this.props.toNewPage(this.props.match.params) } cancelDelClasses=()=>{ @@ -69,23 +71,53 @@ class commonWork extends Component{ } componentDidUpdate(prevProps, prevState) { - if (prevProps.match.path != this.props.match.path) { - this.clearSelection() - this.setState({ selectedKeys: 'all', order: '' }, () => { - this._getList() - }) + + if (prevProps.coursesidtype != this.props.coursesidtype||prevProps.match.params.category_id!=this.props.match.params.category_id) { + if (this.props.match.path === "/classrooms/:coursesId/common_homeworks/:category_id" || this.props.match.path === "/classrooms/:coursesId/common_homework/:category_id"|| + this.props.match.path === "/classrooms/:coursesId/group_homeworks/:category_id" || this.props.match.path === "/classrooms/:coursesId/group_homework/:category_id" + ) { + + if (this.props.coursesidtype === "node" && this.props.match.path === "/classrooms/:coursesId/common_homeworks/:category_id"|| + this.props.coursesidtype === "node" && this.props.match.path === "/classrooms/:coursesId/group_homeworks/:category_id" + ) { + + this.clearSelection() + this.setState({selectedKeys: 'all', order: ''}, () => { + this._getList() + }) + } + + if (this.props.coursesidtype === "child" && this.props.match.path === "/classrooms/:coursesId/common_homework/:category_id"|| + this.props.coursesidtype === "child" && this.props.match.path === "/classrooms/:coursesId/group_homework/:category_id" + ) { + + this.clearSelection() + this.setState({selectedKeys: 'all', order: ''}, () => { + this._getList(this.props.match.params.category_id) + }) + } + } + } + } - - _getList = () => { + + _getList = (id) => { this.setState({ - isSpin:true + isSpin:true, + category_id:id }) let {page,search,order}=this.state; - this.getList(page,search,order); + this.getList(page,search,order,id); } componentDidMount(){ - this._getList() + + if(this.props.match.path === "/classrooms/:coursesId/common_homeworks/:category_id"||this.props.match.path === "/classrooms/:coursesId/group_homeworks/:category_id"){ + this._getList() + } + if(this.props.match.path === "/classrooms/:coursesId/common_homework/:category_id"||this.props.match.path === "/classrooms/:coursesId/group_homework/:category_id") { + this._getList(this.props.match.params.category_id) + } on('updateNavSuccess', this.updateNavSuccess) } @@ -93,9 +125,14 @@ class commonWork extends Component{ off('updateNavSuccess', this.updateNavSuccess) } updateNavSuccess = () => { - this._getList() + if(this.props.match.path === "/classrooms/:coursesId/common_homeworks/:category_id"||this.props.match.path === "/classrooms/:coursesId/group_homeworks/:category_id"){ + this._getList() + } + if(this.props.match.path === "/classrooms/:coursesId/common_homework/:category_id"||this.props.match.path === "/classrooms/:coursesId/group_homework/:category_id") { + this._getList(this.props.match.params.category_id) + } } - + useBankSuccess = (checkBoxValues, newWorkIdArray) => { this.setState({ page:1, @@ -103,12 +140,13 @@ class commonWork extends Component{ }, () => { this.refs['publishModalRef'].open() }) - - let {search, order}=this.state; - this.getList(1, search, order); + + let {search, order,category_id}=this.state; + this.getList(1, search, order,category_id); } - getList=(page,search,order)=>{ + getList=(page,search,order,category_id)=>{ + this.setState({ isSpin:true }) @@ -121,6 +159,9 @@ class commonWork extends Component{ if(search!=""){ url+="&search="+search; } + if(category_id){ + url+="&category="+category_id; + } axios.get(encodeURI(url)).then((result)=>{ if(result.status==200){ this.setState({ @@ -130,6 +171,32 @@ class commonWork extends Component{ page:page, ...result.data }) + this.getdatas(result.data.main_category_id) + } + }).catch((error)=>{ + this.setState({ + isSpin:false + }) + }) + } + getdatas=(main_category_id)=>{ + let newcourse_module=[] + + let urls=`/course_modules/${main_category_id}.json` + axios.get(encodeURI(urls)).then((result)=>{ + if(result.status==200){ + + newcourse_module.push({name:result.data.course_module.module_name,id:result.data.course_module.id}) + if(result.data.course_module.course_second_categories.length>0){ + + result.data.course_module.course_second_categories.map((item,key)=>{ + newcourse_module.push(item) + }) + } + + this.setState({ + course_module:newcourse_module + }) } }).catch((error)=>{ this.setState({ @@ -148,8 +215,8 @@ class commonWork extends Component{ checkBoxValues:[], checkAll:false }) - let {search}=this.state; - this.getList(1,search,e.key==="all"?"":e.key); + let {search,category_id}=this.state; + this.getList(1,search,e.key==="all"?"":e.key,category_id); } onPageChange=(pageNumber)=>{ @@ -157,8 +224,8 @@ class commonWork extends Component{ page:pageNumber, checkBoxValues:[] }) - let {search,order}=this.state; - this.getList(pageNumber,search,order); + let {search,order,category_id}=this.state; + this.getList(pageNumber,search,order,category_id); } // 全选和反选 @@ -191,7 +258,7 @@ class commonWork extends Component{ } onWorkDelete = () => { - const { checkBoxValues } = this.state; + const { checkBoxValues,category_id} = this.state; const len = checkBoxValues.length; if (len == 0) { this.props.showNotification('请先选择要删除的作业') @@ -209,13 +276,14 @@ class commonWork extends Component{ axios.post(url, { homework_ids: checkBoxValues, all_check: 0, + // category:category_id // group_ids }).then((response) => { - if (response.data.status == 0) { + if (response.data.status == 0) { this.props.showNotification('删除成功') this.clearSelection() let {search,order}=this.state; - this.getList(1,search,order); + this.getList(1,search,order,category_id); this.props.updataleftNavfun() } @@ -224,14 +292,14 @@ class commonWork extends Component{ }) } }) - + } clearSelection = () => { this.setState({ checkBoxValues: [], checkAll: false }) } - // + // onSetPublic = () => { - const { checkBoxValues } = this.state; + const { checkBoxValues,category_id } = this.state; const len = checkBoxValues.length; if (len == 0) { this.props.showNotification('请先选择要公开的作业') @@ -249,10 +317,10 @@ class commonWork extends Component{ homework_ids: checkBoxValues, all_check: 0 }).then((response) => { - if (response.data.status == 0) { + if (response.data.status == 0) { this.props.showNotification('设为公开操作成功') let {search,order, page}=this.state; - this.getList(page,search,order); + this.getList(page,search,order,category_id); } }).catch((error) => { @@ -262,8 +330,8 @@ class commonWork extends Component{ }) } doWhenSuccess = () => { - let {search,order, page}=this.state; - this.getList(page,search,order); + let {search,order, page,category_id}=this.state; + this.getList(page,search,order,category_id); this.setState({ checkBoxValues:[] }) @@ -279,7 +347,7 @@ class commonWork extends Component{ this.onChangeSelect(checkBoxValues) } addToBank = () => { - const { checkBoxValues } = this.state; + const { checkBoxValues,category_id } = this.state; const len = checkBoxValues.length; if (len == 0) { this.props.showNotification('请先选择要加入题库的作业') @@ -291,10 +359,10 @@ class commonWork extends Component{ homework_ids: checkBoxValues, all_check: 0 }).then((response) => { - if (response.data.status == 0) { + if (response.data.status == 0) { this.props.showNotification('加入成功') let {search,order}=this.state; - this.getList(1,search,order); + this.getList(1,search,order,category_id); } }).catch((error) => { @@ -302,27 +370,70 @@ class commonWork extends Component{ }) } connectSuccess = () => { - let {page,search,order}=this.state; - this.getList(page,search,order); + let {page,search,order,category_id}=this.state; + this.getList(page,search,order,category_id); } cancelConnectionProject = (work) => { let workId=this.props.match.params.workId; let courseId=this.props.match.params.coursesId; - + let {page,search,order,category_id}=this.state; const url = `/homework_commons/${work.homework_id}/student_works/cancel_relate_project.json` axios.get(url).then((response)=> { if (response.data.status == 0) { - let {page,search,order}=this.state; - this.getList(page,search,order); + + this.getList(page,search,order,category_id); this.props.showNotification('取消关联成功') } }).catch((error)=>{ console.log(error) }) } + addDir = (id) => { + + if(!id){ + trigger('addcommon_homeworks', parseInt(this.props.match.params.category_id)) + }else{ + let data={id:parseInt(id),name:this.state.category_name} + trigger('editcommon_homeworks', data) + } + + } + + newaddDir = () => { + trigger('addcommon_homeworks', parseInt(this.state.main_category_id)) + } + moveTo = (item) => { + const len = this.state.checkBoxValues.length + if (len == 0) { + this.props.showNotification('请先在列表中选择要移动的作业') + return; + } + const checkBoxValues = this.state.checkBoxValues; + const coursesId= this.props.match.params.coursesId; + const category_id=this.state.category_id; + const url = `/courses/${coursesId}/homework_commons/move_to_category.json` + axios.post(url, { + homework_ids: checkBoxValues, + new_category_id: item.id, + category_id:!category_id?undefined:category_id + }) + .then((response) => { + if (response.data.status == 0) { + console.log('--- 成功') + this.props.showNotification('作业移动成功') + this.props.updataleftNavfun() + this.setState({ + checkBoxValues:[] + }) + this.updateNavSuccess() + } + }) + .catch(function (error) { + console.log(error); + }); + } - render(){ let { search, @@ -334,11 +445,13 @@ class commonWork extends Component{ totalCount, checkAll, checkBoxValues, - + course_module, task_count, published_count, unpublished_count, main_category_name, + category_name, + category_id }=this.state; const { coursedata } = this.props; if (!coursedata) { @@ -350,16 +463,15 @@ class commonWork extends Component{ const isGroup = this.props.isGroup() const isAdmin = this.props.isAdmin() + const bid = this.props.match.params.category_id - // - // return( - +

{/*

{moduleChineseName} - +

@@ -374,7 +486,7 @@ class commonWork extends Component{
- } + { isAdmin &&
  • + this.addDir(category_id)}>{!category_id?"新建目录":"目录重命名"} +
  • } } secondRowBotton={ @@ -425,7 +540,7 @@ class commonWork extends Component{ searchPlaceholder={"请输入名称进行搜索"} showSearchInput={true} > - this.refs['publishModalRef'].homeworkstart()}>{ "立即发布" }
  • -
  • - + { !!course_public &&
  • 设为公开
  • } - {this.props.user&&this.props.user.main_site===true?
  • 加入题库
  • :""} +
  • + 移动到... +
      + { course_module && course_module.length > 10 &&

      + {this.setState({dirSearchValue: e.target.value})}}/> +

      } + { + course_module && course_module.filter((item)=> { + return item.id != bid && (!this.state.dirSearchValue || item.name.indexOf(this.state.dirSearchValue) != -1) + }).map( (item, index) => { + return
    • this.moveTo(item)} title={item.name}>{item.name}
    • + }) + } + { isAdmin && +

      + this.newaddDir()} + >新建目录... +

      + } + {/*

      添加分班...

      */} +
    +
  • {/* 设为公开 */} 15 && -
    +
    } diff --git a/public/react/src/modules/courses/competitions/Competitioncommon/CompetitionCommonChild/CompetitionContentsMd.js b/public/react/src/modules/courses/competitions/Competitioncommon/CompetitionCommonChild/CompetitionContentsMd.js index 9ea972177..0cae1e2a6 100644 --- a/public/react/src/modules/courses/competitions/Competitioncommon/CompetitionCommonChild/CompetitionContentsMd.js +++ b/public/react/src/modules/courses/competitions/Competitioncommon/CompetitionCommonChild/CompetitionContentsMd.js @@ -34,7 +34,7 @@ class CompetitionContentsMd extends Component{ }else{ chart_rules.rule_contents.map((items,keys)=>{ - debugger + if(parseInt(this.props.tabkey)===items.competition_stage_id){ console.log(items) this.contentMdRef.current.setValue(items.content); diff --git a/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js b/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js index 1c627b78d..eaefd50e9 100644 --- a/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js +++ b/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js @@ -142,6 +142,8 @@ class Coursesleftnav extends Component{ off('editshixunmainname',this.editshixunmainname) off('videoAdd',this.addVideo) off('editVideo',this.editVideo) + off('addcommon_homeworks',this.addcommon_homeworks) + off('editcommon_homeworks',this.editcommon_homeworks) } addshixunchild=(e, data)=>{ this.Navmodalnames(e,1,"shixun_homework",data); @@ -149,6 +151,12 @@ class Coursesleftnav extends Component{ editshixunchild=(e, data)=>{ this.Navmodalnames(e,4,"editSecondname",data.id,data.name); } + addcommon_homeworks=(e, data)=>{ + this.Navmodalnames(e,1,"common_homework",data); + } + editcommon_homeworks=(e, data)=>{ + this.Navmodalnames(e,4,"editSecondname",data.id,data.name); + } editshixunmainname=(e, data)=>{ this.Navmodalnames(e,3,"editname",data.id,data.name); } @@ -196,7 +204,8 @@ class Coursesleftnav extends Component{ on('editshixunmainname',this.editshixunmainname); on('videoAdd',this.addVideo); on('editVideo',this.editVideo) - + on('addcommon_homeworks',this.addcommon_homeworks) + on('editcommon_homeworks',this.editcommon_homeworks) let courstype=this.props.match.url; @@ -537,7 +546,7 @@ class Coursesleftnav extends Component{ } saveNavmodapost=(url,value,positiontype,coursesId,type)=>{ - + console.log(positiontype) axios.post(url, {name:value}).then((result)=>{ if(result!=undefined){ @@ -548,6 +557,23 @@ class Coursesleftnav extends Component{ description:result.data.message }); + if(positiontype==="common_homeworks"||positiontype==="common_homework"||positiontype==="group_homeworks"||positiontype==="group_homework"){ + if(type===true){ + this.updasaveNavmoda() + trigger('updateNavSuccess') + }else{ + this.updasaveNavmoda() + if(positiontype==="common_homeworks"){ + this.props.history.push(`/classrooms/${coursesId}/common_homework/${result.data.category_id}`); + } + if(positiontype==="group_homeworks"){ + this.props.history.push(`/classrooms/${coursesId}/group_homework/${result.data.category_id}`); + } + + } + return + } + if(positiontype==="shixun_homeworks"||positiontype==="shixun_homework"){ if(type===true){ this.updasaveNavmoda() @@ -557,6 +583,7 @@ class Coursesleftnav extends Component{ this.props.history.push(`/classrooms/${coursesId}/shixun_homework/${result.data.category_id}`); } + return } if(positiontype==="files"||positiontype==="file"){ @@ -569,22 +596,25 @@ class Coursesleftnav extends Component{ this.updasaveNavmoda() this.props.history.push(`/classrooms/${coursesId}/file/${result.data.category_id}`); } - + return } if(positiontype==="boards"){ this.updasaveNavmoda() trigger('updateNavSuccess') this.props.history.push(`/classrooms/${coursesId}/boards/${result.data.category_id}`); + return } if(positiontype!="course_groups"&&positiontype!="shixun_homeworks"&&positiontype!="shixun_homework"){ this.updasaveNavmoda() + return } if(positiontype==="course_groups"){ this.props.updataleftNavfun(); this.props.history.push(`/classrooms/${coursesId}/course_groups/${result.data.group_id}`); + return } } @@ -864,6 +894,10 @@ class Coursesleftnav extends Component{ {/*公告栏*/} {/*作业*/} {item.type==="shixun_homework"?
    this.Navmodalnames(e,1,"shixun_homework",item.id)}>新建目录
    :""} + {/* 普通作业 */} + {item.type==="common_homework"?
    this.Navmodalnames(e,1,"common_homeworks",item.id)}>新建目录
    :""} + {/*/!* 分组作业 *!/*/} + {item.type==="group_homework"?
    this.Navmodalnames(e,1,"group_homeworks",item.id)}>新建目录
    :""} {/*资源*/} {item.type==="attachment"?
    this.Navmodalnames(e,1,"attachment",item.id)}>新建目录
    :""} {/* 视频 */} @@ -894,8 +928,8 @@ class Coursesleftnav extends Component{ let {twosandiantypes,twosandiantypenum}=this.state; return (item.type==="graduation"?"":
    {/*作业/资源*/} - {item.type==="shixun_homework"||item.type==="attachment"||item.type==="graduation"?
    this.Navmodalnames(e,4,"editSecondname",iem.category_id,iem.category_name)}>重命名
    :""} - {item.type==="shixun_homework"||item.type==="attachment"?
    this.deleteSecondary(e,1,iem.category_id)}>删除
    :""} + {item.type==="shixun_homework"||item.type==="attachment"||item.type==="graduation"||item.type==="common_homework"||item.type==="group_homework"?
    this.Navmodalnames(e,4,"editSecondname",iem.category_id,iem.category_name)}>重命名
    :""} + {item.type==="shixun_homework"||item.type==="attachment"||item.type==="common_homework"||item.type==="group_homework"?
    this.deleteSecondary(e,1,iem.category_id)}>删除
    :""} {/*分班*/} {item.type==="course_group"?
    this.Navmodalnames(e,5,"editSecondname",iem.category_id,iem.category_name)}>重命名
    :""} {item.type==="course_group"?
    this.deleteSecondary(e,2,iem.category_id)}>删除
    :""} diff --git a/public/react/src/modules/courses/gradinforms/Bullsubdirectory.js b/public/react/src/modules/courses/gradinforms/Bullsubdirectory.js index 78f56a0f7..f166f3aaa 100644 --- a/public/react/src/modules/courses/gradinforms/Bullsubdirectory.js +++ b/public/react/src/modules/courses/gradinforms/Bullsubdirectory.js @@ -156,7 +156,7 @@ class Bullsubdirectory extends Component{ handleSubmit=(e) => { e.preventDefault(); this.props.form.validateFields((err, values) => { - debugger + if (!err) { console.log(values.description); if(values.eduintits === undefined|| values.eduintits === "" || values.eduintits ===null){ diff --git a/public/react/src/modules/ecs/subroute/ecCourseSupportSetting/EditableCourseSupportSetting.js b/public/react/src/modules/ecs/subroute/ecCourseSupportSetting/EditableCourseSupportSetting.js index 70b39241c..3b5d88a3d 100644 --- a/public/react/src/modules/ecs/subroute/ecCourseSupportSetting/EditableCourseSupportSetting.js +++ b/public/react/src/modules/ecs/subroute/ecCourseSupportSetting/EditableCourseSupportSetting.js @@ -20,7 +20,7 @@ let id = 0; /** target_id - position + position target_weight target_contents @@ -29,7 +29,7 @@ let id = 0; subitem_contents */ -const data = +const data = [{"position":0,"target_weight":0.02,"target_contents":"12","standard_grade":2,"subitem_id":"65"},{"position":3,"target_id":"0","target_weight":0.1,"target_contents":"理解数据管理技术和数据库技术的发展,区分不同数据模型的作用和特点,描述数据库系统的类型、结构、数据独立性。","standard_grade":60,"subitem_id":"66"},{"position":4,"target_weight":1,"target_contents":"22","standard_grade":33,"subitem_id":"66"},{"position":11,"target_id":"1","target_weight":0.1,"target_contents":"理解数据管理技术和数据库技术的发展,区分不同数据模型的作用和特点,描述数据库系统的类型、结构、数据独立性。","standard_grade":61,"subitem_id":"65"}] ; let _data = [ @@ -70,10 +70,10 @@ class EditableCourseSupportSetting extends Component { let fValues = this.props.form.getFieldsValue(); if ( // fValues.standard_grade[k] && fValues.standard_grade[k] != 75 - // || fValues.subitem_id[k] - // || - fValues.target_contents[k] - // || fValues.target_weight[k] + // || fValues.subitem_id[k] + // || + fValues.target_contents[k] + // || fValues.target_weight[k] ) { this.props.showModal('提示', '确定要删除吗?', () => { this.remove(k) @@ -129,7 +129,7 @@ class EditableCourseSupportSetting extends Component { const subitem_id = form.getFieldValue('subitem_id'); keys.splice(index_arg, 0, newKey); - // position2Target_idMap + // position2Target_idMap // {1:2, 2:3, 3:4, 4:6 } --> {1:2, 2:3, 3:7, 4:4, 5:6 } // 更新key/position 映射到target_id的map // 两次revers,用这个结构,达到给position加1的效果 @@ -142,13 +142,13 @@ class EditableCourseSupportSetting extends Component { reverseMap[target_id] = parseInt(reverseMap[target_id]) + 1; keys[i] = keys[i] + 1; } - for (let i = 0 ; i < keys.length - 1; i++) { + for (let i = 0 ; i < keys.length - 1; i++) { if (keys[i] == keys[i + 1]) { - debugger; + } } this.position2Target_idMap = this._reverseMap(reverseMap); - + target_weight.splice(newKey, 0, undefined); target_contents.splice(newKey, 0, undefined); @@ -179,7 +179,7 @@ class EditableCourseSupportSetting extends Component { const keys = form.getFieldValue('keys'); let nextKeys ; let newKey = k + 1; - + const newKeyIndex = keys.indexOf(newKey) if (newKeyIndex != -1) { // 新key存在,将新key位置及以后的row后移,直到找到一个之后的空位置 @@ -213,7 +213,7 @@ class EditableCourseSupportSetting extends Component { data.push({}) } for (var valKey in values) { - + let dataIndex = 0 values[valKey].forEach( (item,index) => { let _val = values[valKey][index]; @@ -228,7 +228,7 @@ class EditableCourseSupportSetting extends Component { } console.log('Received values of form: ', values, data); - + let totalWeight = 0; values.target_weight.forEach(item => { if (item) { @@ -264,8 +264,8 @@ class EditableCourseSupportSetting extends Component { } } } - - + + }); } @@ -292,7 +292,7 @@ class EditableCourseSupportSetting extends Component { subitem_id[item.position] = item.subitem_id ? (item.subitem_id).toString() : item.subitem_id; this.position2Target_idMap[item.position] = item.target_id - }) + }) form.setFieldsValue({ keys }); @@ -308,9 +308,9 @@ class EditableCourseSupportSetting extends Component { // this.forceUpdate() }, 3000) - + } - + render() { const { getFieldDecorator, getFieldValue } = this.props.form; @@ -397,7 +397,7 @@ class EditableCourseSupportSetting extends Component { message: "请先选择毕业要求指标点", }], })( - )} - { !addOrDeleting && { this.onRemove(k) }} className="color-grey-c mr15" data-tip-down="删除"> } - { !addOrDeleting && { this.add(k, index + 1) }} - className="color-green show-FillTable" + className="color-green show-FillTable" data-tip-down="添加"> } - - + + )); return ( - +

    @@ -443,15 +443,15 @@ class EditableCourseSupportSetting extends Component { 对应毕业要求指标点 { !addOrDeleting && - { this.add(-1, 0) }} data-tip-down="添加"> } -

    +

    {formItems}
    {/* - diff --git a/public/react/src/modules/ecs/subroute/ecStudentList/EcStudentList.js b/public/react/src/modules/ecs/subroute/ecStudentList/EcStudentList.js index e8876b7a5..9af0acb31 100644 --- a/public/react/src/modules/ecs/subroute/ecStudentList/EcStudentList.js +++ b/public/react/src/modules/ecs/subroute/ecStudentList/EcStudentList.js @@ -123,7 +123,7 @@ class EcStudentList extends Component { console.log(error); }); } - + windowsgoblack=()=>{ window.history.go(-1) @@ -267,17 +267,17 @@ class EcStudentList extends Component { Modallist: '确定删除这些学生吗?', Modallisttype:true, Modallisttypess:1 - }) + }) }else{ this.setState({ Modallist: '请选择学生!', Modallisttype:true - }) + }) } }; //删除学生 deletelistbthenters=()=>{ - debugger + let {Myschoolstudents,studentall} =this.state; let major_id=this.props.match.params.majorId; let year_id=this.props.match.params.yearId; diff --git a/public/react/src/modules/forums/MemoDetail.js b/public/react/src/modules/forums/MemoDetail.js index 792b24aa9..b5ba988e5 100644 --- a/public/react/src/modules/forums/MemoDetail.js +++ b/public/react/src/modules/forums/MemoDetail.js @@ -668,7 +668,7 @@ class MemoDetail extends Component { // --------------------------------------------------------------------------------------------帖子獎勵 END showCommentInput = () => { - debugger + if (window.__useKindEditor === true) { this.refs.editor.showEditor(); } else { diff --git a/public/react/src/modules/login/LoginDialog.js b/public/react/src/modules/login/LoginDialog.js index dda9fed7f..cc0a15514 100644 --- a/public/react/src/modules/login/LoginDialog.js +++ b/public/react/src/modules/login/LoginDialog.js @@ -469,7 +469,7 @@ class LoginDialog extends Component { autologin:isGoingValue } ).then((response) => { - debugger; + if(response===undefined){ return } diff --git a/public/react/src/modules/modals/Modals.js b/public/react/src/modules/modals/Modals.js index 1aaec6402..60485b26a 100644 --- a/public/react/src/modules/modals/Modals.js +++ b/public/react/src/modules/modals/Modals.js @@ -34,6 +34,9 @@ render() { } .color848282{ color:#848282; + } + .task-btn{ + color: #fff !important; } ` } @@ -50,7 +53,7 @@ render() {
    : } diff --git a/public/react/src/modules/modals/SendTopics.js b/public/react/src/modules/modals/SendTopics.js index 96320f201..7a072a843 100644 --- a/public/react/src/modules/modals/SendTopics.js +++ b/public/react/src/modules/modals/SendTopics.js @@ -95,7 +95,7 @@ class SendTopics extends Component{ }catch (e) { } -debugger + if(this.props.mysendall===true){ //详情页面跳过来的 try { @@ -119,7 +119,7 @@ debugger } }else{ //外部多个列表页跳过来的 - debugger + try { var rurls=""; if(this.props.category==="normal"){ diff --git a/public/react/src/modules/paths/PathDetail/DetailTop.js b/public/react/src/modules/paths/PathDetail/DetailTop.js index d542c225e..bf43c0759 100644 --- a/public/react/src/modules/paths/PathDetail/DetailTop.js +++ b/public/react/src/modules/paths/PathDetail/DetailTop.js @@ -32,7 +32,10 @@ class DetailTop extends Component{ getappointmenttype:false, openpathss:false, cancel_publics:false, - cancel_has_publics:false + cancel_has_publics:false, + applyissuePaths:false, + cancelText:undefined, + okText:undefined } } componentDidMount(){ @@ -110,21 +113,27 @@ class DetailTop extends Component{ applyissuePath=()=>{ + this.setState({ + loadtype:true, + Modalstype: true, + Modalstopval:`课程发布后即可发送课堂使用`, + // modalsMidval:"有人公开可见,若仅本人教学使用则无需申请公开,直接发", + // Modalsbottomval:"送到课堂即可。", + applyissuePaths:true + }) + + } + + showapplyissuePath=()=>{ let pathid=this.props.match.params.pathId; let url ="/paths/"+pathid+"/publish.json"; axios.post(url).then((result)=>{ if(result.status===200){ if(result.data.status===0){ - this.setState({ - loadtype:true, - Modalstype: true, - Modalstopval: ` 课程需经过平台审核方可公开使用,公开的课程将对平台所`, - modalsMidval:"有人公开可见。若仅本人教学使用则无需申请公开, 直接发", - Modalsbottomval:"送到课堂即可.", - cardsModalsavetype: true, - }) + this.props.showNotification(result.data.message) this.props.getlistdatas(); + this.cardsModalcancel() }else if(result.data.status===1){ // window.location.reload(); } @@ -132,9 +141,7 @@ class DetailTop extends Component{ }).catch((error)=>{ console.log(error); }) - - - } + } postcancelissuePath=()=>{ let pathId=this.props.match.params.pathId; let url ="/paths/"+pathId+"/cancel_publish.json"; @@ -180,12 +187,15 @@ class DetailTop extends Component{ modalsMidval:'', modalstyles:'', cardsModalsavetype:false, - applyissuePath:false, + applyissuePaths:false, openpathss:false, cancel_publics:false, cancel_has_publics:false, Modalstopval:``, + cancelText:undefined, + okText:undefined }) + } cardsModalsave=()=>{ @@ -369,13 +379,13 @@ class DetailTop extends Component{ openpaths=()=>{ this.setState({ - loadtype:true, Modalstype: true, openpathss:true, - Modalstopval: "公开申请已提交,请等待管理员的审核", - modalsMidval:"• 我们将在1-2个工作日内完成审核", - Loadtype:true, - modalstyles:"848282" + Modalstopval: "公开课程需经过平台标准化审核,审核周期为1-2天,公开", + modalsMidval:"的课程将对平台所有人可见。若仅本人教学使用则无需", + Modalsbottomval:"申请公开,直接发送到课堂即可", + cancelText:"取消申请", + okText:"确定申请" }) } @@ -433,7 +443,7 @@ class DetailTop extends Component{ render(){ let{detailInfoList}=this.props; - let{Modalstype,Modalstopval,cardsModalcancel,putappointmenttype,Modalsbottomval,cardsModalsavetype,loadtype,getappointmenttype,openpathss,cancel_publics,cancel_has_publics}=this.state; + let{Modalstype,Modalstopval,cardsModalcancel,putappointmenttype,Modalsbottomval,cardsModalsavetype,loadtype,getappointmenttype,openpathss,cancel_publics,cancel_has_publics,applyissuePaths}=this.state; const radioStyle = { display: 'block', height: '30px', @@ -470,8 +480,10 @@ class DetailTop extends Component{ modalsTopval={Modalstopval} modalsBottomval={Modalsbottomval} modalCancel={cardsModalcancel} - modalSave={loadtype===true&&openpathss===false?()=>this.cardsModalcancel():cardsModalsavetype===true?()=>this.postcancelissuePath():openpathss===true?()=>this.postopenpaths():cancel_publics===true?()=>this.postcancel_public():cancel_has_publics===true?()=>this.postcancel_has_public():putappointmenttype===true?()=>this.getappointment():()=>this.cardsModalsave()} + modalSave={applyissuePaths===true?()=>this.showapplyissuePath():loadtype===true&&openpathss===false?()=>this.cardsModalcancel():cardsModalsavetype===true?()=>this.postcancelissuePath():openpathss===true?()=>this.postopenpaths():cancel_publics===true?()=>this.postcancel_public():cancel_has_publics===true?()=>this.postcancel_has_public():putappointmenttype===true?()=>this.getappointment():()=>this.cardsModalsave()} loadtype={loadtype} + cancelText={this.state.cancelText} + okText={this.state.okText} modalsMidval={this.state.modalsMidval} modalstyles={this.state.modalstyles} > @@ -605,8 +617,8 @@ class DetailTop extends Component{ { detailInfoList.publish_status===0&&detailInfoList.allow_add_member===true? 发布:"" + style={{'width':'95px'}} + onClick={this.applyissuePath}>申请发布:"" } diff --git a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBanner.js b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBanner.js index ffb28d3df..283445ea1 100644 --- a/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBanner.js +++ b/public/react/src/modules/projectPackages/PackageIndexNewandEdit/PackageIndexNEIBanner.js @@ -16,7 +16,7 @@ class PackageIndexNEIBanner extends Component { } onChange=(current)=>{ - debugger + console.log('onChange:', current); this.setState({ current }); }; diff --git a/public/react/src/modules/question/component/Newknledpots.js b/public/react/src/modules/question/component/Newknledpots.js index 7e0a79228..ad2710593 100644 --- a/public/react/src/modules/question/component/Newknledpots.js +++ b/public/react/src/modules/question/component/Newknledpots.js @@ -63,7 +63,7 @@ class PaperDeletModel extends Component { } NewknTypedeltyoedels=()=>{ - debugger + if(this.state.newkntypeinput.length===0){ this.setState({ errorestit:'请输入知识点', diff --git a/public/react/src/modules/question/comthetestpaper/Comthetestpaperst.js b/public/react/src/modules/question/comthetestpaper/Comthetestpaperst.js index a426e7ea7..447416225 100644 --- a/public/react/src/modules/question/comthetestpaper/Comthetestpaperst.js +++ b/public/react/src/modules/question/comthetestpaper/Comthetestpaperst.js @@ -475,7 +475,7 @@ class Comthetestpaperst extends Component { //////console.log('Clicked! But prevent default.'); } deletesobject = (item, index) => { - debugger + var tmp = this.state.Knowpoints; for (var i = 0; i < tmp.length; i++) { if (i ===index) { diff --git a/public/react/src/modules/testpaper/component/Paperlibraryseeid_item.js b/public/react/src/modules/testpaper/component/Paperlibraryseeid_item.js index 58959d745..05dbaec82 100644 --- a/public/react/src/modules/testpaper/component/Paperlibraryseeid_item.js +++ b/public/react/src/modules/testpaper/component/Paperlibraryseeid_item.js @@ -123,7 +123,7 @@ class Paperreview_item extends Component { } axios.post(url, data) .then((result) => { - debugger + if (result.data.status == 0) { // this.props.showNotification(`拖动成功`); this.props.getdata(); diff --git a/public/react/src/modules/tpm/Audit_situationComponent.js b/public/react/src/modules/tpm/Audit_situationComponent.js index 3739cd6db..1057bc484 100644 --- a/public/react/src/modules/tpm/Audit_situationComponent.js +++ b/public/react/src/modules/tpm/Audit_situationComponent.js @@ -106,7 +106,7 @@ class Audit_situationComponent extends Component { } showModal = (id,status) => { - debugger + this.setState({ visible: true, editid:id, diff --git a/public/react/src/modules/tpm/TPMBanner.js b/public/react/src/modules/tpm/TPMBanner.js index 9ba752827..7527357c0 100644 --- a/public/react/src/modules/tpm/TPMBanner.js +++ b/public/react/src/modules/tpm/TPMBanner.js @@ -60,7 +60,8 @@ class TPMBanner extends Component { openshowpublictype:false, Radiovalue:1, TextAreaintshow:false, - + cancelText:undefined, + okText:undefined, } } @@ -434,6 +435,9 @@ class TPMBanner extends Component { modalsMidval:undefined, ModalsBottomval:"", modalstyles:"", + cancelText:undefined, + okText:undefined, + Loadtype:false, }) } ModalSave = () => { @@ -441,7 +445,10 @@ class TPMBanner extends Component { let url = "/shixuns/" + id + "/cancel_publish.json"; axios.get(url).then((response) => { this.props.showSnackbar(response.data.message); - window.location.reload() + // window.location.reload() + this.ModalCancel() + this.props.getcomponentdidmount() + }).catch((error) => { console.log(error) }); @@ -461,16 +468,21 @@ class TPMBanner extends Component { ModalSaveopenpublic= () => { this.setState({ Modalstype: true, - Modalstopval: "公开申请已提交,请等待管理员的审核", - modalsMidval:"• 我们将在1-2个工作日内完成审核", - ModalCancel: this.eopenpublicupdatadata, + Modalstopval:"公开实训需经过平台标准化审核,审核周期为1-2天,", + modalsMidval:"公开的实训将对平台所有人可见。若仅本人教学使用", + ModalsBottomval:"则无需申请公开, 直接发送到课堂即可。", + cancelText:"取消申请", + okText:"确定申请", + ModalCancel: this.ModalCancel, ModalSave: this.eopenpublicupdatadata, - Loadtype:true, - modalstyles:"848282" + // Loadtype:true, + // modalstyles:"848282" }) } eopenpublicupdatadata=()=>{ - window.location.reload() + // window.location.reload() + this.ModalCancel() + this.props.getcomponentdidmount() } openpublic=()=>{ let id = this.props.match.params.shixunId; @@ -490,7 +502,9 @@ class TPMBanner extends Component { let url = `/shixuns/${id}/cancel_apply_public.json`; axios.get(url).then((response) => { if(response.data.status===0){ - window.location.reload() + // window.location.reload() + this.ModalCancel() + this.props.getcomponentdidmount() } }).catch((error) => { console.log(error) @@ -522,7 +536,10 @@ class TPMBanner extends Component { evaluation_set_position = response.data.evaluation_set_position } if(response.data.status===0){ - window.location.reload() + // window.location.reload() + this.applyreleaseopen() + // this.ModalCancel() + this.props.getcomponentdidmount() }else{ this.setState({ Issuevisible: true, @@ -536,13 +553,23 @@ class TPMBanner extends Component { console.log(error) }); }; + applyreleaseopen = () => { + this.setState({ + Modalstype: true, + Loadtype:true, + Modalstopval: "实训发布后即可发送课堂使用", + ModalSave: this.ModalCancel, + }) + } hiddenIssuevisible = (val) => { this.setState({ Issuevisible: false }) if (val === 0 || val === 1) { - window.location.reload() + // window.location.reload() + this.ModalCancel() + this.props.getcomponentdidmount() } } @@ -803,7 +830,9 @@ class TPMBanner extends Component { hidestartshixunsreplacevalue, Forkvisibletype, AccountProfiletype, - isIE + isIE, + cancelText, + okText, } = this.state; let {shixunsDetails, shixunId, star_info, star_infos} = this.props; let challengeBtnTipText = ''; @@ -900,6 +929,8 @@ class TPMBanner extends Component { modalsMidval={this.state.modalsMidval} loadtype={this.state.Loadtype} modalstyles={this.state.modalstyles} + cancelText={this.state.cancelText} + okText={this.state.okText} /> : ""}
    diff --git a/public/react/src/modules/tpm/TPMIndex.js b/public/react/src/modules/tpm/TPMIndex.js index 7c7a706c5..2a650e3d0 100644 --- a/public/react/src/modules/tpm/TPMIndex.js +++ b/public/react/src/modules/tpm/TPMIndex.js @@ -412,6 +412,7 @@ class TPMIndex extends Component { {...this.props} {...this.state} is_jupyter={this.state. is_jupyter} + getcomponentdidmount={()=>this.getcomponentdidmount()} > } diff --git a/public/react/src/modules/tpm/newshixuns/Newshixuns.js b/public/react/src/modules/tpm/newshixuns/Newshixuns.js index 46f45a8a7..71b325986 100644 --- a/public/react/src/modules/tpm/newshixuns/Newshixuns.js +++ b/public/react/src/modules/tpm/newshixuns/Newshixuns.js @@ -97,7 +97,7 @@ class Newshixuns extends Component { }) const mdContnet = this.contentMdRef.current.getValue().trim(); this.props.form.validateFieldsAndScroll((err, values) => { - debugger + if (!err) { console.log('Received values of form: ', values); diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js index 0e701c00c..32263676f 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js @@ -33,7 +33,7 @@ class Challenges extends Component { isSpin:false, boxoffsetHeigh:0, opentitletype:true, - isopentitletype:"Less", + isopentitletype:"Less" } } @@ -357,6 +357,50 @@ class Challenges extends Component { }) } + // 开启挑战 + beginChallenge=(url)=>{ + if (this.props.checkIfLogin() === false) { + this.props.showLoginDialog() + return; + } + if (this.props.checkIfProfileCompleted() === false) { + this.setState({ + AccountProfiletype: true + }) + return; + } + this.setState({ + startbtns:true + }) + if(url.indexOf(".json")>-1){ + axios.get(url).then((response) => { + if (response.data.status === -2) { + this.setState({ + startbtns:false, + shixunsreplace:true, + hidestartshixunsreplacevalue:response.data.message+".json" + }) + } else if (response.data.status === -1) { + this.setState({ + startbtns: false + }) + }else if(response.data.status===-3){ + this.setState({ + shixunsmessage:response.data.message, + startshixunCombattype:true, + startbtns:false + }) + } else { + window.location.href = "/tasks/" + response.data.game_identifier; + } + }).catch((error) => { + + }); + }else{ + window.location.href=url; + } + } + render() { let { ChallengesDataList, startbtns, sumidtype ,startshixunCombattype,shixunsreplace,shixunsmessage,hidestartshixunsreplacevalue,operationstrue,AccountProfiletype} = this.state; let { loadingContent } = this.props; @@ -700,49 +744,60 @@ class Challenges extends Component {
    +
    +
    +
    + {/*onClick={() => this.EditTraining(this.props.identity, item.challenge_id, "/editquestion")}*/} + {this.props.identity<5? + item.st === 1 ? +
    {item.name}
    + : +
    {item.name}
    :
    this.startshixunCombat(this.props.identity, item.challenge_id, "/editcheckpoint")} + className="font-16 color05101a fonthiddens">{item.name}
    + } + {/* onClick={() => this.EditTraining(this.props.identity, item.challenge_id, "/editcheckpoint")}*/} + + + +
    +
    + + 正在挑战: {item.playing_count}人 + 完成挑战: {item.passed_count}人 + 可获经验: {item.score}点 -
    - {/*onClick={() => this.EditTraining(this.props.identity, item.challenge_id, "/editquestion")}*/} - {this.props.identity<5? - item.st === 1 ? -
    {item.name}
    - : -
    {item.name}
    :
    this.startshixunCombat(this.props.identity, item.challenge_id, "/editcheckpoint")} - className="font-16 color05101a fonthiddens">{item.name}
    +
    +
    + { + item.open_game ? + this.beginChallenge(item.open_game)} className="challengeBtn blue">开启挑战 + : + 开启挑战 } - {/* onClick={() => this.EditTraining(this.props.identity, item.challenge_id, "/editcheckpoint")}*/} - - - - - -
    -
    - - 正在挑战: {item.playing_count}人 - 完成挑战: {item.passed_count}人 - 可获经验: {item.score}点 - -
    +
    ) })}
    + + + - { - debugger + if(this.state.login === undefined || this.state.login.length===0){ this.openNotification("请输入手机号或邮箱"); return; diff --git a/public/react/src/modules/user/LoginRegisterComponent.js b/public/react/src/modules/user/LoginRegisterComponent.js index a356e3788..786fd1356 100644 --- a/public/react/src/modules/user/LoginRegisterComponent.js +++ b/public/react/src/modules/user/LoginRegisterComponent.js @@ -352,7 +352,7 @@ class LoginRegisterComponent extends Component { login: this.state.login, password: this.state.password, }).then((response) => { - debugger + if (response === undefined) { return } diff --git a/public/react/src/modules/user/usersInfo/banks/NewGtaskForm.js b/public/react/src/modules/user/usersInfo/banks/NewGtaskForm.js index 70994e42d..a8fcdeeae 100644 --- a/public/react/src/modules/user/usersInfo/banks/NewGtaskForm.js +++ b/public/react/src/modules/user/usersInfo/banks/NewGtaskForm.js @@ -110,7 +110,7 @@ class NewGtaskForms extends Component{ } handleSubmit = () => { - + console.log(this.props) let {contentFileList,min_num,max_num,base_on_project}=this.state; let {data}=this.props; let task_type=data.task_type diff --git a/public/react/src/modules/user/usersInfo/common/HeadlessModal.js b/public/react/src/modules/user/usersInfo/common/HeadlessModal.js index b208cb951..c5a6e39ac 100644 --- a/public/react/src/modules/user/usersInfo/common/HeadlessModal.js +++ b/public/react/src/modules/user/usersInfo/common/HeadlessModal.js @@ -1,22 +1,14 @@ -import React, { useState, useEffect, useContext, useRef, memo } from 'react'; -import {Link} from 'react-router-dom'; +import React, { useContext } from 'react'; -import { getUrl2, isDev, ThemeContext } from 'educoder' +import { ThemeContext } from 'educoder' import { Modal } from 'antd' -function HeadlessModal (props) { - // const [ visible, setVisible ] = useState(false) +function HeadlessModal(props) { const theme = useContext(ThemeContext); - const { category, visible, setVisible, className, width } = props; - - - useEffect(() => { - - }, []) - + const { visible, setVisible, className, width } = props; return ( - - setVisible(false) }> + setVisible(false)}> {props.children} ) diff --git a/public/react/src/modules/user/usersInfo/video/InfosVideo.js b/public/react/src/modules/user/usersInfo/video/InfosVideo.js index 05d726628..907243600 100644 --- a/public/react/src/modules/user/usersInfo/video/InfosVideo.js +++ b/public/react/src/modules/user/usersInfo/video/InfosVideo.js @@ -10,6 +10,7 @@ import HeadlessModal from '../common/HeadlessModal' import ClipboardJS from 'clipboard' import VideoPlay from '../../../courses/Video/video-play'; +import { logWatchHistory } from '../../../../services/video-service'; function useModal(initValue) { const [visible, setVisible] = useState(initValue) @@ -219,32 +220,32 @@ function InfoVideo(props) { } - function deleteVideo(item){ + function deleteVideo(item) { props.confirm({ content: '该视频将被删除,不可恢复', subContent: '是否确认删除?', - + onOk: () => { - const url = `/users/${user && user.login}/videos/${item.id}.json`; - axios.delete(url).then(result => { - if (result) { - props.showNotification(`视频删除成功!`); - if (pageObj.current === 1) { - if (categoryObj.category === 'all') { - fetchvideos() - } else { - fetchReviewvideos() - } - } else { - pageObj.onChange(1) + const url = `/users/${user && user.login}/videos/${item.id}.json`; + axios.delete(url).then(result => { + if (result) { + props.showNotification(`视频删除成功!`); + if (pageObj.current === 1) { + if (categoryObj.category === 'all') { + fetchvideos() + } else { + fetchReviewvideos() + } + } else { + pageObj.onChange(1) + } } - } - }).catch(error => { - console.log(error); - }) + }).catch(error => { + console.log(error); + }) }, onCancel() { - console.log('Cancel'); + console.log('Cancel'); }, }); } @@ -267,7 +268,7 @@ function InfoVideo(props) { className="showVideoModal" width={800 - 1} > - {videoModalObj.visible && } + {videoModalObj.visible && }