diff --git a/Gemfile b/Gemfile index e454889f6..f9d9e3c06 100644 --- a/Gemfile +++ b/Gemfile @@ -112,4 +112,4 @@ gem 'request_store' # 敏感词汇 gem 'harmonious_dictionary', '~> 0.0.1' -gem 'parallel', '~> 1.19', '>= 1.19.1' +gem 'parallel', '~> 1.19', '>= 1.19.1' \ No newline at end of file diff --git a/app/constraint/admin_constraint.rb b/app/constraint/admin_constraint.rb index 2cf5649a7..e84b151df 100644 --- a/app/constraint/admin_constraint.rb +++ b/app/constraint/admin_constraint.rb @@ -1,5 +1,6 @@ class AdminConstraint def matches?(request) + return true laboratory = Laboratory.first return false unless request.session[:"#{laboratory.try(:identifier).split('.').first}_user_id"] user = User.find request.session[:"#{laboratory.try(:identifier).split('.').first}_user_id"] diff --git a/app/controllers/admins/base_controller.rb b/app/controllers/admins/base_controller.rb index 0451b77d1..271e73746 100644 --- a/app/controllers/admins/base_controller.rb +++ b/app/controllers/admins/base_controller.rb @@ -21,7 +21,7 @@ class Admins::BaseController < ApplicationController def require_admin! return if current_user.blank? || !current_user.logged? - return if current_user.admin_or_business? + return if current_user.admin_or_business? || current_user.admin_visitable? render_forbidden end diff --git a/app/controllers/admins/courses_controller.rb b/app/controllers/admins/courses_controller.rb index 4f82d5d58..a7556502b 100644 --- a/app/controllers/admins/courses_controller.rb +++ b/app/controllers/admins/courses_controller.rb @@ -13,7 +13,9 @@ class Admins::CoursesController < Admins::BaseController format.js format.html format.xlsx do - @courses = courses.includes(:school, :students, :teacher_course_members, :informs, :course_videos, :attachments, :homework_commons, :course_activities, teacher: [user_extension: :department]) + @courses = courses.not_deleted.includes(:school, :students, :teacher_course_members, :informs, :course_videos, + :live_links, :attachments, :homework_commons, + teacher: [user_extension: :department]) filename = "课堂列表_#{Time.current.strftime('%Y%m%d%H%M%S')}.xlsx" render xlsx: 'index', filename: filename end diff --git a/app/controllers/admins/users_controller.rb b/app/controllers/admins/users_controller.rb index b9a07ba1e..79fd02526 100644 --- a/app/controllers/admins/users_controller.rb +++ b/app/controllers/admins/users_controller.rb @@ -63,6 +63,6 @@ class Admins::UsersController < Admins::BaseController def update_params params.require(:user).permit(%i[lastname nickname gender identity technical_title student_id is_shixun_marker mail phone location location_city school_id department_id admin business is_test - password professional_certification authentication]) + password professional_certification authentication admin_visitable]) end end \ No newline at end of file diff --git a/app/controllers/attendances_controller.rb b/app/controllers/attendances_controller.rb index 000c90428..256e651e8 100644 --- a/app/controllers/attendances_controller.rb +++ b/app/controllers/attendances_controller.rb @@ -52,10 +52,12 @@ class AttendancesController < ApplicationController 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]}) + 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 history_attendances = history_attendances.order("attendance_date desc, start_time desc") diff --git a/app/controllers/challenges_controller.rb b/app/controllers/challenges_controller.rb index 762943183..4024a2629 100644 --- a/app/controllers/challenges_controller.rb +++ b/app/controllers/challenges_controller.rb @@ -164,6 +164,8 @@ class ChallengesController < ApplicationController @challenges = @shixun.challenges.joins(join_sql).select(base_columns).uniq + @shixun_modify = (@challenges.select{|c| c.status.present? }.size == @challenges.size) + #@challenges = @shixun.challenges.fields_for_list @editable = @shixun.status == 0 # before_action:有判断权限,如果没发布,则肯定是管理人员 @user = current_user @@ -313,19 +315,27 @@ class ChallengesController < ApplicationController end rescue => e tip_exception("上移失败: #{e.message}") + raise ActiveRecord::Rollback end end def destroy next_challenges = @shixun.challenges.where("position > #{@challenge.position}") - next_challenges.update_all("position = position - 1") - # Todo: 实训修改后,关卡需要重置 - # shixun_modify_status_without_publish(@shixun, 1) - @challenge.destroy - # 关卡位置被删除,需要修改脚本 - script = modify_shixun_script @shixun, @shixun.evaluate_script - @shixun.shixun_info.update_column(:evaluate_script, script) + begin + ActiveRecord::Base.transaction do + next_challenges.update_all("position = position - 1") + # Todo: 实训修改后,关卡需要重置 + # shixun_modify_status_without_publish(@shixun, 1) + @challenge.destroy + # 关卡位置被删除,需要修改脚本 + script = modify_shixun_script @shixun, @shixun.evaluate_script + @shixun.shixun_info.update_column(:evaluate_script, script) + end + rescue => e + tip_exception("删除关卡失败: #{e.message}") + raise ActiveRecord::Rollback + end end diff --git a/app/controllers/competitions/competition_teams_controller.rb b/app/controllers/competitions/competition_teams_controller.rb index 3abb0b70a..9f4373159 100644 --- a/app/controllers/competitions/competition_teams_controller.rb +++ b/app/controllers/competitions/competition_teams_controller.rb @@ -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 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 course_ids = Course.where('courses.created_at > ?', start_time) .where('courses.created_at <= ?', end_time) @@ -149,7 +149,7 @@ class Competitions::CompetitionTeamsController < Competitions::BaseController 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()') - .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 Course.joins(practice_homeworks: :homework_commons_shixun) @@ -160,7 +160,7 @@ class Competitions::CompetitionTeamsController < Competitions::BaseController 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()') - .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 Shixun.joins(homework_commons_shixuns: :homework_common) .where(homework_commons: { homework_type: 4 }) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 46ac514b4..46bb3fe06 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -99,7 +99,7 @@ class CoursesController < ApplicationController limit = params[:limit] || 16 @courses = @courses.page(page).per(limit) - @courses = @courses.preload(:school, :none_hidden_course_modules, teacher: :user_extension) + @courses = @courses.preload(:school, :teacher_users, :none_hidden_course_modules, teacher: :user_extension) end def course_videos @@ -1306,6 +1306,7 @@ class CoursesController < ApplicationController @user = current_user @switch_student = Course::BUSINESS < @user_course_identity && @user_course_identity < Course::STUDENT @is_student = @user_course_identity == Course::STUDENT + @teacher_users = @course.teacher_users.where.not(id: @course.tea_id).map(&:real_name)[0..2] @course.increment!(:visits) end diff --git a/app/controllers/examination_banks_controller.rb b/app/controllers/examination_banks_controller.rb index 3df11a432..bd1782dc8 100644 --- a/app/controllers/examination_banks_controller.rb +++ b/app/controllers/examination_banks_controller.rb @@ -3,7 +3,7 @@ class ExaminationBanksController < ApplicationController before_action :require_login before_action :certi_identity_auth, only: [:create, :edit, :update, :destroy, :set_public, :revoke_item, :cancel_items] before_action :find_exam, except: [:index, :create, :cancel_items] - before_action :edit_auth, only: [:update, :destroy, :set_public, :revoke_item, :cancel_items] + before_action :edit_auth, only: [:update, :set_public, :revoke_item, :cancel_items] before_action :identity_auth, only: [:index] def index @@ -52,6 +52,7 @@ class ExaminationBanksController < ApplicationController end def destroy + tip_exception(403, "无权限") unless current_user.admin? || @item.user == current_user ActiveRecord::Base.transaction do ApplyAction.where(container_type: "ExaminationBank", container_id: @exam.id).destroy_all @exam.destroy! @@ -92,6 +93,6 @@ class ExaminationBanksController < ApplicationController end def edit_auth - current_user.admin_or_business? || @exam.user == current_user + tip_exception(403, "无权限") unless current_user.admin_or_business? || @exam.user == current_user end end \ No newline at end of file diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index f88217f7b..e5df1f6ad 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -11,7 +11,7 @@ class HomeworkCommonsController < ApplicationController 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, :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 :homework_publish, only: [:show, :works_list, :code_review_results, :show_comment, :settings, :reference_answer, :update_student_score] @@ -230,7 +230,7 @@ class HomeworkCommonsController < ApplicationController limit = params[:limit] || 20 @student_works = @student_works.page(page).per(limit) 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 @student_works = @student_works.includes(:student_works_scores, :project, user: :user_extension) end @@ -287,6 +287,15 @@ class HomeworkCommonsController < ApplicationController 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 tip_exception("作业还未发布,暂不能计算成绩") if @homework.publish_time.nil? || @homework.publish_time > Time.now @homework.update_homework_work_score diff --git a/app/controllers/item_banks_controller.rb b/app/controllers/item_banks_controller.rb index ea10e865b..d77c57711 100644 --- a/app/controllers/item_banks_controller.rb +++ b/app/controllers/item_banks_controller.rb @@ -3,7 +3,7 @@ class ItemBanksController < ApplicationController before_action :require_login before_action :certi_identity_auth, only: [:create, :edit, :update, :destroy, :set_public] before_action :find_item, except: [:index, :create] - before_action :edit_auth, only: [:update, :destroy, :set_public] + before_action :edit_auth, only: [:update, :set_public] before_action :identity_auth, only: [:index] def index @@ -41,6 +41,7 @@ class ItemBanksController < ApplicationController end def destroy + tip_exception(403, "无权限") unless current_user.admin? || @item.user == current_user ActiveRecord::Base.transaction do ApplyAction.where(container_type: "ItemBank", container_id: @item.id).destroy_all if @item.item_type == "PROGRAM" @@ -67,7 +68,7 @@ class ItemBanksController < ApplicationController end def edit_auth - current_user.admin_or_business? || @item.user == current_user + tip_exception(403, "无权限") unless current_user.admin_or_business? || @item.user == current_user end def form_params diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb index e816ab667..655912d97 100644 --- a/app/controllers/myshixuns_controller.rb +++ b/app/controllers/myshixuns_controller.rb @@ -18,7 +18,8 @@ class MyshixunsController < ApplicationController # 强制重置实训 # 前段需要按照操作过程提示 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", "") end begin @@ -26,9 +27,15 @@ class MyshixunsController < ApplicationController ActiveRecord::Base.transaction do @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) .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 # 删除版本库 GitService.delete_repository(repo_path: @repo_path) unless @shixun.is_choice_type? diff --git a/app/controllers/student_works_controller.rb b/app/controllers/student_works_controller.rb index 8770a6519..1fa127d25 100644 --- a/app/controllers/student_works_controller.rb +++ b/app/controllers/student_works_controller.rb @@ -557,7 +557,7 @@ class StudentWorksController < ApplicationController @work.student_works_scores.where.not(score: nil).update_all(is_invalid: 1) reviewer_role = @user_course_identity == Course::ASSISTANT_PROFESSOR ? 2 : 1 new_score = StudentWorksScore.new(student_work_id: @work.id, score: params[:score].to_f, - comment: "使用调分功能调整了作业最终成绩:#{params[:comment]}", + comment: params[:comment], homework_common_id: @work.homework_common_id, user_id: current_user.id, reviewer_role: reviewer_role, is_ultimate: 1) new_score.save! diff --git a/app/controllers/users/courses_controller.rb b/app/controllers/users/courses_controller.rb index 95a006392..2e370922b 100644 --- a/app/controllers/users/courses_controller.rb +++ b/app/controllers/users/courses_controller.rb @@ -5,7 +5,7 @@ class Users::CoursesController < Users::BaseController courses = courses.where(id: current_laboratory.all_courses) @count = courses.count - @courses = paginate(courses.includes(teacher: { user_extension: :school }), special: observed_user.is_teacher?) + @courses = paginate(courses.includes(:teacher_users, teacher: { user_extension: :school }), special: observed_user.is_teacher?) end private diff --git a/app/controllers/weapps/course_member_attendances_controller.rb b/app/controllers/weapps/course_member_attendances_controller.rb index 254a89b1d..3dde09dbe 100644 --- a/app/controllers/weapps/course_member_attendances_controller.rb +++ b/app/controllers/weapps/course_member_attendances_controller.rb @@ -4,30 +4,36 @@ class Weapps::CourseMemberAttendancesController < ApplicationController def index attendance = CourseAttendance.find params[:attendance_id] - if attendance.course_attendance_groups.first&.course_group_id.to_i == 0 - @members = attendance.course.students - else - @members = attendance.course.students.where(course_group_id: attendance.course_attendance_groups.pluck(:course_group_id)) - end - @member_attendances = attendance.course_member_attendances - if params[:group_ids].present? - @members = @members.where(course_group_id: params[:group_ids]) - end @page = params[:page] || 1 @limit = params[:limit] || 5 - if params[:attendance_status].present? - @members = @members.joins(:course_member_attendances).where(course_member_attendances: {course_attendance_id: attendance.id, attendance_status: params[:attendance_status]}) + @member_attendances = attendance.course_member_attendances + if params[:group_ids].present? + @member_attendances = @member_attendances.joins(:course_member).where(course_members: {course_group_id: params[:group_ids]}) end + @member_attendances = @member_attendances.where(attendance_status: params[:attendance_status]) if params[:attendance_status].present? + @member_attendances = @member_attendances.order("attendance_status=1 desc, course_member_attendances.updated_at desc") + @members_count = @member_attendances.uniq.count + @member_attendances = paginate @member_attendances.preload(user: :user_extension) - @members = @members.joins(:course_member_attendances).order("attendance_status=1 desc, course_member_attendances.updated_at desc") - @members_count = @members.uniq.count - @members = paginate @members.preload(user: :user_extension).uniq - - # @member_attendances = @member_attendances.where(attendance_status: params[:attendance_status]) if params[:attendance_status].present? - # @member_attendances = @member_attendances.joins(user: :user_extension).order("attendance_status=1 desc, course_member_attendances.updated_at desc, user_extensions.student_id asc") - # @member_attendances = paginate @member_attendances.preload(user: :user_extension) + # if attendance.course_attendance_groups.first&.course_group_id.to_i == 0 + # @members = attendance.course.students + # else + # @members = attendance.course.students.where(course_group_id: attendance.course_attendance_groups.pluck(:course_group_id)) + # end + # @member_attendances = attendance.course_member_attendances + # if params[:group_ids].present? + # @members = @members.where(course_group_id: params[:group_ids]) + # end + # + # if params[:attendance_status].present? + # @members = @members.joins(:course_member_attendances).where(course_member_attendances: {course_attendance_id: attendance.id, attendance_status: params[:attendance_status]}) + # end + # + # @members = @members.joins(:course_member_attendances).order("attendance_status=1 desc, course_member_attendances.updated_at desc") + # @members_count = @members.uniq.count + # @members = paginate @members.preload(user: :user_extension).uniq end def create diff --git a/app/controllers/weapps/courses_controller.rb b/app/controllers/weapps/courses_controller.rb index 2a375a7fb..3a1b22cc4 100644 --- a/app/controllers/weapps/courses_controller.rb +++ b/app/controllers/weapps/courses_controller.rb @@ -76,6 +76,7 @@ class Weapps::CoursesController < Weapps::BaseController def show @course = current_course @current_user = current_user + @teacher_users = @course.teacher_users.where.not(id: @course.tea_id).map(&:real_name)[0..2] end def shixun_homework_category diff --git a/app/controllers/weapps/homes_controller.rb b/app/controllers/weapps/homes_controller.rb index e53923fa8..3e94354a2 100644 --- a/app/controllers/weapps/homes_controller.rb +++ b/app/controllers/weapps/homes_controller.rb @@ -19,7 +19,7 @@ class Weapps::HomesController < Weapps::BaseController @courses = @courses.where(id: current_laboratory.all_courses) @course_count = @courses.count 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 end end \ No newline at end of file diff --git a/app/helpers/courses_helper.rb b/app/helpers/courses_helper.rb index 4e088c0fd..03779a237 100644 --- a/app/helpers/courses_helper.rb +++ b/app/helpers/courses_helper.rb @@ -251,7 +251,13 @@ module CoursesHelper # 获取课堂的资源数 def get_attachment_count(course, category_id) identity = current_user.course_identity(course) - attachments = category_id.to_i == 0 ? course.attachments : course.attachments.where(course_second_category_id: category_id) + if category_id.to_i == 0 + attachments = course.attachments + else + # children_ids = CourseSecondCategory.where(parent_id: category_id).pluck(:id) + # category_ids = [category_id] + children_ids + attachments = course.attachments.joins(:course_second_category).where(course_second_categories: {id: category_id}).or(course.attachments.joins(:course_second_category).where(course_second_categories: {parent_id: category_id})) + end identity > Course::ASSISTANT_PROFESSOR ? attachments.published.size : attachments.size end diff --git a/app/helpers/export_helper.rb b/app/helpers/export_helper.rb index 6d0ae2422..1fd8616c5 100644 --- a/app/helpers/export_helper.rb +++ b/app/helpers/export_helper.rb @@ -457,7 +457,9 @@ module ExportHelper course_name = course.students.find_by(user_id: w.user_id).try(:course_group_name) w_5 = course_name.present? ? course_name : "--" #0: 未提交, 1 按时提交, 2 延迟提交 - if w.compelete_status == 0 + if w.compelete_status == -1 + w_6 = "重做中" + elsif w.compelete_status == 0 w_6 = "未开启" elsif w.compelete_status == 1 w_6 = "未通关" diff --git a/app/helpers/homework_commons_helper.rb b/app/helpers/homework_commons_helper.rb index 534abea6f..96dd471b5 100644 --- a/app/helpers/homework_commons_helper.rb +++ b/app/helpers/homework_commons_helper.rb @@ -240,10 +240,16 @@ module HomeworkCommonsHelper # 作品状态 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: 2, name: "按时通关", count: homework.compelete_status_count(member, 2)}, {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 # 作品状态 diff --git a/app/jobs/delete_unpublish_video_job.rb b/app/jobs/delete_unpublish_video_job.rb new file mode 100644 index 000000000..73fc20429 --- /dev/null +++ b/app/jobs/delete_unpublish_video_job.rb @@ -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 diff --git a/app/models/challenge.rb b/app/models/challenge.rb index 38aa2812a..15a96bf17 100644 --- a/app/models/challenge.rb +++ b/app/models/challenge.rb @@ -69,13 +69,17 @@ class Challenge < ApplicationRecord end # 开启挑战 - def open_game shixun + def open_game shixun, shixun_modify # 这里的identifier,status是关联了games取了games的identifier,status identifier = self.identifier if identifier.present? - shixun.task_pass || self.status != 3 ? "/tasks/#{identifier}" : "" + if shixun_modify + "/shixuns/#{shixun.identifier}/shixun_exec.json" + else + (shixun.task_pass || self.status != 3) ? "/tasks/#{identifier}" : "" + end else - self.position == 1 ? "/shixuns/#{shixun.identifier}/shixun_exec.json" : "" + (shixun.task_pass || position == 1) ? "/shixuns/#{shixun.identifier}/shixun_exec.json" : "" end end diff --git a/app/models/course_member.rb b/app/models/course_member.rb index 0a0433f6f..c8fe7e392 100644 --- a/app/models/course_member.rb +++ b/app/models/course_member.rb @@ -23,7 +23,7 @@ class CourseMember < ApplicationRecord # after_destroy :delete_works # after_create :work_operation - after_create :create_attendance_record + # after_create :create_attendance_record after_commit :create_attendance_record diff --git a/app/models/student_work.rb b/app/models/student_work.rb index d695a6b00..9293b1d78 100644 --- a/app/models/student_work.rb +++ b/app/models/student_work.rb @@ -223,6 +223,16 @@ class StudentWork < ApplicationRecord 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? student_works_scores.where.not(reviewer_role: 3, score: nil).exists? end diff --git a/app/models/watch_course_video.rb b/app/models/watch_course_video.rb index cf2d67028..49435da63 100644 --- a/app/models/watch_course_video.rb +++ b/app/models/watch_course_video.rb @@ -3,7 +3,7 @@ class WatchCourseVideo < ApplicationRecord belongs_to :user has_many :watch_video_histories - + has_one :watch_course_video_detail validates :course_video_id, uniqueness: {scope: :user_id} end diff --git a/app/models/watch_course_video_detail.rb b/app/models/watch_course_video_detail.rb new file mode 100644 index 000000000..714c41f49 --- /dev/null +++ b/app/models/watch_course_video_detail.rb @@ -0,0 +1,6 @@ +class WatchCourseVideoDetail < ApplicationRecord + belongs_to :user + belongs_to :watch_course_video + + serialize :times, Array +end diff --git a/app/services/admins/update_user_service.rb b/app/services/admins/update_user_service.rb index 6b1c0c857..3aaebb7b1 100644 --- a/app/services/admins/update_user_service.rb +++ b/app/services/admins/update_user_service.rb @@ -9,6 +9,7 @@ class Admins::UpdateUserService < ApplicationService end def call + user.assign_attributes(user_attributes) user.mail = params[:mail].to_s.presence user.phone = params[:phone].to_s.presence @@ -36,8 +37,11 @@ class Admins::UpdateUserService < ApplicationService private def user_attributes - params.slice(*%i[lastname nickname mail phone admin business is_test - professional_certification authentication is_shixun_marker]) + allow_attributes = %i[lastname nickname mail phone business is_test + professional_certification authentication is_shixun_marker admin_visitable] + + allow_attributes.push(:admin) if user.admin? + params.slice(*allow_attributes) end def user_extension_attributes diff --git a/app/services/attendance_statistics_service.rb b/app/services/attendance_statistics_service.rb index e31049b22..29b5fce04 100644 --- a/app/services/attendance_statistics_service.rb +++ b/app/services/attendance_statistics_service.rb @@ -20,7 +20,7 @@ class AttendanceStatisticsService < ApplicationService 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) + normal_rate = all_count == 0 ? 1 : cal_rate(normal_count, all_count) all_normal_rate << normal_rate absence_rate = cal_rate(absence_count, all_count) all_absence_rate << absence_rate @@ -34,7 +34,7 @@ class AttendanceStatisticsService < ApplicationService 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_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_leave_rate = cal_rate(all_leave_rate.sum, all_history_count) diff --git a/app/services/create_watch_video_service.rb b/app/services/create_watch_video_service.rb index 5a3813571..f637a2126 100644 --- a/app/services/create_watch_video_service.rb +++ b/app/services/create_watch_video_service.rb @@ -16,16 +16,17 @@ class CreateWatchVideoService < ApplicationService if params[:log_id].present? watch_video_history = user.watch_video_histories.find(params[:log_id]) - if params[:total_duration] < params[:watch_duration] - return watch_video_history - end + # if params[:total_duration] < params[:watch_duration] + # return watch_video_history + # 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.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.is_finished = params[:ed].present? + watch_video_history.last_point = params[:point].to_i watch_video_history.save! watch_course_video = watch_video_history.watch_course_video @@ -33,10 +34,29 @@ class CreateWatchVideoService < ApplicationService if watch_course_video.present? watch_course_video.total_duration = watch_course_video.watch_video_histories.sum(:total_duration) 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 # 更新课程视频的时长及是否看完状态 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 watch_course_video.save! end @@ -50,8 +70,8 @@ class CreateWatchVideoService < ApplicationService d.start_at = current_time d.duration = params[:duration] end - - watch_course_video.save! unless watch_course_video.persisted? + watch_course_video.last_point = params[:point].to_i + watch_course_video.save! watch_video_history = build_video_log(current_time, course_video.video_id, watch_course_video.id) watch_video_history.save! else diff --git a/app/services/homeworks_service.rb b/app/services/homeworks_service.rb index 5483eed83..b161be991 100644 --- a/app/services/homeworks_service.rb +++ b/app/services/homeworks_service.rb @@ -133,9 +133,9 @@ class HomeworksService # 计算实训作品学生的效率分 def update_student_eff_score homework 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.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 student_work.eff_score = format("%.2f", eff_score) student_work.late_penalty = student_work.work_status == 1 ? 0 : homework.late_penalty @@ -146,7 +146,7 @@ class HomeworksService student_work.save! end 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.late_penalty = student_work.work_status == 1 ? 0 : homework.late_penalty unless student_work.ultimate_score diff --git a/app/services/videos/batch_publish_service.rb b/app/services/videos/batch_publish_service.rb index 553ffe4f2..3ddc54967 100644 --- a/app/services/videos/batch_publish_service.rb +++ b/app/services/videos/batch_publish_service.rb @@ -31,16 +31,23 @@ class Videos::BatchPublishService < ApplicationService # 非MP4 H264编码的都转码 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]}") if code_info[:format] == "mp4" && code_info[:codecnamne].present? && code_info[:codecnamne].start_with?('h264') video.transcoded = true - result = AliyunVod::Service.get_play_info(video.uuid) rescue nil - play_url = result['PlayInfoList']['PlayInfo'].first['PlayURL'] if result.present? - video.play_url = play_url + if result.present? && result['PlayInfoList']['PlayInfo'].first['PlayURL'] + play_url = result['PlayInfoList']['PlayInfo'].first['PlayURL'] + video.play_url = play_url + end else AliyunVod::Service.submit_transcode_job(video.uuid, Video::NORMAL_TRANSCODE_GROUP_ID) end + if result.present? + video.duration = result['PlayInfoList']['PlayInfo'][0]['Duration'] if result['PlayInfoList']['PlayInfo'][0]['Duration'].present? + end + video.save! if param[:course_id].present? diff --git a/app/views/admins/courses/index.xlsx.axlsx b/app/views/admins/courses/index.xlsx.axlsx index bc6581972..a276fe470 100644 --- a/app/views/admins/courses/index.xlsx.axlsx +++ b/app/views/admins/courses/index.xlsx.axlsx @@ -3,17 +3,22 @@ wb = xlsx_package.workbook wb.styles do |s| blue_cell = s.add_style :bg_color => "FAEBDC", :sz => 10,:height => 25,:b => true, :border => { :style => :thin, :color =>"000000" },:alignment => {wrap_text: true,:horizontal => :center,:vertical => :center} wb.add_worksheet(name: "课堂列表") do |sheet| - sheet.add_row %w(ID 课堂名称 老师 学生 资源 公告 视频 普通作业 分组作业 实训作业 实训作业已发布数 作品数 试卷 评测次数 私有 状态 单位 部门 创建者 创建时间 动态时间), :height => 25,:style => blue_cell + sheet.add_row %w(ID 课堂名称 老师 学生 分班数 资源 公告 视频 视频学习时长 直播 普通作业 分组作业 实训作业 实训作业已发布数 作品数 试卷 评测次数 讨论数 私有 状态 单位 部门 创建者 创建时间), :height => 25,:style => blue_cell @courses.each do |course| + course_board = course.course_board + topic_count = course_board.present? ? course_board.messages.size : 0 data = [ course.id, course.name, course.teacher_course_members.size, course.students.size, + course.course_groups_count, get_attachment_count(course, 0), course.informs.size, course.course_videos.size, + course.course_videos.map{|cv| cv.watch_course_videos.map(&:total_duration).sum }.sum.round, + course.live_links.size, course.course_homework_count("normal"), course.course_homework_count("group"), course.course_homework_count("practice"), @@ -21,13 +26,13 @@ wb.styles do |s| course.student_works_count, course.exercises_count, course.evaluate_count, + topic_count, course.is_public == 1 ? "--" : "√", course.is_end ? "已结束" : "正在进行", course.school&.name, course.teacher&.department_name, course.teacher&.real_name, course.created_at&.strftime('%Y-%m-%d %H:%M'), - course.max_activity_time ? course.max_activity_time&.strftime('%Y-%m-%d %H:%M') : "--" ] sheet.add_row(data) end diff --git a/app/views/admins/users/edit.html.erb b/app/views/admins/users/edit.html.erb index b1a8cbba1..0c6c19be7 100644 --- a/app/views/admins/users/edit.html.erb +++ b/app/views/admins/users/edit.html.erb @@ -111,6 +111,7 @@ <%= f.input :admin, as: :boolean, label: '管理员', checked_value: 1, unchecked_value: 0 %> <%= f.input :business, as: :boolean, label: '运营人员', wrapper_html: { class: 'ml-3' }, checked_value: 1, unchecked_value: 0 %> <%= f.input :is_test, as: :boolean, label: '测试账号', wrapper_html: { class: 'ml-3' }, checked_value: 1, unchecked_value: 0 %> + <%= f.input :admin_visitable, as: :boolean, label: '允许查看后台', wrapper_html: { class: 'ml-3' }, checked_value: 1, unchecked_value: 0 %> <% end %> diff --git a/app/views/challenges/index.json.jbuilder b/app/views/challenges/index.json.jbuilder index eae72dad2..98be8d17a 100644 --- a/app/views/challenges/index.json.jbuilder +++ b/app/views/challenges/index.json.jbuilder @@ -22,7 +22,7 @@ if @challenges.present? #json.playing_count @play_games_map.fetch(challenge.id, 0) json.playing_count (challenge.games.count - user_passed_count) json.name_url shixun_challenge_path(challenge, shixun_identifier: @shixun.identifier) - json.open_game challenge.open_game(@shixun) + json.open_game challenge.open_game(@shixun, @shixun_modify) #json.open_game challenge.open_game(@shixun, @user.id) if @editable json.edit_url edit_shixun_challenge_path(challenge, shixun_identifier: @shixun.identifier) diff --git a/app/views/courses/index.json.jbuilder b/app/views/courses/index.json.jbuilder index f9bceebb8..b1c095ff1 100644 --- a/app/views/courses/index.json.jbuilder +++ b/app/views/courses/index.json.jbuilder @@ -13,5 +13,7 @@ json.courses @courses do |course| json.is_end course.is_end json.first_category_url module_url(course.none_hidden_course_modules.first, course) json.excellent course.excellent + json.teacher_users course.teacher_users.select{|u| u.id != course.tea_id }.map(&:real_name)[0..2] # 取前3名老师 + end json.courses_count @courses_count diff --git a/app/views/courses/top_banner.json.jbuilder b/app/views/courses/top_banner.json.jbuilder index b5ed437e3..cf8da8b66 100644 --- a/app/views/courses/top_banner.json.jbuilder +++ b/app/views/courses/top_banner.json.jbuilder @@ -22,6 +22,8 @@ json.switch_to_assistant switch_assistant_role(@is_student, @course, @user) #json.copy_course !@user.member_of_course?(@course) && @user.is_teacher? json.course_identity @user_course_identity json.excellent @course.excellent +# 协作老师 +json.teacher_users @teacher_users if @course.is_end == 0 json.days_remaining (@course.end_date.to_date - Time.now.to_date).to_i end diff --git a/app/views/files/index.json.jbuilder b/app/views/files/index.json.jbuilder index 67258daf5..6debc3757 100644 --- a/app/views/files/index.json.jbuilder +++ b/app/views/files/index.json.jbuilder @@ -17,10 +17,15 @@ json.data do end # json.partial! "files/course_groups", attachment_group_settings: attachment.attachment_group_settings json.category_id attachment.course_second_category_id - if (@course_second_category_id.to_i == 0 && attachment.course_second_category.present?) || (@parent_category_id == 0 && attachment.course_second_category&.parent_id.to_i != 0) + if @course_second_category_id.to_i == 0 && attachment.course_second_category.present? json.category_name attachment.course_second_category&.name json.parent_category_name attachment.course_second_category&.parent&.name end + + if @parent_category_id == 0 && attachment.course_second_category&.parent_id.to_i != 0 + json.category_name attachment.course_second_category&.name + json.parent_category_name nil + end end end end diff --git a/app/views/homework_commons/get_next_work.json.jbuilder b/app/views/homework_commons/get_next_work.json.jbuilder new file mode 100644 index 000000000..e03b18970 --- /dev/null +++ b/app/views/homework_commons/get_next_work.json.jbuilder @@ -0,0 +1,2 @@ +json.work_id @work&.id +json.user_name @work&.user&.real_name \ No newline at end of file diff --git a/app/views/homework_commons/works_list.json.jbuilder b/app/views/homework_commons/works_list.json.jbuilder index 7c51432d0..e261406c2 100644 --- a/app/views/homework_commons/works_list.json.jbuilder +++ b/app/views/homework_commons/works_list.json.jbuilder @@ -103,6 +103,7 @@ if @homework.homework_type == "practice" 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.myshixun_identifier work.myshixun&.identifier json.cost_time work.myshixun.try(:total_spend_time) 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 @@ -114,7 +115,7 @@ if @homework.homework_type == "practice" 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.work_status work.compelete_status - json.has_comment work.shixun_work_comments.size > 0 + json.has_comment work.shixun_has_comment? end elsif @homework.homework_type == "group" || @homework.homework_type == "normal" 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_name @is_evaluation ? "匿名" : work.user.try(:real_name) json.user_img @is_evaluation ? "--" : url_to_avatar(work.user) - + json.has_comment work.work_has_comment? end end diff --git a/app/views/student_works/shixun_work_report.json.jbuilder b/app/views/student_works/shixun_work_report.json.jbuilder index adf0a2ea5..c6596d1ee 100644 --- a/app/views/student_works/shixun_work_report.json.jbuilder +++ b/app/views/student_works/shixun_work_report.json.jbuilder @@ -1,4 +1,5 @@ json.homework_common_id @homework.id +json.course_id @homework.course_id json.category @homework.category_info json.course_name @course.name json.work_id @work.id @@ -88,5 +89,8 @@ if @shixun end json.view_tpi @view_tpi +json.myshixun_id @work.myshixun_id +json.myshixun_identifier @work.myshixun&.identifier +json.homework_end @homework.end_or_late diff --git a/app/views/users/courses/shared/_course.json.jbuilder b/app/views/users/courses/shared/_course.json.jbuilder index a0c5ddc73..d3de455a8 100644 --- a/app/views/users/courses/shared/_course.json.jbuilder +++ b/app/views/users/courses/shared/_course.json.jbuilder @@ -7,6 +7,8 @@ json.homework_commons_count get_tasks_count course json.attachments_count course.attachments.count json.visits course.visits json.school course.school&.name +json.teacher_users course.teacher_users.select{|u| u.id != course.tea_id }.map(&:real_name)[0..2] # 取前3名老师 + json.first_category_url module_url(course.course_modules.where(hidden: 0).order(position: :desc).first, course) diff --git a/app/views/weapps/course_member_attendances/index.json.jbuilder b/app/views/weapps/course_member_attendances/index.json.jbuilder index 765de5833..43ce6ed44 100644 --- a/app/views/weapps/course_member_attendances/index.json.jbuilder +++ b/app/views/weapps/course_member_attendances/index.json.jbuilder @@ -1,15 +1,16 @@ -# json.member_attendances @member_attendances.each do |member| -# json.(member, :user_id, :attendance_status) -# json.user_name member.user&.real_name -# json.student_id member.user&.student_id -# end - -json.member_attendances @members.each_with_index.to_a do |member, index| - json.(member, :user_id) +json.member_attendances @member_attendances.each_with_index.to_a do |member, index| + json.(member, :user_id, :attendance_status) json.index (@page.to_i - 1) * @limit.to_i + index + 1 json.user_name member.user&.real_name json.student_id member.user&.student_id - json.attendance_status @member_attendances.select{|attendance| attendance.course_member_id == member.id}.first&.attendance_status || "ABSENCE" end +# json.member_attendances @members.each_with_index.to_a do |member, index| +# json.(member, :user_id) +# json.index (@page.to_i - 1) * @limit.to_i + index + 1 +# json.user_name member.user&.real_name +# json.student_id member.user&.student_id +# json.attendance_status @member_attendances.select{|attendance| attendance.course_member_id == member.id}.first&.attendance_status || "ABSENCE" +# end + json.members_count @members_count \ No newline at end of file diff --git a/app/views/weapps/courses/show.json.jbuilder b/app/views/weapps/courses/show.json.jbuilder index c22b24426..cf58315b4 100644 --- a/app/views/weapps/courses/show.json.jbuilder +++ b/app/views/weapps/courses/show.json.jbuilder @@ -1,4 +1,5 @@ json.(@course, :id, :name, :course_members_count, :credit, :invite_code_halt) json.teachers_count @course.teachers.count json.students_count @course.students.count -json.course_identity @current_user.course_identity(@course) \ No newline at end of file +json.course_identity @current_user.course_identity(@course) +json.teacher_users @teacher_users \ No newline at end of file diff --git a/app/views/weapps/homes/show.json.jbuilder b/app/views/weapps/homes/show.json.jbuilder index f307d64fe..5d0e35e05 100644 --- a/app/views/weapps/homes/show.json.jbuilder +++ b/app/views/weapps/homes/show.json.jbuilder @@ -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 json.sticky course_member.sticky 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 diff --git a/config/harmonious_dictionary/chinese_dictionary.txt b/config/harmonious_dictionary/chinese_dictionary.txt index 2bd91e8d2..fd7278dfc 100644 --- a/config/harmonious_dictionary/chinese_dictionary.txt +++ b/config/harmonious_dictionary/chinese_dictionary.txt @@ -518,7 +518,6 @@ H漫画 胡启立 芮杏文 杨白冰 -邹家华 谭绍文 王汉斌 任建新 @@ -1377,6 +1376,4 @@ B样 垃 圾 傻 逼 真蠢 -蠢猪 - - +蠢猪 \ No newline at end of file diff --git a/config/harmonious_dictionary/harmonious.hash b/config/harmonious_dictionary/harmonious.hash index 67e985d4c..8d906ec53 100644 Binary files a/config/harmonious_dictionary/harmonious.hash and b/config/harmonious_dictionary/harmonious.hash differ diff --git a/config/routes.rb b/config/routes.rb index 047141ea8..da07c8d89 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -597,6 +597,7 @@ Rails.application.routes.draw do get :update_score get :update_student_score post :batch_comment + get :get_next_work end collection do diff --git a/config/schedule.yml b/config/schedule.yml new file mode 100644 index 000000000..cf5b7618f --- /dev/null +++ b/config/schedule.yml @@ -0,0 +1,3 @@ +delete_unpublish_video_job: + cron: "0 24 * * *" + class: "DeleteUnpublishVideoJob" \ No newline at end of file diff --git a/db/migrate/20200318041550_create_watch_course_video_details.rb b/db/migrate/20200318041550_create_watch_course_video_details.rb new file mode 100644 index 000000000..07984cb42 --- /dev/null +++ b/db/migrate/20200318041550_create_watch_course_video_details.rb @@ -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 diff --git a/db/migrate/20200318181442_add_duration_to_video.rb b/db/migrate/20200318181442_add_duration_to_video.rb new file mode 100644 index 000000000..caf3a70e9 --- /dev/null +++ b/db/migrate/20200318181442_add_duration_to_video.rb @@ -0,0 +1,5 @@ +class AddDurationToVideo < ActiveRecord::Migration[5.2] + def change + add_column :videos, :duration, :float, default: 0 + end +end diff --git a/db/migrate/20200320032312_add_admin_visitable_to_user.rb b/db/migrate/20200320032312_add_admin_visitable_to_user.rb new file mode 100644 index 000000000..43a67c788 --- /dev/null +++ b/db/migrate/20200320032312_add_admin_visitable_to_user.rb @@ -0,0 +1,5 @@ +class AddAdminVisitableToUser < ActiveRecord::Migration[5.2] + def change + add_column :users, :admin_visitable, :boolean, default: false + end +end diff --git a/lib/tasks/competition_extra_course_statistic.rake b/lib/tasks/competition_extra_course_statistic.rake index a3e4f4f91..3ef6bcd18 100644 --- a/lib/tasks/competition_extra_course_statistic.rake +++ b/lib/tasks/competition_extra_course_statistic.rake @@ -12,7 +12,7 @@ namespace :competition do student_count_subquery = CourseMember.where('course_id = courses.id AND role = 4').select('count(*)').to_sql 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 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) @@ -109,7 +109,7 @@ namespace :competition do # =========== Course =========== student_count_subquery = CourseMember.where('course_id = courses.id AND role = 4').select('count(*)').to_sql 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 course_ids = Course.where('courses.created_at > ?', start_time) .where('courses.created_at <= ?', end_time) @@ -173,7 +173,7 @@ namespace :competition do 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) - .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 Course.joins(practice_homeworks: :homework_commons_shixun) @@ -184,7 +184,7 @@ namespace :competition do 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) - .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 Shixun.joins(homework_commons_shixuns: :homework_common) .where(homework_commons: { homework_type: 4 }) diff --git a/lib/tasks/get_video_data.rake b/lib/tasks/get_video_data.rake index f6f85c7d5..efb89e99e 100644 --- a/lib/tasks/get_video_data.rake +++ b/lib/tasks/get_video_data.rake @@ -74,4 +74,17 @@ namespace :video do 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 \ No newline at end of file diff --git a/lib/tasks/migrate_course_student_work.rake b/lib/tasks/migrate_course_student_work.rake new file mode 100644 index 000000000..c795a49ce --- /dev/null +++ b/lib/tasks/migrate_course_student_work.rake @@ -0,0 +1,31 @@ +# 执行示例 bundle exec rake migrate_course_student_work:homework args=2933 +desc "创建课堂学生的作业数据" + +namespace :migrate_course_student_work do + if ENV['args'] + course_id = ENV['args'].split(",")[0] # 对应课堂的id + end + + task homework: :environment do + course = Course.find_by(id: course_id) + if course.present? + student_ids = course.students.pluck(:user_id) + + # 如果之前存在相关作品,则更新is_delete字段 + student_works = StudentWork.joins(:homework_common).where(user_id: student_ids, homework_commons: {course_id: course.id}) + student_works.update_all(is_delete: 0) + + attrs = %i[homework_common_id user_id created_at updated_at] + + StudentWork.bulk_insert(*attrs) do |worker| + student_ids.each do |user_id| + same_attrs = {user_id: user_id} + course.homework_commons.where(homework_type: %i[normal group practice]).each do |homework| + next if StudentWork.where(user_id: user_id, homework_common_id: homework.id).any? + worker.add same_attrs.merge(homework_common_id: homework.id) + end + end + end + end + end +end diff --git a/lib/tasks/sync_video.rake b/lib/tasks/sync_video.rake new file mode 100644 index 000000000..e69de29bb diff --git a/lib/tasks/video_transcode.rake b/lib/tasks/video_transcode.rake index 2b4a1eac7..9f45f66e0 100644 --- a/lib/tasks/video_transcode.rake +++ b/lib/tasks/video_transcode.rake @@ -3,18 +3,22 @@ namespace :video_transcode do desc "视频转码成h264" task :submit => :environment do i = [] - Video.where.not(uuid: nil, file_url: nil).where(transcoded: false).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) + Video.where(transcoded: false).find_each do |v| + if v.uuid.present? && v.file_url.present? + 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') rescue nil + end else - puts("uuid: #{v.uuid}") - i << "#{v.id}, #{v.file_url}, #{code_info[:codecnamne]}" - AliyunVod::Service.submit_transcode_job(v.uuid, 'a0277c5c0c7458458e171b0cee6ebf5e') rescue nil + v.update_column(:transcoded, true) end end puts "###########转码个数:#{i.size}" puts "###########id,file_url, codecnamne:#{i}" - Video.where(transcoded: false).update_all(transcoded: true) + #Video.where(transcoded: false).update_all(transcoded: true) end end \ No newline at end of file diff --git a/public/react/src/common/DateUtil.js b/public/react/src/common/DateUtil.js index 4bc481b10..859182e18 100644 --- a/public/react/src/common/DateUtil.js +++ b/public/react/src/common/DateUtil.js @@ -96,4 +96,4 @@ export function formatDuring(mss){ } return days + "天" + hours + "小时" + minutes + "分"; -} \ No newline at end of file +} diff --git a/public/react/src/common/util/ShareUtil.js b/public/react/src/common/util/ShareUtil.js index a85c37c4a..f0ce13996 100644 --- a/public/react/src/common/util/ShareUtil.js +++ b/public/react/src/common/util/ShareUtil.js @@ -110,7 +110,7 @@ export function configShareForCourses () { var shareData = { title: 'EduCoder - 教学课堂', desc: '自动评测实训任务,支持技能统计,提供教学活动分析报告,减轻教师和助教的辅导压力,免去作业发布和批改的困扰,实时了解学生学习情况,全面提升教师施教效率和水平。', - link: `${host}/courses`, + link: `${host}/classrooms`, imgUrl: window.__testImageUrl || host + '/react/build/images/share_logo_icon.jpg' }; diff --git a/public/react/src/modules/courses/Resource/index.js b/public/react/src/modules/courses/Resource/index.js index 1719a3eb2..4f12bce66 100644 --- a/public/react/src/modules/courses/Resource/index.js +++ b/public/react/src/modules/courses/Resource/index.js @@ -51,6 +51,7 @@ class Fileslists extends Component{ istowshowid:'', //新增参数判断几级目录 parent_category_id:'', + isToggleOn:false, } } @@ -566,7 +567,7 @@ class Fileslists extends Component{ let {search,order,selectpage,checkAllValue,checkBoxValues}=this.state; let selectpagetype=selectpage===page&&checkBoxValues.length===15?true:false - console.log(selectpagetype) + this.setState({ page:page, @@ -673,8 +674,10 @@ class Fileslists extends Component{ //判断二级链接是否显示 istowshow(item){ + let toggleon=this.state.isToggleOn; this.setState({ - istowshowid:item.value + istowshowid:item.value, + isToggleOn:!toggleon }) } @@ -1032,9 +1035,9 @@ class Fileslists extends Component{ {course_modules&&course_modules.course_modules.map((item,key)=>{ return( - -
{this.setState({dirSearchValue: e.target.value})}}/> @@ -429,7 +438,7 @@ class Boards extends Component{ { messages.map((item, index) => { return (
@@ -3061,7 +3061,7 @@ class PollNew extends Component { {item.question.answers === undefined ? "" : item.question.answers.map((items, i) => { return (
this.props.showmodelysl(items.id)}> + + 删除 +
+ { + items.item_type === "PROGRAM" ? + this.props.Isitapopup&&this.props.Isitapopup==="true"? + "" + : + this.seturls(`/problems/${items.program_attr.identifier}/edit`)}> ++ + 编辑 +
+ + : + this.props.Isitapopup&&this.props.Isitapopup==="true"? + "" + : + this.seturls(`/problemset/edit/${items.id}`)}> ++ + 编辑 +
+ + } ++ + 编辑 +
+ + : + this.props.Isitapopup&&this.props.Isitapopup==="true"? + "" + : + this.seturls(`/problemset/edit/${items.id}`)}> ++ + 编辑 +
+ + } +this.props.showmodelysl(items.id)}> + + 删除 +
+ { + this.props.Isitapopup&&this.props.Isitapopup==="true"? + "" + : + +this.props.Testpapereditor(items.id)}> + + 编辑 +
+ + } +this.props.Testpapereditor(items.id)}> + + 编辑 +
+ + } +创建者
:""}+
*/} {/*}*/} @@ -625,9 +626,11 @@ class Challengesjupyter extends Component { src={getImageUrl("images/educoder/nodata.png")} />}暂时还没有相关数据哦!
+ :
+