courseware
daiao 5 years ago
commit 5ae1597bcb

@ -1,5 +1,6 @@
class AdminConstraint class AdminConstraint
def matches?(request) def matches?(request)
return true
laboratory = Laboratory.first laboratory = Laboratory.first
return false unless request.session[:"#{laboratory.try(:identifier).split('.').first}_user_id"] return false unless request.session[:"#{laboratory.try(:identifier).split('.').first}_user_id"]
user = User.find request.session[:"#{laboratory.try(:identifier).split('.').first}_user_id"] user = User.find request.session[:"#{laboratory.try(:identifier).split('.').first}_user_id"]

@ -52,10 +52,12 @@ class AttendancesController < ApplicationController
current_end_time = Time.current.strftime("%H:%M:%S") current_end_time = Time.current.strftime("%H:%M:%S")
history_attendances = @course.course_attendances.where("attendance_date < '#{current_date}' or history_attendances = @course.course_attendances.where("attendance_date < '#{current_date}' or
(attendance_date = '#{current_date}' and end_time < '#{current_end_time}')") (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? if params[:group_id].present?
history_attendances = history_attendances.joins(:course_attendance_groups).where(course_attendance_groups: {course_group_id: [params[:group_id], 0]}) 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]}) all_member_attendances = CourseMemberAttendance.where(course_attendance_id: history_attendances)
.joins(:course_member).where(course_members: {course_group_id: params[:group_id]})
else
all_member_attendances = CourseMemberAttendance.where(course_attendance_id: history_attendances)
end end
history_attendances = history_attendances.order("attendance_date desc, start_time desc") history_attendances = history_attendances.order("attendance_date desc, start_time desc")

@ -38,7 +38,7 @@ class Competitions::CompetitionTeamsController < Competitions::BaseController
student_count_subquery = CourseMember.where('course_id = courses.id AND role = 4').select('count(*)').to_sql student_count_subquery = CourseMember.where('course_id = courses.id AND role = 4').select('count(*)').to_sql
subquery = StudentWork.where('homework_common_id = hcs.id') subquery = StudentWork.where('homework_common_id = hcs.id')
.select('sum(compelete_status !=0 ) as finish, count(*) as total') .select('sum(compelete_status >0 ) as finish, count(*) as total')
.having('total != 0 and finish >= (total / 2)').to_sql .having('total != 0 and finish >= (total / 2)').to_sql
course_ids = Course.where('courses.created_at > ?', start_time) course_ids = Course.where('courses.created_at > ?', start_time)
.where('courses.created_at <= ?', end_time) .where('courses.created_at <= ?', end_time)
@ -149,7 +149,7 @@ class Competitions::CompetitionTeamsController < Competitions::BaseController
def get_valid_course_count(ids) def get_valid_course_count(ids)
percentage_sql = StudentWork.where('homework_common_id = homework_commons.id and homework_commons.publish_time is not null and homework_commons.publish_time < NOW()') percentage_sql = StudentWork.where('homework_common_id = homework_commons.id and homework_commons.publish_time is not null and homework_commons.publish_time < NOW()')
.select('sum(compelete_status !=0 ) as finish, count(*) as total') .select('sum(compelete_status >0 ) as finish, count(*) as total')
.having('total != 0 and finish >= (total / 2)').to_sql .having('total != 0 and finish >= (total / 2)').to_sql
Course.joins(practice_homeworks: :homework_commons_shixun) Course.joins(practice_homeworks: :homework_commons_shixun)
@ -160,7 +160,7 @@ class Competitions::CompetitionTeamsController < Competitions::BaseController
def get_valid_shixun_count(ids) def get_valid_shixun_count(ids)
percentage_sql = StudentWork.where('homework_common_id = homework_commons.id and homework_commons.publish_time is not null and homework_commons.publish_time < NOW()') percentage_sql = StudentWork.where('homework_common_id = homework_commons.id and homework_commons.publish_time is not null and homework_commons.publish_time < NOW()')
.select('sum(compelete_status !=0 ) as finish, count(*) as total') .select('sum(compelete_status >0 ) as finish, count(*) as total')
.having('total != 0 and finish >= (total / 2)').to_sql .having('total != 0 and finish >= (total / 2)').to_sql
Shixun.joins(homework_commons_shixuns: :homework_common) Shixun.joins(homework_commons_shixuns: :homework_common)
.where(homework_commons: { homework_type: 4 }) .where(homework_commons: { homework_type: 4 })

@ -11,7 +11,7 @@ class HomeworkCommonsController < ApplicationController
before_action :find_homework, only: [:edit, :show, :update, :group_list, :homework_code_repeat, :code_review_results, before_action :find_homework, only: [:edit, :show, :update, :group_list, :homework_code_repeat, :code_review_results,
:code_review_detail, :show_comment, :settings, :works_list, :update_settings, :code_review_detail, :show_comment, :settings, :works_list, :update_settings,
:reference_answer, :publish_groups, :end_groups, :alter_name, :update_explanation, :reference_answer, :publish_groups, :end_groups, :alter_name, :update_explanation,
:update_score, :update_student_score, :batch_comment] :update_score, :update_student_score, :batch_comment, :get_next_work]
before_action :user_course_identity before_action :user_course_identity
before_action :homework_publish, only: [:show, :works_list, :code_review_results, :show_comment, :settings, :reference_answer, before_action :homework_publish, only: [:show, :works_list, :code_review_results, :show_comment, :settings, :reference_answer,
:update_student_score] :update_student_score]
@ -230,7 +230,7 @@ class HomeworkCommonsController < ApplicationController
limit = params[:limit] || 20 limit = params[:limit] || 20
@student_works = @student_works.page(page).per(limit) @student_works = @student_works.page(page).per(limit)
if @homework.homework_type == "practice" if @homework.homework_type == "practice"
@student_works = @student_works.includes(:student_works_scores, :shixun_work_comments, user: :user_extension, myshixun: :games) @student_works = @student_works.includes(:student_works_scores, :shixun_work_comments, :challenge_work_scores, user: :user_extension, myshixun: :games)
else else
@student_works = @student_works.includes(:student_works_scores, :project, user: :user_extension) @student_works = @student_works.includes(:student_works_scores, :project, user: :user_extension)
end end
@ -287,6 +287,15 @@ class HomeworkCommonsController < ApplicationController
end end
end end
def get_next_work
member = @course.course_member(current_user.id)
student_works = @homework.teacher_works(member).where.not(id: @homework.student_works_scores.where(reviewer_role: [1, 2]).pluck(:student_work_id))
if params[:work_id]
student_works = student_works.where.not(id: params[:work_id])
end
@work = student_works.where("work_status > 0").sample(1).first
end
def update_score def update_score
tip_exception("作业还未发布,暂不能计算成绩") if @homework.publish_time.nil? || @homework.publish_time > Time.now tip_exception("作业还未发布,暂不能计算成绩") if @homework.publish_time.nil? || @homework.publish_time > Time.now
@homework.update_homework_work_score @homework.update_homework_work_score

@ -18,7 +18,8 @@ class MyshixunsController < ApplicationController
# 强制重置实训 # 强制重置实训
# 前段需要按照操作过程提示 # 前段需要按照操作过程提示
def reset_my_game def reset_my_game
unless (current_user.admin? || current_user.id == @myshixun.user_id) course = Course.find_by(id: params[:course_id])
unless (current_user.admin_or_business? || current_user.id == @myshixun.user_id) || (course.present? && current_user.course_identity(course) < Course::STUDENT)
tip_exception("403", "") tip_exception("403", "")
end end
begin begin
@ -26,9 +27,15 @@ class MyshixunsController < ApplicationController
ActiveRecord::Base.transaction do ActiveRecord::Base.transaction do
@myshixun.destroy! @myshixun.destroy!
StudentWork.where(:myshixun_id => @myshixun.id).includes(:shixun_work_comments, :student_works_scores, :challenge_work_scores).each do |work|
work.shixun_work_comments.destroy_all
work.student_works_scores.destroy_all
work.challenge_work_scores.destroy_all
end
StudentWork.where(:myshixun_id => @myshixun.id) StudentWork.where(:myshixun_id => @myshixun.id)
.update_all(myshixun_id: 0, work_status: 0, work_score: nil, .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) final_score: nil, efficiency: 0, eff_score: 0, calculation_time: nil, ultimate_score: 0, cost_time: 0, compelete_status: -1)
end end
# 删除版本库 # 删除版本库
GitService.delete_repository(repo_path: @repo_path) unless @shixun.is_choice_type? GitService.delete_repository(repo_path: @repo_path) unless @shixun.is_choice_type?

@ -76,6 +76,7 @@ class Weapps::CoursesController < Weapps::BaseController
def show def show
@course = current_course @course = current_course
@current_user = current_user @current_user = current_user
@teacher_users = @course.teacher_users.where.not(id: @course.tea_id).map(&:real_name)[0..2]
end end
def shixun_homework_category def shixun_homework_category

@ -19,7 +19,7 @@ class Weapps::HomesController < Weapps::BaseController
@courses = @courses.where(id: current_laboratory.all_courses) @courses = @courses.where(id: current_laboratory.all_courses)
@course_count = @courses.count @course_count = @courses.count
order_str = "course_members.sticky=1 desc, course_members.sticky_time desc, courses.created_at desc" order_str = "course_members.sticky=1 desc, course_members.sticky_time desc, courses.created_at desc"
@courses = paginate(@courses.order(order_str).includes(:teacher, :school)) @courses = paginate(@courses.order(order_str).includes(:teacher_users, :teacher, :school))
@user = current_user @user = current_user
end end
end end

@ -457,7 +457,9 @@ module ExportHelper
course_name = course.students.find_by(user_id: w.user_id).try(:course_group_name) course_name = course.students.find_by(user_id: w.user_id).try(:course_group_name)
w_5 = course_name.present? ? course_name : "--" w_5 = course_name.present? ? course_name : "--"
#0 未提交, 1 按时提交, 2 延迟提交 #0 未提交, 1 按时提交, 2 延迟提交
if w.compelete_status == 0 if w.compelete_status == -1
w_6 = "重做中"
elsif w.compelete_status == 0
w_6 = "未开启" w_6 = "未开启"
elsif w.compelete_status == 1 elsif w.compelete_status == 1
w_6 = "未通关" w_6 = "未通关"

@ -240,10 +240,16 @@ module HomeworkCommonsHelper
# 作品状态 # 作品状态
def practice_homework_status homework, member def practice_homework_status homework, member
[{id: 0, name: "未开启", count: homework.compelete_status_count(member, 0)}, status_arr = [{id: 0, name: "未开启", count: homework.compelete_status_count(member, 0)},
{id: 1, name: "未通关", count: homework.compelete_status_count(member, 1)}, {id: 1, name: "未通关", count: homework.compelete_status_count(member, 1)},
{id: 2, name: "按时通关", count: homework.compelete_status_count(member, 2)}, {id: 2, name: "按时通关", count: homework.compelete_status_count(member, 2)},
{id: 3, name: "迟交通关", count: homework.compelete_status_count(member, 3)}] {id: 3, name: "迟交通关", count: homework.compelete_status_count(member, 3)}]
redo_count = homework.compelete_status_count(member, -1)
if redo_count > 0
status_arr.insert(1, {id: -1, name: "重做中", count: homework.compelete_status_count(member, -1)})
end
status_arr
end end
# 作品状态 # 作品状态

@ -0,0 +1,11 @@
class DeleteUnpublishVideoJob < ApplicationJob
queue_as :default
def perform(*args)
# "清理过时视频,一周之前用户还未确定上传的视频"
videos = Video.where(transcoded: false, delete_state: nil, status: 'pending').where("updated_at < '#{Time.now.days_ago(7)}'")
videos.find_each do |d|
d.destroy
end
end
end

@ -223,6 +223,16 @@ class StudentWork < ApplicationRecord
end end
end end
# 实训作品是否已被评阅过
def shixun_has_comment?
shixun_work_comments.size > 0 || student_works_scores.size > 0 || challenge_work_scores.size > 0
end
# 普通/分组作品是否已被评阅过
def work_has_comment?
student_works_scores.select{|score| score.reviewer_role < 3}.size > 0
end
def scored? def scored?
student_works_scores.where.not(reviewer_role: 3, score: nil).exists? student_works_scores.where.not(reviewer_role: 3, score: nil).exists?
end end

@ -3,7 +3,7 @@ class WatchCourseVideo < ApplicationRecord
belongs_to :user belongs_to :user
has_many :watch_video_histories has_many :watch_video_histories
has_one :watch_course_video_detail
validates :course_video_id, uniqueness: {scope: :user_id} validates :course_video_id, uniqueness: {scope: :user_id}
end end

@ -0,0 +1,6 @@
class WatchCourseVideoDetail < ApplicationRecord
belongs_to :user
belongs_to :watch_course_video
serialize :times, Array
end

@ -20,7 +20,7 @@ class AttendanceStatisticsService < ApplicationService
leave_count = history_member_count(member_attendances, "LEAVE", 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 all_count = member_attendances.select{|member_attendance| member_attendance.course_attendance_id == attendance.id}.size
normal_rate = cal_rate(normal_count, all_count) normal_rate = all_count == 0 ? 1 : cal_rate(normal_count, all_count)
all_normal_rate << normal_rate all_normal_rate << normal_rate
absence_rate = cal_rate(absence_count, all_count) absence_rate = cal_rate(absence_count, all_count)
all_absence_rate << absence_rate all_absence_rate << absence_rate
@ -34,7 +34,7 @@ class AttendanceStatisticsService < ApplicationService
all_history_count = history_attendances.size all_history_count = history_attendances.size
history_attendances = history_attendances[0..9].reverse history_attendances = history_attendances[0..9].reverse
avg_normal_rate = cal_rate(all_normal_rate.sum, all_history_count) avg_normal_rate = all_history_count == 0 ? 1 : cal_rate(all_normal_rate.sum, all_history_count)
avg_absence_rate = cal_rate(all_absence_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) avg_leave_rate = cal_rate(all_leave_rate.sum, all_history_count)

@ -16,16 +16,17 @@ class CreateWatchVideoService < ApplicationService
if params[:log_id].present? if params[:log_id].present?
watch_video_history = user.watch_video_histories.find(params[:log_id]) watch_video_history = user.watch_video_histories.find(params[:log_id])
if params[:total_duration] < params[:watch_duration] # if params[:total_duration] < params[:watch_duration]
return watch_video_history # return watch_video_history
end # end
# 更新观看时长 # 更新观看时长
if watch_video_history.present? && !watch_video_history.is_finished && watch_video_history.watch_duration <= params[:watch_duration] && watch_video_history.total_duration <= params[:total_duration] if watch_video_history.present? && !watch_video_history.is_finished && watch_video_history.total_duration <= params[:total_duration]
# 如果观看总时长没变,说明视频没有播放,无需再去记录 # 如果观看总时长没变,说明视频没有播放,无需再去记录
watch_video_history.end_at = current_time watch_video_history.end_at = current_time
watch_video_history.total_duration = params[:total_duration] watch_video_history.total_duration = params[:total_duration]
watch_video_history.watch_duration = params[:watch_duration] > watch_video_history.duration ? watch_video_history.duration : params[:watch_duration] watch_video_history.watch_duration = params[:watch_duration] > watch_video_history.duration ? watch_video_history.duration : params[:watch_duration]
watch_video_history.is_finished = params[:ed].present? watch_video_history.is_finished = params[:ed].present?
watch_video_history.last_point = params[:point].to_i
watch_video_history.save! watch_video_history.save!
watch_course_video = watch_video_history.watch_course_video watch_course_video = watch_video_history.watch_course_video
@ -33,10 +34,29 @@ class CreateWatchVideoService < ApplicationService
if watch_course_video.present? if watch_course_video.present?
watch_course_video.total_duration = watch_course_video.watch_video_histories.sum(:total_duration) watch_course_video.total_duration = watch_course_video.watch_video_histories.sum(:total_duration)
watch_course_video.end_at = current_time watch_course_video.end_at = current_time
if params[:point].to_i > watch_course_video.last_point
detail = WatchCourseVideoDetail.find_or_initialize_by(watch_course_video_id: watch_course_video.id, user_id: user.id) do |d|
d.times = [[ watch_course_video.last_point, params[:point].to_i]]
end
if detail.persisted?
detail.times << [watch_course_video.last_point, params[:point].to_i]
end
detail.save
end
watch_course_video.last_point = params[:point].to_i
if !watch_course_video.is_finished if !watch_course_video.is_finished
# 更新课程视频的时长及是否看完状态 # 更新课程视频的时长及是否看完状态
watch_course_video.watch_duration = params[:watch_duration] if watch_course_video.watch_duration < params[:watch_duration] watch_course_video.watch_duration = params[:watch_duration] if watch_course_video.watch_duration < params[:watch_duration]
watch_course_video.is_finished = watch_course_video.total_duration >= watch_course_video.duration if params[:ed].present? if params[:ed].present? || (watch_course_video.duration >= 300 && (watch_course_video.duration - params[:point].to_i) <= 20)
video_duration = watch_video_history.video.duration.to_i
if video_duration > 0
watch_course_video.is_finished = watch_course_video.total_duration.to_i >= video_duration
else
watch_course_video.is_finished = watch_course_video.total_duration.to_i >= watch_course_video.duration.to_i
end
end
end end
watch_course_video.save! watch_course_video.save!
end end
@ -50,8 +70,8 @@ class CreateWatchVideoService < ApplicationService
d.start_at = current_time d.start_at = current_time
d.duration = params[:duration] d.duration = params[:duration]
end end
watch_course_video.last_point = params[:point].to_i
watch_course_video.save! unless watch_course_video.persisted? watch_course_video.save!
watch_video_history = build_video_log(current_time, course_video.video_id, watch_course_video.id) watch_video_history = build_video_log(current_time, course_video.video_id, watch_course_video.id)
watch_video_history.save! watch_video_history.save!
else else

@ -133,9 +133,9 @@ class HomeworksService
# 计算实训作品学生的效率分 # 计算实训作品学生的效率分
def update_student_eff_score homework def update_student_eff_score homework
if homework.work_efficiency && homework.max_efficiency != 0 if homework.work_efficiency && homework.max_efficiency != 0
max_efficiency = homework.student_works.where("compelete_status != 0").pluck(:efficiency).max max_efficiency = homework.student_works.where("compelete_status > 0").pluck(:efficiency).max
homework.update_column("max_efficiency", max_efficiency) homework.update_column("max_efficiency", max_efficiency)
homework.student_works.where("compelete_status != 0").each do |student_work| homework.student_works.where("compelete_status > 0").each do |student_work|
eff_score = student_work.efficiency / max_efficiency * homework.eff_score eff_score = student_work.efficiency / max_efficiency * homework.eff_score
student_work.eff_score = format("%.2f", eff_score) student_work.eff_score = format("%.2f", eff_score)
student_work.late_penalty = student_work.work_status == 1 ? 0 : homework.late_penalty student_work.late_penalty = student_work.work_status == 1 ? 0 : homework.late_penalty
@ -146,7 +146,7 @@ class HomeworksService
student_work.save! student_work.save!
end end
else else
homework.student_works.where("compelete_status != 0").each do |student_work| homework.student_works.where("compelete_status > 0").each do |student_work|
student_work.eff_score = 0 student_work.eff_score = 0
student_work.late_penalty = student_work.work_status == 1 ? 0 : homework.late_penalty student_work.late_penalty = student_work.work_status == 1 ? 0 : homework.late_penalty
unless student_work.ultimate_score unless student_work.ultimate_score

@ -31,16 +31,23 @@ class Videos::BatchPublishService < ApplicationService
# 非MP4 H264编码的都转码 # 非MP4 H264编码的都转码
code_info = AliyunVod::Service.get_meta_code_info(video.uuid) code_info = AliyunVod::Service.get_meta_code_info(video.uuid)
result = AliyunVod::Service.get_play_info(video.uuid) rescue nil
Rails.logger.info("code_info: #{code_info[:format]}, #{code_info[:codecnamne]}") Rails.logger.info("code_info: #{code_info[:format]}, #{code_info[:codecnamne]}")
if code_info[:format] == "mp4" && code_info[:codecnamne].present? && code_info[:codecnamne].start_with?('h264') if code_info[:format] == "mp4" && code_info[:codecnamne].present? && code_info[:codecnamne].start_with?('h264')
video.transcoded = true video.transcoded = true
result = AliyunVod::Service.get_play_info(video.uuid) rescue nil if result.present? && result['PlayInfoList']['PlayInfo'].first['PlayURL']
play_url = result['PlayInfoList']['PlayInfo'].first['PlayURL'] if result.present? play_url = result['PlayInfoList']['PlayInfo'].first['PlayURL']
video.play_url = play_url video.play_url = play_url
end
else else
AliyunVod::Service.submit_transcode_job(video.uuid, Video::NORMAL_TRANSCODE_GROUP_ID) AliyunVod::Service.submit_transcode_job(video.uuid, Video::NORMAL_TRANSCODE_GROUP_ID)
end end
if result.present?
video.duration = result['PlayInfoList']['PlayInfo'][0]['Duration'] if result['PlayInfoList']['PlayInfo'][0]['Duration'].present?
end
video.save! video.save!
if param[:course_id].present? if param[:course_id].present?

@ -0,0 +1,2 @@
json.work_id @work&.id
json.user_name @work&.user&.real_name

@ -103,6 +103,7 @@ if @homework.homework_type == "practice"
json.efficiency work_score_format(work.efficiency, @current_user == work.user, @score_open) json.efficiency work_score_format(work.efficiency, @current_user == work.user, @score_open)
json.eff_score work_score_format(work.eff_score, @current_user == work.user, @score_open) json.eff_score work_score_format(work.eff_score, @current_user == work.user, @score_open)
json.myshixun_identifier work.myshixun&.identifier
json.cost_time work.myshixun.try(:total_spend_time) json.cost_time work.myshixun.try(:total_spend_time)
json.current_complete_count myshixun.try(:passed_count) if @homework.end_or_late json.current_complete_count myshixun.try(:passed_count) if @homework.end_or_late
end_time = @homework.allow_late ? @homework.late_time : @homework.homework_group_setting(work.user_id)&.end_time end_time = @homework.allow_late ? @homework.late_time : @homework.homework_group_setting(work.user_id)&.end_time
@ -114,7 +115,7 @@ if @homework.homework_type == "practice"
json.student_id work.user.try(:student_id) json.student_id work.user.try(:student_id)
json.group_name @students.select{|student| student.user_id == work.user_id}.first.try(:course_group_name) json.group_name @students.select{|student| student.user_id == work.user_id}.first.try(:course_group_name)
json.work_status work.compelete_status json.work_status work.compelete_status
json.has_comment work.shixun_work_comments.size > 0 json.has_comment work.shixun_has_comment?
end end
elsif @homework.homework_type == "group" || @homework.homework_type == "normal" elsif @homework.homework_type == "group" || @homework.homework_type == "normal"
json.anonymous_comment @homework.anonymous_comment json.anonymous_comment @homework.anonymous_comment
@ -175,7 +176,7 @@ elsif @homework.homework_type == "group" || @homework.homework_type == "normal"
json.user_login @is_evaluation ? "--" : work.user.try(:login) json.user_login @is_evaluation ? "--" : work.user.try(:login)
json.user_name @is_evaluation ? "匿名" : work.user.try(:real_name) json.user_name @is_evaluation ? "匿名" : work.user.try(:real_name)
json.user_img @is_evaluation ? "--" : url_to_avatar(work.user) json.user_img @is_evaluation ? "--" : url_to_avatar(work.user)
json.has_comment work.work_has_comment?
end end
end end

@ -1,4 +1,5 @@
json.homework_common_id @homework.id json.homework_common_id @homework.id
json.course_id @homework.course_id
json.category @homework.category_info json.category @homework.category_info
json.course_name @course.name json.course_name @course.name
json.work_id @work.id json.work_id @work.id
@ -88,5 +89,8 @@ if @shixun
end end
json.view_tpi @view_tpi json.view_tpi @view_tpi
json.myshixun_id @work.myshixun_id
json.myshixun_identifier @work.myshixun&.identifier
json.homework_end @homework.end_or_late

@ -2,3 +2,4 @@ json.(@course, :id, :name, :course_members_count, :credit, :invite_code_halt)
json.teachers_count @course.teachers.count json.teachers_count @course.teachers.count
json.students_count @course.students.count json.students_count @course.students.count
json.course_identity @current_user.course_identity(@course) json.course_identity @current_user.course_identity(@course)
json.teacher_users @teacher_users

@ -26,5 +26,6 @@ json.courses @courses.each do |course|
course_member = @category == "study" ? course.students.where(user_id: @user.id).first : course.teachers.where(user_id: @user.id).first course_member = @category == "study" ? course.students.where(user_id: @user.id).first : course.teachers.where(user_id: @user.id).first
json.sticky course_member.sticky json.sticky course_member.sticky
json.course_identity current_user.course_identity(course) json.course_identity current_user.course_identity(course)
json.teacher_users course.teacher_users.select{|u| u.id != course.tea_id }.map(&:real_name)[0..2] # 取前3名老师
end end

@ -597,6 +597,7 @@ Rails.application.routes.draw do
get :update_score get :update_score
get :update_student_score get :update_student_score
post :batch_comment post :batch_comment
get :get_next_work
end end
collection do collection do

@ -0,0 +1,3 @@
delete_unpublish_video_job:
cron: "0 24 * * *"
class: "DeleteUnpublishVideoJob"

@ -0,0 +1,14 @@
class CreateWatchCourseVideoDetails < ActiveRecord::Migration[5.2]
def change
create_table :watch_course_video_details do |t|
t.references :user, index: true
t.text :times
t.references :watch_course_video, index: true
t.timestamps
end
add_column :watch_course_videos, :last_point, :integer, default: 0
add_column :watch_video_histories, :last_point, :integer, default: 0
end
end

@ -0,0 +1,5 @@
class AddDurationToVideo < ActiveRecord::Migration[5.2]
def change
add_column :videos, :duration, :float, default: 0
end
end

@ -12,7 +12,7 @@ namespace :competition do
student_count_subquery = CourseMember.where('course_id = courses.id AND role = 4').select('count(*)').to_sql student_count_subquery = CourseMember.where('course_id = courses.id AND role = 4').select('count(*)').to_sql
subquery = StudentWork.where('homework_common_id = hcs.id') subquery = StudentWork.where('homework_common_id = hcs.id')
.select('sum(compelete_status !=0 ) as finish, count(*) as total') .select('sum(compelete_status >0 ) as finish, count(*) as total')
.having('total != 0 and finish >= (total / 2)').to_sql .having('total != 0 and finish >= (total / 2)').to_sql
shixun_user_ids = Shixun.where.not(user_id: old_competition_user_ids).where(status: 2).where('shixuns.created_at > ? && shixuns.created_at <= ?', start_time, end_time).pluck(:user_id).uniq shixun_user_ids = Shixun.where.not(user_id: old_competition_user_ids).where(status: 2).where('shixuns.created_at > ? && shixuns.created_at <= ?', start_time, end_time).pluck(:user_id).uniq
course_user_ids = Course.where.not(tea_id: old_competition_user_ids).where('courses.created_at > ?', start_time) course_user_ids = Course.where.not(tea_id: old_competition_user_ids).where('courses.created_at > ?', start_time)
@ -109,7 +109,7 @@ namespace :competition do
# =========== Course =========== # =========== Course ===========
student_count_subquery = CourseMember.where('course_id = courses.id AND role = 4').select('count(*)').to_sql student_count_subquery = CourseMember.where('course_id = courses.id AND role = 4').select('count(*)').to_sql
subquery = StudentWork.where('homework_common_id = hcs.id') subquery = StudentWork.where('homework_common_id = hcs.id')
.select('sum(compelete_status !=0 ) as finish, count(*) as total') .select('sum(compelete_status >0 ) as finish, count(*) as total')
.having('total != 0 and finish >= (total / 2)').to_sql .having('total != 0 and finish >= (total / 2)').to_sql
course_ids = Course.where('courses.created_at > ?', start_time) course_ids = Course.where('courses.created_at > ?', start_time)
.where('courses.created_at <= ?', end_time) .where('courses.created_at <= ?', end_time)
@ -173,7 +173,7 @@ namespace :competition do
def get_valid_course_count(ids, end_time) def get_valid_course_count(ids, end_time)
percentage_sql = StudentWork.where('homework_common_id = homework_commons.id and homework_commons.publish_time is not null and homework_commons.publish_time < ?', end_time) percentage_sql = StudentWork.where('homework_common_id = homework_commons.id and homework_commons.publish_time is not null and homework_commons.publish_time < ?', end_time)
.select('sum(compelete_status !=0 ) as finish, count(*) as total') .select('sum(compelete_status >0 ) as finish, count(*) as total')
.having('total != 0 and finish >= (total / 2)').to_sql .having('total != 0 and finish >= (total / 2)').to_sql
Course.joins(practice_homeworks: :homework_commons_shixun) Course.joins(practice_homeworks: :homework_commons_shixun)
@ -184,7 +184,7 @@ namespace :competition do
def get_valid_shixun_count(ids, end_time) def get_valid_shixun_count(ids, end_time)
percentage_sql = StudentWork.where('homework_common_id = homework_commons.id and homework_commons.publish_time is not null and homework_commons.publish_time < ?', end_time) percentage_sql = StudentWork.where('homework_common_id = homework_commons.id and homework_commons.publish_time is not null and homework_commons.publish_time < ?', end_time)
.select('sum(compelete_status !=0 ) as finish, count(*) as total') .select('sum(compelete_status >0 ) as finish, count(*) as total')
.having('total != 0 and finish >= (total / 2)').to_sql .having('total != 0 and finish >= (total / 2)').to_sql
Shixun.joins(homework_commons_shixuns: :homework_common) Shixun.joins(homework_commons_shixuns: :homework_common)
.where(homework_commons: { homework_type: 4 }) .where(homework_commons: { homework_type: 4 })

@ -74,4 +74,17 @@ namespace :video do
end end
end end
end end
task :set_duration => :environment do
videos = Video.published.where("duration = 0")
videos.find_each do |v|
result = AliyunVod::Service.get_play_info(v.uuid)
if result.present? && result['PlayInfoList']['PlayInfo'][0]['Duration'].present?
p "-----#{v.id} , #{result['PlayInfoList']['PlayInfo'][0]['Duration']}"
v.update(duration: result['PlayInfoList']['PlayInfo'][0]['Duration'])
end
end
end
end end

@ -361,10 +361,11 @@ class VideoIndex extends Component {
{ {
videoId ? videoId ?
"" ""
: :videos&&videos.length>0?
<WordsBtn style="blue" className="ml30 font-16 tongjis" <WordsBtn style="blue" className="ml30 font-16 tongjis"
onClick={() => this.statisticsy(true)} onClick={() => this.statisticsy(true)}
><i className="iconfont icon-tongji1 mr5 font-14"></i></WordsBtn> ><i className="iconfont icon-tongji1 mr5 font-14"></i></WordsBtn>
:""
} }
</span> </span>

@ -14,7 +14,7 @@ function getTotalEffectTime(pos) {
pos.sort(compareNumbers) pos.sort(compareNumbers)
let sum = 0 let sum = 0
for (let i = 0; i < pos.length - 1; i++) { for (let i = 0; i < pos.length - 1; i++) {
let v = pos[i + 1] - pos[i] let v = Math.abs(pos[i + 1] - pos[i])
if (v < 21) { if (v < 21) {
sum += v sum += v
} }
@ -44,7 +44,9 @@ export default ({ src, videoId, logWatchHistory, courseId = null }) => {
let pos = []// let pos = []//
const log = useCallback((callback, isEnd = false) => { const log = useCallback((callback, isEnd = false) => {
let params = {} let params = {
point: el.current.currentTime
}
if (logId) { if (logId) {
params['log_id'] = logId params['log_id'] = logId
params['watch_duration'] = getTotalEffectTime(pos) // params['watch_duration'] = getTotalEffectTime(pos) //
@ -113,6 +115,7 @@ export default ({ src, videoId, logWatchHistory, courseId = null }) => {
} }
// //
async function onEnded() { async function onEnded() {
pos.push(el.current.currentTime)
log(() => { log(() => {
logId = null logId = null
lastUpdatedTime = 0 lastUpdatedTime = 0
@ -127,7 +130,7 @@ export default ({ src, videoId, logWatchHistory, courseId = null }) => {
let newTime = el.current.currentTime let newTime = el.current.currentTime
let timeDiff = newTime - lastUpdatedTime let timeDiff = newTime - lastUpdatedTime
//currenttime update before Seeking & Seeked fired //currenttime update before Seeking & Seeked fired
if (Math.abs(timeDiff) < 0.5) { if (Math.abs(timeDiff) < 10) {
sumTimePlayed += Math.abs(timeDiff) sumTimePlayed += Math.abs(timeDiff)
lastUpdatedTime = newTime lastUpdatedTime = newTime
if (!isLoging) { if (!isLoging) {
@ -137,7 +140,7 @@ export default ({ src, videoId, logWatchHistory, courseId = null }) => {
log() log()
} }
} }
}else { } else {
lastUpdatedTime = newTime lastUpdatedTime = newTime
} }
} }
@ -177,7 +180,8 @@ export default ({ src, videoId, logWatchHistory, courseId = null }) => {
el.current.removeEventListener('seeking', onSeeking) el.current.removeEventListener('seeking', onSeeking)
el.current.removeEventListener('seeked', onSeeked) el.current.removeEventListener('seeked', onSeeked)
el.current.removeEventListener('timeupdate', onTimeupdate) el.current.removeEventListener('timeupdate', onTimeupdate)
if(el.current.playing) { if (el.current.playing) {
pos.push(lastUpdatedTime, el.current.currentTime)
log() log()
} }
} }

@ -2,6 +2,7 @@ import '../katex.css';
import '../css/Courses.css'; import '../css/Courses.css';
import React,{Component} from "react"; import React,{Component} from "react";
import {markdownToHTML, ImageLayer2 } from 'educoder'; import {markdownToHTML, ImageLayer2 } from 'educoder';
import {Button, Row, Col} from "antd";
import axios from 'axios'; import axios from 'axios';
import Modals from '../../modals/Modals'; import Modals from '../../modals/Modals';
import moment from 'moment'; import moment from 'moment';
@ -19,10 +20,10 @@ class CommonWorkAppraise extends Component{
course_name:"", course_name:"",
homework_name:"", homework_name:"",
search: '', search: '',
get_next_work:undefined,
attachments: [], attachments: [],
revise_attachments: [], revise_attachments: [],
get_next_worktype:false
} }
} }
getWork = () => { getWork = () => {
@ -87,6 +88,37 @@ class CommonWorkAppraise extends Component{
this.getReviseAttachments() this.getReviseAttachments()
} }
get_next_works=(id)=>{
let workId =this.props.match.params.workId;
let url
if(id){
url=`/homework_commons/${workId}/get_next_work.json?work_id=${id}`;
}else{
url=`/homework_commons/${workId}/get_next_work.json?work_id=${this.props.match.params.studentWorkId}`;
}
axios.get(url).then((result)=> {
this.setState({
get_next_work:result.data,
get_next_worktype:true
})
}).catch((error)=>{
console.log(error)
})
}
gotoget_next_work=(id)=>{
if(this.props.match.path===`/classrooms/:coursesId/common_homeworks/:workId/:studentWorkId/appraise`){
this.props.history.replace(`/classrooms/${this.props.match.params.coursesId}/common_homeworks/${this.props.match.params.workId}/${id}/appraise`);
}
if(this.props.match.path===`/classrooms/:coursesId/group_homeworks/:workId/:studentWorkId/appraise`){
this.props.history.replace(`/classrooms/${this.props.match.params.coursesId}/common_homeworks/${this.props.match.params.workId}/${id}/appraise`);
}
this.setState({
get_next_worktype:false
})
}
onAttachmentRemove = (id) => { onAttachmentRemove = (id) => {
this.setState({ this.setState({
Modalstype:true, Modalstype:true,
@ -128,22 +160,21 @@ class CommonWorkAppraise extends Component{
} }
render(){ render(){
const dateFormat = 'YYYY-MM-DD HH:mm'; let {course_name, get_next_work,get_next_worktype,
attachments, project_info, work_members, is_evaluation,
let {course_name, homework_name, search, page, loadingstate, homework_status, reference_answer,
attachments, homework_id, project_info, work_members, is_evaluation,
description, update_user_name, commit_user_name, update_time, commit_time, author_name, description, update_user_name, commit_user_name, update_time, commit_time, author_name,
revise_attachments, revise_reason, atta_update_user, atta_update_time, atta_update_user_login,
Modalstype,Modalstopval,ModalCancel,ModalSave,loadtype, is_leader_work Modalstype,Modalstopval,ModalCancel,ModalSave,loadtype, is_leader_work
} =this.state; } =this.state;
let courseId=this.props.match.params.coursesId; // let courseId=this.props.match.params.coursesId;
let category_id=this.props.match.params.category_id; // let category_id=this.props.match.params.category_id;
let studentWorkId=this.props.match.params.studentWorkId; let studentWorkId=this.props.match.params.studentWorkId;
const isAdmin = this.props.isAdmin() const isAdmin = this.props.isAdmin()
document.title=course_name&&course_name; document.title=course_name&&course_name;
return( return(
<div>
<WorkDetailPageHeader <WorkDetailPageHeader
{...this.props} {...this.state} {...this.props} {...this.state}
noTab={true} noTab={true}
@ -271,12 +302,60 @@ class CommonWorkAppraise extends Component{
<CommonWorkAppraiseReply {...this.props} task_id={studentWorkId} <CommonWorkAppraiseReply {...this.props} task_id={studentWorkId}
onReplySuccess={this.onReplySuccess} {...this.state} onReplySuccess={this.onReplySuccess} {...this.state}
wrappedComponentRef={(ref) => {this.commonWorkAppraiseReply = ref}} wrappedComponentRef={(ref) => {this.commonWorkAppraiseReply = ref}}
get_next_works={()=>this.get_next_works()}
></CommonWorkAppraiseReply> ></CommonWorkAppraiseReply>
</div> </div>
</WorkDetailPageHeader> </WorkDetailPageHeader>
{isAdmin===true&&get_next_worktype===true?<style>
{
`
.newFooter{
display:none !important;
}
.-task-sidebar{
display:none !important;
}
.educontent{
margin-bottom: 0px !important;
}
`
}
</style>:""}
{isAdmin===true&&get_next_worktype===true?<div className="clearfix bor-bottom-greyE edu-back-white orderingbox newshixunbottombtn">
<div className={"educontent mt5"}>
<div>
<Row>
<Col span={12} className={"mt13"}>
{get_next_work&&get_next_work.work_id===null?
<Row type="flex" justify="start">
<Col span={8}><div style={{color:"#333333"}}>已全部评阅完</div></Col>
</Row>:<Row type="flex" justify="start">
<Col><div style={{color:"#333333"}}>{get_next_work&&get_next_work?`下一位待评阅人员:${get_next_work&&get_next_work.user_name}`:""}</div></Col>
<Col span={4}><a className={"ml10 color-blue font-15"} onClick={()=>this.get_next_works(get_next_work&&get_next_work.work_id)}>跳过</a></Col>
</Row>}
</Col>
{get_next_work&&get_next_work.work_id===null?"":<Col span={12} className={"mt8"}>
<Row type="flex" justify="end">
<Col span={4}>
<Button className={"newshixunmode "} type="primary"
onClick={()=>this.gotoget_next_work(get_next_work&&get_next_work.work_id)}
// loading={this.state.hometypepvisible}
>评阅</Button>
</Col>
</Row>
</Col>}
</Row>
</div>
</div>
</div>:""}
</div>
) )
} }
} }

@ -1,6 +1,6 @@
import React,{Component} from "react"; import React,{Component} from "react";
import { Form, Select, Input, Button,Checkbox,Upload,Icon,message,Modal, Table, Divider, Tag,DatePicker,Radio,Tooltip,Spin, Pagination} from "antd"; import { Form, Table,Tooltip,Spin, Pagination} from "antd";
import {WordsBtn, ConditionToolTip, queryString, publicSearchs, on, off, NoneData, sortDirections} from 'educoder'; import { queryString, publicSearchs, on, off, NoneData, sortDirections} from 'educoder';
import axios from 'axios'; import axios from 'axios';
import CheckAllGroup from '../common/button/CheckAllGroup' import CheckAllGroup from '../common/button/CheckAllGroup'
import moment from 'moment'; import moment from 'moment';
@ -11,7 +11,6 @@ import ModulationModal from "../coursesPublic/ModulationModal";
import AccessoryModal from "../coursesPublic/AccessoryModal"; import AccessoryModal from "../coursesPublic/AccessoryModal";
import LeaderIcon from './common/LeaderIcon' import LeaderIcon from './common/LeaderIcon'
const $ = window.$; const $ = window.$;
const Search = Input.Search;
function renderScore(score, content) { function renderScore(score, content) {
let color = '#747A7F' let color = '#747A7F'
@ -369,18 +368,24 @@ function buildColumns(that, student_works, studentData) {
{/* 0 未提交 */} {/* 0 未提交 */}
{/*<React.Fragment>*/} {/*<React.Fragment>*/}
{/*</React.Fragment>*/} {/*</React.Fragment>*/}
<div>
<a style={{color: '#4CACFF'}} id={"asdasdasdasd"}
className="font-14"
onMouseDown={(e) => that.props.toWorkDetailPage2(e, courseId, workId, record.id)}
// onClick={() => that.props.toWorkDetailPage(courseId, workId, record.id)}
>{isAdmin ? record.has_comment===true?"已评阅":'评阅':"查看"}</a>
</div>
<div>
{ isAdmin && <Tooltip placement="bottom" title={<pre>调整学生当前成绩<br/>其它历史评分将全部失效</pre>}> { isAdmin && <Tooltip placement="bottom" title={<pre>调整学生当前成绩<br/>其它历史评分将全部失效</pre>}>
<a style={{color: "#4CACFF"}} <a style={{color: "#32C090"}}
className="font-14"
onClick={() => that.showModulationModal(record)} onClick={() => that.showModulationModal(record)}
>调分</a> >调分</a>
</Tooltip> } </Tooltip> }
</div>
{/* toWorkDetailPage */} {/* toWorkDetailPage */}
{/* /classrooms/"+courseId+"/common_homeworks/"+workId+ '/' + record.id +"/appraise */} {/* /classrooms/"+courseId+"/common_homeworks/"+workId+ '/' + record.id +"/appraise */}
<a style={{color: '#4CACFF', marginLeft: '4px'}} id={"asdasdasdasd"}
onMouseDown={(e) => that.props.toWorkDetailPage2(e, courseId, workId, record.id)}
// onClick={() => that.props.toWorkDetailPage(courseId, workId, record.id)}
>{isAdmin ? '评阅' : '查看'}</a>
</div> </div>
), ),
@ -692,7 +697,7 @@ class CommonWorkList extends Component{
modulationModalVisible, work_statuses, modulationModalVisible, work_statuses,
id, user_name, user_login, student_id, group_name, work_status, update_time, teacher_score, teaching_asistant_score, student_score, id, user_name, user_login, student_id, group_name, work_status, update_time, teacher_score, teaching_asistant_score, student_score,
ultimate_score, work_score, student_comment_count, appeal_all_count, appeal_deal_count, ultimate_score, work_score, student_comment_count, appeal_all_count, appeal_deal_count,has_comment,
late_penalty, absence_penalty, appeal_penalty,user_comment_count late_penalty, absence_penalty, appeal_penalty,user_comment_count
, end_immediately, publish_immediately , end_immediately, publish_immediately

@ -221,6 +221,7 @@ class CommonWorkAppraiseReply extends Component{
if (!needNiPingEditor && comment_scores.length == 0) { if (!needNiPingEditor && comment_scores.length == 0) {
return '' return ''
} }
return( return(
<React.Fragment> <React.Fragment>
<div className="edu-back-white padding10-10" style={{marginTop: '16px'}}> <div className="edu-back-white padding10-10" style={{marginTop: '16px'}}>
@ -283,6 +284,7 @@ class CommonWorkAppraiseReply extends Component{
addSuccess={this.addSuccess} ref={this.editorRef} totalCount={comment_scores.length} addSuccess={this.addSuccess} ref={this.editorRef} totalCount={comment_scores.length}
onReply={this.onReply} placeholder={"请在此输入对本作品的评语最大限制2000个字符"} onReply={this.onReply} placeholder={"请在此输入对本作品的评语最大限制2000个字符"}
showSameScore={isGroup && isAdmin} showSameScore={isGroup && isAdmin}
get_next_works={()=>this.props.get_next_works()}
></GraduationTasksappraiseMainEditor> } ></GraduationTasksappraiseMainEditor> }
</div> </div>
{/* ${!!comment_scores.length ? 'bor-bottom-greyE' : ''} */} {/* ${!!comment_scores.length ? 'bor-bottom-greyE' : ''} */}

@ -67,6 +67,9 @@ class GraduationTasksappraiseMainEditor extends Component{
same_score same_score
} }
if (this.props.onReply) { if (this.props.onReply) {
if(this.props.get_next_works){
this.props.get_next_works()
}
this.props.onReply(params) this.props.onReply(params)
} else { } else {
axios.post(url, params).then((response)=>{ axios.post(url, params).then((response)=>{

@ -27,3 +27,7 @@
text-overflow:ellipsis; text-overflow:ellipsis;
white-space:nowrap white-space:nowrap
} }
.color32C090{
color:#32C090 !important;
}

@ -0,0 +1,68 @@
import React from 'react';
import Modals from "../../modals/Modals";
import axios from 'axios';
class Chongzuomodel extends React.Component {
constructor(props) {
super(props);
this.state = {
ModalsType:false,
antIcon:false
}
}
componentDidMount(){
this.setState({
ModalsType:this.props.Chongzuomodeltype,
Modalstopval:`该作业将被打回重做,学生实训记录将被清空!`,
ModalsBottomval:`确定打回?`,
})
}
ModalSaves=()=>{
this.setState({
antIcon:true
})
let zrl=`/myshixuns/${this.props.chongzuoId}/reset_my_game.json?course_id=${this.props.match.params.coursesId}`;
axios.get(zrl).then((response) => {
this.setState({
antIcon:false
})
this.props.showNotification("操作成功");
this.props.hideChongzuomodeltype()
this.props.Isupdatass();
}).catch((error) => {
this.setState({
antIcon:false
})
});
}
ModalCancels=()=>{
this.props.hideChongzuomodeltype()
}
render() {
//console.log(this.props)
// Chongzuomodeltype:undefined,
// chongzuoId:undefined,
return (
<React.Fragment>
<Modals
modalsType={this.state.ModalsType}
modalsTopval={this.state.Modalstopval}
modalsBottomval={this.state.ModalsBottomval}
modalSave={()=>this.ModalSaves()}
modalCancel={()=>this.ModalCancels()}
loadtype={false}
antIcon={this.state.antIcon}
>
</Modals>
</React.Fragment>
);
}
}
export default Chongzuomodel;

@ -1,19 +1,10 @@
import React, {Component} from "react"; import React, {Component} from "react";
import CoursesListType from '../coursesPublic/CoursesListType';
import {getRandomcode, publicSearchs, sortDirections} from 'educoder'; import {getRandomcode, publicSearchs, sortDirections} from 'educoder';
import { import {
Form,
Select,
Input,
Button,
Checkbox, Checkbox,
Upload,
Icon, Icon,
message,
Modal,
Table, Table,
Pagination, Pagination,
Radio,
Tooltip, Tooltip,
notification, notification,
Spin, Spin,
@ -30,18 +21,15 @@ import './Challenges.css';
import {getImageUrl} from 'educoder'; import {getImageUrl} from 'educoder';
import TraineetraininginformationModal from "./TraineetraininginformationModal"; import TraineetraininginformationModal from "./TraineetraininginformationModal";
import DownloadMessageysl from '../../modals/DownloadMessageysl'; import DownloadMessageysl from '../../modals/DownloadMessageysl';
import Startshixuntask from "../coursesPublic/Startshixuntask";
import ModulationModal from "../coursesPublic/ModulationModal"; import ModulationModal from "../coursesPublic/ModulationModal";
import HomeworkModal from "../coursesPublic/HomeworkModal"; import HomeworkModal from "../coursesPublic/HomeworkModal";
import OneSelfOrderModal from "../coursesPublic/OneSelfOrderModal"; import OneSelfOrderModal from "../coursesPublic/OneSelfOrderModal";
import ShixunWorkModal from "./Shixunworkdetails/ShixunWorkModal"; import ShixunWorkModal from "./Shixunworkdetails/ShixunWorkModal";
import NoneData from '../../../modules/courses/coursesPublic/NoneData'; import NoneData from '../../../modules/courses/coursesPublic/NoneData';
import Chongzuomodel from "./Chongzuomodel";
const Search = Input.Search;
const RadioGroup = Radio.Group;
const CheckboxGroup = Checkbox.Group; const CheckboxGroup = Checkbox.Group;
const {Option} = Select;
//GraduationTaskssetting.js
//作品列表(学生) //作品列表(学生)
let allow_lates=false; let allow_lates=false;
@ -65,6 +53,8 @@ class Listofworksstudentone extends Component {
//关卡得分final_score //关卡得分final_score
this.state = { this.state = {
Chongzuomodeltype:undefined,
chongzuoId:undefined,
searchtypes:false, searchtypes:false,
jobsettingsdata: undefined, jobsettingsdata: undefined,
endTime: "2018/11/10 17:10:00", endTime: "2018/11/10 17:10:00",
@ -280,7 +270,11 @@ class Listofworksstudentone extends Component {
width: '98px', width: '98px',
render: (text, record) => ( render: (text, record) => (
<span style={{width: '98px',}}> <span style={{width: '98px',}}>
<span style={record.submitstate === "迟交通关" ? { <span style={record.submitstate === "重做中" ?{
color: '#FF8432',
textAlign: "center",
width: '98px',
}:record.submitstate === "迟交通关" ? {
color: '#DD1717', color: '#DD1717',
textAlign: "center", textAlign: "center",
width: '98px', width: '98px',
@ -675,7 +669,11 @@ class Listofworksstudentone extends Component {
width: '98px', width: '98px',
render: (text, record) => ( render: (text, record) => (
<span style={{width: '98px',}}> <span style={{width: '98px',}}>
<span style={record.submitstate === "迟交通关" ? { <span style={record.submitstate === "重做中" ?{
color: '#FF8432',
textAlign: "center",
width: '98px',
}:record.submitstate === "迟交通关" ? {
color: '#DD1717', color: '#DD1717',
textAlign: "center", textAlign: "center",
width: '98px', width: '98px',
@ -1029,7 +1027,11 @@ class Listofworksstudentone extends Component {
align: 'center', align: 'center',
className: 'font-14', className: 'font-14',
render: (text, record) => ( render: (text, record) => (
<span style={record.submitstate === "迟交通关" ? { <span style={record.submitstate === "重做中" ?{
color: '#FF8432',
textAlign: "center",
width: '98px',
}:record.submitstate === "迟交通关" ? {
color: '#DD1717', color: '#DD1717',
textAlign: "center" textAlign: "center"
} : record.submitstate === "按时通关" ? {color: '#29BD8B', textAlign: "center"} } : record.submitstate === "按时通关" ? {color: '#29BD8B', textAlign: "center"}
@ -1294,19 +1296,37 @@ class Listofworksstudentone extends Component {
display: 'block', display: 'block',
align: 'center', align: 'center',
className: 'font-14', className: 'font-14',
width: '40px', width: '80px',
render: (text, record) => ( render: (text, record) => (
record.submitstate === "未开启" ? record.submitstate === "未开启" ?
<span>
<div>
<a style={{textAlign: "center",width: '40px'}} className="color-blue" <a style={{textAlign: "center",width: '40px'}} className="color-blue"
onMouseDown={(e) => this.Viewstudenttraininginformationtysl2(e, record)} onMouseDown={(e) => this.Viewstudenttraininginformationtysl2(e, record)}
// onClick={() => this.Viewstudenttraininginformationt(record)} >{record.has_comment===true?"已评阅":"评阅 "}</a>
>{record.has_comment===true?"详情":"评阅 "}</a> : </div>
{this.props.teacherdatapage === undefined ? "": this.props.teacherdatapage.homework_status[0]==="已截止"?"":record.myshixun_id===0?"":<div>
<a style={{textAlign: "center",width: '40px'}} className="color32C090"
onMouseDown={(e) => this.chongzuofun(record.myshixun_identifier)}
>重做</a>
</div>}
</span>:
<span> <span>
<div>
<a style={{textAlign: "center"}} className="color-blue" <a style={{textAlign: "center"}} className="color-blue"
onMouseDown={(e) => this.Viewstudenttraininginformationtysl2(e, record)} onMouseDown={(e) => this.Viewstudenttraininginformationtysl2(e, record)}
// onClick={() => this.Viewstudenttraininginformationt(record)} >{record.has_comment===true?"已评阅":"评阅 "}</a>
>{record.has_comment===true?"详情":"评阅 "}</a> </div>
{this.props.teacherdatapage === undefined ? "": this.props.teacherdatapage.homework_status[0]==="已截止"?"":record.myshixun_id===0?"":<div>
<a style={{textAlign: "center",width: '40px'}} className="color32C090"
onMouseDown={(e) => this.chongzuofun(record.myshixun_identifier)}
>重做</a>
</div>}
</span> </span>
) )
}, },
@ -1408,7 +1428,11 @@ class Listofworksstudentone extends Component {
align: 'center', align: 'center',
className: 'font-14', className: 'font-14',
render: (text, record) => ( render: (text, record) => (
<span style={record.submitstate === "迟交通关" ? { <span style={record.submitstate === "重做中" ?{
color: '#FF8432',
textAlign: "center",
width: '98px',
}:record.submitstate === "迟交通关" ? {
color: '#DD1717', color: '#DD1717',
textAlign: "center" textAlign: "center"
} : record.submitstate === "按时通关" ? {color: '#29BD8B', textAlign: "center"} } : record.submitstate === "按时通关" ? {color: '#29BD8B', textAlign: "center"}
@ -1662,18 +1686,36 @@ class Listofworksstudentone extends Component {
display: 'block', display: 'block',
align: 'center', align: 'center',
className: 'font-14', className: 'font-14',
width: '40px', width: '80px',
render: (text, record) => ( render: (text, record) => (
record.submitstate === "未开启" ? record.submitstate === "未开启" ?
<span>
<div>
<a style={{textAlign: "center",width: '40px'}} className="color-blue" <a style={{textAlign: "center",width: '40px'}} className="color-blue"
onMouseDown={(e) => this.Viewstudenttraininginformationtysl2(e, record)} onMouseDown={(e) => this.Viewstudenttraininginformationtysl2(e, record)}
// onClick={() => this.Viewstudenttraininginformationt(record)} // onClick={() => this.Viewstudenttraininginformationt(record)}
>{record.has_comment===true?"详情":"评阅"}</a> : >{record.has_comment===true?"已评阅":"评阅"}</a>
</div>
{this.props.teacherdatapage === undefined ? "": this.props.teacherdatapage.homework_status[0]==="已截止"?"":record.myshixun_id===0?"":<div>
<a style={{textAlign: "center",width: '40px'}} className="color32C090"
onMouseDown={(e) => this.chongzuofun(record.myshixun_identifier)}
>重做</a>
</div>}
</span>:
<span> <span>
<div>
<a style={{textAlign: "center"}} className="color-blue" <a style={{textAlign: "center"}} className="color-blue"
onMouseDown={(e) => this.Viewstudenttraininginformationtysl2(e, record)} onMouseDown={(e) => this.Viewstudenttraininginformationtysl2(e, record)}
// onClick={() => this.Viewstudenttraininginformationt(record)} // onClick={() => this.Viewstudenttraininginformationt(record)}
>{record.has_comment===true?"详情":"评阅"}</a> >{record.has_comment===true?"已评阅":"评阅"}</a>
</div>
{this.props.teacherdatapage === undefined ? "": this.props.teacherdatapage.homework_status[0]==="已截止"?"":record.myshixun_id===0?"":<div>
<a style={{textAlign: "center",width: '40px'}} className="color32C090"
onMouseDown={(e) => this.chongzuofun(record.myshixun_identifier)}
>重做</a>
</div>}
</span> </span>
) )
}, },
@ -2073,7 +2115,7 @@ class Listofworksstudentone extends Component {
classroom: teacherdata.group_name, classroom: teacherdata.group_name,
cost_time: teacherdata.cost_time, cost_time: teacherdata.cost_time,
has_comment:teacherdata.has_comment, has_comment:teacherdata.has_comment,
submitstate: teacherdata.work_status === 0 ? "未开启" : teacherdata.work_status === 1 ? "未通关" : teacherdata.work_status === 2 ? "按时通关" : "迟交通关", submitstate:teacherdata.work_status === -1 ? "重做中":teacherdata.work_status === 0 ? "未开启" : teacherdata.work_status === 1 ? "未通关" : teacherdata.work_status === 2 ? "按时通关" : "迟交通关",
// updatetime:this.state.teacherdata.student_works[i].update_time, // updatetime:this.state.teacherdata.student_works[i].update_time,
// updatetime:"", // updatetime:"",
updatetime: timedata === "Invalid date" ? "--" : timedata, updatetime: timedata === "Invalid date" ? "--" : timedata,
@ -2119,7 +2161,9 @@ class Listofworksstudentone extends Component {
classroom: student_works[i].group_name, classroom: student_works[i].group_name,
cost_time: student_works[i].cost_time, cost_time: student_works[i].cost_time,
has_comment:student_works[i].has_comment, has_comment:student_works[i].has_comment,
submitstate: student_works[i].work_status === 0 ? "未开启" : student_works[i].work_status === 1 ? "未通关" : student_works[i].work_status === 2 ? "按时通关" : "迟交通关", myshixun_id:student_works[i].myshixun_id,
myshixun_identifier:student_works[i].myshixun_identifier,
submitstate:student_works[i].work_status === -1 ? "重做中":student_works[i].work_status === 0 ? "未开启" : student_works[i].work_status === 1 ? "未通关" : student_works[i].work_status === 2 ? "按时通关" : "迟交通关",
// updatetime:this.state.teacherdata.student_works[i].update_time, // updatetime:this.state.teacherdata.student_works[i].update_time,
// updatetime:"", // updatetime:"",
updatetime: timedata === "Invalid date" ? "--" : timedata, updatetime: timedata === "Invalid date" ? "--" : timedata,
@ -2281,7 +2325,7 @@ class Listofworksstudentone extends Component {
classroom: teacherdata.group_name, classroom: teacherdata.group_name,
cost_time: teacherdata.cost_time, cost_time: teacherdata.cost_time,
has_comment:teacherdata.has_comment, has_comment:teacherdata.has_comment,
submitstate: teacherdata.work_status === 0 ? "未开启" : teacherdata.work_status === 1 ? "未通关" : teacherdata.work_status === 2 ? "按时通关" : "迟交通关", submitstate:teacherdata.work_status === -1 ? "重做中":teacherdata.work_status === 0 ? "未开启" : teacherdata.work_status === 1 ? "未通关" : teacherdata.work_status === 2 ? "按时通关" : "迟交通关",
// updatetime:this.state.teacherdata.student_works[i].update_time, // updatetime:this.state.teacherdata.student_works[i].update_time,
// updatetime:"", // updatetime:"",
updatetime: timedata === "Invalid date" ? "--" : timedata, updatetime: timedata === "Invalid date" ? "--" : timedata,
@ -2646,7 +2690,9 @@ class Listofworksstudentone extends Component {
classroom: student_works[i].group_name, classroom: student_works[i].group_name,
cost_time: student_works[i].cost_time, cost_time: student_works[i].cost_time,
has_comment:student_works[i].has_comment, has_comment:student_works[i].has_comment,
submitstate: student_works[i].work_status === 0 ? "未开启" : student_works[i].work_status === 1 ? "未通关" : student_works[i].work_status === 2 ? "按时通关" : "迟交通关", myshixun_id:student_works[i].myshixun_id,
myshixun_identifier:student_works[i].myshixun_identifier,
submitstate:student_works[i].work_status === -1 ? "重做中":student_works[i].work_status === 0 ? "未开启" : student_works[i].work_status === 1 ? "未通关" : student_works[i].work_status === 2 ? "按时通关" : "迟交通关",
// updatetime:this.state.teacherdata.student_works[i].update_time, // updatetime:this.state.teacherdata.student_works[i].update_time,
// updatetime:"", // updatetime:"",
updatetime: timedata === "Invalid date" ? "--" : timedata, updatetime: timedata === "Invalid date" ? "--" : timedata,
@ -3442,6 +3488,19 @@ class Listofworksstudentone extends Component {
}) })
} }
chongzuofun=(id)=>{
this.setState({
chongzuoId:id,
Chongzuomodeltype:true
})
}
hideChongzuomodeltype=()=>{
this.setState({
chongzuoId:undefined,
Chongzuomodeltype:false
})
}
render() { render() {
let {columns,columnss, course_groupysls, datajs, isAdmin, homework_status, course_groupyslstwo, unlimited, unlimitedtwo, course_group_info, orders, task_status, checkedValuesine, searchtext, teacherlist, visible, visibles, game_list, columnsstu, columnsstu2, limit, experience, boolgalist, viewtrainingdata, teacherdata, page, data, jobsettingsdata, styletable, datas, order, loadingstate, computeTimetype} = this.state; let {columns,columnss, course_groupysls, datajs, isAdmin, homework_status, course_groupyslstwo, unlimited, unlimitedtwo, course_group_info, orders, task_status, checkedValuesine, searchtext, teacherlist, visible, visibles, game_list, columnsstu, columnsstu2, limit, experience, boolgalist, viewtrainingdata, teacherdata, page, data, jobsettingsdata, styletable, datas, order, loadingstate, computeTimetype} = this.state;
@ -3483,6 +3542,13 @@ class Listofworksstudentone extends Component {
this.props.isAdmin() === true ? this.props.isAdmin() === true ?
<div className=" clearfix " style={{margin: "auto", minWidth: "1200px"}}> <div className=" clearfix " style={{margin: "auto", minWidth: "1200px"}}>
{this.state.Chongzuomodeltype===true?<Chongzuomodel
{...this.props}
{...this.state}
hideChongzuomodeltype={()=>this.hideChongzuomodeltype()}
Isupdatass={()=>this.Isupdatass()}
/>:""}
{visible === true ? <ModulationModal {visible === true ? <ModulationModal
visible={visible} visible={visible}
Cancel={() => this.cancelModulationModel()} Cancel={() => this.cancelModulationModel()}

@ -22,6 +22,7 @@ import "../common/formCommon.css";
import '../css/Courses.css'; import '../css/Courses.css';
import './style.css'; import './style.css';
import 'moment/locale/zh-cn'; import 'moment/locale/zh-cn';
import Chongzuomodel from "./Chongzuomodel";
class ShixunWorkReport extends Component { class ShixunWorkReport extends Component {
@ -39,7 +40,12 @@ class ShixunWorkReport extends Component {
work_comment:undefined, work_comment:undefined,
has_commit: false, has_commit: false,
shixun_detail:[], shixun_detail:[],
view_tpi:false view_tpi:false,
myshixun_id:undefined,
myshixun_identifier:undefined,
homework_end:undefined,
chongzuoId:undefined,
Chongzuomodeltype:false
} }
} }
@ -117,7 +123,10 @@ class ShixunWorkReport extends Component {
spinning: false, spinning: false,
has_commit: result.data.has_commit, has_commit: result.data.has_commit,
shixun_detail:result.data.shixun_detail, shixun_detail:result.data.shixun_detail,
view_tpi:result.data.view_tpi view_tpi:result.data.view_tpi,
myshixun_id:result.data.myshixun_id,
myshixun_identifier:result.data.myshixun_identifier,
homework_end:result.data.homework_end,
}) })
} }
@ -308,8 +317,22 @@ class ShixunWorkReport extends Component {
} }
} }
Backtoredo=(id)=>{
this.setState({
chongzuoId:id,
Chongzuomodeltype:true
})
}
hideChongzuomodeltype=()=>{
this.setState({
chongzuoId:undefined,
Chongzuomodeltype:false
})
}
render() { render() {
let {data, showAppraiseModaltype, work_comment_hidden, work_comment, has_commit,shixun_detail,view_tpi} = this.state; let {data, showAppraiseModaltype, work_comment_hidden, work_comment, has_commit,shixun_detail,view_tpi,myshixun_id,myshixun_identifier,homework_end} = this.state;
let category_id=data===undefined?"":data.category===null?"":data.category.category_id; let category_id=data===undefined?"":data.category===null?"":data.category.category_id;
let homework_common_id=data===undefined?"":data.homework_common_id; let homework_common_id=data===undefined?"":data.homework_common_id;
@ -324,6 +347,13 @@ class ShixunWorkReport extends Component {
return ( return (
data===undefined?"":<Spin indicator={antIcon} spinning={this.state.spinning}> data===undefined?"":<Spin indicator={antIcon} spinning={this.state.spinning}>
{this.state.Chongzuomodeltype===true?<Chongzuomodel
{...this.props}
{...this.state}
hideChongzuomodeltype={()=>this.hideChongzuomodeltype()}
Isupdatass={()=>this.getdatalist()}
/>:""}
<Modals <Modals
modalsType={this.state.modalsType} modalsType={this.state.modalsType}
modalsTopval={this.state.modalsTopval} modalsTopval={this.state.modalsTopval}
@ -385,6 +415,12 @@ class ShixunWorkReport extends Component {
{/*className=" color-blue font-14 fr ml20 mt15"*/} {/*className=" color-blue font-14 fr ml20 mt15"*/}
{/*onClick={()=>this.showAppraiseModal(1)}*/} {/*onClick={()=>this.showAppraiseModal(1)}*/}
{/*>评阅</a> : ""}*/} {/*>评阅</a> : ""}*/}
{this.props.isAdmin()?homework_end===false&&myshixun_id!=0?<a
className=" color-blue font-14 fr ml20 mt15"
onClick={()=>this.Backtoredo(myshixun_identifier)}
>打回重做</a>:"":""}
{this.props.isAdmin() ?<a {this.props.isAdmin() ?<a
className=" color-blue font-14 fr ml20 mt15" className=" color-blue font-14 fr ml20 mt15"
onClick={()=>this.showAppraiseModal("main",undefined,work_comment,work_comment_hidden)} onClick={()=>this.showAppraiseModal("main",undefined,work_comment,work_comment_hidden)}

@ -549,3 +549,6 @@
.widh150wpos{ .widh150wpos{
word-break: break-all; word-break: break-all;
} }
a { text-decoration:none !important;}
a:hover {text-decoration: none !important;}
a:active{text-decoration:none !important;}

@ -101,11 +101,20 @@ class Signedinlist extends Component {
handleChangegroup_ids=(value)=>{ handleChangegroup_ids=(value)=>{
let neval let neval
if(!value){ if(!value){
if(value===0){
neval=[0]
this.setState({
group_ids: [0],
page:1
})
}else{
neval=[] neval=[]
this.setState({ this.setState({
group_ids: [], group_ids: [],
page:1 page:1
}) })
}
}else{ }else{
neval=[value] neval=[value]
this.setState({ this.setState({
@ -327,11 +336,11 @@ class Signedinlist extends Component {
<Row type="flex" justify="end"> <Row type="flex" justify="end">
{this.props.defaultActiveKey==="2"?<Col className={"Signedintextright "}> {this.props.defaultActiveKey==="2"?<Col className={"Signedintextright mr5"}>
<span className={"color26C7C9 mr20"}>正常签到{data&&data.normal_count}</span> <span className={"color26C7C9 mr20"}>正常签到{data&&data.normal_count}</span>
<span className={"colorEAAE4E mr20"}>请假{data&&data.leave_count}</span> <span className={"colorEAAE4E mr20"}>请假{data&&data.leave_count}</span>
<span className={"colorFF835C"}>旷课{data&&data.absence_count}</span> <span className={"colorFF835C"}>旷课{data&&data.absence_count}</span>
</Col>:<Col className={"Signedintextright "}> </Col>:<Col className={"Signedintextright mr5"}>
<span className={"mr20"}>已签到<span className={"color1890FF"}>{this.state.course_members_count}</span></span> <span className={"mr20"}>已签到<span className={"color1890FF"}>{this.state.course_members_count}</span></span>
<span>应签到<span className={"color1890FF"}>{this.state.attendance_count}</span></span> <span>应签到<span className={"color1890FF"}>{this.state.attendance_count}</span></span>
</Col>} </Col>}

@ -87,6 +87,16 @@ class Videostatistics extends Component{
return( return(
<React.Fragment> <React.Fragment>
<div className="ws100s"> <div className="ws100s">
<script>
{
`
a{text-decoration:none !important;}
a:hover {text-decoration: none !important;}
a:active{text-decoration:none !important;}
`
}
</script>
{ {
tisticsbool===false? tisticsbool===false?
<div className="ws100s" style={{ <div className="ws100s" style={{

@ -36,14 +36,9 @@ class Studenticscom extends Component {
<script> <script>
{ {
` `
a{  a{text-decoration:none !important;}
    text-decoration:none; a:hover {text-decoration: none !important;}
    color:#333; a:active{text-decoration:none !important;}
}
a:hover{
    text-decoration:none;//鼠标放上面不显示下划线
    color:#333;
}
` `
} }
</script> </script>

@ -38,18 +38,13 @@ class Studentstatistics extends Component {
<script> <script>
{ {
` `
a{  a{text-decoration:none !important;}
    text-decoration:none; a:hover {text-decoration: none !important;}
    color:#333; a:active{text-decoration:none !important;}
}
a:hover{
    text-decoration:none;
    color:#333;
}
` `
} }
</script> </script>
<a className="maxnamewidth150s textalignlefts" style={{ <a className="maxnamewidth150s textalignlefts xiaoshout" style={{
color:"#333333" color:"#333333"
}} title={record.title}>{record.title}</a> }} title={record.title}>{record.title}</a>
@ -83,18 +78,13 @@ class Studentstatistics extends Component {
<script> <script>
{ {
` `
a{  a{text-decoration:none !important;}
    text-decoration:none; a:hover {text-decoration: none !important;}
    color:#333; a:active{text-decoration:none !important;}
}
a:hover{
    text-decoration:none;
    color:#333;
}
` `
} }
</script> </script>
<a className="maxnamewidth100s " style={{ <a className="maxnamewidth100s xiaoshout" style={{
color:"#333333" color:"#333333"
}} title={record.total_duration}>{record.total_duration}</a> }} title={record.total_duration}>{record.total_duration}</a>
@ -113,18 +103,13 @@ class Studentstatistics extends Component {
<script> <script>
{ {
` `
a{  a{text-decoration:none !important;}
    text-decoration:none; a:hover {text-decoration: none !important;}
    color:#333; a:active{text-decoration:none !important;}
}
a:hover{
    text-decoration:none;
    color:#333;
}
` `
} }
</script> </script>
<a className="maxnamewidth100s" style={{ <a className="maxnamewidth100s xiaoshout" style={{
color:"#333333" color:"#333333"
}} title={record.user_name}>{record.user_name}</a> }} title={record.user_name}>{record.user_name}</a>
@ -297,14 +282,9 @@ class Studentstatistics extends Component {
<script> <script>
{ {
` `
a{  a{text-decoration:none !important;}
    text-decoration:none; a:hover {text-decoration: none !important;}
    color:#333; a:active{text-decoration:none !important;}
}
a:hover{
    text-decoration:none;//鼠标放上面不显示下划线
    color:#333;
}
` `
} }
</script> </script>

@ -36,14 +36,9 @@ class Videostatisticscom extends Component {
<script> <script>
{ {
` `
a{  a{text-decoration:none !important;}
    text-decoration:none; a:hover {text-decoration: none !important;}
    color:#333; a:active{text-decoration:none !important;}
}
a:hover{
    text-decoration:none;//鼠标放上面不显示下划线
    color:#333;
}
` `
} }
</script> </script>

@ -43,18 +43,13 @@ class Videostatisticscomtwo extends Component {
<script> <script>
{ {
` `
a{  a{text-decoration:none !important;}
    text-decoration:none; a:hover {text-decoration: none !important;}
    color:#333; a:active{text-decoration:none !important;}
}
a:hover{
    text-decoration:none;
    color:#333;
}
` `
} }
</script> </script>
<a className="maxnamewidth100s" style={{ <a className="maxnamewidth100s xiaoshout" style={{
color:"#333333" color:"#333333"
}} title={record.user_name}>{record.user_name}</a> }} title={record.user_name}>{record.user_name}</a>
@ -87,18 +82,13 @@ class Videostatisticscomtwo extends Component {
<script> <script>
{ {
` `
a{  a{text-decoration:none !important;}
    text-decoration:none; a:hover {text-decoration: none !important;}
    color:#333; a:active{text-decoration:none !important;}
}
a:hover{
    text-decoration:none;
    color:#333;
}
` `
} }
</script> </script>
<a className="maxnamewidth100s" style={{ <a className="maxnamewidth100s xiaoshout" style={{
color:"#333333" color:"#333333"
}} title={record.total_duration}>{record.total_duration}</a></div> }} title={record.total_duration}>{record.total_duration}</a></div>
), ),
@ -117,18 +107,13 @@ class Videostatisticscomtwo extends Component {
<script> <script>
{ {
` `
a{  a{text-decoration:none !important;}
    text-decoration:none; a:hover {text-decoration: none !important;}
    color:#333; a:active{text-decoration:none !important;}
}
a:hover{
    text-decoration:none;
    color:#333;
}
` `
} }
</script> </script>
<a className="maxnamewidth100s" style={{ <a className="maxnamewidth100s xiaoshout" style={{
color:"#333333" color:"#333333"
}} title={record.feq}>{record.feq}</a> }} title={record.feq}>{record.feq}</a>
</div> </div>
@ -145,20 +130,15 @@ class Videostatisticscomtwo extends Component {
<script> <script>
{ {
` `
a{  a{text-decoration:none !important;}
    text-decoration:none; a:hover {text-decoration: none !important;}
    color:#333; a:active{text-decoration:none !important;}
}
a:hover{
    text-decoration:none;
    color:#333;
}
` `
} }
</script> </script>
{ {
record.start_at? record.start_at?
<a style={{ <a className="xiaoshout" style={{
color:"#333333" color:"#333333"
}} title={moment(record.start_at).format('YYYY-MM-DD HH:mm:ss')}>{moment(record.start_at).format('YYYY-MM-DD HH:mm:ss')}</a> }} title={moment(record.start_at).format('YYYY-MM-DD HH:mm:ss')}>{moment(record.start_at).format('YYYY-MM-DD HH:mm:ss')}</a>
: :
@ -178,20 +158,15 @@ class Videostatisticscomtwo extends Component {
<script> <script>
{ {
` `
a{  a{text-decoration:none !important;}
    text-decoration:none; a:hover {text-decoration: none !important;}
    color:#333; a:active{text-decoration:none !important;}
}
a:hover{
    text-decoration:none;
    color:#333;
}
` `
} }
</script> </script>
{ {
record.end_at? record.end_at?
<a style={{ <a className="xiaoshout" style={{
color:"#333333" color:"#333333"
}} title={moment(record.end_at).format('YYYY-MM-DD HH:mm:ss')}>{moment(record.end_at).format('YYYY-MM-DD HH:mm:ss')}</a> }} title={moment(record.end_at).format('YYYY-MM-DD HH:mm:ss')}>{moment(record.end_at).format('YYYY-MM-DD HH:mm:ss')}</a>
: :
@ -560,13 +535,10 @@ class Videostatisticscomtwo extends Component {
{ {
` `
a{  a{ 
    text-decoration:none;     text-decoration:none !important;
    color:#333;
}
a:hover{
    text-decoration:none;//鼠标放上面不显示下划线
    color:#333;
} }
a:hover {text-decoration: none !important;}
a:active{text-decoration:none !important;}
` `
} }
</script> </script>

@ -38,18 +38,13 @@ class Videostatisticslist extends Component {
<script> <script>
{ {
` `
a{  a{text-decoration:none !important;}
    text-decoration:none; a:hover {text-decoration: none !important;}
    color:#333; a:active{text-decoration:none !important;}
}
a:hover{
    text-decoration:none;
    color:#333;
}
` `
} }
</script> </script>
<a className="maxnamewidth200ss textalignlefts" style={{ <a className="maxnamewidth200ss textalignlefts xiaoshout" style={{
color:"#333333" color:"#333333"
}} title={record.title}>{record.title}</a> }} title={record.title}>{record.title}</a>
@ -83,18 +78,13 @@ class Videostatisticslist extends Component {
<script> <script>
{ {
` `
a{  a{text-decoration:none !important;}
    text-decoration:none; a:hover {text-decoration: none !important;}
    color:#333; a:active{text-decoration:none !important;}
}
a:hover{
    text-decoration:none;
    color:#333;
}
` `
} }
</script> </script>
<a className="maxnamewidth100s " style={{ <a className="maxnamewidth100s xiaoshout" style={{
color:"#333333" color:"#333333"
}} title={record.total_time}>{record.total_time}</a> }} title={record.total_time}>{record.total_time}</a>
@ -113,18 +103,13 @@ class Videostatisticslist extends Component {
<script> <script>
{ {
` `
a{  a{text-decoration:none !important;}
    text-decoration:none; a:hover {text-decoration: none !important;}
    color:#333; a:active{text-decoration:none !important;}
}
a:hover{
    text-decoration:none;
    color:#333;
}
` `
} }
</script> </script>
<a className="maxnamewidth150ss" style={{ <a className="maxnamewidth150ss xiaoshout" style={{
color:"#333333" color:"#333333"
}} title={record.user_name}>{record.user_name}</a> }} title={record.user_name}>{record.user_name}</a>
@ -294,13 +279,10 @@ class Videostatisticslist extends Component {
{ {
` `
a{  a{ 
    text-decoration:none;     text-decoration:none !important;
    color:#333;
}
a:hover{
    text-decoration:none;//鼠标放上面不显示下划线
    color:#333;
} }
a:hover {text-decoration: none !important;}
a:active{text-decoration:none !important;}
` `
} }
</script> </script>

Loading…
Cancel
Save