From ec1826c469f37364e549863c7c3d3079cedacf4e Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Mon, 2 Sep 2019 14:17:17 +0800 Subject: [PATCH 001/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../graduation_tasks_controller.rb | 41 +++++++++++-------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/app/controllers/graduation_tasks_controller.rb b/app/controllers/graduation_tasks_controller.rb index 727bdb77e..138be4960 100644 --- a/app/controllers/graduation_tasks_controller.rb +++ b/app/controllers/graduation_tasks_controller.rb @@ -452,22 +452,27 @@ class GraduationTasksController < ApplicationController tip_exception("评阅时间应当大于截止时间") if @task.cross_comment && params[:comment_time] <= @task.end_time @task.comment_time = @task.cross_comment ? params[:comment_time] : nil - @task.comment_num = @task.cross_comment ? params[:comment_num].to_i : 3 - @task.comment_status = @task.cross_comment ? params[:comment_status] : 0 - if @task.cross_comment && params[:comment_status].to_i == 4 - tip_exception("评阅数不能为空") if params[:comment_num].blank? - tip_exception("评阅数应大于0") if params[:comment_num].to_i < 1 - - @course.graduation_groups.each_with_index do |group, index| - ass_group = @task.graduation_task_group_assignations.find_by(graduation_group_id: group.id) - if ass_group.present? && params[:comment_group][index].present? && params[:comment_group][index] != "0" - ass_group.update_attributes(assign_graduation_group_id: params[:comment_group][index]) - else - @task.graduation_task_group_assignations << GraduationTaskGroupAssignation.new(graduation_group_id: group.id, - assign_graduation_group_id: params[:comment_group][index]) - end - end - end + + # unless @task.cross_comment + # @task.graduation_work_comment_assignations.destroy_all + # end + # 去掉评阅设置 + # @task.comment_num = @task.cross_comment ? params[:comment_num].to_i : 3 + # @task.comment_status = @task.cross_comment ? params[:comment_status] : 0 + # if @task.cross_comment && params[:comment_status].to_i == 4 + # tip_exception("评阅数不能为空") if params[:comment_num].blank? + # tip_exception("评阅数应大于0") if params[:comment_num].to_i < 1 + # + # @course.graduation_groups.each_with_index do |group, index| + # ass_group = @task.graduation_task_group_assignations.find_by(graduation_group_id: group.id) + # if ass_group.present? && params[:comment_group][index].present? && params[:comment_group][index] != "0" + # ass_group.update_attributes(assign_graduation_group_id: params[:comment_group][index]) + # else + # @task.graduation_task_group_assignations << GraduationTaskGroupAssignation.new(graduation_group_id: group.id, + # assign_graduation_group_id: params[:comment_group][index]) + # end + # end + # end end # 公开设置 @@ -492,6 +497,10 @@ class GraduationTasksController < ApplicationController end end + def cross_comment_setting + + end + private def find_task begin From 7e1054aaf38ae28bbc21d995946a9a95e4558b11 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Mon, 2 Sep 2019 16:14:40 +0800 Subject: [PATCH 002/394] com --- app/controllers/graduation_tasks_controller.rb | 6 +++--- config/routes.rb | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/app/controllers/graduation_tasks_controller.rb b/app/controllers/graduation_tasks_controller.rb index 138be4960..ac6cb7eae 100644 --- a/app/controllers/graduation_tasks_controller.rb +++ b/app/controllers/graduation_tasks_controller.rb @@ -1,11 +1,11 @@ class GraduationTasksController < ApplicationController before_action :require_login, :check_auth, except: [:index] before_action :find_course, except: [:edit, :update, :settings, :update_settings, :tasks_list, :show, :show_comment] - before_action :find_task, only: [:edit, :update, :settings, :update_settings, :tasks_list, :show, :show_comment] + before_action :find_task, only: [:edit, :update, :settings, :update_settings, :tasks_list, :show, :show_comment, :cross_comment_setting] before_action :user_course_identity before_action :task_publish, only: [:show, :show_comment, :tasks_list, :settings] before_action :teacher_allowed, only: [:new, :create, :edit, :update, :set_public,:multi_destroy, :publish_task, :end_task, - :update_settings, :add_to_bank] + :update_settings, :add_to_bank, :cross_comment_setting] before_action :require_id_params, only: [:set_public ,:multi_destroy, :publish_task, :end_task, :add_to_bank] before_action :valid_params, only: [:update_settings] include ExportHelper @@ -498,7 +498,7 @@ class GraduationTasksController < ApplicationController end def cross_comment_setting - + @comment_status end private diff --git a/config/routes.rb b/config/routes.rb index c2da5fc63..34e9947aa 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -536,6 +536,7 @@ Rails.application.routes.draw do post 'update_settings' get 'tasks_list' get :show_comment + get :cross_comment_setting end collection do From bc8c77fc76e90f916aacf6872bb6da6360545bfe Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Mon, 2 Sep 2019 17:48:49 +0800 Subject: [PATCH 003/394] tiaoz --- app/controllers/graduation_tasks_controller.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/controllers/graduation_tasks_controller.rb b/app/controllers/graduation_tasks_controller.rb index 076965899..836ece3e9 100644 --- a/app/controllers/graduation_tasks_controller.rb +++ b/app/controllers/graduation_tasks_controller.rb @@ -499,7 +499,9 @@ class GraduationTasksController < ApplicationController end def cross_comment_setting - @comment_status + @comment_status = @task.cross_comment ? @task.comment_status : (params[:comment_status] || 2) + user_ids = @course.teacher_group_user_ids(current_user.id) + @work_list = @task.graduation_works.where(user_id: user_ids).includes(user: [:user_extension]) end private From 0692caf4273dec1cfe1ef8e96a5497978962998e Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 3 Sep 2019 17:23:53 +0800 Subject: [PATCH 004/394] =?UTF-8?q?=E6=AF=95=E8=AE=BE=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=9A=84=E8=AF=84=E9=98=85=E8=AE=BE=E7=BD=AE=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 4 +- .../graduation_tasks_controller.rb | 109 ++++++++++++++++-- .../graduation_works_controller.rb | 2 +- app/helpers/graduation_tasks_helper.rb | 2 +- app/jobs/graduation_task_cross_comment_job.rb | 31 +---- app/models/graduation_task.rb | 9 +- .../graduation_task_group_assignation.rb | 8 +- app/models/graduation_work.rb | 19 ++- .../graduation_work_comment_assignation.rb | 7 +- app/models/graduation_work_score.rb | 1 + app/models/student_work.rb | 4 +- .../cross_comment_setting.json.jbuilder | 26 +++++ config/routes.rb | 2 + ...raduation_work_id_to_group_assignations.rb | 7 ++ ...90903025159_add_temporary_to_graduation.rb | 6 + lib/tasks/graduation_task.rake | 7 +- 16 files changed, 198 insertions(+), 46 deletions(-) create mode 100644 app/views/graduation_tasks/cross_comment_setting.json.jbuilder create mode 100644 db/migrate/20190903022313_add_graduation_work_id_to_group_assignations.rb create mode 100644 db/migrate/20190903025159_add_temporary_to_graduation.rb diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 6046be5af..9f2813940 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -496,8 +496,8 @@ class ApplicationController < ActionController::Base # 只看我的交叉评阅 if option[:cross_comment] - graduation_work_id = task.graduation_work_comment_assignations.where(:user_id => current_user.id) - .pluck(:graduation_work_id).uniq if task.graduation_work_comment_assignations + graduation_work_id = task.formal_graduation_work_comment_assignations.where(:user_id => current_user.id) + .pluck(:graduation_work_id).uniq if task.formal_graduation_work_comment_assignations work_list = work_list.where(id: graduation_work_id) end diff --git a/app/controllers/graduation_tasks_controller.rb b/app/controllers/graduation_tasks_controller.rb index 836ece3e9..49a4ead78 100644 --- a/app/controllers/graduation_tasks_controller.rb +++ b/app/controllers/graduation_tasks_controller.rb @@ -1,13 +1,16 @@ class GraduationTasksController < ApplicationController before_action :require_login, :check_auth, except: [:index] - before_action :find_course, except: [:edit, :update, :settings, :update_settings, :tasks_list, :show, :show_comment] - before_action :find_task, only: [:edit, :update, :settings, :update_settings, :tasks_list, :show, :show_comment, :cross_comment_setting] + before_action :find_course, except: [:edit, :update, :settings, :update_settings, :tasks_list, :show, :show_comment, + :cross_comment_setting, :assign_works, :commit_comment_setting] + before_action :find_task, only: [:edit, :update, :settings, :update_settings, :tasks_list, :show, :show_comment, + :cross_comment_setting, :assign_works, :commit_comment_setting] before_action :user_course_identity before_action :task_publish, only: [:show, :show_comment, :tasks_list, :settings] before_action :teacher_allowed, only: [:new, :create, :edit, :update, :set_public,:multi_destroy, :publish_task, :end_task, - :update_settings, :add_to_bank, :cross_comment_setting] + :update_settings, :add_to_bank, :cross_comment_setting, :assign_works, :commit_comment_setting] before_action :require_id_params, only: [:set_public ,:multi_destroy, :publish_task, :end_task, :add_to_bank] before_action :valid_params, only: [:update_settings] + before_action :allow_cross_comment, only: [:cross_comment_setting, :assign_works, :commit_comment_setting] include ExportHelper def index @@ -99,8 +102,8 @@ class GraduationTasksController < ApplicationController # 只看我的交叉评阅 unless params[:cross_comment].blank? - graduation_work_id = @task.graduation_work_comment_assignations.where(:user_id =>current_user.id) - .pluck(:graduation_work_id).uniq if @task.graduation_work_comment_assignations + graduation_work_id = @task.formal_graduation_work_comment_assignations.where(:user_id =>current_user.id) + .pluck(:graduation_work_id).uniq if @task.formal_graduation_work_comment_assignations @work_list = @task.graduation_works.where(id: graduation_work_id) end @@ -499,9 +502,94 @@ class GraduationTasksController < ApplicationController end def cross_comment_setting - @comment_status = @task.cross_comment ? @task.comment_status : (params[:comment_status] || 2) - user_ids = @course.teacher_group_user_ids(current_user.id) - @work_list = @task.graduation_works.where(user_id: user_ids).includes(user: [:user_extension]) + @comment_status = params[:comment_status] || (@task.cross_comment ? @task.comment_status : 2) + group_ids = @course.charge_group_ids(current_user) + @course_groups = @course.course_groups.where(id: group_ids) + + # 如果传了分班id则取合集 + group_ids = group_ids & params[:group_ids] unless params[:group_ids].blank? + page = params[:page] ? params[:page].to_i : 1 + limit = params[:limit] ? params[:limit].to_i : 10 + @work_list = @task.graduation_works.joins("join course_members on graduation_works.user_id=course_members.user_id"). + where(course_members: {course_group_id: group_ids}).page(page).per(limit).includes(user: [:user_extension]) + @students = @course.students.where(user_id: @work_list.pluck(:user_id)) + end + + def assign_works + tip_exception("请先选择作品") if params[:work_ids].blank? + tip_exception("请指定要分配的老师或答辩组") if params[:user_ids].blank? && params[:graduation_group_ids].blank? + + ActiveRecord::Base.transaction do + begin + works = @task.graduation_works.where(id: params[:work_ids]) + # 手动分配:分配给老师 + if !params[:user_ids].blank? + works.each do |work| + # 之前分配的老师但现在未分配时,置为删除位,点取消时需要还原,点确认时再删除 + work.graduation_work_comment_assignations.where.not(user_id: params[:user_ids]).update_all(temporary: 2) + @course.teachers.where(user_id: params[:user_ids]).pluck(:user_id).uniq.each do |user_id| + unless work.graduation_work_comment_assignations.exists?(user_id: user_id) + GraduationWorkCommentAssignation.create!(graduation_task_id: @task.id, graduation_work_id: work.id, + user_id: user_id, temporary: 1) + end + end + end + + # 答辩组分配:分配答辩组 + elsif !params[:graduation_group_ids].blank? + works.each do |work| + work.graduation_task_group_assignations.where.not(graduation_group_id: params[:graduation_group_ids]).update_all(temporary: 2) + @course.graduation_groups.where(id: params[:graduation_group_ids]).pluck(:id).uniq.each do |graduation_group_id| + unless work.graduation_task_group_assignations.exists?(graduation_group_id: graduation_group_id) + GraduationTaskGroupAssignation.create!(graduation_task_id: @task.id, graduation_work_id: work.id, + graduation_group_id: graduation_group_id, temporary: 1) + end + end + end + end + normal_status("分配成功") + rescue Exception => e + uid_logger(e.message) + tip_exception(e.message) + raise ActiveRecord::Rollback + end + end + end + + def commit_comment_setting + tip_exception("type参数有误") if params[:type].blank? || !["commit", "cancel"].include?(params[:type]) + ActiveRecord::Base.transaction do + begin + # 提交弹框 + if params[:type] == "commit" + tip_exception("comment_status参数有误") if params[:comment_status].blank? || ![2, 4].include?(params[:comment_status].to_i) + @task.update_attributes(comment_status: params[:comment_status]) + if params[:comment_status].to_i == 2 + @task.temporary_graduation_work_comment_assignations.update_all(temporary: 0) # 临时数据转正 + @task.delete_graduation_work_comment_assignations.destroy_all # 删除置了删除位的数据 + @task.graduation_task_group_assignations.destroy_all # 删除答辩组分配数据 + else + @task.temporary_graduation_task_group_assignations.update_all(temporary: 0) + @task.delete_graduation_task_group_assignations.destroy_all + @task.graduation_work_comment_assignations.destroy_all + + GraduationTaskCrossCommentJob.perform_later(@task.id) + end + else + # 取消时删除临时数据,恢复删除位数据 + @task.temporary_graduation_work_comment_assignations.destroy_all # 删除临时数据 + @task.delete_graduation_work_comment_assignations.update_all(temporary: 0) # 恢复置了删除位的数据 + + @task.temporary_graduation_task_group_assignations.destroy_all # 删除临时数据 + @task.delete_graduation_task_group_assignations.update_all(temporary: 0) # 恢复置了删除位的数据 + end + normal_status("操作成功") + rescue Exception => e + uid_logger(e.message) + tip_exception(e.message) + raise ActiveRecord::Rollback + end + end end private @@ -544,6 +632,11 @@ class GraduationTasksController < ApplicationController tip_exception("最大人数不能小于最小人数要求") if params[:min_num].to_i > params[:max_num].to_i end end + + def allow_cross_comment + tip_exception("请先开启交叉评阅再设置") unless @task.cross_comment + end + # # def graduation_work_to_xls items # xls_report = StringIO.new diff --git a/app/controllers/graduation_works_controller.rb b/app/controllers/graduation_works_controller.rb index 204e0e5d4..c22ab7706 100644 --- a/app/controllers/graduation_works_controller.rb +++ b/app/controllers/graduation_works_controller.rb @@ -308,7 +308,7 @@ class GraduationWorksController < ApplicationController end end - if @task.status == 3 && @task.graduation_work_comment_assignations.where(graduation_work_id: @work.id, user_id: current_user.id).count > 0 + if @task.status == 3 && @task.formal_graduation_work_comment_assignations.where(graduation_work_id: @work.id, user_id: current_user.id).count > 0 new_score.reviewer_role = 2 else new_score.reviewer_role = 1 diff --git a/app/helpers/graduation_tasks_helper.rb b/app/helpers/graduation_tasks_helper.rb index 2bc059a55..48926ce8f 100644 --- a/app/helpers/graduation_tasks_helper.rb +++ b/app/helpers/graduation_tasks_helper.rb @@ -15,7 +15,7 @@ module GraduationTasksHelper # 交叉评阅 def cross_comment task, user_id if task.cross_comment && task.status >= 3 - [{id: 1, name: "只看我的交叉评阅", count: task.graduation_work_comment_assignations.myself(user_id).count}] + [{id: 1, name: "只看我的交叉评阅", count: task.formal_graduation_work_comment_assignations.myself(user_id).count}] else [] end diff --git a/app/jobs/graduation_task_cross_comment_job.rb b/app/jobs/graduation_task_cross_comment_job.rb index cf2cb613e..38cc56178 100644 --- a/app/jobs/graduation_task_cross_comment_job.rb +++ b/app/jobs/graduation_task_cross_comment_job.rb @@ -6,32 +6,13 @@ class GraduationTaskCrossCommentJob < ApplicationJob task = GraduationTask.find_by(id: graduation_task_id) return if task.blank? - course = task.course - task.graduation_task_group_assignations.each do |assignation| + task.graduation_task_group_assignations.includes(:graduation_group, :graduation_work).each do |assignation| graduation_group = assignation.graduation_group - assign_group = assignation.assign_group - if graduation_group.present? && assign_group.present? - course_group_ids = course.teacher_course_groups.where(course_member_id: graduation_group.course_members.pluck(:id)).pluck(:course_group_id) - graduation_works = task.graduation_works.where(user_id: course.course_members.where(:course_group_id => course_group_ids).map(&:user_id), - work_status: [1, 2]) - if assign_group.course_members.count <= task.comment_num - graduation_works.each do |work| - assign_group.course_members.each do |member| - work.graduation_work_comment_assignations << GraduationWorkCommentAssignation.new( - graduation_group_id: assign_group.id, user_id: member.user_id, graduation_task_id: task.id) - end - end - else - member_user_ids = assign_group.course_members.pluck(:user_id) - count = 0 - graduation_works.each do |work| - for i in 1 .. task.comment_num - assign_user_id = member_user_ids[count % member_user_ids.size] - work.graduation_work_comment_assignations << GraduationWorkCommentAssignation.new( - graduation_group_id: assign_group.id, user_id: assign_user_id, graduation_task_id: task.id) - count += 1 - end - end + work = assignation.graduation_work + if graduation_group.present? && work.present? + member_ids = graduation_group.course_members.pluck(:user_id).uniq + member_ids.each do |user_id| + work.graduation_work_comment_assignations << GraduationWorkCommentAssignation.new(user_id: user_id, graduation_task_id: task.id) end end end diff --git a/app/models/graduation_task.rb b/app/models/graduation_task.rb index e247f2b6e..4150c52bc 100644 --- a/app/models/graduation_task.rb +++ b/app/models/graduation_task.rb @@ -13,8 +13,15 @@ class GraduationTask < ApplicationRecord has_many :attachments, as: :container, dependent: :destroy - has_many :graduation_task_group_assignations, dependent: :destroy has_many :graduation_work_comment_assignations, dependent: :destroy + has_many :formal_graduation_work_comment_assignations, -> { formal }, class_name: "GraduationWorkCommentAssignation" + has_many :temporary_graduation_work_comment_assignations, -> { temporary }, class_name: "GraduationWorkCommentAssignation" + has_many :delete_graduation_work_comment_assignations, -> { temporary_delete }, class_name: "GraduationWorkCommentAssignation" + + has_many :graduation_task_group_assignations, dependent: :destroy + has_many :formal_graduation_task_group_assignations, -> { formal }, class_name: "GraduationTaskGroupAssignation" + has_many :temporary_graduation_task_group_assignations, -> { temporary }, class_name: "GraduationTaskGroupAssignation" + has_many :delete_graduation_task_group_assignations, -> { temporary_delete }, class_name: "GraduationTaskGroupAssignation" has_many :graduation_works, -> { where("is_delete = 0") } has_many :score_graduation_works, -> { where("is_delete = 0 and work_status != 0").order("work_score desc") }, class_name: "GraduationWork" diff --git a/app/models/graduation_task_group_assignation.rb b/app/models/graduation_task_group_assignation.rb index 52da65191..b7e857c35 100644 --- a/app/models/graduation_task_group_assignation.rb +++ b/app/models/graduation_task_group_assignation.rb @@ -1,6 +1,12 @@ class GraduationTaskGroupAssignation < ApplicationRecord + # temporary 0: 正式分配 1:临时分配(交叉评阅设置中临时分配的作品,点取消时会删除) 2: 删除标志 belongs_to :graduation_task belongs_to :graduation_group - belongs_to :assign_group, class_name: 'GraduationGroup', foreign_key: :assign_graduation_group_id # 分配的互评组 + belongs_to :assign_group, class_name: 'GraduationGroup', foreign_key: :assign_graduation_group_id, optional: true # 分配的互评组 + belongs_to :graduation_work, optional: true + scope :temporary, -> {where(temporary: 1)} + scope :formal, -> {where(temporary: 0)} + scope :temporary_delete, -> {where(temporary: 2)} + scope :temporary_formal, -> {where(temporary: [0, 1])} end diff --git a/app/models/graduation_work.rb b/app/models/graduation_work.rb index 235bfcac6..aa95e8ca4 100644 --- a/app/models/graduation_work.rb +++ b/app/models/graduation_work.rb @@ -9,7 +9,14 @@ class GraduationWork < ApplicationRecord has_many :attachments, as: :container, dependent: :destroy has_many :tidings, as: :container, dependent: :destroy has_many :graduation_work_scores, dependent: :destroy + has_many :graduation_work_comment_assignations, dependent: :destroy + has_many :formal_graduation_work_comment_assignations, -> { formal }, class_name: "GraduationWorkCommentAssignation" + has_many :temporary_graduation_work_comment_assignations, -> { temporary }, class_name: "GraduationWorkCommentAssignation" + + has_many :graduation_task_group_assignations, dependent: :destroy + has_many :formal_graduation_task_group_assignations, -> { formal }, class_name: "GraduationTaskGroupAssignation" + has_many :temporary_graduation_task_group_assignations, -> { temporary }, class_name: "GraduationTaskGroupAssignation" validates :description, length: { maximum: 5000 } @@ -108,11 +115,21 @@ class GraduationWork < ApplicationRecord end end + # 作品被交叉评阅的次数 def cross_comment_num graduation_work_scores.where(reviewer_role: 2).group_by(&:user_id).count end + # 作品是否被评阅过 def scored? - graduation_work_scores.where.not(reviewer_role: 3).exists? + graduation_work_scores.where.not(core: nil).exists? + end + + def work_cross_teachers + User.where(id: graduation_work_comment_assignations.temporary_formal.pluck(:user_id)).map(&:real_name).join("、") + end + + def work_cross_groups + course.graduation_groups.where(id: graduation_task_group_assignations.temporary_formal.pluck(:graduation_group_id)).pluck(:name).join("、") end end diff --git a/app/models/graduation_work_comment_assignation.rb b/app/models/graduation_work_comment_assignation.rb index 33f30d2a0..7225dbcbf 100644 --- a/app/models/graduation_work_comment_assignation.rb +++ b/app/models/graduation_work_comment_assignation.rb @@ -1,8 +1,13 @@ class GraduationWorkCommentAssignation < ApplicationRecord + # temporary 0: 正式分配 1:临时分配(交叉评阅设置中临时分配的作品,点取消时会删除) 2: 删除标志 belongs_to :graduation_work belongs_to :graduation_task belongs_to :user - belongs_to :graduation_group + belongs_to :graduation_group, optional: true + scope :temporary, -> {where(temporary: 1)} + scope :formal, -> {where(temporary: 0)} + scope :temporary_delete, -> {where(temporary: 2)} + scope :temporary_formal, -> {where(temporary: [0, 1])} scope :myself, ->(user_id) {where(user_id: user_id)} end diff --git a/app/models/graduation_work_score.rb b/app/models/graduation_work_score.rb index fa978b68f..eaf59ffbd 100644 --- a/app/models/graduation_work_score.rb +++ b/app/models/graduation_work_score.rb @@ -1,4 +1,5 @@ class GraduationWorkScore < ApplicationRecord + # reviewer_role: 1 老师评分 2 交叉评分 belongs_to :graduation_work belongs_to :user belongs_to :graduation_task diff --git a/app/models/student_work.rb b/app/models/student_work.rb index 168cfeb68..26409da59 100644 --- a/app/models/student_work.rb +++ b/app/models/student_work.rb @@ -192,7 +192,7 @@ class StudentWork < ApplicationRecord end def scored? - student_works_scores.where.not(reviewer_role: 3).exists? + student_works_scores.where.not(reviewer_role: 3, score: nil).exists? end def work_challenge_score game, score @@ -201,7 +201,7 @@ class StudentWork < ApplicationRecord if adjust_score.present? game_score = adjust_score.score else - setting = homework_common.homework_group_setting user_id + setting = homework_common.homework_group_setting game.user_id if game.status == 2 && ((game.end_time && game.end_time < setting.end_time) || (homework_common.allow_late && game.end_time && game.end_time < homework_common.late_time)) answer_open_evaluation = homework_common.homework_detail_manual.answer_open_evaluation game_score = answer_open_evaluation ? score : (game.final_score > 0 ? game.real_score(score) : 0) diff --git a/app/views/graduation_tasks/cross_comment_setting.json.jbuilder b/app/views/graduation_tasks/cross_comment_setting.json.jbuilder new file mode 100644 index 000000000..58ceb16a2 --- /dev/null +++ b/app/views/graduation_tasks/cross_comment_setting.json.jbuilder @@ -0,0 +1,26 @@ +json.work_users @work_list do |work| + json.work_id work.id + json.user_name work.user&.real_name + json.student_id work.user&.student_id + json.course_group_name @students.select{|member| member.user_id == work.user_id}.first.try(:course_group_name) + if @comment_status.to_i == 2 + json.cross_teachers work.work_cross_teachers + elsif @comment_status.to_i == 4 + json.cross_groups work.work_cross_groups + end +end + +json.course_groups @course_groups do |group| + json.(group, :id, :name) +end + +if @comment_status.to_i == 2 + json.teachers @course.teachers.includes(:user) do |teacher| + json.user_id teacher.user_id + json.user_name teacher.user&.real_name + end +elsif @comment_status.to_i == 4 + json.graduation_groups @course.graduation_groups do |group| + json.(group, :id, :name) + end +end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 34e9947aa..6e5727dfd 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -537,6 +537,8 @@ Rails.application.routes.draw do get 'tasks_list' get :show_comment get :cross_comment_setting + post :assign_works + post :commit_comment_setting end collection do diff --git a/db/migrate/20190903022313_add_graduation_work_id_to_group_assignations.rb b/db/migrate/20190903022313_add_graduation_work_id_to_group_assignations.rb new file mode 100644 index 000000000..e1db275fb --- /dev/null +++ b/db/migrate/20190903022313_add_graduation_work_id_to_group_assignations.rb @@ -0,0 +1,7 @@ +class AddGraduationWorkIdToGroupAssignations < ActiveRecord::Migration[5.2] + def change + add_column :graduation_task_group_assignations, :graduation_work_id, :integer, default: 0 + + add_index :graduation_task_group_assignations, :graduation_work_id + end +end diff --git a/db/migrate/20190903025159_add_temporary_to_graduation.rb b/db/migrate/20190903025159_add_temporary_to_graduation.rb new file mode 100644 index 000000000..adf7e1aa3 --- /dev/null +++ b/db/migrate/20190903025159_add_temporary_to_graduation.rb @@ -0,0 +1,6 @@ +class AddTemporaryToGraduation < ActiveRecord::Migration[5.2] + def change + add_column :graduation_task_group_assignations, :temporary, :integer, default: 0 + add_column :graduation_work_comment_assignations, :temporary, :integer, default: 0 + end +end diff --git a/lib/tasks/graduation_task.rake b/lib/tasks/graduation_task.rake index 58f7764d0..92a1900d2 100644 --- a/lib/tasks/graduation_task.rake +++ b/lib/tasks/graduation_task.rake @@ -43,9 +43,10 @@ namespace :graduation_task do task :cross_comment_start => :environment do tasks = GraduationTask.where("cross_comment = 1 and comment_time is not null and comment_time <= '#{Time.now}' and status = 2") tasks.each do |task| - if task.comment_status == 4 - GraduationTaskCrossCommentJob.perform_later(task.id) - end + # 改成设置时都实时分配 + # if task.comment_status == 4 + # GraduationTaskCrossCommentJob.perform_later(task.id) + # end task.update_attributes(status: 3) # 给老师发消息 From 06a4a5a4d6b69fb01ce447f04b4244d6751ad159 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Wed, 11 Sep 2019 16:55:41 +0800 Subject: [PATCH 005/394] =?UTF-8?q?=E4=BA=A4=E5=8F=89=E8=AF=84=E9=98=85?= =?UTF-8?q?=E7=9A=84=E8=AF=84=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/graduation_works_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/graduation_works_controller.rb b/app/controllers/graduation_works_controller.rb index c22ab7706..bc10c0a91 100644 --- a/app/controllers/graduation_works_controller.rb +++ b/app/controllers/graduation_works_controller.rb @@ -308,7 +308,7 @@ class GraduationWorksController < ApplicationController end end - if @task.status == 3 && @task.formal_graduation_work_comment_assignations.where(graduation_work_id: @work.id, user_id: current_user.id).count > 0 + if @work.formal_graduation_work_comment_assignations.where(user_id: current_user.id).count > 0 new_score.reviewer_role = 2 else new_score.reviewer_role = 1 From 856942dbb0ff982c0885a301ebab2a36dbaa40b7 Mon Sep 17 00:00:00 2001 From: caicai8 <1149225589@qq.com> Date: Wed, 11 Sep 2019 19:14:20 +0800 Subject: [PATCH 006/394] =?UTF-8?q?=E4=BA=A4=E5=8F=89=E8=AF=84=E9=98=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/courses/graduation/tasks/GraduationAcrossCheck.js | 0 .../modules/courses/graduation/tasks/GraduationTaskDetail.js | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 public/react/src/modules/courses/graduation/tasks/GraduationAcrossCheck.js diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationAcrossCheck.js b/public/react/src/modules/courses/graduation/tasks/GraduationAcrossCheck.js new file mode 100644 index 000000000..e69de29bb diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskDetail.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskDetail.js index 0aff1a1bd..e228d4146 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskDetail.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskDetail.js @@ -436,7 +436,7 @@ class GraduationTaskDetail extends Component{ {/*项目在线质量检测*/} { this.props.isAdmin() ? questionslist.status===1 ? { this.end()} }>立即截止 : "" : "" } { this.props.isAdmin() ? questionslist.status===0 ? { this.publish()} }>立即发布 : "" : "" } - + { this.props.isAdmin() ? 交叉评阅设置 : "" } { this.props.isAdmin() ? 编辑任务 : "" } From 04722f0a8cf4719bc00f4c5cce72831dc60a0832 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 17 Sep 2019 10:10:09 +0800 Subject: [PATCH 007/394] =?UTF-8?q?=E6=AF=95=E8=AE=BE=E8=AF=84=E9=98=85?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/graduation_tasks/cross_comment_setting.json.jbuilder | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/views/graduation_tasks/cross_comment_setting.json.jbuilder b/app/views/graduation_tasks/cross_comment_setting.json.jbuilder index 58ceb16a2..72cae6eba 100644 --- a/app/views/graduation_tasks/cross_comment_setting.json.jbuilder +++ b/app/views/graduation_tasks/cross_comment_setting.json.jbuilder @@ -10,6 +10,8 @@ json.work_users @work_list do |work| end end +json.user_count @work_list.size + json.course_groups @course_groups do |group| json.(group, :id, :name) end From cfb610a787cd541b0530c7c28d52a2400f8650d6 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 17 Sep 2019 10:56:14 +0800 Subject: [PATCH 008/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/graduation_tasks_controller.rb | 2 ++ .../20190917024120_migrate_graduation_task_comment_status.rb | 5 +++++ 2 files changed, 7 insertions(+) create mode 100644 db/migrate/20190917024120_migrate_graduation_task_comment_status.rb diff --git a/app/controllers/graduation_tasks_controller.rb b/app/controllers/graduation_tasks_controller.rb index fe8bd660c..da3c680ce 100644 --- a/app/controllers/graduation_tasks_controller.rb +++ b/app/controllers/graduation_tasks_controller.rb @@ -457,6 +457,8 @@ class GraduationTasksController < ApplicationController @task.comment_time = @task.cross_comment ? params[:comment_time] : nil + @task.comment_status = 2 if @task.cross_comment && @task.comment_status == 0 + # unless @task.cross_comment # @task.graduation_work_comment_assignations.destroy_all # end diff --git a/db/migrate/20190917024120_migrate_graduation_task_comment_status.rb b/db/migrate/20190917024120_migrate_graduation_task_comment_status.rb new file mode 100644 index 000000000..3b3a3fccc --- /dev/null +++ b/db/migrate/20190917024120_migrate_graduation_task_comment_status.rb @@ -0,0 +1,5 @@ +class MigrateGraduationTaskCommentStatus < ActiveRecord::Migration[5.2] + def change + GraduationTask.where(cross_comment: true, comment_status: 0).update_all(comment_status: 2) + end +end From 4c13fb53a9d289fb2b37ce8ce600051087176b2e Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 17 Sep 2019 14:06:15 +0800 Subject: [PATCH 009/394] =?UTF-8?q?=E8=81=8C=E4=B8=9A=E8=AE=A4=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/users/apply_professional_auth_service.rb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/services/users/apply_professional_auth_service.rb b/app/services/users/apply_professional_auth_service.rb index 74ee08c85..cc6f36fff 100644 --- a/app/services/users/apply_professional_auth_service.rb +++ b/app/services/users/apply_professional_auth_service.rb @@ -38,11 +38,11 @@ class Users::ApplyProfessionalAuthService < ApplicationService move_image_file! unless params[:upload_image].to_s == 'false' - # sms_cache = Rails.cache.read("apply_pro_certification") - # if sms_cache.nil? - sms_notify_admin - # Rails.cache.write("apply_pro_certification", 1) - # end + sms_cache = Rails.cache.read("apply_pro_certification") + if sms_cache.nil? + sms_notify_admin + Rails.cache.write("apply_pro_certification", 1, expires_in: 5.minutes) + end end end From e3d99170ffa3162c07e72b9f6d18680f70dd9196 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 17 Sep 2019 14:08:10 +0800 Subject: [PATCH 010/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/graduation_tasks_controller.rb | 4 +++- .../graduation_tasks/cross_comment_setting.json.jbuilder | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/controllers/graduation_tasks_controller.rb b/app/controllers/graduation_tasks_controller.rb index da3c680ce..2475ded42 100644 --- a/app/controllers/graduation_tasks_controller.rb +++ b/app/controllers/graduation_tasks_controller.rb @@ -513,7 +513,9 @@ class GraduationTasksController < ApplicationController page = params[:page] ? params[:page].to_i : 1 limit = params[:limit] ? params[:limit].to_i : 10 @work_list = @task.graduation_works.joins("join course_members on graduation_works.user_id=course_members.user_id"). - where(course_members: {course_group_id: group_ids}).page(page).per(limit).includes(user: [:user_extension]) + where(course_members: {course_group_id: group_ids}) + @user_count = @work_list.size + @work_list = @work_list.page(page).per(limit).includes(user: [:user_extension]) @students = @course.students.where(user_id: @work_list.pluck(:user_id)) end diff --git a/app/views/graduation_tasks/cross_comment_setting.json.jbuilder b/app/views/graduation_tasks/cross_comment_setting.json.jbuilder index 72cae6eba..a10343c0b 100644 --- a/app/views/graduation_tasks/cross_comment_setting.json.jbuilder +++ b/app/views/graduation_tasks/cross_comment_setting.json.jbuilder @@ -10,7 +10,7 @@ json.work_users @work_list do |work| end end -json.user_count @work_list.size +json.user_count @user_count json.course_groups @course_groups do |group| json.(group, :id, :name) From 1120b3804227304c470a5ed62bd87c46ecc87cc9 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 17 Sep 2019 14:51:07 +0800 Subject: [PATCH 011/394] =?UTF-8?q?=E5=AE=9E=E5=90=8D=E8=AE=A4=E8=AF=81?= =?UTF-8?q?=E5=8A=A0cache=EF=BC=8C5=E5=88=86=E9=92=9F=E5=86=85=E4=B8=8D?= =?UTF-8?q?=E9=87=8D=E5=A4=8D=E5=8F=91=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/users/apply_trail_service.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/services/users/apply_trail_service.rb b/app/services/users/apply_trail_service.rb index 61563c301..45abd8d1b 100644 --- a/app/services/users/apply_trail_service.rb +++ b/app/services/users/apply_trail_service.rb @@ -24,7 +24,11 @@ class Users::ApplyTrailService < ApplicationService apply.status = 1 else - send_trial_apply_notify! + sms_cache = Rails.cache.read("apply_auth") + if sms_cache.nil? + send_trial_apply_notify! + Rails.cache.write("apply_auth", 1, expires_in: 5.minutes) + end end apply.save! end From dc4931a705f766dbed6e566008f5ed294caa216f Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Tue, 17 Sep 2019 16:58:13 +0800 Subject: [PATCH 012/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/graduation_work.rb | 12 ++++++++++-- .../cross_comment_setting.json.jbuilder | 2 ++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/app/models/graduation_work.rb b/app/models/graduation_work.rb index aa95e8ca4..904d0cbdc 100644 --- a/app/models/graduation_work.rb +++ b/app/models/graduation_work.rb @@ -125,11 +125,19 @@ class GraduationWork < ApplicationRecord graduation_work_scores.where.not(core: nil).exists? end + def work_cross_teacher_ids + graduation_work_comment_assignations.temporary_formal.pluck(:user_id) + end + def work_cross_teachers - User.where(id: graduation_work_comment_assignations.temporary_formal.pluck(:user_id)).map(&:real_name).join("、") + User.where(id: work_cross_teacher_ids).map(&:real_name).join("、") + end + + def work_cross_group_ids + graduation_task_group_assignations.temporary_formal.pluck(:graduation_group_id) end def work_cross_groups - course.graduation_groups.where(id: graduation_task_group_assignations.temporary_formal.pluck(:graduation_group_id)).pluck(:name).join("、") + course.graduation_groups.where(id: work_cross_group_ids).pluck(:name).join("、") end end diff --git a/app/views/graduation_tasks/cross_comment_setting.json.jbuilder b/app/views/graduation_tasks/cross_comment_setting.json.jbuilder index a10343c0b..f63bc28cc 100644 --- a/app/views/graduation_tasks/cross_comment_setting.json.jbuilder +++ b/app/views/graduation_tasks/cross_comment_setting.json.jbuilder @@ -5,8 +5,10 @@ json.work_users @work_list do |work| json.course_group_name @students.select{|member| member.user_id == work.user_id}.first.try(:course_group_name) if @comment_status.to_i == 2 json.cross_teachers work.work_cross_teachers + json.cross_teacher_ids work.work_cross_teacher_ids elsif @comment_status.to_i == 4 json.cross_groups work.work_cross_groups + json.cross_group_ids work.work_cross_group_ids end end From 04406419f3d269a85fbbecf71cdc7cc9af4ae94a Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Wed, 18 Sep 2019 09:16:02 +0800 Subject: [PATCH 013/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/graduation_tasks_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/graduation_tasks_controller.rb b/app/controllers/graduation_tasks_controller.rb index 2475ded42..100a671ec 100644 --- a/app/controllers/graduation_tasks_controller.rb +++ b/app/controllers/graduation_tasks_controller.rb @@ -509,7 +509,7 @@ class GraduationTasksController < ApplicationController @course_groups = @course.course_groups.where(id: group_ids) # 如果传了分班id则取合集 - group_ids = group_ids & params[:group_ids] unless params[:group_ids].blank? + group_ids = group_ids & params[:group_ids].map(&:to_i) unless params[:group_ids].blank? page = params[:page] ? params[:page].to_i : 1 limit = params[:limit] ? params[:limit].to_i : 10 @work_list = @task.graduation_works.joins("join course_members on graduation_works.user_id=course_members.user_id"). From 2606717142aee138c4b776984073c9b5e28c055c Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Wed, 18 Sep 2019 14:18:04 +0800 Subject: [PATCH 014/394] =?UTF-8?q?=E6=AF=95=E8=AE=BE=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/application_controller.rb | 4 +- .../graduation_tasks_controller.rb | 74 ++++++++++--------- .../graduation_works_controller.rb | 2 +- app/helpers/graduation_tasks_helper.rb | 2 +- app/jobs/graduation_task_cross_comment_job.rb | 4 +- app/models/graduation_task.rb | 14 ++-- app/models/graduation_work.rb | 8 +- lib/tasks/graduation_task.rake | 6 +- 8 files changed, 61 insertions(+), 53 deletions(-) diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index e338c1c63..2ce52d405 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -503,8 +503,8 @@ class ApplicationController < ActionController::Base # 只看我的交叉评阅 if option[:cross_comment] - graduation_work_id = task.formal_graduation_work_comment_assignations.where(:user_id => current_user.id) - .pluck(:graduation_work_id).uniq if task.formal_graduation_work_comment_assignations + graduation_work_id = task.graduation_work_comment_assignations.where(:user_id => current_user.id) + .pluck(:graduation_work_id).uniq if task.graduation_work_comment_assignations work_list = work_list.where(id: graduation_work_id) end diff --git a/app/controllers/graduation_tasks_controller.rb b/app/controllers/graduation_tasks_controller.rb index 100a671ec..6a0ce85a9 100644 --- a/app/controllers/graduation_tasks_controller.rb +++ b/app/controllers/graduation_tasks_controller.rb @@ -102,8 +102,8 @@ class GraduationTasksController < ApplicationController # 只看我的交叉评阅 unless params[:cross_comment].blank? - graduation_work_id = @task.formal_graduation_work_comment_assignations.where(:user_id =>current_user.id) - .pluck(:graduation_work_id).uniq if @task.formal_graduation_work_comment_assignations + graduation_work_id = @task.graduation_work_comment_assignations.where(:user_id =>current_user.id) + .pluck(:graduation_work_id).uniq if @task.graduation_work_comment_assignations @work_list = @task.graduation_works.where(id: graduation_work_id) end @@ -459,9 +459,7 @@ class GraduationTasksController < ApplicationController @task.comment_status = 2 if @task.cross_comment && @task.comment_status == 0 - # unless @task.cross_comment - # @task.graduation_work_comment_assignations.destroy_all - # end + @task.graduation_work_comment_assignations.destroy_all if !@task.cross_comment # 去掉评阅设置 # @task.comment_num = @task.cross_comment ? params[:comment_num].to_i : 3 # @task.comment_status = @task.cross_comment ? params[:comment_status] : 0 @@ -512,8 +510,14 @@ class GraduationTasksController < ApplicationController group_ids = group_ids & params[:group_ids].map(&:to_i) unless params[:group_ids].blank? page = params[:page] ? params[:page].to_i : 1 limit = params[:limit] ? params[:limit].to_i : 10 - @work_list = @task.graduation_works.joins("join course_members on graduation_works.user_id=course_members.user_id"). - where(course_members: {course_group_id: group_ids}) + + # 取所有课堂的作品 + if group_ids.sort == @course.course_groups.pluck(:id).sort + @work_list = @task.graduation_works + else + @work_list = @task.graduation_works.joins("join course_members on graduation_works.user_id=course_members.user_id"). + where(course_members: {course_group_id: group_ids}) + end @user_count = @work_list.size @work_list = @work_list.page(page).per(limit).includes(user: [:user_extension]) @students = @course.students.where(user_id: @work_list.pluck(:user_id)) @@ -528,25 +532,27 @@ class GraduationTasksController < ApplicationController works = @task.graduation_works.where(id: params[:work_ids]) # 手动分配:分配给老师 if !params[:user_ids].blank? + @task.update_attributes(comment_status: 2) works.each do |work| - # 之前分配的老师但现在未分配时,置为删除位,点取消时需要还原,点确认时再删除 - work.graduation_work_comment_assignations.where.not(user_id: params[:user_ids]).update_all(temporary: 2) + # 之前分配的老师但现在未分配时需要删除 + work.graduation_work_comment_assignations.where.not(user_id: params[:user_ids]).destroy_all @course.teachers.where(user_id: params[:user_ids]).pluck(:user_id).uniq.each do |user_id| unless work.graduation_work_comment_assignations.exists?(user_id: user_id) GraduationWorkCommentAssignation.create!(graduation_task_id: @task.id, graduation_work_id: work.id, - user_id: user_id, temporary: 1) + user_id: user_id) end end end # 答辩组分配:分配答辩组 elsif !params[:graduation_group_ids].blank? + @task.update_attributes(comment_status: 4) works.each do |work| - work.graduation_task_group_assignations.where.not(graduation_group_id: params[:graduation_group_ids]).update_all(temporary: 2) + work.graduation_task_group_assignations.where.not(graduation_group_id: params[:graduation_group_ids]).destroy_all @course.graduation_groups.where(id: params[:graduation_group_ids]).pluck(:id).uniq.each do |graduation_group_id| unless work.graduation_task_group_assignations.exists?(graduation_group_id: graduation_group_id) GraduationTaskGroupAssignation.create!(graduation_task_id: @task.id, graduation_work_id: work.id, - graduation_group_id: graduation_group_id, temporary: 1) + graduation_group_id: graduation_group_id) end end end @@ -565,28 +571,28 @@ class GraduationTasksController < ApplicationController ActiveRecord::Base.transaction do begin # 提交弹框 - if params[:type] == "commit" - tip_exception("comment_status参数有误") if params[:comment_status].blank? || ![2, 4].include?(params[:comment_status].to_i) - @task.update_attributes(comment_status: params[:comment_status]) - if params[:comment_status].to_i == 2 - @task.temporary_graduation_work_comment_assignations.update_all(temporary: 0) # 临时数据转正 - @task.delete_graduation_work_comment_assignations.destroy_all # 删除置了删除位的数据 - @task.graduation_task_group_assignations.destroy_all # 删除答辩组分配数据 - else - @task.temporary_graduation_task_group_assignations.update_all(temporary: 0) - @task.delete_graduation_task_group_assignations.destroy_all - @task.graduation_work_comment_assignations.destroy_all - - GraduationTaskCrossCommentJob.perform_later(@task.id) - end - else - # 取消时删除临时数据,恢复删除位数据 - @task.temporary_graduation_work_comment_assignations.destroy_all # 删除临时数据 - @task.delete_graduation_work_comment_assignations.update_all(temporary: 0) # 恢复置了删除位的数据 - - @task.temporary_graduation_task_group_assignations.destroy_all # 删除临时数据 - @task.delete_graduation_task_group_assignations.update_all(temporary: 0) # 恢复置了删除位的数据 - end + # if params[:type] == "commit" + # tip_exception("comment_status参数有误") if params[:comment_status].blank? || ![2, 4].include?(params[:comment_status].to_i) + # @task.update_attributes(comment_status: params[:comment_status]) + # if params[:comment_status].to_i == 2 + # @task.temporary_graduation_work_comment_assignations.update_all(temporary: 0) # 临时数据转正 + # @task.delete_graduation_work_comment_assignations.destroy_all # 删除置了删除位的数据 + # @task.graduation_task_group_assignations.destroy_all # 删除答辩组分配数据 + # else + # @task.temporary_graduation_task_group_assignations.update_all(temporary: 0) + # @task.delete_graduation_task_group_assignations.destroy_all + # @task.graduation_work_comment_assignations.destroy_all + # + # GraduationTaskCrossCommentJob.perform_later(@task.id) + # end + # else + # # 取消时删除临时数据,恢复删除位数据 + # @task.temporary_graduation_work_comment_assignations.destroy_all # 删除临时数据 + # @task.delete_graduation_work_comment_assignations.update_all(temporary: 0) # 恢复置了删除位的数据 + # + # @task.temporary_graduation_task_group_assignations.destroy_all # 删除临时数据 + # @task.delete_graduation_task_group_assignations.update_all(temporary: 0) # 恢复置了删除位的数据 + # end normal_status("操作成功") rescue Exception => e uid_logger(e.message) diff --git a/app/controllers/graduation_works_controller.rb b/app/controllers/graduation_works_controller.rb index bc10c0a91..1d26a3ed1 100644 --- a/app/controllers/graduation_works_controller.rb +++ b/app/controllers/graduation_works_controller.rb @@ -308,7 +308,7 @@ class GraduationWorksController < ApplicationController end end - if @work.formal_graduation_work_comment_assignations.where(user_id: current_user.id).count > 0 + if @task.cross_comment && @work.graduation_work_comment_assignations.where(user_id: current_user.id).count > 0 new_score.reviewer_role = 2 else new_score.reviewer_role = 1 diff --git a/app/helpers/graduation_tasks_helper.rb b/app/helpers/graduation_tasks_helper.rb index 48926ce8f..2bc059a55 100644 --- a/app/helpers/graduation_tasks_helper.rb +++ b/app/helpers/graduation_tasks_helper.rb @@ -15,7 +15,7 @@ module GraduationTasksHelper # 交叉评阅 def cross_comment task, user_id if task.cross_comment && task.status >= 3 - [{id: 1, name: "只看我的交叉评阅", count: task.formal_graduation_work_comment_assignations.myself(user_id).count}] + [{id: 1, name: "只看我的交叉评阅", count: task.graduation_work_comment_assignations.myself(user_id).count}] else [] end diff --git a/app/jobs/graduation_task_cross_comment_job.rb b/app/jobs/graduation_task_cross_comment_job.rb index 38cc56178..a2d181b50 100644 --- a/app/jobs/graduation_task_cross_comment_job.rb +++ b/app/jobs/graduation_task_cross_comment_job.rb @@ -12,7 +12,9 @@ class GraduationTaskCrossCommentJob < ApplicationJob if graduation_group.present? && work.present? member_ids = graduation_group.course_members.pluck(:user_id).uniq member_ids.each do |user_id| - work.graduation_work_comment_assignations << GraduationWorkCommentAssignation.new(user_id: user_id, graduation_task_id: task.id) + unless work.graduation_work_comment_assignations.exists?(user_id: user_id) + work.graduation_work_comment_assignations << GraduationWorkCommentAssignation.new(user_id: user_id, graduation_task_id: task.id) + end end end end diff --git a/app/models/graduation_task.rb b/app/models/graduation_task.rb index c42c92890..c9838954a 100644 --- a/app/models/graduation_task.rb +++ b/app/models/graduation_task.rb @@ -14,14 +14,14 @@ class GraduationTask < ApplicationRecord has_many :attachments, as: :container, dependent: :destroy has_many :graduation_work_comment_assignations, dependent: :destroy - has_many :formal_graduation_work_comment_assignations, -> { formal }, class_name: "GraduationWorkCommentAssignation" - has_many :temporary_graduation_work_comment_assignations, -> { temporary }, class_name: "GraduationWorkCommentAssignation" - has_many :delete_graduation_work_comment_assignations, -> { temporary_delete }, class_name: "GraduationWorkCommentAssignation" - + # has_many :formal_graduation_work_comment_assignations, -> { formal }, class_name: "GraduationWorkCommentAssignation" + # has_many :temporary_graduation_work_comment_assignations, -> { temporary }, class_name: "GraduationWorkCommentAssignation" + # has_many :delete_graduation_work_comment_assignations, -> { temporary_delete }, class_name: "GraduationWorkCommentAssignation" + # has_many :graduation_task_group_assignations, dependent: :destroy - has_many :formal_graduation_task_group_assignations, -> { formal }, class_name: "GraduationTaskGroupAssignation" - has_many :temporary_graduation_task_group_assignations, -> { temporary }, class_name: "GraduationTaskGroupAssignation" - has_many :delete_graduation_task_group_assignations, -> { temporary_delete }, class_name: "GraduationTaskGroupAssignation" + # has_many :formal_graduation_task_group_assignations, -> { formal }, class_name: "GraduationTaskGroupAssignation" + # has_many :temporary_graduation_task_group_assignations, -> { temporary }, class_name: "GraduationTaskGroupAssignation" + # has_many :delete_graduation_task_group_assignations, -> { temporary_delete }, class_name: "GraduationTaskGroupAssignation" has_many :graduation_works, -> { where("is_delete = 0") } has_many :score_graduation_works, -> { where("is_delete = 0 and work_status != 0").order("work_score desc") }, class_name: "GraduationWork" diff --git a/app/models/graduation_work.rb b/app/models/graduation_work.rb index 904d0cbdc..73c217114 100644 --- a/app/models/graduation_work.rb +++ b/app/models/graduation_work.rb @@ -11,12 +11,12 @@ class GraduationWork < ApplicationRecord has_many :graduation_work_scores, dependent: :destroy has_many :graduation_work_comment_assignations, dependent: :destroy - has_many :formal_graduation_work_comment_assignations, -> { formal }, class_name: "GraduationWorkCommentAssignation" - has_many :temporary_graduation_work_comment_assignations, -> { temporary }, class_name: "GraduationWorkCommentAssignation" + # has_many :formal_graduation_work_comment_assignations, -> { formal }, class_name: "GraduationWorkCommentAssignation" + # has_many :temporary_graduation_work_comment_assignations, -> { temporary }, class_name: "GraduationWorkCommentAssignation" has_many :graduation_task_group_assignations, dependent: :destroy - has_many :formal_graduation_task_group_assignations, -> { formal }, class_name: "GraduationTaskGroupAssignation" - has_many :temporary_graduation_task_group_assignations, -> { temporary }, class_name: "GraduationTaskGroupAssignation" + # has_many :formal_graduation_task_group_assignations, -> { formal }, class_name: "GraduationTaskGroupAssignation" + # has_many :temporary_graduation_task_group_assignations, -> { temporary }, class_name: "GraduationTaskGroupAssignation" validates :description, length: { maximum: 5000 } diff --git a/lib/tasks/graduation_task.rake b/lib/tasks/graduation_task.rake index 92a1900d2..4d8bf80b8 100644 --- a/lib/tasks/graduation_task.rake +++ b/lib/tasks/graduation_task.rake @@ -44,9 +44,9 @@ namespace :graduation_task do tasks = GraduationTask.where("cross_comment = 1 and comment_time is not null and comment_time <= '#{Time.now}' and status = 2") tasks.each do |task| # 改成设置时都实时分配 - # if task.comment_status == 4 - # GraduationTaskCrossCommentJob.perform_later(task.id) - # end + if task.comment_status == 4 + GraduationTaskCrossCommentJob.perform_later(task.id) + end task.update_attributes(status: 3) # 给老师发消息 From 2ef8fe31b5696e3e2285e4ed23e3c17d0980d752 Mon Sep 17 00:00:00 2001 From: caicai8 <1149225589@qq.com> Date: Wed, 18 Sep 2019 14:49:05 +0800 Subject: [PATCH 015/394] =?UTF-8?q?=E6=AF=95=E8=AE=BE=E4=BB=BB=E5=8A=A1-?= =?UTF-8?q?=E4=BA=A4=E5=8F=89=E8=AF=84=E9=98=85=E8=AE=BE=E7=BD=AE=E5=BC=B9?= =?UTF-8?q?=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/graduation/style.css | 11 + .../graduation/tasks/GraduationAcrossCheck.js | 475 ++++++++++++++++++ .../graduation/tasks/GraduationTaskDetail.js | 42 +- .../tasks/GraduationTaskssetting.js | 16 +- 4 files changed, 532 insertions(+), 12 deletions(-) diff --git a/public/react/src/modules/courses/graduation/style.css b/public/react/src/modules/courses/graduation/style.css index c704a9c93..5d78f3cb9 100644 --- a/public/react/src/modules/courses/graduation/style.css +++ b/public/react/src/modules/courses/graduation/style.css @@ -43,3 +43,14 @@ .TopicDetailTable .bottomBody li{border-bottom: 1px solid #eee;clear: both;} .TopicDetailTable .bottomBody li:last-child{border-bottom: none;} +.acrossSureBtn{ + width:40px; + height:24px; + line-height: 20px; + border:1px solid rgba(76,172,255,1); + color: #4CACFF!important; + float: left; + border-radius:4px; + text-align: center +} + diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationAcrossCheck.js b/public/react/src/modules/courses/graduation/tasks/GraduationAcrossCheck.js index e69de29bb..2cca4ccae 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationAcrossCheck.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationAcrossCheck.js @@ -0,0 +1,475 @@ +import React, { Component } from 'react'; + +import { Modal , Radio , Table , Pagination , Select ,Divider ,Icon , Input } from "antd"; +import {Link} from 'react-router-dom' +import axios from 'axios'; + +import '../style.css' + + +const RadioGroup = Radio.Group; + +const { Option } = Select; +const $ = window.$; + +const bindTableColumn=(that)=>{ + let { course_groups }=that.state + const filter=course_groups && course_groups.map((i,key)=>{ + let list={ + value: i.id, + text: i.name + } + return list; + }) + const columns = [ + { + title: '序号', + dataIndex: 'index', + key: 'index', + width:"50px", + className:"edu-txt-center", + render: (id, student, index) => { + return (that.state.page - 1) * that.state.limit + index + 1 + } + }, + { + title: '姓名', + dataIndex: 'user_name', + key: 'user_name', + render: (user_name, line, index) => { + return( + {user_name} + ) + } + },{ + title: '学号', + dataIndex: 'student_id', + key: 'student_id', + render: (student_id, line, index) => { + return( + {student_id} + ) + } + },{ + title: '分班', + dataIndex: 'course_group_name', + key: 'course_group_name', + filters:filter, + render: (course_group_name, line, index) => { + return( + {course_group_name} + ) + } + } + ]; + if(that.state.comment_status == 2){ + columns.push({ + title: '交叉评阅老师', + dataIndex: 'cross_teachers', + key: 'cross_teachers', + width:"200px", + render: (cross_teachers, line, index) => { + return( + {cross_teachers} + ) + } + }) + }else{ + columns.push({ + title: '答辩组', + dataIndex: 'cross_groups', + key: 'cross_groups', + width:"200px", + render: (cross_groups, line, index) => { + return( + {cross_groups} + ) + } + }) + } + return columns; +} +class GraduationAcrossCheck extends Component{ + constructor(props){ + super(props); + this.state={ + comment_status:2, + page:1, + limit:7, + group_ids:undefined, + users:undefined, + user_count:undefined, + graduation_groups:undefined, + course_groups:undefined, + teachers:undefined, + tableLoading:false, + chooseCount:0, + chooseId:undefined, + AcrossTeamIds:undefined, + searchValue:undefined, + showflag:false + } + } + + + + // 根据分班筛选 + filterByGroup=(value,record)=>{ + console.log(value); + console.log(record) + } + + // 切换分配方式 + funcommentstatus = (e) =>{ + this.setState({ + comment_status:e.target.value, + chooseCount:0, + chooseId:[], + AcrossTeamIds:undefined, + searchValue:undefined, + showflag:false, + page:1 + }) + let { group_ids }=this.state; + this.getList(1,group_ids,e.target.value); + } + + componentDidMount =()=>{ + let { comment_status }=this.props; + let { page,group_ids }=this.state; + this.setState({ + comment_status + }) + + this.getList(page,group_ids,comment_status); + + window.addEventListener('click', this.clickOther) + } + + clickOther = (e) =>{ + if(e.target && e.target.matches('#acrossContent') || e.target.matches(".ant-modal-body") + || e.target.matches(".acrossfoot") || e.target.matches(".acrossHead") || e.target.matches ('.ant-radio-wrapper') || + e.target.matches("th") || e.target.matches("td")) { + this.setState({ + showflag:false + }) + } + } + + componentWillUnmount() { + window.removeEventListener('click', this.clickOther); + } + + getList=(page,group_ids,comment_status)=>{ + let { limit }=this.state; + let { task_Id }=this.props; + this.setState({ + tableLoading:true + }) + let url=`/graduation_tasks/${task_Id}/cross_comment_setting.json`; + axios.get((url),{params:{ + page,limit,group_ids,comment_status + }}).then((result)=>{ + if(result){ + this.setState({ + users:result.data.work_users && result.data.work_users.map((item,key)=>{ + let list = { + key:item.work_id, + course_group_name:item.course_group_name, + cross_teachers: item.cross_teachers, + student_id:item.student_id, + user_name:item.user_name, + work_id:item.work_id + } + return list; + }), + user_count:result.data.user_count, + graduation_groups:result.data.graduation_groups, + course_groups:result.data.course_groups, + teachers:result.data.teachers, + tableLoading:false, + // AcrossTeamIds:result.data + }) + } + }).catch((error)=>{ + this.setState({ + tableLoading:false + }) + console.log(error); + }) + } + + // 切换分页 + onPageChange=(page)=>{ + this.setState({ + page, + showflag:false + }) + let{group_ids,comment_status}=this.state; + this.getList(page,group_ids,comment_status); + } + + // 下拉切换 + changeSelect = (AcrossTeamIds) =>{ + this.setState({ + AcrossTeamIds + }) + } + + // 重置 + clearSelect =()=>{ + this.setState({ + AcrossTeamIds:undefined, + searchValue:undefined + }) + } + + // 确定分配 + sureAcross=()=>{ + let { AcrossTeamIds , chooseId , group_ids , comment_status }=this.state; + let { task_Id }=this.props; + + let type = comment_status == 2 ? "user_ids" : "graduation_group_ids"; + + let url=`/graduation_tasks/${task_Id}/assign_works.json`; + if(!AcrossTeamIds || (AcrossTeamIds && AcrossTeamIds.length==0)){ + this.props.showNotification(`请先选择${ comment_status == 2 ? "老师": "答辩组" }!`); + return; + } + if(!chooseId || (chooseId && chooseId.length==0)){ + this.props.showNotification("请先选择毕设作品!"); + return; + } + axios.post((url),{ + [type]:AcrossTeamIds, + work_ids:chooseId + }).then((result)=>{ + if(result){ + this.props.showNotification(result.data.message); + this.getList(1,group_ids,comment_status); + this.setState({ + showflag:false, + AcrossTeamIds:undefined, + chooseCount:0, + chooseId:[] + }) + } + }).catch((error)=>{ + console.log(error); + }) + } + + // 筛选 + handleTableChange =(pagination, filters, sorter)=>{ + console.log(filters.course_group_name) + // if(filters.course_group_name.length > 0){ + this.setState({ + page:1, + group_ids:filters.course_group_name + }) + let { comment_status }= this.state; + this.getList(1,filters.course_group_name,comment_status); + // } + } + + // 下拉搜索 + changeSearchValue=(e)=>{ + this.setState({ + searchValue:e.target.value + }) + } + // 显示下拉 + changeFlag=(flag)=>{ + this.setState({ + showflag:flag + }) + } + + + render(){ + let { + comment_status, + users, + user_count, + graduation_groups, + course_groups, + teachers, + page, + limit, + tableLoading, + chooseCount, + chooseId, + AcrossTeamIds, + searchValue,showflag + } = this.state; + let { modalVisible } = this.props; + let courseId = this.props.match.params.coursesId; + + const radioStyle = { + display: 'block', + height: '30px', + lineHeight: '30px', + marginRight:'0px' + }; + + + + const rowSelection = { + // 选中行的key,选中行 + onChange: (selectedRowKeys, selectedRows) => { + this.setState({ + chooseId:selectedRowKeys, + chooseCount:selectedRowKeys.length, + showflag:false + }) + console.log(selectedRowKeys); + }, + selectedRowKeys:chooseId, + getCheckboxProps: record => ({ + disabled: record.name === 'Disabled User', // Column configuration not to be checked + name: record.name, + }), + }; + + // 筛选下拉列表 + const teacherList = searchValue ? teachers.filter(e=>e.user_name.indexOf(searchValue)>-1) : teachers; + const course_groupsList = searchValue ? course_groups.filter(e=>e.name.indexOf(searchValue)>-1) : course_groups; + return( + + +
+ 评阅分配方式: + + + 手动分配评阅(逐一指定每个学生的交叉评阅老师) + 答辩组分配评阅(将老师加入不同答辩组,指定每个学生的交叉评阅答辩组, + + 立即设置答辩组 + + + +
+
+ 已选 { chooseCount == 0 ? 0 : {chooseCount}} 个 + + 分配给{ comment_status && comment_status == 2 ? "老师":"答辩组"}: + + +
+ {menu} + +
+ 确定 + 重置 +
+ + )} + > + { comment_status == 2 ? + teacherList && teacherList.map((i,key)=>{ + return + }): + course_groupsList && course_groupsList.map((i,key)=>{ + return + }) + } + + + + +
+
+
+ { + user_count > limit ? + :"" + } +
+
+ 关闭 + 确认 +
+
+
+ ) + } +} +export default GraduationAcrossCheck; \ No newline at end of file diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskDetail.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskDetail.js index e228d4146..dc5e4d602 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskDetail.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskDetail.js @@ -10,6 +10,7 @@ import HomeworkModal from "../../coursesPublic/HomeworkModal"; import AccessoryModal from "../../coursesPublic/AccessoryModal"; import Associationmodel from '../../coursesPublic/Associationmodel'; import CoursesListType from '../../coursesPublic/CoursesListType'; +import GraduationAcrossCheck from "./GraduationAcrossCheck"; import moment from 'moment'; import "../../css/members.css" import "../../css/Courses.css" @@ -58,7 +59,8 @@ class GraduationTaskDetail extends Component{ Modalstype:undefined, Modalstopval:undefined, ModalCancel:undefined, - ModalSave:undefined + ModalSave:undefined, + acrossVisible:undefined } } componentDidMount(){ @@ -80,6 +82,21 @@ class GraduationTaskDetail extends Component{ }) } + + // 交叉评阅设置弹框 + openAcross=()=>{ + this.setState({ + acrossVisible:true + }) + } + closeAcross=()=>{ + this.setState({ + acrossVisible:false + }) + } + + + //返回 goback=()=>{ // let courseId=this.props.match.params.coursesId; @@ -190,7 +207,6 @@ class GraduationTaskDetail extends Component{ } // 取消 cancelmodel=()=>{ - debugger this.setState({ Modalstype:false, Loadtype:false, @@ -291,11 +307,13 @@ class GraduationTaskDetail extends Component{ Modalstype, Modalstopval, ModalCancel, - ModalSave + ModalSave, + acrossVisible } = this.state const commom = { - setTab:this.setTab + setTab:this.setTab, + getdatas:this.getdatas } return(
@@ -353,6 +371,20 @@ class GraduationTaskDetail extends Component{ destroyOnClose={true} centered={true} /> + + { + acrossVisible && + + } +

{questionslist.course_name} > @@ -436,7 +468,7 @@ class GraduationTaskDetail extends Component{ {/*项目在线质量检测*/} { this.props.isAdmin() ? questionslist.status===1 ? { this.end()} }>立即截止 : "" : "" } { this.props.isAdmin() ? questionslist.status===0 ? { this.publish()} }>立即发布 : "" : "" } - { this.props.isAdmin() ? 交叉评阅设置 : "" } + { this.props.isAdmin() && questionslist.cross_comment ? 交叉评阅设置 : "" } { this.props.isAdmin() ? 编辑任务 : "" }

diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js index 874a69ca5..74300bf5d 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js @@ -79,7 +79,7 @@ class GraduationTaskssettingapp extends Component{ visible:false, starttime:undefined, DownloadType:false, - DownloadMessageval:undefined, + DownloadMessageval:undefined } } @@ -166,7 +166,7 @@ class GraduationTaskssettingapp extends Component{ } } - + baseprojectfun=(e)=>{ this.setState({ baseonproject:e.target.checked @@ -711,7 +711,9 @@ class GraduationTaskssettingapp extends Component{ starttime:undefined, course_groupslist:[], }) - this.props.showNotification(resulet.data.message); + this.props.showNotification(resulet.data.message); + //调用父组件方法,刷新按钮 + this.props.getdatas(); } } }).catch((error)=>{ @@ -1188,7 +1190,7 @@ class GraduationTaskssettingapp extends Component{ {crosscomment===true&&commenttimetype===true?
{commenttimevalue}
:""} -
+ {/*
评阅方式: @@ -1203,10 +1205,10 @@ class GraduationTaskssettingapp extends Component{ -
+
*/} -
+ {/*
评阅数: @@ -1243,7 +1245,7 @@ class GraduationTaskssettingapp extends Component{ ) })} -
+
*/}
:""} From c77d45f0ca63132a1d19e181e83371f68cd91c27 Mon Sep 17 00:00:00 2001 From: caicai8 <1149225589@qq.com> Date: Wed, 18 Sep 2019 14:53:17 +0800 Subject: [PATCH 016/394] =?UTF-8?q?=E4=BA=A4=E5=8F=89=E8=AF=84=E9=98=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tasks/{GraduationAcrossCheck.js => GraduationAcross.js} | 4 ++-- .../modules/courses/graduation/tasks/GraduationTaskDetail.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename public/react/src/modules/courses/graduation/tasks/{GraduationAcrossCheck.js => GraduationAcross.js} (99%) diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationAcrossCheck.js b/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js similarity index 99% rename from public/react/src/modules/courses/graduation/tasks/GraduationAcrossCheck.js rename to public/react/src/modules/courses/graduation/tasks/GraduationAcross.js index 2cca4ccae..809ad72ff 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationAcrossCheck.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js @@ -89,7 +89,7 @@ const bindTableColumn=(that)=>{ } return columns; } -class GraduationAcrossCheck extends Component{ +class GraduationAcross extends Component{ constructor(props){ super(props); this.state={ @@ -472,4 +472,4 @@ class GraduationAcrossCheck extends Component{ ) } } -export default GraduationAcrossCheck; \ No newline at end of file +export default GraduationAcross; \ No newline at end of file diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskDetail.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskDetail.js index dc5e4d602..abd40784a 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskDetail.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskDetail.js @@ -10,7 +10,7 @@ import HomeworkModal from "../../coursesPublic/HomeworkModal"; import AccessoryModal from "../../coursesPublic/AccessoryModal"; import Associationmodel from '../../coursesPublic/Associationmodel'; import CoursesListType from '../../coursesPublic/CoursesListType'; -import GraduationAcrossCheck from "./GraduationAcrossCheck"; +import GraduationAcross from "./GraduationAcross"; import moment from 'moment'; import "../../css/members.css" import "../../css/Courses.css" @@ -374,7 +374,7 @@ class GraduationTaskDetail extends Component{ { acrossVisible && - Date: Wed, 18 Sep 2019 15:01:48 +0800 Subject: [PATCH 017/394] =?UTF-8?q?=E6=AF=95=E8=AE=BE=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/graduation_tasks/tasks_list.json.jbuilder | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/graduation_tasks/tasks_list.json.jbuilder b/app/views/graduation_tasks/tasks_list.json.jbuilder index 5a2d7e08a..7b189c456 100644 --- a/app/views/graduation_tasks/tasks_list.json.jbuilder +++ b/app/views/graduation_tasks/tasks_list.json.jbuilder @@ -2,6 +2,7 @@ json.partial! "public_navigation", locals: {graduation: @task, course: @course} json.user_course_identity @user_course_identity json.course_group_count @course.course_groups_count json.cross_comment @task.cross_comment +json.comment_status @task.comment_status # 课程发布才有数据 if @task.published? || @user_course_identity < Course::STUDENT # 老师身份才有的分类信息 From 8aab67c9207fdfcd4271a1b6ed1a8eb601cda164 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 19 Sep 2019 16:26:52 +0800 Subject: [PATCH 018/394] setting init --- .../EditableCourseSupportSetting.js | 475 ++++++++++++++++++ .../ShowTableCourseSupportSetting.js | 150 ++++++ .../subroute/ecCourseSupportSetting/index.js | 324 ++++++++++++ .../subroute/ecCourseSupportSetting/style.css | 44 ++ 4 files changed, 993 insertions(+) create mode 100644 public/react/src/modules/ecs/subroute/ecCourseSupportSetting/EditableCourseSupportSetting.js create mode 100644 public/react/src/modules/ecs/subroute/ecCourseSupportSetting/ShowTableCourseSupportSetting.js create mode 100644 public/react/src/modules/ecs/subroute/ecCourseSupportSetting/index.js create mode 100644 public/react/src/modules/ecs/subroute/ecCourseSupportSetting/style.css diff --git a/public/react/src/modules/ecs/subroute/ecCourseSupportSetting/EditableCourseSupportSetting.js b/public/react/src/modules/ecs/subroute/ecCourseSupportSetting/EditableCourseSupportSetting.js new file mode 100644 index 000000000..ec5805947 --- /dev/null +++ b/public/react/src/modules/ecs/subroute/ecCourseSupportSetting/EditableCourseSupportSetting.js @@ -0,0 +1,475 @@ +import React, { Component } from 'react'; + +import moment from 'moment' +import { getUrl } from 'educoder' +import { Form, Input, Icon, Button, Select, InputNumber } from 'antd'; +const { TextArea } = Input; +const { Option } = Select; + +let _url_origin = getUrl() +const $ = window.$ +// https://www.educoder.net/stylesheets/css/common.css?1546618720 +if (!window['EcLoaded']) { + $('head').append( $('') + .attr('href', `${_url_origin}/stylesheets/css/common.css?1525440977`) ); + window['EcLoaded'] = true +} + +let id = 0; + + +/** + target_id + position + target_weight + target_contents + + subitem_id + index + subitem_contents + +*/ +const data = +[{"position":0,"target_weight":0.02,"target_contents":"12","standard_grade":2,"subitem_id":"65"},{"position":3,"target_id":"0","target_weight":0.1,"target_contents":"理解数据管理技术和数据库技术的发展,区分不同数据模型的作用和特点,描述数据库系统的类型、结构、数据独立性。","standard_grade":60,"subitem_id":"66"},{"position":4,"target_weight":1,"target_contents":"22","standard_grade":33,"subitem_id":"66"},{"position":11,"target_id":"1","target_weight":0.1,"target_contents":"理解数据管理技术和数据库技术的发展,区分不同数据模型的作用和特点,描述数据库系统的类型、结构、数据独立性。","standard_grade":61,"subitem_id":"65"}] +; +let _data = [ + { + target_id: 0, + position: 1, + target_weight: 0.1, + target_contents: '理解数据管理技术和数据库技术的发展,区分不同数据模型的作用和特点,描述数据库系统的类型、结构、数据独立性。', + standard_grade: 60, + // biyeYaoqiuZhibiaodian: ':能够运用相关的工程基础和专业知识辨别材料生产中出现的技术、工艺、质量等问题', + "subitem_id": 64, + "index": "1-1", + "subitem_contents": "能够运用相关的工程基础和专业知识辨别材料生产中出现的技术、工艺、质量等问题" + }, + { + target_id: 1, + position: 2, + target_weight: 0.1, + target_contents: '理解数据管理技术和数据库技术的发展,区分不同数据模型的作用和特点,描述数据库系统的类型、结构、数据独立性。', + standard_grade: 61, + // biyeYaoqiuZhibiaodian: ':能够运用相关的工程基础和专业知识辨别材料生产中出现的技术、工艺、质量等问题', + "subitem_id": 65, + "index": "1-2", + "subitem_contents": "222能够运用相关的工程基础和专业知识辨别材料生产中出现的技术、工艺、质量等问题" + } +] +const item = {} + +class EditableCourseSupportSetting extends Component { + constructor(props) { + super(props) + this.state = { + addOrDeleting: false, + errorMsg: '' + } + } + onRemove = (k) => { + let fValues = this.props.form.getFieldsValue(); + if ( + // fValues.standard_grade[k] && fValues.standard_grade[k] != 75 + // || fValues.subitem_id[k] + // || + fValues.target_contents[k] + // || fValues.target_weight[k] + ) { + this.props.showModal('提示', '确定要删除吗?', () => { + this.remove(k) + }) + } else { + this.remove(k) + } + } + remove = (k) => { + const { form } = this.props; + // can use data-binding to get + const keys = form.getFieldValue('keys'); + // We need at least one passenger + // if (keys.length === 1) { + // return; + // } + if (keys.length === 1) { + this.setState({ errorMsg: '至少得保留一条数据' }) + return; + } + // 清除悬浮tip + window.$('.data-tip-down').hide() + + console.log('remove :' , k , this.position2Target_idMap[k]) + delete this.position2Target_idMap[k] + // can use data-binding to set + form.setFieldsValue({ + keys: keys.filter(key => key !== k), + }); + } + _reverseMap = (map) => { + let newMap = {} + for (var k in map) { + newMap[map[k]] = k; + } + return newMap + } + addIfNewKeyExist = (newKey, index_arg) => { + this.setState({ addOrDeleting: true }) + const { form } = this.props; + const keys = form.getFieldValue('keys'); + /** + [0,1,2,3] + ['11', '22', '33', '44'] + -> + [0,1,2,3,4] + ['11', '22', empty, '33', '44'] + + */ + const target_weight = form.getFieldValue('target_weight'); + const target_contents = form.getFieldValue('target_contents'); + const standard_grade = form.getFieldValue('standard_grade'); + const subitem_id = form.getFieldValue('subitem_id'); + keys.splice(index_arg, 0, newKey); + + // position2Target_idMap + // {1:2, 2:3, 3:4, 4:6 } --> {1:2, 2:3, 3:7, 4:4, 5:6 } + // 更新key/position 映射到target_id的map + // 两次revers,用这个结构,达到给position加1的效果 + let reverseMap = this._reverseMap(this.position2Target_idMap); + for (let i = index_arg ; i < keys.length; i++) { + if(keys[i] === keys[i+1]) { // 找到开始+1的行 + continue; + } + let target_id = this.position2Target_idMap[keys[i]]; + reverseMap[target_id] = parseInt(reverseMap[target_id]) + 1; + keys[i] = keys[i] + 1; + } + for (let i = 0 ; i < keys.length - 1; i++) { + if (keys[i] == keys[i + 1]) { + debugger; + } + } + this.position2Target_idMap = this._reverseMap(reverseMap); + + + target_weight.splice(newKey, 0, undefined); + target_contents.splice(newKey, 0, undefined); + standard_grade.splice(newKey, 0, undefined); + subitem_id.splice(newKey, 0, undefined); + + setTimeout(() => { + form.setFieldsValue({ + target_weight, + target_contents, + standard_grade, + subitem_id + }); + window.$('.data-tip-down').hide() + this.setState({ addOrDeleting: false }) + + }, 300) + form.setFieldsValue({ + keys: keys + }); + + } + add = (k, index) => { + this.setState({ errorMsg: '' }) + + const { form } = this.props; + // can use data-binding to get + const keys = form.getFieldValue('keys'); + let nextKeys ; + let newKey = k + 1; + + const newKeyIndex = keys.indexOf(newKey) + if (newKeyIndex != -1) { + // 新key存在,将新key位置及以后的row后移,直到找到一个之后的空位置 + this.addIfNewKeyExist(newKey, index) + } else { // 如果这个新key不存在 + // keys[newIndex] = newKey + keys.splice(index === 0 && k === -1 ? 0 : index, 0, newKey); + } + // can use data-binding to set + // important! notify form to detect changes + form.setFieldsValue({ + keys: keys, + }); + } + + handleSubmit = (e) => { + if (!this.props.is_manager) { + this.props.showModal('提示', '您没权限编辑,请联系管理员。') + return; + } + this.setState({ errorMsg: '' }) + e.preventDefault && e.preventDefault(); + this.props.form.validateFieldsAndScroll((err, values) => { + if (!err) { + let keysLen = values.keys.length + if (keysLen < 1) { + this.setState({ errorMsg: '至少得保留一条数据' }) + } + var data = [] + while( keysLen-- ) { + data.push({}) + } + for (var valKey in values) { + + let dataIndex = 0 + values[valKey].forEach( (item,index) => { + let _val = values[valKey][index]; + if (_val || _val == 0) { + data[dataIndex][valKey === 'keys' ? 'position' : valKey] = _val + if (valKey === 'keys' && (this.position2Target_idMap[_val] || this.position2Target_idMap[_val] === 0) ) { + data[dataIndex].target_id = this.position2Target_idMap[_val] + } + dataIndex++; + } + }) + } + + console.log('Received values of form: ', values, data); + + let totalWeight = 0; + values.target_weight.forEach(item => { + if (item) { + totalWeight += item + } + }) + // 精度问题 0.2 + 0.7 = 0.8999999999 + if (parseInt((totalWeight * 100).toFixed(1)) != 100) { + this.setState({ errorMsg: '请先保证权重和等于1' }) + return; + } + + this.props.updateCourseTargets(data) + } else { + + const keyRowNumMap = {} + let rowNum = 1; + for (var key in values.target_contents) { + keyRowNumMap[key] = rowNum; + rowNum++; + } + + // err.target_contents[1].errors[0] + // {message: "请填入目标内容", field: "target_contents[1]"} + for (var key in err) { + for (var _k in err[key]) { + let errorObj = err[key][_k].errors[0]; + + let _key = errorObj.field.match(`[(0-9)]`) + this.setState({ errorMsg: `第${keyRowNumMap[_key]}行,${errorObj.message}` }) + return; + // console.log(`第${keyRowNumMap[_key]}行,${errorObj.message}`); + } + } + } + + + }); + } + + componentDidMount = () => { + this.position2Target_idMap = {} + const { form } = this.props; + + const data = this.props.course_targets + + let target_weight = [] + let target_contents = [] + let standard_grade = [] + // let biyeYaoqiuZhibiaodian = [] + let subitem_id = [] + let keys = [] + + data.forEach(item => { + keys.push(item.position); + target_weight[item.position] = (item.target_weight) + target_contents[item.position] = (item.target_contents); + standard_grade[item.position] = (item.standard_grade); + // biyeYaoqiuZhibiaodian[item.position] = (item.biyeYaoqiuZhibiaodian); + + subitem_id[item.position] = item.subitem_id ? (item.subitem_id).toString() : item.subitem_id; + + this.position2Target_idMap[item.position] = item.target_id + }) + form.setFieldsValue({ + keys + }); + setTimeout(() => { + form.setFieldsValue({ + target_weight, + target_contents, + standard_grade, + // biyeYaoqiuZhibiaodian, + subitem_id, + }); + // this.forceUpdate() + }, 300) + + + } + + + render() { + const { getFieldDecorator, getFieldValue } = this.props.form; + const { requirements } = this.props; + const { addOrDeleting } = this.state; + const formItemLayout = { + labelCol: { + xs: { span: 24 }, + sm: { span: 4 }, + }, + wrapperCol: { + xs: { span: 24 }, + sm: { span: 20 }, + }, + }; + const formItemLayoutWithOutLabel = { + wrapperCol: { + xs: { span: 24, offset: 0 }, + sm: { span: 20, offset: 4 }, + }, + }; + getFieldDecorator('keys', { initialValue: [] }); + const keys = getFieldValue('keys'); + const formItems = keys.map((k, index) => ( +
  • + + { index + 1 } + + {getFieldDecorator(`target_weight[${k}]`, { + // validateTrigger: ['onChange', 'onBlur'], + rules: [{ + required: true, + whitespace: true, + type: 'number', + message: "请填入权重", + }], + })( + + )} + + + {getFieldDecorator(`target_contents[${k}]`, { + // validateTrigger: ['onChange', 'onBlur'], + rules: [{ + required: true, + // whitespace: true, + message: "请填入目标内容", + }], + })( + ' + + $(".newMain").after(html).hide(); + + editormd.markdownToHTML("MDContent", { + htmlDecode: "style,script,iframe", // you can filter tags decode + taskList: true, + tex: true, // 默认不解析 + flowChart: true, // 默认不解析 + sequenceDiagram: true // 默认不解析 + }); +} +function removeElasticLayer(){ + $(".layerContent").hide(); + $(".newMain").show(); +} +window.elasticLayer = elasticLayer +window.doElasticLayer = doElasticLayer +window.removeElasticLayer = removeElasticLayer + class Ecs extends React.Component { render() { From eae00a74e6b2956c29870c830064da23a45b09c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 25 Sep 2019 16:06:40 +0800 Subject: [PATCH 098/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tasks/GraduationTaskssetting.js | 2 +- .../Collaborators/Collaborators.js | 154 +++++++++--------- 2 files changed, 82 insertions(+), 74 deletions(-) diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js index 830525af2..5ca6ee537 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js @@ -1169,7 +1169,7 @@ class GraduationTaskssettingapp extends Component{
    评分设置
    最终成绩组成 (取各教师最终评分的平均分)
    - + 启用交叉评阅 (给老师分配其他指导老师的学生作品) diff --git a/public/react/src/modules/tpm/shixunchild/Collaborators/Collaborators.js b/public/react/src/modules/tpm/shixunchild/Collaborators/Collaborators.js index 7921941df..d67599bf1 100644 --- a/public/react/src/modules/tpm/shixunchild/Collaborators/Collaborators.js +++ b/public/react/src/modules/tpm/shixunchild/Collaborators/Collaborators.js @@ -16,8 +16,10 @@ import { getImageUrl, toPath } from 'educoder' import axios from 'axios'; +import NoneData from "../../../courses/coursesPublic/NoneData"; + import './Collaborators.css'; -import SchoolSelect from "../../../courses/members/modal/AddStudentModal"; + const $ = window.$; @@ -88,6 +90,7 @@ class Collaborators extends Component { }); } CollaboratorsshowModal = (type) => { + if (type === "cooperation") { this.setState({ Collaboratorsvisibleadmin: false, @@ -108,9 +111,10 @@ class Collaborators extends Component { } showCollaboratorsvisible = (type) => { + this.setState({ Collaboratorslist: [], - Searchadmin:[], + Searchadmin:undefined, onSearchcalue:"" }) let admintype = this.props.identity; @@ -160,7 +164,7 @@ class Collaborators extends Component { let {collaboratorList,user_name,school_name} = this.state; this.setState({ - Searchadmin: [], + // Searchadmin: undefined, spinnings:true, }) // if (value === "") { @@ -199,6 +203,7 @@ class Collaborators extends Component { } selectChangenickname = (e, key) => { + let {Searchadmin} = this.state; let newlist = Searchadmin; for (var i = 0; i < newlist.length; i++) { @@ -235,6 +240,7 @@ class Collaborators extends Component { } allChange = (e) => { + let {Searchadmin} = this.state; let newlist = Searchadmin; for (var i = 0; i < newlist.length; i++) { @@ -246,6 +252,7 @@ class Collaborators extends Component { }) } submit_add_collaborators_form = () => { + let id = this.props.match.params.shixunId; let {Searchadmin,collaboratorList} = this.state; let newlist = Searchadmin; @@ -300,6 +307,7 @@ class Collaborators extends Component { } submit_addadminredio = () => { + let {addadminrediovalue} = this.state; let id = this.props.match.params.shixunId; @@ -371,6 +379,7 @@ class Collaborators extends Component { contentViewScrolledit=(e)=>{ + //滑动到底判断 let newscrollTop=parseInt(e.currentTarget.scrollTop); let allclientHeight=e.currentTarget.clientHeight+newscrollTop; @@ -395,7 +404,6 @@ class Collaborators extends Component { newSearchadmin.push(newlist[i]) } - console.log(newSearchadmin) this.setState({ Searchadmin: newSearchadmin, collaboratorList: collaboratorList, @@ -495,68 +503,68 @@ class Collaborators extends Component { - - {/* this.onSearchadmin(value)}*/} - {/*onInput={this.onSearchadmins}*/} - {/*style={{width: '100%'}}*/} - {/*/>*/} - 姓名或手机号: - - {this.setState({user_name: e.target.value})}} - style={{ width: '215px'}} - > - 单位: - {this.setState({school_name: e.target.value})}} - style={{ width: '215px'}} - > + {Collaboratorsvisibleadmin===true? + {/* this.onSearchadmin(value)}*/} + {/*onInput={this.onSearchadmins}*/} + {/*style={{width: '100%'}}*/} + {/*/>*/} + 姓名或手机号: + + {this.setState({user_name: e.target.value})}} + style={{ width: '215px'}} + > + 单位: + {this.setState({school_name: e.target.value})}} + style={{ width: '215px'}} + > - this.onSearchadmin()} - style={{ height: '30px', lineHeight: '30px', width: '70px'}} - >搜索 -

    - 姓名 - 职业 - 单位 -

    -
    - -
    -
      - {Searchadmin === undefined ?
    • - 请试试搜索一下 -
    • :Searchadmin.length === 0 ? "": Searchadmin.map((item, key) => { - return ( -
    • - this.selectChangenickname(e, key)} - id={item.user_id}> - {item.nickname} - {item.identify} - {item.school_name} -
    • - ) - }) - - } -
    -
    -
    -
    -
    + this.onSearchadmin()} + style={{ height: '30px', lineHeight: '30px', width: '70px'}} + >搜索 +

    + 姓名 + 职业 + 单位 +

    +
    + +
    +
      + {Searchadmin === undefined ?
    • + 请试试搜索一下 +
    • :Searchadmin.length === 0 ?: Searchadmin.map((item, key) => { + return ( +
    • + this.selectChangenickname(e, key)} + id={item.user_id}> + {item.nickname} + {item.identify} + {item.school_name} +
    • + ) + }) + + } +
    +
    +
    +
    +
    全选 @@ -567,15 +575,15 @@ class Collaborators extends Component { -
    - {useristrue===true?请先选择用户:""} - - +
    + {useristrue===true?请先选择用户:""} + +
    :""}
    { From 275f245f4d2bd270cc9b4951ad483ea40cc9a743 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Wed, 25 Sep 2019 16:20:51 +0800 Subject: [PATCH 099/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/shixunHomework/Trainingjobsetting.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js index cb75a765c..6bb3593ad 100644 --- a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js +++ b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js @@ -67,7 +67,7 @@ class Trainingjobsetting extends Component { // // }); this.state = { - flagPageEdit: undefined, + flagPageEdit: true, flagPageEdits: false, flagPageEditstwo:false, flagPageEditsthrees:false, From e7652a1acbfeab2e2255ff7a6c34cd9b3a304657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 25 Sep 2019 16:23:53 +0800 Subject: [PATCH 100/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/graduation/tasks/GraduationTaskssettinglist.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js index 184895428..0720d7240 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js @@ -1215,7 +1215,7 @@ class GraduationTaskssettinglist extends Component{
    {this.props.isAdmin()===true? {taskslistdata&&taskslistdata.work_count} - 个检索结果({taskslistdata&&taskslistdata.work_count} 学生):""} + 个检索结果({taskslistdata&&taskslistdata.all_work_count} 学生):""} {this.props.isAdmin()===true?

    From 0ee59c82b921cd50b7643a28ea5c52119da716a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Wed, 25 Sep 2019 16:38:30 +0800 Subject: [PATCH 101/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/courses/exercise/Testpapersettinghomepage.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js index ba3cee3d3..d878eb872 100644 --- a/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js +++ b/public/react/src/modules/courses/exercise/Testpapersettinghomepage.js @@ -436,22 +436,22 @@ class Testpapersettinghomepage extends Component{ /> { // 教师列表 - parseInt(tab[0])==0 && this.setcourse_groupysls(value)} current_status = {this.state.current_status} Commonheadofthetestpaper={this.state.Commonheadofthetestpaper}> + parseInt(tab[0])==0 ? this.setcourse_groupysls(value)} current_status = {this.state.current_status} Commonheadofthetestpaper={this.state.Commonheadofthetestpaper}>:"" } {/*统计结果*/} { - parseInt(tab[0])==1 && + parseInt(tab[0])==1 ? :"" } { - parseInt(tab[0])==2 && + parseInt(tab[0])==2 ? :"" } { - parseInt(tab[0])==3 && + parseInt(tab[0])==3 ? :"" }

    From 2bb947e5da6ea8ac436a8f99ad40c82044cd6e7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 25 Sep 2019 16:45:05 +0800 Subject: [PATCH 102/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/AppConfig.js | 4 ++-- .../tasks/GraduationTaskssettinglist.js | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index 4de5d9d88..025db7f5c 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -83,9 +83,9 @@ export function initAxiosInterceptors(props) { } config.url = `${proxy}${url}`; if (config.url.indexOf('?') == -1) { - config.url = `${config.url}?debug=${'student'}` + config.url = `${config.url}?debug=${debugType}` } else { - config.url = `${config.url}&debug=${'student'}` + config.url = `${config.url}&debug=${debugType}` } } else { // 加api前缀 diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js index 0720d7240..c18dcfc53 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js @@ -847,28 +847,28 @@ class GraduationTaskssettinglist extends Component{ ), - }, { + }, { title: '操作', key: 'operation', width:'100px', dataIndex: 'operation', className:'edu-txt-center', render: operation => ( -
    +
    {this.props.isAdmin()?operation.map((tag,key) => { return( { tag.name && - 调整学生最终成绩
    其它历史评分将全部失效:""}> - {tag.name==="评阅"?
    + 调整学生最终成绩
    其它历史评分将全部失效:""}> + {tag.name==="评阅"?

    {tag.name} - +

    : - this.showModulationtype(tag.id):tag.name==="分配"?()=>this.showAllocationModal(tag.id):""}> - {tag.name} - +

    this.showModulationtype(tag.id):tag.name==="分配"?taskslistdata&&taskslistdata.cross_comment===true?"":()=>this.showAllocationModal(tag.id):""}> + {tag.name==="分配"?taskslistdata&&taskslistdata.cross_comment===true?"":tag.name:tag.name} +

    } } From afbf3bd4397b4d0fc6f539eb412f2a3c96a56f81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 25 Sep 2019 17:01:40 +0800 Subject: [PATCH 103/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/tpm/shixunchild/Challenges/Challenges.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js index bb59a0b3d..0bbe3581f 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js @@ -228,7 +228,7 @@ class Challenges extends Component { } - if(this.props.checkIfProfileCompleted()===false){ + if(this.props.checkIfProfessionalCertification()===false){ this.setState({ AccountProfiletype:true }) From 59315e4478380c9eb020561a1acb66b50b592bea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 25 Sep 2019 17:01:51 +0800 Subject: [PATCH 104/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/courses/Resource/Fileslistitem.js | 2 +- public/react/src/modules/courses/boards/BoardsListItem.js | 2 +- public/react/src/modules/courses/busyWork/CommonWorkItem.js | 2 +- public/react/src/modules/courses/exercise/ExerciseListItem.js | 2 +- .../src/modules/courses/graduation/tasks/GraduateTaskItem.js | 2 +- .../modules/courses/graduation/topics/GraduateTopicItem.js | 2 +- public/react/src/modules/courses/poll/PollListItem.js | 2 +- .../src/modules/courses/shixunHomework/ShixunhomeWorkItem.js | 2 +- public/react/src/modules/paths/PathDetail/DetailCards.js | 2 +- public/react/src/modules/paths/PathDetail/DetailTop.js | 4 ++-- public/react/src/modules/tpm/TPMBanner.js | 4 ++-- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/public/react/src/modules/courses/Resource/Fileslistitem.js b/public/react/src/modules/courses/Resource/Fileslistitem.js index f6df24011..1e37ae370 100644 --- a/public/react/src/modules/courses/Resource/Fileslistitem.js +++ b/public/react/src/modules/courses/Resource/Fileslistitem.js @@ -33,7 +33,7 @@ class Fileslistitem extends Component{ return } - if(this.props.checkIfProfileCompleted()===false){ + if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return } diff --git a/public/react/src/modules/courses/boards/BoardsListItem.js b/public/react/src/modules/courses/boards/BoardsListItem.js index 14966f43a..3b245f557 100644 --- a/public/react/src/modules/courses/boards/BoardsListItem.js +++ b/public/react/src/modules/courses/boards/BoardsListItem.js @@ -15,7 +15,7 @@ class BoardsListItem extends Component{ return } - if(this.props.checkIfProfileCompleted()===false){ + if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return } diff --git a/public/react/src/modules/courses/busyWork/CommonWorkItem.js b/public/react/src/modules/courses/busyWork/CommonWorkItem.js index 183682619..3eb30518b 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkItem.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkItem.js @@ -22,7 +22,7 @@ class CommonWorkItem extends Component{ return } - if(this.props.checkIfProfileCompleted()===false){ + if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return } diff --git a/public/react/src/modules/courses/exercise/ExerciseListItem.js b/public/react/src/modules/courses/exercise/ExerciseListItem.js index e025456e2..7fea267b6 100644 --- a/public/react/src/modules/courses/exercise/ExerciseListItem.js +++ b/public/react/src/modules/courses/exercise/ExerciseListItem.js @@ -59,7 +59,7 @@ class ExerciseListItem extends Component{ return } - if(this.props.checkIfProfileCompleted()===false){ + if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return } diff --git a/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js b/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js index fb43b412a..36c7c1978 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js @@ -141,7 +141,7 @@ class GraduateTaskItem extends Component{ return } - if(this.props.checkIfProfileCompleted()===false){ + if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return } diff --git a/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js b/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js index 45b54899f..c549d277a 100644 --- a/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js +++ b/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js @@ -21,7 +21,7 @@ class GraduateTopicItem extends Component{ return } - if(this.props.checkIfProfileCompleted()===false){ + if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return } diff --git a/public/react/src/modules/courses/poll/PollListItem.js b/public/react/src/modules/courses/poll/PollListItem.js index 356b758c8..59c5e3fa0 100644 --- a/public/react/src/modules/courses/poll/PollListItem.js +++ b/public/react/src/modules/courses/poll/PollListItem.js @@ -22,7 +22,7 @@ class PollListItem extends Component{ return } - if(this.props.checkIfProfileCompleted()===false){ + if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return } diff --git a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js index b29ee6121..e7d29b1a8 100644 --- a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js +++ b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js @@ -151,7 +151,7 @@ class ShixunhomeWorkItem extends Component{ return } - if(this.props.checkIfProfileCompleted()===false){ + if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return } diff --git a/public/react/src/modules/paths/PathDetail/DetailCards.js b/public/react/src/modules/paths/PathDetail/DetailCards.js index be2a9908d..21c3ab6d8 100644 --- a/public/react/src/modules/paths/PathDetail/DetailCards.js +++ b/public/react/src/modules/paths/PathDetail/DetailCards.js @@ -200,7 +200,7 @@ class DetailCards extends Component{ return } - if(this.props.checkIfProfileCompleted()===false){ + if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return } diff --git a/public/react/src/modules/paths/PathDetail/DetailTop.js b/public/react/src/modules/paths/PathDetail/DetailTop.js index 049ed462d..3613e510d 100644 --- a/public/react/src/modules/paths/PathDetail/DetailTop.js +++ b/public/react/src/modules/paths/PathDetail/DetailTop.js @@ -249,7 +249,7 @@ class DetailTop extends Component{ return } - if(this.props.checkIfProfileCompleted()===false){ + if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return } @@ -268,7 +268,7 @@ class DetailTop extends Component{ return } - if(this.props.checkIfProfileCompleted()===false){ + if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return } diff --git a/public/react/src/modules/tpm/TPMBanner.js b/public/react/src/modules/tpm/TPMBanner.js index d2e382de0..881e24361 100644 --- a/public/react/src/modules/tpm/TPMBanner.js +++ b/public/react/src/modules/tpm/TPMBanner.js @@ -167,7 +167,7 @@ class TPMBanner extends Component { this.props.showLoginDialog() return } - if(this.props.checkIfProfileCompleted()===false){ + if(this.props.checkIfProfessionalCertification()===false){ this.setState({ AccountProfiletype:true }) @@ -390,7 +390,7 @@ class TPMBanner extends Component { return } - if(this.props.checkIfProfileCompleted()===false){ + if(this.props.checkIfProfessionalCertification()===false){ this.setState({ AccountProfiletype:true }) From 1cec2db4541f9fd3f6d5375a7b5a70413c20045d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Wed, 25 Sep 2019 17:12:08 +0800 Subject: [PATCH 105/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exercise/Studentshavecompletedthelist.js | 45 +++++++++---------- 1 file changed, 20 insertions(+), 25 deletions(-) diff --git a/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js b/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js index 6fdde6aeb..57f574ac4 100644 --- a/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js +++ b/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js @@ -1278,20 +1278,6 @@ class Studentshavecompletedthelist extends Component { }catch (e) { } - try { - if(this.props.Commonheadofthetestpaper.exercise_status !== undefined){ - this.setState({ - exercise_status:this.props.Commonheadofthetestpaper.exercise_status, - }) - }else{ - this.setState({ - exercise_status:0, - }) - } - }catch (e) { - - } - } componentWillReceiveProps = (nextProps) => { @@ -1330,7 +1316,7 @@ class Studentshavecompletedthelist extends Component { }) if (response.data.current_answer_user === undefined || response.data.current_answer_user === null) { // 学生未截止 - + // console.log("试卷学生未截止"); this.Generatenewdatas(response.data.exercise_users); if (response.data.exercise_types.subjective === 0) { if (this.state.noclassroom === undefined || this.state.noclassroom === "" || this.state.noclassroom === null) { @@ -1377,6 +1363,7 @@ class Studentshavecompletedthelist extends Component { } } else { //学生已截止 + // console.log("试卷学生已截止"); if (response.data.exercise_types.subjective === 0) { if (this.state.loadingstate === false) { var arr =[]; @@ -1458,7 +1445,7 @@ class Studentshavecompletedthelist extends Component { else if (response.data.exercise_types.user_permission === 0) { // console.log(response.data.exercise_users) // console.log(response) - + // console.log("试卷老师加载中"); if (thiss.state.loadingstate === false) { thiss.setState({ loadingstate: true, @@ -1469,7 +1456,9 @@ class Studentshavecompletedthelist extends Component { thiss.Generatenewdatasy(response.data.exercise_users, response); } }).catch((error) => { - console.log(error) + console.log(error); + console.log("其实数据加载失败了"); + console.log("1111"); }); @@ -2490,16 +2479,22 @@ class Studentshavecompletedthelist extends Component { let {data, datas, page, columns, course_groupyslsthree, columnstwo, styletable,exercise_status, course_groupyslstwodatas, limit, course_groupysls, course_groupyslstwodata, course_groupyslstwo, teacherlists, Teacherliststudentlist, order, columnss, course_groupsdatas, course_groups, Evaluationarray, unlimited, unlimiteds, unlimitedtwo, teacherlist, searchtext, loadingstate, review, nocomment, commented, unsubmitted, submitted, columnsys, exercise_users,mylistansum} = this.state; // console.log("Studentshavecompletedthelist"); // console.log(this.props.current_status); + // console.log("获取到的数据"); + // console.log(datas); + // console.log(data); + // console.log("this.props.Commonheadofthetestpaper.exercise_status"); + // console.log(this.props.Commonheadofthetestpaper&&this.props.Commonheadofthetestpaper.exercise_status); + // console.log(exercise_status); return ( isAdmin === true ? (
    {/*老师*/} { - exercise_status===0 || exercise_status===1 ? + this.props.Commonheadofthetestpaper&&this.props.Commonheadofthetestpaper.exercise_status===0 || this.props.Commonheadofthetestpaper&&this.props.Commonheadofthetestpaper.exercise_status===1 ?
    @@ -2598,9 +2593,9 @@ class Studentshavecompletedthelist extends Component { {course_groups === undefined ? "" : course_groups === null ? "" : course_groups.length < 2 ? "" : JSON.stringify(course_groups) === "[]" ? "" :
  • - 分班情况: - this.funtaskstatustwos()}>不限 @@ -2714,9 +2709,9 @@ class Studentshavecompletedthelist extends Component { Teacherliststudentlist === undefined || Teacherliststudentlist.current_answer_user === undefined || Teacherliststudentlist.current_answer_user === null ?
    + style={{"margin": "0 auto", "padding-bottom": "100px", minWidth: " 1200px"}}> { - exercise_status === 0 || exercise_status === 1 ? + this.props.Commonheadofthetestpaper&&this.props.Commonheadofthetestpaper.exercise_status === 0 || this.props.Commonheadofthetestpaper&&this.props.Commonheadofthetestpaper.exercise_status === 1 ?
    @@ -2794,10 +2789,10 @@ class Studentshavecompletedthelist extends Component {
    { - exercise_status === 0 || exercise_status === 1 ? + this.props.Commonheadofthetestpaper&&this.props.Commonheadofthetestpaper.exercise_status === 0 || this.props.Commonheadofthetestpaper&&this.props.Commonheadofthetestpaper.exercise_status === 1 ?
    From 794d35968da5e0632d989f3839fd438b9025034d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 25 Sep 2019 17:32:19 +0800 Subject: [PATCH 106/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/AppConfig.js | 4 ++-- .../src/modules/courses/Resource/Fileslistitem.js | 7 ++++++- .../src/modules/courses/boards/BoardsListItem.js | 7 ++++++- .../modules/courses/busyWork/CommonWorkItem.js | 7 ++++++- .../modules/courses/exercise/ExerciseListItem.js | 7 ++++++- .../courses/graduation/tasks/GraduateTaskItem.js | 7 ++++++- .../graduation/topics/GraduateTopicItem.js | 7 ++++++- .../src/modules/courses/poll/PollListItem.js | 7 ++++++- .../courses/shixunHomework/ShixunhomeWorkItem.js | 7 ++++++- .../src/modules/paths/PathDetail/DetailCards.js | 7 ++++++- .../src/modules/paths/PathDetail/DetailTop.js | 14 ++++++++++++-- public/react/src/modules/tpm/TPMBanner.js | 15 +++++++++++++++ .../tpm/shixunchild/Challenges/Challenges.js | 6 ++++++ 13 files changed, 89 insertions(+), 13 deletions(-) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index 025db7f5c..4de5d9d88 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -83,9 +83,9 @@ export function initAxiosInterceptors(props) { } config.url = `${proxy}${url}`; if (config.url.indexOf('?') == -1) { - config.url = `${config.url}?debug=${debugType}` + config.url = `${config.url}?debug=${'student'}` } else { - config.url = `${config.url}&debug=${debugType}` + config.url = `${config.url}&debug=${'student'}` } } else { // 加api前缀 diff --git a/public/react/src/modules/courses/Resource/Fileslistitem.js b/public/react/src/modules/courses/Resource/Fileslistitem.js index 1e37ae370..109403a3a 100644 --- a/public/react/src/modules/courses/Resource/Fileslistitem.js +++ b/public/react/src/modules/courses/Resource/Fileslistitem.js @@ -32,7 +32,12 @@ class Fileslistitem extends Component{ this.props.showLoginDialog() return } - + if(this.props.checkIfProfileCompleted()===false){ + this.setState({ + AccountProfiletype:true + }) + return + } if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return diff --git a/public/react/src/modules/courses/boards/BoardsListItem.js b/public/react/src/modules/courses/boards/BoardsListItem.js index 3b245f557..a7d6a37e3 100644 --- a/public/react/src/modules/courses/boards/BoardsListItem.js +++ b/public/react/src/modules/courses/boards/BoardsListItem.js @@ -14,7 +14,12 @@ class BoardsListItem extends Component{ this.props.showLoginDialog() return } - + if(this.props.checkIfProfileCompleted()===false){ + this.setState({ + AccountProfiletype:true + }) + return + } if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return diff --git a/public/react/src/modules/courses/busyWork/CommonWorkItem.js b/public/react/src/modules/courses/busyWork/CommonWorkItem.js index 3eb30518b..1a25dde62 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkItem.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkItem.js @@ -21,7 +21,12 @@ class CommonWorkItem extends Component{ this.props.showLoginDialog() return } - + if(this.props.checkIfProfileCompleted()===false){ + this.setState({ + AccountProfiletype:true + }) + return + } if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return diff --git a/public/react/src/modules/courses/exercise/ExerciseListItem.js b/public/react/src/modules/courses/exercise/ExerciseListItem.js index 7fea267b6..e8277a438 100644 --- a/public/react/src/modules/courses/exercise/ExerciseListItem.js +++ b/public/react/src/modules/courses/exercise/ExerciseListItem.js @@ -58,7 +58,12 @@ class ExerciseListItem extends Component{ this.props.showLoginDialog() return } - + if(this.props.checkIfProfileCompleted()===false){ + this.setState({ + AccountProfiletype:true + }) + return + } if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return diff --git a/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js b/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js index 36c7c1978..40dc3792a 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js @@ -140,7 +140,12 @@ class GraduateTaskItem extends Component{ this.props.showLoginDialog() return } - + if(this.props.checkIfProfileCompleted()===false){ + this.setState({ + AccountProfiletype:true + }) + return + } if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return diff --git a/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js b/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js index c549d277a..fc9b00c23 100644 --- a/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js +++ b/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js @@ -20,7 +20,12 @@ class GraduateTopicItem extends Component{ this.props.showLoginDialog("iscancel") return } - + if(this.props.checkIfProfileCompleted()===false){ + this.setState({ + AccountProfiletype:true + }) + return + } if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return diff --git a/public/react/src/modules/courses/poll/PollListItem.js b/public/react/src/modules/courses/poll/PollListItem.js index 59c5e3fa0..ae79b8afb 100644 --- a/public/react/src/modules/courses/poll/PollListItem.js +++ b/public/react/src/modules/courses/poll/PollListItem.js @@ -21,7 +21,12 @@ class PollListItem extends Component{ this.props.showLoginDialog() return } - + if(this.props.checkIfProfileCompleted()===false){ + this.setState({ + AccountProfiletype:true + }) + return + } if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return diff --git a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js index e7d29b1a8..be49ad00a 100644 --- a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js +++ b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js @@ -150,7 +150,12 @@ class ShixunhomeWorkItem extends Component{ this.props.showLoginDialog() return } - + if(this.props.checkIfProfileCompleted()===false){ + this.setState({ + AccountProfiletype:true + }) + return + } if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return diff --git a/public/react/src/modules/paths/PathDetail/DetailCards.js b/public/react/src/modules/paths/PathDetail/DetailCards.js index 21c3ab6d8..9910b7f7b 100644 --- a/public/react/src/modules/paths/PathDetail/DetailCards.js +++ b/public/react/src/modules/paths/PathDetail/DetailCards.js @@ -199,7 +199,12 @@ class DetailCards extends Component{ this.props.showLoginDialog() return } - + if(this.props.checkIfProfileCompleted()===false){ + this.setState({ + AccountProfiletype:true + }) + return + } if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return diff --git a/public/react/src/modules/paths/PathDetail/DetailTop.js b/public/react/src/modules/paths/PathDetail/DetailTop.js index 3613e510d..bc5e7e0d6 100644 --- a/public/react/src/modules/paths/PathDetail/DetailTop.js +++ b/public/react/src/modules/paths/PathDetail/DetailTop.js @@ -248,7 +248,12 @@ class DetailTop extends Component{ this.props.showLoginDialog() return } - + if(this.props.checkIfProfileCompleted()===false){ + this.setState({ + AccountProfiletype:true + }) + return + } if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return @@ -267,7 +272,12 @@ class DetailTop extends Component{ this.props.showLoginDialog() return } - + if(this.props.checkIfProfileCompleted()===false){ + this.setState({ + AccountProfiletype:true + }) + return + } if(this.props.checkIfProfessionalCertification()===false){ this.props.showProfileCompleteDialog() return diff --git a/public/react/src/modules/tpm/TPMBanner.js b/public/react/src/modules/tpm/TPMBanner.js index 881e24361..515f71f7f 100644 --- a/public/react/src/modules/tpm/TPMBanner.js +++ b/public/react/src/modules/tpm/TPMBanner.js @@ -167,6 +167,14 @@ class TPMBanner extends Component { this.props.showLoginDialog() return } + + if(this.props.checkIfProfileCompleted()===false){ + this.setState({ + AccountProfiletype:true + }) + return + } + if(this.props.checkIfProfessionalCertification()===false){ this.setState({ AccountProfiletype:true @@ -390,6 +398,13 @@ class TPMBanner extends Component { return } + if(this.props.checkIfProfileCompleted()===false){ + this.setState({ + AccountProfiletype:true + }) + return + } + if(this.props.checkIfProfessionalCertification()===false){ this.setState({ AccountProfiletype:true diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js index 0bbe3581f..c48a7b427 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js @@ -227,6 +227,12 @@ class Challenges extends Component { return } + if(this.props.checkIfProfileCompleted()===false){ + this.setState({ + AccountProfiletype:true + }) + return + } if(this.props.checkIfProfessionalCertification()===false){ this.setState({ From 8e1e4e6ef244cd5539f5e9329222b43a0c48acc2 Mon Sep 17 00:00:00 2001 From: jingquan huang Date: Wed, 25 Sep 2019 17:39:13 +0800 Subject: [PATCH 107/394] =?UTF-8?q?=E6=81=A2=E5=A4=8D=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/games_controller.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/app/controllers/games_controller.rb b/app/controllers/games_controller.rb index 709b4edfd..be8173b2f 100644 --- a/app/controllers/games_controller.rb +++ b/app/controllers/games_controller.rb @@ -431,7 +431,6 @@ class GamesController < ApplicationController # params[:status] 1: 目录树点击的请求 0:正常自动加载 # 返回参数status : -1 系统统一报错提示;-3 需要轮训重试,带retry参数;-4 立即重试 def rep_content - raise("666") challenge_path = @game.challenge.try(:path) if challenge_path.blank? tip_exception("代码获取异常,请检查实训模板的评测设置是否正确") From 72511c30cb09e11dda16b65dffaa903e3b5efc70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Wed, 25 Sep 2019 17:51:26 +0800 Subject: [PATCH 108/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exercise/Studentshavecompletedthelist.js | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js b/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js index 6fdde6aeb..aef18ef5d 100644 --- a/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js +++ b/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js @@ -1278,19 +1278,19 @@ class Studentshavecompletedthelist extends Component { }catch (e) { } - try { - if(this.props.Commonheadofthetestpaper.exercise_status !== undefined){ - this.setState({ - exercise_status:this.props.Commonheadofthetestpaper.exercise_status, - }) - }else{ - this.setState({ - exercise_status:0, - }) - } - }catch (e) { - - } + // try { + // if(this.props.Commonheadofthetestpaper.exercise_status !== undefined){ + // this.setState({ + // exercise_status:this.props.Commonheadofthetestpaper.exercise_status, + // }) + // }else{ + // this.setState({ + // exercise_status:0, + // }) + // } + // }catch (e) { + // + // } } @@ -2499,7 +2499,7 @@ class Studentshavecompletedthelist extends Component { }}> {/*老师*/} { - exercise_status===0 || exercise_status===1 ? + this.props.Commonheadofthetestpaper&&this.props.Commonheadofthetestpaper.exercise_status===0 || this.props.Commonheadofthetestpaper&&this.props.Commonheadofthetestpaper.exercise_status===1 ?
    @@ -2716,7 +2716,7 @@ class Studentshavecompletedthelist extends Component {
    { - exercise_status === 0 || exercise_status === 1 ? + this.props.Commonheadofthetestpaper&&this.props.Commonheadofthetestpaper.exercise_status === 0 || this.props.Commonheadofthetestpaper&&this.props.Commonheadofthetestpaper.exercise_status === 1 ?
    @@ -2797,7 +2797,7 @@ class Studentshavecompletedthelist extends Component { " min-width": " 1200px" }}> { - exercise_status === 0 || exercise_status === 1 ? + this.props.Commonheadofthetestpaper&&this.props.Commonheadofthetestpaper.exercise_status === 0 || this.props.Commonheadofthetestpaper&&this.props.Commonheadofthetestpaper.exercise_status === 1 ?
    From 896485b41aea6f000b6011da2645ef1658ebbb02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Wed, 25 Sep 2019 17:52:19 +0800 Subject: [PATCH 109/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exercise/Studentshavecompletedthelist.js | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js b/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js index aef18ef5d..610ac5793 100644 --- a/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js +++ b/public/react/src/modules/courses/exercise/Studentshavecompletedthelist.js @@ -1278,20 +1278,6 @@ class Studentshavecompletedthelist extends Component { }catch (e) { } - // try { - // if(this.props.Commonheadofthetestpaper.exercise_status !== undefined){ - // this.setState({ - // exercise_status:this.props.Commonheadofthetestpaper.exercise_status, - // }) - // }else{ - // this.setState({ - // exercise_status:0, - // }) - // } - // }catch (e) { - // - // } - } componentWillReceiveProps = (nextProps) => { From 242d3531855ed761e5fac24dd47f60329c085758 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Wed, 25 Sep 2019 18:07:28 +0800 Subject: [PATCH 110/394] cm.focus() --- public/editormd/plugins/image-dialog/image-dialog.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/editormd/plugins/image-dialog/image-dialog.js b/public/editormd/plugins/image-dialog/image-dialog.js index 6da63f1e5..708fd8881 100644 --- a/public/editormd/plugins/image-dialog/image-dialog.js +++ b/public/editormd/plugins/image-dialog/image-dialog.js @@ -113,13 +113,13 @@ } this.hide().lockScreen(false).hideMask(); - + cm.focus && cm.focus() return false; }], cancel : [lang.buttons.cancel, function() { this.hide().lockScreen(false).hideMask(); - + cm.focus && cm.focus() return false; }] } From 64149719a5f78ad93ecec56024dd7cf1c3f8dc7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 25 Sep 2019 18:08:17 +0800 Subject: [PATCH 111/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/courses/Resource/Fileslistitem.js | 20 +++++----- .../modules/courses/boards/BoardsListItem.js | 20 +++++----- .../courses/busyWork/CommonWorkItem.js | 20 +++++----- .../courses/exercise/ExerciseListItem.js | 20 +++++----- .../graduation/tasks/GraduateTaskItem.js | 20 +++++----- .../graduation/topics/GraduateTopicItem.js | 22 +++++----- .../src/modules/courses/poll/PollListItem.js | 20 +++++----- .../shixunHomework/ShixunhomeWorkItem.js | 20 +++++----- .../modules/paths/PathDetail/DetailCards.js | 20 +++++----- .../src/modules/paths/PathDetail/DetailTop.js | 40 +++++++++---------- public/react/src/modules/tpm/TPMBanner.js | 38 +++++++++--------- .../tpm/shixunchild/Challenges/Challenges.js | 12 +++--- 12 files changed, 136 insertions(+), 136 deletions(-) diff --git a/public/react/src/modules/courses/Resource/Fileslistitem.js b/public/react/src/modules/courses/Resource/Fileslistitem.js index 109403a3a..fe0794a18 100644 --- a/public/react/src/modules/courses/Resource/Fileslistitem.js +++ b/public/react/src/modules/courses/Resource/Fileslistitem.js @@ -32,16 +32,16 @@ class Fileslistitem extends Component{ this.props.showLoginDialog() return } - if(this.props.checkIfProfileCompleted()===false){ - this.setState({ - AccountProfiletype:true - }) - return - } - if(this.props.checkIfProfessionalCertification()===false){ - this.props.showProfileCompleteDialog() - return - } + // if(this.props.checkIfProfileCompleted()===false){ + // this.setState({ + // AccountProfiletype:true + // }) + // return + // } + // if(this.props.checkIfProfessionalCertification()===false){ + // this.props.showProfileCompleteDialog() + // return + // } if(list.is_history_file===false){ // this.props.DownloadFileA(list.title,list.url) diff --git a/public/react/src/modules/courses/boards/BoardsListItem.js b/public/react/src/modules/courses/boards/BoardsListItem.js index a7d6a37e3..a833f4c39 100644 --- a/public/react/src/modules/courses/boards/BoardsListItem.js +++ b/public/react/src/modules/courses/boards/BoardsListItem.js @@ -14,16 +14,16 @@ class BoardsListItem extends Component{ this.props.showLoginDialog() return } - if(this.props.checkIfProfileCompleted()===false){ - this.setState({ - AccountProfiletype:true - }) - return - } - if(this.props.checkIfProfessionalCertification()===false){ - this.props.showProfileCompleteDialog() - return - } + // if(this.props.checkIfProfileCompleted()===false){ + // this.setState({ + // AccountProfiletype:true + // }) + // return + // } + // if(this.props.checkIfProfessionalCertification()===false){ + // this.props.showProfileCompleteDialog() + // return + // } const isAdminOrStudent = this.props.isAdminOrStudent(); if (!isAdminOrStudent && discussMessage.is_public == false) { diff --git a/public/react/src/modules/courses/busyWork/CommonWorkItem.js b/public/react/src/modules/courses/busyWork/CommonWorkItem.js index 1a25dde62..0aebad415 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkItem.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkItem.js @@ -21,16 +21,16 @@ class CommonWorkItem extends Component{ this.props.showLoginDialog() return } - if(this.props.checkIfProfileCompleted()===false){ - this.setState({ - AccountProfiletype:true - }) - return - } - if(this.props.checkIfProfessionalCertification()===false){ - this.props.showProfileCompleteDialog() - return - } + // if(this.props.checkIfProfileCompleted()===false){ + // this.setState({ + // AccountProfiletype:true + // }) + // return + // } + // if(this.props.checkIfProfessionalCertification()===false){ + // this.props.showProfileCompleteDialog() + // return + // } const isStudent = this.props.isStudent() if (isStudent) { diff --git a/public/react/src/modules/courses/exercise/ExerciseListItem.js b/public/react/src/modules/courses/exercise/ExerciseListItem.js index e8277a438..479c9710a 100644 --- a/public/react/src/modules/courses/exercise/ExerciseListItem.js +++ b/public/react/src/modules/courses/exercise/ExerciseListItem.js @@ -58,16 +58,16 @@ class ExerciseListItem extends Component{ this.props.showLoginDialog() return } - if(this.props.checkIfProfileCompleted()===false){ - this.setState({ - AccountProfiletype:true - }) - return - } - if(this.props.checkIfProfessionalCertification()===false){ - this.props.showProfileCompleteDialog() - return - } + // if(this.props.checkIfProfileCompleted()===false){ + // this.setState({ + // AccountProfiletype:true + // }) + // return + // } + // if(this.props.checkIfProfessionalCertification()===false){ + // this.props.showProfileCompleteDialog() + // return + // } this.props.history.push(url); } diff --git a/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js b/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js index 40dc3792a..8ed9bb5ea 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js @@ -140,16 +140,16 @@ class GraduateTaskItem extends Component{ this.props.showLoginDialog() return } - if(this.props.checkIfProfileCompleted()===false){ - this.setState({ - AccountProfiletype:true - }) - return - } - if(this.props.checkIfProfessionalCertification()===false){ - this.props.showProfileCompleteDialog() - return - } + // if(this.props.checkIfProfileCompleted()===false){ + // this.setState({ + // AccountProfiletype:true + // }) + // return + // } + // if(this.props.checkIfProfessionalCertification()===false){ + // this.props.showProfileCompleteDialog() + // return + // } this.props.history.push(url); } diff --git a/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js b/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js index fc9b00c23..2027cfb3a 100644 --- a/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js +++ b/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js @@ -17,19 +17,19 @@ class GraduateTopicItem extends Component{ toDetailPage=(topicId)=>{ if(this.props.checkIfLogin()===false){ - this.props.showLoginDialog("iscancel") - return - } - if(this.props.checkIfProfileCompleted()===false){ - this.setState({ - AccountProfiletype:true - }) - return - } - if(this.props.checkIfProfessionalCertification()===false){ - this.props.showProfileCompleteDialog() + this.props.showLoginDialog() return } + // if(this.props.checkIfProfileCompleted()===false){ + // this.setState({ + // AccountProfiletype:true + // }) + // return + // } + // if(this.props.checkIfProfessionalCertification()===false){ + // this.props.showProfileCompleteDialog() + // return + // } let courseId=this.props.match.params.coursesId; this.props.history.push(`/courses/${courseId}/graduation_topics/${topicId}/detail`); diff --git a/public/react/src/modules/courses/poll/PollListItem.js b/public/react/src/modules/courses/poll/PollListItem.js index ae79b8afb..b4c2f108e 100644 --- a/public/react/src/modules/courses/poll/PollListItem.js +++ b/public/react/src/modules/courses/poll/PollListItem.js @@ -21,16 +21,16 @@ class PollListItem extends Component{ this.props.showLoginDialog() return } - if(this.props.checkIfProfileCompleted()===false){ - this.setState({ - AccountProfiletype:true - }) - return - } - if(this.props.checkIfProfessionalCertification()===false){ - this.props.showProfileCompleteDialog() - return - } + // if(this.props.checkIfProfileCompleted()===false){ + // this.setState({ + // AccountProfiletype:true + // }) + // return + // } + // if(this.props.checkIfProfessionalCertification()===false){ + // this.props.showProfileCompleteDialog() + // return + // } this.props.history.push(url); } diff --git a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js index be49ad00a..74692dcb8 100644 --- a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js +++ b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js @@ -150,16 +150,16 @@ class ShixunhomeWorkItem extends Component{ this.props.showLoginDialog() return } - if(this.props.checkIfProfileCompleted()===false){ - this.setState({ - AccountProfiletype:true - }) - return - } - if(this.props.checkIfProfessionalCertification()===false){ - this.props.showProfileCompleteDialog() - return - } + // if(this.props.checkIfProfileCompleted()===false){ + // this.setState({ + // AccountProfiletype:true + // }) + // return + // } + // if(this.props.checkIfProfessionalCertification()===false){ + // this.props.showProfileCompleteDialog() + // return + // } this.props.history.push(url); diff --git a/public/react/src/modules/paths/PathDetail/DetailCards.js b/public/react/src/modules/paths/PathDetail/DetailCards.js index 9910b7f7b..d459694ef 100644 --- a/public/react/src/modules/paths/PathDetail/DetailCards.js +++ b/public/react/src/modules/paths/PathDetail/DetailCards.js @@ -199,16 +199,16 @@ class DetailCards extends Component{ this.props.showLoginDialog() return } - if(this.props.checkIfProfileCompleted()===false){ - this.setState({ - AccountProfiletype:true - }) - return - } - if(this.props.checkIfProfessionalCertification()===false){ - this.props.showProfileCompleteDialog() - return - } + // if(this.props.checkIfProfileCompleted()===false){ + // this.setState({ + // AccountProfiletype:true + // }) + // return + // } + // if(this.props.checkIfProfessionalCertification()===false){ + // this.props.showProfileCompleteDialog() + // return + // } let url = "/shixuns/" + id + "/shixun_exec.json"; diff --git a/public/react/src/modules/paths/PathDetail/DetailTop.js b/public/react/src/modules/paths/PathDetail/DetailTop.js index bc5e7e0d6..bf8c46e8f 100644 --- a/public/react/src/modules/paths/PathDetail/DetailTop.js +++ b/public/react/src/modules/paths/PathDetail/DetailTop.js @@ -248,16 +248,16 @@ class DetailTop extends Component{ this.props.showLoginDialog() return } - if(this.props.checkIfProfileCompleted()===false){ - this.setState({ - AccountProfiletype:true - }) - return - } - if(this.props.checkIfProfessionalCertification()===false){ - this.props.showProfileCompleteDialog() - return - } + // if(this.props.checkIfProfileCompleted()===false){ + // this.setState({ + // AccountProfiletype:true + // }) + // return + // } + // if(this.props.checkIfProfessionalCertification()===false){ + // this.props.showProfileCompleteDialog() + // return + // } this.setState({ @@ -272,16 +272,16 @@ class DetailTop extends Component{ this.props.showLoginDialog() return } - if(this.props.checkIfProfileCompleted()===false){ - this.setState({ - AccountProfiletype:true - }) - return - } - if(this.props.checkIfProfessionalCertification()===false){ - this.props.showProfileCompleteDialog() - return - } + // if(this.props.checkIfProfileCompleted()===false){ + // this.setState({ + // AccountProfiletype:true + // }) + // return + // } + // if(this.props.checkIfProfessionalCertification()===false){ + // this.props.showProfileCompleteDialog() + // return + // } this.setState({ Modalstype:true, diff --git a/public/react/src/modules/tpm/TPMBanner.js b/public/react/src/modules/tpm/TPMBanner.js index 515f71f7f..1a16e43d6 100644 --- a/public/react/src/modules/tpm/TPMBanner.js +++ b/public/react/src/modules/tpm/TPMBanner.js @@ -168,19 +168,19 @@ class TPMBanner extends Component { return } - if(this.props.checkIfProfileCompleted()===false){ - this.setState({ - AccountProfiletype:true - }) - return - } - - if(this.props.checkIfProfessionalCertification()===false){ - this.setState({ - AccountProfiletype:true - }) - return - } + // if(this.props.checkIfProfileCompleted()===false){ + // this.setState({ + // AccountProfiletype:true + // }) + // return + // } + // + // if(this.props.checkIfProfessionalCertification()===false){ + // this.setState({ + // AccountProfiletype:true + // }) + // return + // } let id = this.props.match.params.shixunId; let url="/shixuns/" + id +"/search_user_courses.json"; this.setState({ @@ -405,12 +405,12 @@ class TPMBanner extends Component { return } - if(this.props.checkIfProfessionalCertification()===false){ - this.setState({ - AccountProfiletype:true - }) - return - } + // if(this.props.checkIfProfessionalCertification()===false){ + // this.setState({ + // AccountProfiletype:true + // }) + // return + // } let {shixunsDetails} = this.props if( shixunsDetails.shixun_status>1){ diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js index c48a7b427..c956736a0 100644 --- a/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js +++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challenges.js @@ -234,12 +234,12 @@ class Challenges extends Component { return } - if(this.props.checkIfProfessionalCertification()===false){ - this.setState({ - AccountProfiletype:true - }) - return - } + // if(this.props.checkIfProfessionalCertification()===false){ + // this.setState({ + // AccountProfiletype:true + // }) + // return + // } let { ChallengesDataList } = this.state; From 1b23d59117249a8e1cf5d1f6b3967d6885335f38 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 26 Sep 2019 09:52:40 +0800 Subject: [PATCH 112/394] config --- public/react/src/AppConfig.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index 4de5d9d88..025db7f5c 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -83,9 +83,9 @@ export function initAxiosInterceptors(props) { } config.url = `${proxy}${url}`; if (config.url.indexOf('?') == -1) { - config.url = `${config.url}?debug=${'student'}` + config.url = `${config.url}?debug=${debugType}` } else { - config.url = `${config.url}&debug=${'student'}` + config.url = `${config.url}&debug=${debugType}` } } else { // 加api前缀 From 7d6b1fac06a7c518b218da77812d0193080d9025 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Thu, 26 Sep 2019 10:08:56 +0800 Subject: [PATCH 113/394] =?UTF-8?q?=E6=AF=95=E8=AE=BE=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E7=9A=84=E4=BD=9C=E8=80=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/graduation_tasks/index.json.jbuilder | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/graduation_tasks/index.json.jbuilder b/app/views/graduation_tasks/index.json.jbuilder index a6540555d..ce9ea0259 100644 --- a/app/views/graduation_tasks/index.json.jbuilder +++ b/app/views/graduation_tasks/index.json.jbuilder @@ -11,6 +11,7 @@ json.tasks @tasks.each do |task| task_curr_status = task_curr_status(task, @course) json.status task_curr_status[:status] json.status_time task_curr_status[:time] + json.author task.user.real_name unless task_curr_status[:status].include?("未发布") json.commit_count grduationwork_count task, 1 From 271dc09f4942682a4d086b70fc67161cf608520a Mon Sep 17 00:00:00 2001 From: caicai8 <1149225589@qq.com> Date: Thu, 26 Sep 2019 10:27:46 +0800 Subject: [PATCH 114/394] =?UTF-8?q?=E6=AF=95=E8=AE=BE=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=88=97=E8=A1=A8-=E6=98=BE=E7=A4=BA=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E8=80=85=E5=A7=93=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/graduation/tasks/GraduateTaskItem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js b/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js index 8ed9bb5ea..17ae8ca28 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js @@ -274,7 +274,7 @@ class GraduateTaskItem extends Component{

    {/* {discussMessage.author.name} */} - + { discussMessage.author && {discussMessage.author} } {discussMessage.commit_count===undefined?"":{discussMessage.commit_count} 已交} {discussMessage.uncommit_count===undefined?"":{discussMessage.uncommit_count} 未交} {/*{discussMessage.replies_count} 3 未评*/} From 9980a827810a8ed3630aaf836095a3bd5389c48e Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 26 Sep 2019 10:34:07 +0800 Subject: [PATCH 115/394] 28px --- public/react/src/modules/paths/PathDetail/PathDetailIndex.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/paths/PathDetail/PathDetailIndex.js b/public/react/src/modules/paths/PathDetail/PathDetailIndex.js index b0f64abde..25437c09e 100644 --- a/public/react/src/modules/paths/PathDetail/PathDetailIndex.js +++ b/public/react/src/modules/paths/PathDetail/PathDetailIndex.js @@ -489,6 +489,9 @@ class PathDetailIndex extends Component{ .padding40-20-30{ padding:40px 20px 30px; } + .pathDetailIndex .markdown-body > p { + line-height: 28px; + } ` } @@ -501,7 +504,7 @@ class PathDetailIndex extends Component{ loadtype={loadtype} > -

    +
    this.getdatasindex(key)} getMenuItemsindex={(key,status)=>this.getMenuItemsindex(key,status)} getlistdatas={()=>this.getlistdatas()}>
    From 2881ac625418926627a5990de903535d763de021 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 26 Sep 2019 10:42:16 +0800 Subject: [PATCH 116/394] this.props.updataleftNavfun() --- public/react/src/App.css | 4 ++++ .../src/modules/courses/members/modal/AddStudentModal.js | 3 ++- public/react/src/modules/courses/members/studentsList.js | 4 +++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/public/react/src/App.css b/public/react/src/App.css index 1c8ce15e1..07d3d718d 100644 --- a/public/react/src/App.css +++ b/public/react/src/App.css @@ -92,6 +92,10 @@ html, body { .formItemInline .ant-form-item-control-wrapper { flex: 1; } +/* AutoComplete placeholder 不显示的问题 */ +.ant-select-auto-complete.ant-select .ant-select-selection__placeholder { + z-index: 2; +} /* 兼容性 */ diff --git a/public/react/src/modules/courses/members/modal/AddStudentModal.js b/public/react/src/modules/courses/members/modal/AddStudentModal.js index ddd1164ea..efa801182 100644 --- a/public/react/src/modules/courses/members/modal/AddStudentModal.js +++ b/public/react/src/modules/courses/members/modal/AddStudentModal.js @@ -68,7 +68,7 @@ class AddStudentModal extends Component{ if (response.data.course_groups && response.data.course_groups.length) { this.setState({ course_groups: response.data.course_groups, - courseGroup: response.data.course_groups[0].id + courseGroup: '0' // response.data.course_groups[0].id }) } else { // showNotification('') @@ -268,6 +268,7 @@ class AddStudentModal extends Component{ {course_groups && course_groups.length &&
    所选学生分班至(选填):
    @@ -463,10 +475,10 @@ class GraduationAcross extends Component{ :"" }
    -
    - 关闭 - 确认 -
    + {/*
    */} + {/*关闭*/} + {/*确认*/} + {/*
    */}
    ) diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js index 3d7327956..ff7564b8f 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js @@ -343,6 +343,7 @@ class GraduationTaskssettingapp extends Component{ } updatesfuncrosscomment=(types,newlatetime,newcommenttime)=>{ + debugger let {endtimetype}=this.state; if(types===1){ this.setState({ @@ -372,7 +373,7 @@ class GraduationTaskssettingapp extends Component{ funcrosscomment=(e)=>{ let {latetime,end_time,allowlate,commenttime,commenttimeone}=this.state; let commenttimetype=commenttime===null||commenttime===""; - +debugger let newlatetimea=moment(new Date()).add(7, 'days').format("YYYY-MM-DD HH:mm"); let newcommenttimea=moment(new Date()).format("YYYY-MM-DD HH:mm"); @@ -386,7 +387,7 @@ class GraduationTaskssettingapp extends Component{ let newcommenttimed=moment(end_time).add(8, 'days').format("YYYY-MM-DD HH:mm"); if(e.target.checked===true){ - if(commenttimetype===true){ + debugger if(allowlate===1||allowlate===true){ if(latetime===null||latetime===""){ @@ -401,12 +402,6 @@ class GraduationTaskssettingapp extends Component{ this.updatesfuncrosscomment(2,newend_timed,newcommenttimed) } } - }else{ - this.setState({ - crosscomment:e.target.checked, - commenttime:commenttimeone, - }) - } }else{ this.setState({ @@ -545,25 +540,29 @@ class GraduationTaskssettingapp extends Component{ endTimetypes:false }) } - + debugger if(moment(latetime)<=moment(publish_time)){ + + debugger this.setState({ latetimetype:true, latetimetypeval:"结束时间必须晚于发布时间" }) return }else if(moment(latetime)<=moment(end_time)){ + debugger this.setState({ latetimetype:true, latetimetypeval:"结束时间必须晚于截止时间" }) return }else{ + debugger this.setState({ latetimetype:false }) } - + debugger if(crosscomment===true){ if(this.state.commenttime===undefined||this.state.commenttime===null||this.state.commenttime===""){ @@ -950,9 +949,7 @@ class GraduationTaskssettingapp extends Component{ // // console.log(moment(publish_time)) - // console.log(this.props.isSuperAdmin()) - - + console.log(commenttime) return( From 191f5ec677c6d861c94533d1c069a601eb21553f Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Thu, 26 Sep 2019 14:37:28 +0800 Subject: [PATCH 122/394] =?UTF-8?q?=E9=80=89=E7=94=A8=E5=AE=9E=E8=B7=B5?= =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E6=94=B9=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/assets/javascripts/subject_lists.js | 2 + app/assets/stylesheets/subject_lists.scss | 3 ++ app/controllers/shixun_lists_controller.rb | 2 +- app/controllers/subject_lists_controller.rb | 10 +++++ app/helpers/subject_lists_helper.rb | 2 + app/models/searchable/subject.rb | 7 +++- app/services/subject_search_service.rb | 42 +++++++++++++++++++ app/views/subject_lists/index.json.jbuilder | 22 ++++++++++ config/routes.rb | 1 + .../subject_lists_controller_spec.rb | 5 +++ spec/helpers/subject_lists_helper_spec.rb | 15 +++++++ 11 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 app/assets/javascripts/subject_lists.js create mode 100644 app/assets/stylesheets/subject_lists.scss create mode 100644 app/controllers/subject_lists_controller.rb create mode 100644 app/helpers/subject_lists_helper.rb create mode 100644 app/services/subject_search_service.rb create mode 100644 app/views/subject_lists/index.json.jbuilder create mode 100644 spec/controllers/subject_lists_controller_spec.rb create mode 100644 spec/helpers/subject_lists_helper_spec.rb diff --git a/app/assets/javascripts/subject_lists.js b/app/assets/javascripts/subject_lists.js new file mode 100644 index 000000000..dee720fac --- /dev/null +++ b/app/assets/javascripts/subject_lists.js @@ -0,0 +1,2 @@ +// Place all the behaviors and hooks related to the matching controller here. +// All this logic will automatically be available in application.js. diff --git a/app/assets/stylesheets/subject_lists.scss b/app/assets/stylesheets/subject_lists.scss new file mode 100644 index 000000000..bf0f29103 --- /dev/null +++ b/app/assets/stylesheets/subject_lists.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the subject_lists controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/shixun_lists_controller.rb b/app/controllers/shixun_lists_controller.rb index e92e857ad..b57f0af21 100644 --- a/app/controllers/shixun_lists_controller.rb +++ b/app/controllers/shixun_lists_controller.rb @@ -5,6 +5,6 @@ class ShixunListsController < ApplicationController private def search_params - params.permit(:keyword, :type, :page, :limit, :order, :type, :status, :diff) + params.permit(:keyword, :type, :page, :limit, :order, :status, :diff) end end \ No newline at end of file diff --git a/app/controllers/subject_lists_controller.rb b/app/controllers/subject_lists_controller.rb new file mode 100644 index 000000000..c8a523d79 --- /dev/null +++ b/app/controllers/subject_lists_controller.rb @@ -0,0 +1,10 @@ +class SubjectListsController < ApplicationController + def index + @results = SubjectSearchService.call(search_params) + end + + private + def search_params + params.permit(:keyword, :type, :page, :limit, :order, :sort) + end +end diff --git a/app/helpers/subject_lists_helper.rb b/app/helpers/subject_lists_helper.rb new file mode 100644 index 000000000..92df21ed8 --- /dev/null +++ b/app/helpers/subject_lists_helper.rb @@ -0,0 +1,2 @@ +module SubjectListsHelper +end diff --git a/app/models/searchable/subject.rb b/app/models/searchable/subject.rb index a0036c200..64845a566 100644 --- a/app/models/searchable/subject.rb +++ b/app/models/searchable/subject.rb @@ -18,7 +18,9 @@ module Searchable::Subject def search_data { name: name, - description: Util.extract_content(description)[0..Searchable::MAXIMUM_LENGTH] + description: Util.extract_content(description)[0..Searchable::MAXIMUM_LENGTH], + shixuns_count: shixuns_count, + myshixuns_count: member_count, }.merge!(searchable_user_data) .merge!(searchable_stages_data) end @@ -45,7 +47,8 @@ module Searchable::Subject visits_count: visits, stage_count: stages_count, stage_shixuns_count: stage_shixuns_count, - shixuns_count: shixuns_count + shixuns_count: shixuns_count, + myshixuns_count: member_count } end diff --git a/app/services/subject_search_service.rb b/app/services/subject_search_service.rb new file mode 100644 index 000000000..2366cecc2 --- /dev/null +++ b/app/services/subject_search_service.rb @@ -0,0 +1,42 @@ +class SubjectSearchService < ApplicationService + include ElasticsearchAble + + attr_reader :params + + def initialize(params) + @params = params + end + + def call + # 全部实训/我的实训 + type = params[:type] || "all" + + if type == "mine" + @subjects = User.current.shixuns.visible.unhidden + else + @subjects = Subject.visible.unhidden + end + + Subject.search(keyword, search_options) + end + + private + + def search_options + model_options = { + includes: [ user: { user_extension: :school } ] + } + model_options.merge!(where: { id: @subjects.pluck(:id) }) + model_options.merge!(order: {sort_type => sort_str}) + model_options.merge!(default_options) + model_options + end + + def sort_str + params[:order] || "desc" + end + + def sort_type + params[:sort] || "myshixuns_count" + end +end \ No newline at end of file diff --git a/app/views/subject_lists/index.json.jbuilder b/app/views/subject_lists/index.json.jbuilder new file mode 100644 index 000000000..6992deb1f --- /dev/null +++ b/app/views/subject_lists/index.json.jbuilder @@ -0,0 +1,22 @@ +json.subjects_count @results.total_count + +json.subject_list do + json.array! @results.with_highlights(multiple: true) do |obj, highlights| + json.merge! obj.to_searchable_json + + # 去除开头标点符号 + reg = /^[,。?:;‘’!“”—……、]/ + # 附件的替换 + atta_reg = /!\[.*]\(\/api\/attachments\/\d+\)/ + + highlights[:description]&.first&.sub!(reg, '') + highlights[:description]&.map{|des| des.gsub!(atta_reg, '')} + highlights[:content]&.first&.sub!(reg, '') + highlights[:content]&.map{|des| des.gsub!(atta_reg, '')} + + json.title highlights.delete(:name)&.join('...') || obj.searchable_title + json.description highlights[:description]&.join('...') || Util.extract_content(obj.description)[0..300]&.sub!(atta_reg, '') + + json.content highlights + end +end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index f111d4894..bafd7dd0e 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -174,6 +174,7 @@ Rails.application.routes.draw do end end + resources :subject_lists resources :shixun_lists resources :shixuns, param: :identifier do diff --git a/spec/controllers/subject_lists_controller_spec.rb b/spec/controllers/subject_lists_controller_spec.rb new file mode 100644 index 000000000..b6ce01674 --- /dev/null +++ b/spec/controllers/subject_lists_controller_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe SubjectListsController, type: :controller do + +end diff --git a/spec/helpers/subject_lists_helper_spec.rb b/spec/helpers/subject_lists_helper_spec.rb new file mode 100644 index 000000000..b48480161 --- /dev/null +++ b/spec/helpers/subject_lists_helper_spec.rb @@ -0,0 +1,15 @@ +require 'rails_helper' + +# Specs in this file have access to a helper object that includes +# the SubjectListsHelper. For example: +# +# describe SubjectListsHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# expect(helper.concat_strings("this","that")).to eq("this that") +# end +# end +# end +RSpec.describe SubjectListsHelper, type: :helper do + pending "add some examples to (or delete) #{__FILE__}" +end From ba2075a9ee0b5811c48a1cb8a3364752c600e3b6 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 26 Sep 2019 14:40:52 +0800 Subject: [PATCH 123/394] ecs fix bu --- .../ecs/requirement_support_objectives_controller.rb | 2 +- app/controllers/ecs/subitem_support_standards_controller.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/ecs/requirement_support_objectives_controller.rb b/app/controllers/ecs/requirement_support_objectives_controller.rb index 7aeba21bb..92e49547f 100644 --- a/app/controllers/ecs/requirement_support_objectives_controller.rb +++ b/app/controllers/ecs/requirement_support_objectives_controller.rb @@ -19,7 +19,7 @@ class Ecs::RequirementSupportObjectivesController < Ecs::BaseController end def create - record = EcRequirementVsObjective.find_by_or_initialize(permit_params) + record = EcRequirementVsObjective.find_or_initialize_by(permit_params) record.status = true record.save! diff --git a/app/controllers/ecs/subitem_support_standards_controller.rb b/app/controllers/ecs/subitem_support_standards_controller.rb index 697d5acc4..f718fb5f7 100644 --- a/app/controllers/ecs/subitem_support_standards_controller.rb +++ b/app/controllers/ecs/subitem_support_standards_controller.rb @@ -19,7 +19,7 @@ class Ecs::SubitemSupportStandardsController < Ecs::BaseController end def create - record = EcRequireSubVsStandard.find_by_or_initialize(permit_params) + record = EcRequireSubVsStandard.find_or_initialize_by(permit_params) record.status = true record.save! From 2553f71eefe80801b184c67fed8bc34edd6e3fa6 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 26 Sep 2019 14:45:49 +0800 Subject: [PATCH 124/394] ecs: fix --- .../ecs/requirement_support_objectives_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/ecs/requirement_support_objectives_controller.rb b/app/controllers/ecs/requirement_support_objectives_controller.rb index 92e49547f..2fe8cc338 100644 --- a/app/controllers/ecs/requirement_support_objectives_controller.rb +++ b/app/controllers/ecs/requirement_support_objectives_controller.rb @@ -48,6 +48,6 @@ class Ecs::RequirementSupportObjectivesController < Ecs::BaseController end def permit_params - params.require(%i[graduation_requirement_id training_subitem_id]) + params.require(%i[ec_graduation_requirement_id ec_training_subitem_id]) end end \ No newline at end of file From 93a123f25a82c6df0f8713a7b2acc90ab758c59b Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 26 Sep 2019 14:51:36 +0800 Subject: [PATCH 125/394] fix --- .../ecs/requirement_support_objectives_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/ecs/requirement_support_objectives_controller.rb b/app/controllers/ecs/requirement_support_objectives_controller.rb index 2fe8cc338..d06dbe568 100644 --- a/app/controllers/ecs/requirement_support_objectives_controller.rb +++ b/app/controllers/ecs/requirement_support_objectives_controller.rb @@ -36,12 +36,12 @@ class Ecs::RequirementSupportObjectivesController < Ecs::BaseController private def check_record_exists! - unless current_year.ec_graduation_requirements.exists?(id: params[:graduation_requirement_id]) + unless current_year.ec_graduation_requirements.exists?(id: params[:ec_graduation_requirement_id]) render_not_found return end - unless current_year.ec_training_subitems.exists?(id: params[:training_subitem_id]) + unless current_year.ec_training_subitems.exists?(id: params[:ec_training_subitem_id]) render_not_found return end From 25941dbcf468c8bb18fc08464fc0db40c273af79 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 26 Sep 2019 14:59:57 +0800 Subject: [PATCH 126/394] =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RequirementVsObjective/SelectTable.js | 123 +++++++++++++++ .../EcSetting/RequirementVsObjective/index.js | 144 ++++++++++++++++++ .../react/src/modules/ecs/EcSetting/index.js | 12 +- 3 files changed, 278 insertions(+), 1 deletion(-) create mode 100644 public/react/src/modules/ecs/EcSetting/RequirementVsObjective/SelectTable.js create mode 100644 public/react/src/modules/ecs/EcSetting/RequirementVsObjective/index.js diff --git a/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/SelectTable.js b/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/SelectTable.js new file mode 100644 index 000000000..9e95d9eb8 --- /dev/null +++ b/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/SelectTable.js @@ -0,0 +1,123 @@ +import React, { Component } from 'react'; + +import classNames from 'classnames' + +import axios from 'axios'; + +import { Table, Divider, Tag, Checkbox, InputNumber, Spin, Icon, Tooltip } from 'antd'; + +class SelectTable extends Component { + constructor(props) { + super(props) + this.state={ + + } + } + + componentDidMount(){ + + } + + render() { + const { match, columns, tableData } = this.props + if (!tableData || !tableData.length) return ''; + return ( + + + + + + {columns.map((item, index) => { + if (index == 0) return ; + return ( + + + + ) + })} + {/* + + + + */} + + { tableData.map((item, rowIndex) => { + const cells = item.map((cell, colIndex) => { + if(colIndex == 0) return + + + return ( + + ) + }) + return ( + + {cells} + + ) + })} + {/* + + + + + + + */} + {/* + + + + + + + + + + + + + + + */} + +
    {columns[0][0]}{columns[0][1]}目标{index}目标1目标2目标3目标4目标5
    指标点{rowIndex + 1} this.props.onCellClick(rowIndex, colIndex, !!cell)}> + +
    指标点1 + + + + + + + + + +
    指标点2 + + + + + + + + + +
    指标点3 + + + + + + + + + +
    + + + ); + } +} + +export default (SelectTable) ; diff --git a/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/index.js b/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/index.js new file mode 100644 index 000000000..49b056950 --- /dev/null +++ b/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/index.js @@ -0,0 +1,144 @@ +import React, { Component } from 'react'; + +import classNames from 'classnames' + +import axios from 'axios'; + +import { Table, Divider, Tag, Checkbox, InputNumber, Spin, Icon } from 'antd'; +import SelectTable from './SelectTable' +import update from 'immutability-helper' +const testState = { + "graduation_requirements": [ + { + "id": 1, + "position": 1, + "content": "毕业要求一" + }, + { + "id": 2, + "position": 2, + "content": "毕业要求二" + } + ], + "training_subitems": [ + { + "id": 1, + "content": "培养目标一" + }, + { + "id": 2, + "content": "培养目标二" + } + ], + "requirement_support_objectives": [ + { + "graduation_requirement_id": 1, + "training_subitem_id": 1 + }, + { + "graduation_requirement_id": 2, + "training_subitem_id": 2 + }, + ] +} +class RequirementVsObjective extends Component { + constructor(props) { + super(props) + this.state={ + ...testState + } + } + + componentDidMount(){ + // this.init() + // return; + + const yearId = this.props.match.params.yearId + const url = `/ec_years/${yearId}/requirement_support_objectives.json` + axios.get(url).then((response) => { + if (response.data.graduation_requirements) { + this.setState( {...response.data} , () => { + this.init() + }) + } + }).catch((e) => { + + }) + } + init = () => { + this.graduationRequirementsIdIndexMap = {} + this.trainingSubitemsIdIndexMap = {} + this.state.graduation_requirements.forEach((item, index) => { + this.graduationRequirementsIdIndexMap[item.id] = index + }) + this.state.training_subitems.forEach((item, index) => { + this.trainingSubitemsIdIndexMap[item.id] = index + }) + const tableData = [] + this.state.graduation_requirements.forEach((item, index) => { + tableData.push([item.content, ...Array(this.state.training_subitems.length)]) + }) + this.state.requirement_support_objectives.forEach(item => { + tableData[this.graduationRequirementsIdIndexMap[item.graduation_requirement_id]][this.trainingSubitemsIdIndexMap[item.training_subitem_id]] + = true + }) + this.setState({ tableData }) + } + onCellClick = (rowIndex, colIndex, select) => { + console.log( rowIndex, colIndex, select ) + const ec_graduation_requirement_id = this.state.graduation_requirements[rowIndex].id + const ec_training_subitem_id = this.state.training_subitems[colIndex].id + const yearId = this.props.match.params.yearId + const url = `/ec_years/${yearId}/requirement_support_objectives.json` + const method = select ? axios.delete : axios.post + method(url, + select ? { + params: { + ec_graduation_requirement_id, + ec_training_subitem_id + } + } : { + ec_graduation_requirement_id, + ec_training_subitem_id + } + ).then((response) => { + if (response.data.status == 0) { + this.setState( + (prevState) => ({ + tableData : update(prevState.tableData, {[rowIndex]: {[colIndex]: {$set: select ? false : true}}}) + }) + ) + this.props.showNotification(`${select ? '取消' : '选择'}成功`) + } + }).catch((e) => { + + }) + if (select) { // 取消 + + } else { // 选择 + + } + } + render() { + const { match, history, current_user } = this.props + const { tableData, training_subitems, graduation_requirements, is_manager } = this.state + + const columns = training_subitems && [['毕业要求', '培养目标'], ...training_subitems.map(item => item.content)] + const columnIdIndexMap = {} + console.log(columns, tableData) + return ( + +
    + requirementVsObjective + +
    + + ); + } +} + +export default (RequirementVsObjective) ; diff --git a/public/react/src/modules/ecs/EcSetting/index.js b/public/react/src/modules/ecs/EcSetting/index.js index 69d309c46..fd3ac436a 100644 --- a/public/react/src/modules/ecs/EcSetting/index.js +++ b/public/react/src/modules/ecs/EcSetting/index.js @@ -40,6 +40,11 @@ const ReachCalculationInfo=Loadable({ loader: () => import('./reachCalculationInfo/index'), loading: Loading, }); +const RequirementVsObjective=Loadable({ + loader: () => import('./RequirementVsObjective/index'), + loading: Loading, +}); + class EcSetting extends React.Component { @@ -132,8 +137,13 @@ class EcSetting extends React.Component { render={ (props) => () }> () }> + () }> - + {/* 毕业要求对培养目标的支撑 */} + () }> + {/*学生*/} () }> From 3f637947f8532282a11166abc8fb5095b2872d9a Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 26 Sep 2019 15:05:27 +0800 Subject: [PATCH 127/394] ecs: fix --- .../ecs/requirement_support_objectives_controller.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/controllers/ecs/requirement_support_objectives_controller.rb b/app/controllers/ecs/requirement_support_objectives_controller.rb index d06dbe568..1abc5994f 100644 --- a/app/controllers/ecs/requirement_support_objectives_controller.rb +++ b/app/controllers/ecs/requirement_support_objectives_controller.rb @@ -48,6 +48,8 @@ class Ecs::RequirementSupportObjectivesController < Ecs::BaseController end def permit_params - params.require(%i[ec_graduation_requirement_id ec_training_subitem_id]) + hash = params.permit(%i[ec_graduation_requirement_id ec_training_subitem_id]) + hash[:ec_training_objective_id] = hash.delete(:ec_training_subitem_id) + hash end end \ No newline at end of file From 12f28bcfae2766af5905d758d0545bf1eadb5f20 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 26 Sep 2019 15:08:22 +0800 Subject: [PATCH 128/394] place --- .../modules/ecs/EcSetting/RequirementVsObjective/SelectTable.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/SelectTable.js b/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/SelectTable.js index 9e95d9eb8..5975cafb3 100644 --- a/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/SelectTable.js +++ b/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/SelectTable.js @@ -43,6 +43,7 @@ class SelectTable extends Component { { tableData.map((item, rowIndex) => { const cells = item.map((cell, colIndex) => { + // placement="bottom" if(colIndex == 0) return 指标点{rowIndex + 1} From ab211b4b745d2d16b60d19b9b527ec0cb8563fcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 26 Sep 2019 15:20:32 +0800 Subject: [PATCH 129/394] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=AF=95=E8=AE=BE?= =?UTF-8?q?=E5=BC=B9=E7=AA=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/AppConfig.js | 20 +++--- .../modules/courses/boards/BoardsListItem.js | 6 +- .../courses/busyWork/CommonWorkItem.js | 10 ++- .../graduation/topics/GraduateTopicItem.js | 6 +- .../react/src/modules/moop_cases/CaseNew.js | 28 ++++++-- .../react/src/modules/moop_cases/CaseTags.js | 71 ++++++++++--------- .../src/modules/moop_cases/css/moopCases.css | 8 ++- 7 files changed, 90 insertions(+), 59 deletions(-) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index 025db7f5c..f6598a3c4 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -21,16 +21,16 @@ let hashTimeout // TODO 开发期多个身份切换 let debugType ="" -if (isDev) { - const _search = window.location.search; - let parsed = {}; - if (_search) { - parsed = queryString.parse(_search); - } - debugType = window.location.search.indexOf('debug=t') != -1 ? 'teacher' : - window.location.search.indexOf('debug=s') != -1 ? 'student' : - window.location.search.indexOf('debug=a') != -1 ? 'admin' : parsed.debug || 'admin' -} +// if (isDev) { +// const _search = window.location.search; +// let parsed = {}; +// if (_search) { +// parsed = queryString.parse(_search); +// } +// debugType = window.location.search.indexOf('debug=t') != -1 ? 'teacher' : +// window.location.search.indexOf('debug=s') != -1 ? 'student' : +// window.location.search.indexOf('debug=a') != -1 ? 'admin' : parsed.debug || 'admin' +// } window._debugType = debugType; export function initAxiosInterceptors(props) { diff --git a/public/react/src/modules/courses/boards/BoardsListItem.js b/public/react/src/modules/courses/boards/BoardsListItem.js index a833f4c39..e27e7ad65 100644 --- a/public/react/src/modules/courses/boards/BoardsListItem.js +++ b/public/react/src/modules/courses/boards/BoardsListItem.js @@ -63,10 +63,10 @@ class BoardsListItem extends Component{
    onItemClick(discussMessage)}>
    40 ? discussMessage.subject : ''}`} placement="bottom"> - {discussMessage.subject}: {} : () => this.onTitleClick(discussMessage)} - >{discussMessage.subject} + >{discussMessage.subject}} { !!discussMessage.sticky && 置顶 } { diff --git a/public/react/src/modules/courses/busyWork/CommonWorkItem.js b/public/react/src/modules/courses/busyWork/CommonWorkItem.js index 0aebad415..c51606e35 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkItem.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkItem.js @@ -144,6 +144,9 @@ class CommonWorkItem extends Component{ text-overflow: ellipsis; white-space: nowrap; } + a:hover{ + color: #4cacff; + } ` } @@ -158,12 +161,15 @@ class CommonWorkItem extends Component{ mainList && isAdmin && } +
    this.props.onItemClick(Object.assign({}, item, {id: item.homework_id})) }>

    - + {item.name} + : {} : () => this.onItemClick(item)} - >{item.name} + >{item.name}} {/* 只有非课堂成员且作业是私有的情况下才会为true */} { diff --git a/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js b/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js index 2027cfb3a..afef56e1b 100644 --- a/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js +++ b/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js @@ -83,12 +83,16 @@ class GraduateTopicItem extends Component{ text-overflow:ellipsis; white-space:nowrap } + a:hover{ + color: #4cacff; + } `}

    { isNotMember? - {discussMessage.name} + {discussMessage.private_icon===true?{discussMessage.name}: + {discussMessage.name}} :"" } diff --git a/public/react/src/modules/moop_cases/CaseNew.js b/public/react/src/modules/moop_cases/CaseNew.js index 2fbe993bc..925536a1a 100644 --- a/public/react/src/modules/moop_cases/CaseNew.js +++ b/public/react/src/modules/moop_cases/CaseNew.js @@ -41,7 +41,8 @@ class CaseNew extends Component{ loading: false, checkTag:false, checkFile:false, - coverID:undefined + coverID:undefined, + library_tags:undefined } } @@ -132,6 +133,17 @@ class CaseNew extends Component{ if(this.props.match.params.caseID){ this.InitEditData(); } + let url=`/library_tags.json`; + axios.get(url).then((result) => { + console.log(result) + if(result.data.status===0){ + this.setState({ + library_tags:result.data.library_tags + }) + } + }).catch((error) => { + console.log(error); + }) } componentDidUpdate=(prevState)=>{ @@ -263,7 +275,7 @@ class CaseNew extends Component{ render(){ let { caseID } = this.props.match.params; let { CaseDetail } = this.props; - let { casesTags , contentFileList , imageUrl , checkTag , checkFile } = this.state; + let { casesTags , contentFileList , imageUrl , checkTag , checkFile,library_tags } = this.state; const {getFieldDecorator} = this.props.form; @@ -301,8 +313,8 @@ class CaseNew extends Component{ action:`${getUploadActionUrl()}`, onChange:this.handleChange, } - console.log('111'); - console.log(!caseID || (CaseDetail && CaseDetail.status == "pending")); + // console.log('111'); + // console.log(!caseID || (CaseDetail && CaseDetail.status == "pending")); return(
    :"" } +
    {this.props.children} {this.props.checkBoxValuestype===true?
    @@ -59,6 +60,7 @@ class ModalWrapper extends Component{
    { bottomRender }
    +
    ) } diff --git a/public/react/src/modules/user/account/ChangeHeaderPicModal.js b/public/react/src/modules/user/account/ChangeHeaderPicModal.js index 197e84a5c..0a2205261 100644 --- a/public/react/src/modules/user/account/ChangeHeaderPicModal.js +++ b/public/react/src/modules/user/account/ChangeHeaderPicModal.js @@ -1,5 +1,5 @@ import React, { Component } from "react"; -import { Modal } from "antd"; +import { Spin } from "antd"; import axios from 'axios' import ModalWrapper from "../../courses/common/ModalWrapper" import { Cropper, getUrl } from 'educoder' @@ -13,7 +13,7 @@ class ChangeHeaderPicModal extends Component{ constructor(props){ super(props); this.state={ - + uploading: false } } init = () => { @@ -85,12 +85,23 @@ class ChangeHeaderPicModal extends Component{ } - onOk = () => { + if (this.state.uploading == true) return; if (this.fileUploaded != true) { this.props.showNotification("请先上传图片") return; } + console.log(new Date().getTime()) + this.setState({ uploading: true }, () => { + window.setTimeout(() => { + console.log(new Date().getTime()) + this._onOk() + }, 10) + + }) + } + _onOk = () => { + var img_lg = document.getElementById(previewId); // https://github.com/niklasvh/html2canvas/issues/1908 // 截图小的显示框内的内容 @@ -115,9 +126,12 @@ class ChangeHeaderPicModal extends Component{ } else { this.doAfterUpdated(); } + this.setState({ uploading: false }) } }) .catch(function (error) { + this.setState({ uploading: false }) + console.log(error); }); }); @@ -142,6 +156,8 @@ class ChangeHeaderPicModal extends Component{ okText="保存" width={552} className="changeHeaderModal" + loading={this.state.uploading} + onCancel={() => this.setState({ uploading: false })} >
    @@ -436,7 +477,7 @@ class GraduationAcross extends Component{ onFocus={()=>this.changeFlag(true)} dropdownRender={menu => (
    -
    + {comment_status == 2 &&teachers&&teachers.length>10?
    -
    +
    :""} + {comment_status != 2 &&course_groups&&course_groups.length>10?
    + +
    :""} + {comment_status == 2 &&teacherList&&teacherList.length>2? this.checkonChange(e,teacherList)}>全选:""} + {comment_status != 2 &&course_groupsList&&course_groupsList.length>2? this.checkonChange(e,course_groupsList)}>全选:""} {menu}
    From d7008219e9eba7f5ed5326ee919ffa9cc14b3e25 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 26 Sep 2019 16:48:40 +0800 Subject: [PATCH 137/394] init --- .../EcSetting/RequirementVsObjective/index.js | 2 +- .../EcSetting/RequirementVsStandard/index.js | 128 ++++++++++++++++++ .../react/src/modules/ecs/EcSetting/index.js | 8 +- 3 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 public/react/src/modules/ecs/EcSetting/RequirementVsStandard/index.js diff --git a/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/index.js b/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/index.js index e4a944d95..dfc4aa663 100644 --- a/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/index.js +++ b/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/index.js @@ -45,7 +45,7 @@ class RequirementVsObjective extends Component { constructor(props) { super(props) this.state={ - ...testState + // ...testState } } diff --git a/public/react/src/modules/ecs/EcSetting/RequirementVsStandard/index.js b/public/react/src/modules/ecs/EcSetting/RequirementVsStandard/index.js new file mode 100644 index 000000000..45ea17811 --- /dev/null +++ b/public/react/src/modules/ecs/EcSetting/RequirementVsStandard/index.js @@ -0,0 +1,128 @@ +import React, { Component } from 'react'; + +import classNames from 'classnames' + +import axios from 'axios'; + +import { Table, Divider, Tag, Checkbox, InputNumber, Spin, Icon } from 'antd'; +import SelectTable from '../RequirementVsObjective/SelectTable' +import update from 'immutability-helper' + +class RequirementVsObjective extends Component { + constructor(props) { + super(props) + this.state={ + + } + } + + componentDidMount(){ + // this.init() + // return; + + const yearId = this.props.match.params.yearId + const url = `/ec_years/${yearId}/requirement_support_objectives.json` + axios.get(url).then((response) => { + if (response.data.graduation_requirements) { + this.setState( {...response.data} , () => { + this.init() + }) + } + }).catch((e) => { + + }) + } + init = () => { + this.graduationRequirementsIdIndexMap = {} + this.trainingSubitemsIdIndexMap = {} + this.state.graduation_requirements.forEach((item, index) => { + this.graduationRequirementsIdIndexMap[item.id] = index + }) + this.state.training_subitems.forEach((item, index) => { + // 对应table的列数 + this.trainingSubitemsIdIndexMap[item.id] = index + 1 + }) + const tableData = [] + this.state.graduation_requirements.forEach((item, index) => { + tableData.push([item.content, ...Array(this.state.training_subitems.length)]) + }) + this.state.requirement_support_objectives.forEach(item => { + tableData[this.graduationRequirementsIdIndexMap[item.graduation_requirement_id]][this.trainingSubitemsIdIndexMap[item.training_subitem_id]] + = true + }) + this.setState({ tableData }) + } + onCellClick = (rowIndex, colIndex, select) => { + console.log( rowIndex, colIndex, select ) + const ec_graduation_requirement_id = this.state.graduation_requirements[rowIndex].id + const ec_training_subitem_id = this.state.training_subitems[colIndex - 1].id + const yearId = this.props.match.params.yearId + const url = `/ec_years/${yearId}/requirement_support_objectives.json` + const method = select ? axios.delete : axios.post + method(url, + select ? { + params: { + ec_graduation_requirement_id, + ec_training_subitem_id + } + } : { + ec_graduation_requirement_id, + ec_training_subitem_id + } + ).then((response) => { + if (response.data.status == 0) { + this.setState( + (prevState) => ({ + tableData : update(prevState.tableData, {[rowIndex]: {[colIndex]: {$set: select ? false : true}}}) + }) + ) + this.props.showNotification(`${select ? '取消' : '选择'}成功`) + } + }).catch((e) => { + + }) + if (select) { // 取消 + + } else { // 选择 + + } + } + render() { + const { match, history, current_user } = this.props + const { tableData, training_subitems, graduation_requirements, is_manager } = this.state + + const columns = training_subitems && [['毕业要求', '培养目标'], ...training_subitems.map(item => item.content)] + const columnIdIndexMap = {} + console.log(columns, tableData) + return ( + +
    + +
    +

    + 表示支撑 + 表示不支撑 +

    + +
    +
    + + ); + } +} + +export default (RequirementVsObjective) ; diff --git a/public/react/src/modules/ecs/EcSetting/index.js b/public/react/src/modules/ecs/EcSetting/index.js index ad3e4caf0..b4a388744 100644 --- a/public/react/src/modules/ecs/EcSetting/index.js +++ b/public/react/src/modules/ecs/EcSetting/index.js @@ -44,7 +44,10 @@ const RequirementVsObjective=Loadable({ loader: () => import('./RequirementVsObjective/index'), loading: Loading, }); - +const RequirementVsStandard=Loadable({ + loader: () => import('./RequirementVsStandard/index'), + loading: Loading, +}); class EcSetting extends React.Component { @@ -143,6 +146,9 @@ class EcSetting extends React.Component { {/* 毕业要求对培养目标的支撑 */} () }> + {/* 毕业要求对通用标准的支撑 */} + () }> {/*学生*/} Date: Thu, 26 Sep 2019 16:56:14 +0800 Subject: [PATCH 138/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/Resource/Fileslistitem.js | 4 +--- .../src/modules/courses/boards/BoardsListItem.js | 5 ++--- .../src/modules/courses/busyWork/CommonWorkItem.js | 7 ++++--- .../src/modules/courses/exercise/ExerciseListItem.js | 4 +--- .../courses/graduation/tasks/GraduateTaskItem.js | 4 +--- .../courses/graduation/topics/GraduateTopicItem.js | 12 +++++------- .../react/src/modules/courses/poll/PollListItem.js | 4 +--- .../courses/shixunHomework/ShixunhomeWorkItem.js | 4 +--- 8 files changed, 16 insertions(+), 28 deletions(-) diff --git a/public/react/src/modules/courses/Resource/Fileslistitem.js b/public/react/src/modules/courses/Resource/Fileslistitem.js index fe0794a18..4713431ca 100644 --- a/public/react/src/modules/courses/Resource/Fileslistitem.js +++ b/public/react/src/modules/courses/Resource/Fileslistitem.js @@ -232,9 +232,7 @@ class Fileslistitem extends Component{ { this.props.isNotMember===true? discussMessage.is_lock === true ? - - {discussMessage.title} - + {discussMessage.title} :this.showfiles(discussMessage)} title={discussMessage.title} diff --git a/public/react/src/modules/courses/boards/BoardsListItem.js b/public/react/src/modules/courses/boards/BoardsListItem.js index e27e7ad65..021a41b7a 100644 --- a/public/react/src/modules/courses/boards/BoardsListItem.js +++ b/public/react/src/modules/courses/boards/BoardsListItem.js @@ -62,12 +62,11 @@ class BoardsListItem extends Component{
    onItemClick(discussMessage)}>
    - 40 ? discussMessage.subject : ''}`} placement="bottom"> - {canNotLink?{discussMessage.subject}:{discussMessage.subject}: {} : () => this.onTitleClick(discussMessage)} >{discussMessage.subject}} - { !!discussMessage.sticky && 置顶 } { diff --git a/public/react/src/modules/courses/busyWork/CommonWorkItem.js b/public/react/src/modules/courses/busyWork/CommonWorkItem.js index c51606e35..c92d91c48 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkItem.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkItem.js @@ -164,13 +164,14 @@ class CommonWorkItem extends Component{
    this.props.onItemClick(Object.assign({}, item, {id: item.homework_id})) }>

    - - {canNotLink? + {canNotLink? {item.name} : {} : () => this.onItemClick(item)} + title={item.name} >{item.name}} - {/* 只有非课堂成员且作业是私有的情况下才会为true */} { item.private_icon===true ? diff --git a/public/react/src/modules/courses/exercise/ExerciseListItem.js b/public/react/src/modules/courses/exercise/ExerciseListItem.js index 479c9710a..07606bd58 100644 --- a/public/react/src/modules/courses/exercise/ExerciseListItem.js +++ b/public/react/src/modules/courses/exercise/ExerciseListItem.js @@ -128,9 +128,7 @@ class ExerciseListItem extends Component{ { this.props.isNotMember()? item.lock_status === 0 ? - - {item.exercise_name} - + {item.exercise_name} : this.toDetailPage(`/courses/${coursesId}/exercises/${item.id}/student_exercise_list?tab=0`)}>{item.exercise_name}:"" } diff --git a/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js b/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js index 17ae8ca28..2b27571e2 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js @@ -247,9 +247,7 @@ class GraduateTaskItem extends Component{ { this.props.isNotMember===true?this.props.discussMessage.private_icon===true? - - {discussMessage.name} - + {discussMessage.name} :this.toDetailPage("/courses/"+coursesId+"/graduation_tasks/"+categoryid+"/"+taskid+"/list")} title={discussMessage.name} className="fl mt3 font-16 font-bd color-dark maxwidth580">{discussMessage.name}:"" diff --git a/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js b/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js index afef56e1b..d11c90703 100644 --- a/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js +++ b/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js @@ -90,18 +90,16 @@ class GraduateTopicItem extends Component{

    { isNotMember? - - {discussMessage.private_icon===true?{discussMessage.name}: - {discussMessage.name}} - :"" - + discussMessage.private_icon===true?{discussMessage.name}: + {discussMessage.name} + :"" } { isStudent? this.toDetailPage(`${discussMessage.id}`)} - className="fl mt3 font-16 font-bd color-dark maxwidth580">{discussMessage.name}:"" + className="fl mt3 font-16 font-bd color-dark maxwidth580" title={discussMessage.name}>{discussMessage.name}:"" } { - isAdmin? this.toDetailPage(`${discussMessage.id}`)} className="fl mt3 font-16 font-bd color-dark maxwidth580">{discussMessage.name}:"" + isAdmin? this.toDetailPage(`${discussMessage.id}`)} className="fl mt3 font-16 font-bd color-dark maxwidth580" title={discussMessage.name}>{discussMessage.name}:"" } { discussMessage.private_icon===true? diff --git a/public/react/src/modules/courses/poll/PollListItem.js b/public/react/src/modules/courses/poll/PollListItem.js index b4c2f108e..1e453d180 100644 --- a/public/react/src/modules/courses/poll/PollListItem.js +++ b/public/react/src/modules/courses/poll/PollListItem.js @@ -57,9 +57,7 @@ class PollListItem extends Component{

    { canNotLink ? - - {item.polls_name} - + {item.polls_name} : this.toDetailPage(`/courses/${coursesId}/polls/${item.id}/detail`)} className="fl font-16 font-bd mt2 color-grey-3 task-hide pointer" style={{"maxWidth":"600px"}} title={item.polls_name}>{item.polls_name} } diff --git a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js index 74692dcb8..e08fb7d8e 100644 --- a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js +++ b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js @@ -328,9 +328,7 @@ class ShixunhomeWorkItem extends Component{ { this.props.isNotMember===true? this.props.discussMessage.private_icon===true? - - {discussMessage.name} - + {discussMessage.name} : this.hrefjumpskip(`/courses/${this.props.match.params.coursesId}/${this.state.shixuntypes}/${discussMessage.homework_id}/list?tab=0`)} title={discussMessage.name} className="fl mt3 font-16 font-bd color-dark maxwidth580">{discussMessage.name}:"" From 2434161fbd268d91170fde6c4ca5749a2e52d0c4 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 26 Sep 2019 17:10:26 +0800 Subject: [PATCH 139/394] ecs: fix --- .../ecs/subitem_support_standards_controller.rb | 8 ++++---- .../ecs/subitem_support_standards/show.json.jbuilder | 7 ++++++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/controllers/ecs/subitem_support_standards_controller.rb b/app/controllers/ecs/subitem_support_standards_controller.rb index f718fb5f7..cb5870892 100644 --- a/app/controllers/ecs/subitem_support_standards_controller.rb +++ b/app/controllers/ecs/subitem_support_standards_controller.rb @@ -4,7 +4,7 @@ class Ecs::SubitemSupportStandardsController < Ecs::BaseController def show @graduation_standards = EcGraduationStandard.all - @graduation_subitems = current_year.ec_graduation_subitems + @graduation_subitems = current_year.ec_graduation_subitems.includes(:ec_graduation_requirement) ids = @graduation_subitems.map(&:id) @subitem_support_standards = EcRequireSubVsStandard.where(ec_graduation_subitem_id: ids, status: true) @@ -36,18 +36,18 @@ class Ecs::SubitemSupportStandardsController < Ecs::BaseController private def check_record_exists! - unless current_year.ec_graduation_subitems.exists?(id: params[:graduation_subitem_id]) + unless current_year.ec_graduation_subitems.exists?(id: params[:ec_graduation_subitem_id]) render_not_found return end - unless EcGraduationStandard.exists?(id: params[:graduation_standard_id]) + unless EcGraduationStandard.exists?(id: params[:ec_graduation_standard_id]) render_not_found return end end def permit_params - params.require(%i[graduation_subitem_id graduation_standard_id]) + params.permit(%i[ec_graduation_subitem_id ec_graduation_standard_id]) end end \ No newline at end of file diff --git a/app/views/ecs/subitem_support_standards/show.json.jbuilder b/app/views/ecs/subitem_support_standards/show.json.jbuilder index a92fe7000..ca4bd59f2 100644 --- a/app/views/ecs/subitem_support_standards/show.json.jbuilder +++ b/app/views/ecs/subitem_support_standards/show.json.jbuilder @@ -1,4 +1,9 @@ json.graduation_standards @graduation_standards, partial: 'ecs/shared/ec_graduation_standard', as: :ec_graduation_standard -json.graduation_subitems @graduation_subitems, partial: 'ecs/shared/ec_graduation_subitem', as: :ec_graduation_subitem +json.graduation_subitems do + json.array! @graduation_subitems do |graduation_subitem| + json.partial! 'ecs/shared/ec_graduation_subitem', ec_graduation_subitem: graduation_subitem + json.graduation_requirement_position graduation_subitem.ec_graduation_requirement.position + end +end json.subitem_support_standards @subitem_support_standards, partial: 'ecs/subitem_support_standards/shared/subitem_support_standard', as: :subitem_support_standard From ca03e891b146a03d22a974db0f5b8387cf2c485a Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 26 Sep 2019 17:18:24 +0800 Subject: [PATCH 140/394] admin: fix user edit --- app/services/admins/update_user_service.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/services/admins/update_user_service.rb b/app/services/admins/update_user_service.rb index c4755a1ae..41b5065d0 100644 --- a/app/services/admins/update_user_service.rb +++ b/app/services/admins/update_user_service.rb @@ -10,6 +10,8 @@ class Admins::UpdateUserService < ApplicationService def call user.assign_attributes(user_attributes) + user.mail = params[:mail].to_s.presence + user.phone = params[:phone].to_s.presence user.firstname = '' user.password = params[:password] if params[:password].present? From 6f142a850060ff6b4ac533aba704f3290822c389 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 26 Sep 2019 17:22:54 +0800 Subject: [PATCH 141/394] =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RequirementVsObjective/SelectTable.js | 4 +- .../EcSetting/RequirementVsStandard/index.js | 40 ++++++++++--------- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/SelectTable.js b/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/SelectTable.js index 81021cf88..9e357aebd 100644 --- a/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/SelectTable.js +++ b/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/SelectTable.js @@ -31,7 +31,7 @@ class SelectTable extends Component { if (index == 0) return {columns[0][0]}{columns[0][1]}; return ( - 目标{index} + {this.props.columnName || '目标'}{index} ) })} @@ -45,7 +45,7 @@ class SelectTable extends Component { const cells = item.map((cell, colIndex) => { // placement="bottom" if(colIndex == 0) return - 指标点{rowIndex + 1} + 指标点{this.props.firstColIndexArray ? this.props.firstColIndexArray[rowIndex] : rowIndex + 1} return ( this.props.onCellClick(rowIndex, colIndex , !!cell)}> diff --git a/public/react/src/modules/ecs/EcSetting/RequirementVsStandard/index.js b/public/react/src/modules/ecs/EcSetting/RequirementVsStandard/index.js index 45ea17811..a1d652cf2 100644 --- a/public/react/src/modules/ecs/EcSetting/RequirementVsStandard/index.js +++ b/public/react/src/modules/ecs/EcSetting/RequirementVsStandard/index.js @@ -21,9 +21,9 @@ class RequirementVsObjective extends Component { // return; const yearId = this.props.match.params.yearId - const url = `/ec_years/${yearId}/requirement_support_objectives.json` + const url = `/ec_years/${yearId}/subitem_support_standards.json` axios.get(url).then((response) => { - if (response.data.graduation_requirements) { + if (response.data.graduation_subitems) { this.setState( {...response.data} , () => { this.init() }) @@ -35,39 +35,41 @@ class RequirementVsObjective extends Component { init = () => { this.graduationRequirementsIdIndexMap = {} this.trainingSubitemsIdIndexMap = {} - this.state.graduation_requirements.forEach((item, index) => { + this.state.graduation_subitems.forEach((item, index) => { this.graduationRequirementsIdIndexMap[item.id] = index }) - this.state.training_subitems.forEach((item, index) => { + this.state.graduation_standards.forEach((item, index) => { // 对应table的列数 this.trainingSubitemsIdIndexMap[item.id] = index + 1 }) const tableData = [] - this.state.graduation_requirements.forEach((item, index) => { - tableData.push([item.content, ...Array(this.state.training_subitems.length)]) + const firstColIndexArray = [] + this.state.graduation_subitems.forEach((item, index) => { + tableData.push([item.content, ...Array(this.state.graduation_standards.length)]) + firstColIndexArray.push(`${item.position}-${item.graduation_requirement_position}`) }) - this.state.requirement_support_objectives.forEach(item => { - tableData[this.graduationRequirementsIdIndexMap[item.graduation_requirement_id]][this.trainingSubitemsIdIndexMap[item.training_subitem_id]] + this.state.subitem_support_standards.forEach(item => { + tableData[this.graduationRequirementsIdIndexMap[item.graduation_subitem_id]][this.trainingSubitemsIdIndexMap[item.graduation_standard_id]] = true }) - this.setState({ tableData }) + this.setState({ tableData, firstColIndexArray }) } onCellClick = (rowIndex, colIndex, select) => { console.log( rowIndex, colIndex, select ) - const ec_graduation_requirement_id = this.state.graduation_requirements[rowIndex].id - const ec_training_subitem_id = this.state.training_subitems[colIndex - 1].id + const ec_graduation_subitem_id = this.state.graduation_subitems[rowIndex].id + const ec_graduation_standard_id = this.state.graduation_standards[colIndex - 1].id const yearId = this.props.match.params.yearId - const url = `/ec_years/${yearId}/requirement_support_objectives.json` + const url = `/ec_years/${yearId}/subitem_support_standards.json` const method = select ? axios.delete : axios.post method(url, select ? { params: { - ec_graduation_requirement_id, - ec_training_subitem_id + ec_graduation_subitem_id, + ec_graduation_standard_id } } : { - ec_graduation_requirement_id, - ec_training_subitem_id + ec_graduation_subitem_id, + ec_graduation_standard_id } ).then((response) => { if (response.data.status == 0) { @@ -89,9 +91,9 @@ class RequirementVsObjective extends Component { } render() { const { match, history, current_user } = this.props - const { tableData, training_subitems, graduation_requirements, is_manager } = this.state + const { tableData, graduation_standards, graduation_subitems, is_manager, firstColIndexArray } = this.state - const columns = training_subitems && [['毕业要求', '培养目标'], ...training_subitems.map(item => item.content)] + const columns = graduation_standards && [['毕业要求', '通用标准'], ...graduation_standards.map(item => item.content)] const columnIdIndexMap = {} console.log(columns, tableData) return ( @@ -116,7 +118,9 @@ class RequirementVsObjective extends Component {

    From deeb7703ed576ea8630653e3bdb5a8893592dcbd Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Thu, 26 Sep 2019 17:24:52 +0800 Subject: [PATCH 142/394] =?UTF-8?q?=E6=AF=95=E8=AE=BE=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=AB=8B=E5=8D=B3=E5=8F=91=E5=B8=83=E5=90=8E=E5=8F=98=E6=88=90?= =?UTF-8?q?=E4=BA=86=E4=BA=A4=E5=8F=89=E8=AF=84=E9=98=85=E7=9A=84=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/graduation_tasks_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/graduation_tasks_controller.rb b/app/controllers/graduation_tasks_controller.rb index de48f9fdb..ecde1eef5 100644 --- a/app/controllers/graduation_tasks_controller.rb +++ b/app/controllers/graduation_tasks_controller.rb @@ -360,7 +360,7 @@ class GraduationTasksController < ApplicationController tasks.each do |task| task.end_time = Time.now - task.status = task.allow_late ? 2 : 3 + task.status = 2 task.save! end normal_status(0, "更新成功") From 3131ff9b531c12cc6de0e44cfc602b7e7ee5cf6b Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 26 Sep 2019 17:25:32 +0800 Subject: [PATCH 143/394] admin: fix edit user autocomplete --- app/views/admins/users/edit.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/admins/users/edit.html.erb b/app/views/admins/users/edit.html.erb index 22ac1f18e..abb003cbc 100644 --- a/app/views/admins/users/edit.html.erb +++ b/app/views/admins/users/edit.html.erb @@ -74,7 +74,7 @@
    <%= f.input :mail, as: :email, label: '邮箱地址', wrapper_html: { class: 'col-md-3' }, input_html: { class: 'col-sm-11' } %> - <%= f.input :phone, as: :tel, label: '手机号', wrapper_html: { class: 'col-md-3' }, input_html: { class: 'col-sm-11' } %> + <%= f.input :phone, as: :tel, label: '手机号', wrapper_html: { class: 'col-md-3' }, input_html: { class: 'col-sm-11', autocomplete: 'off' } %>
    @@ -124,8 +124,8 @@
    - <%= f.input :password, as: :password, label: '修改密码', wrapper_html: { class: 'col-md-3' }, input_html: { class: 'col-sm-11' } %> - <%= f.input :password_confirmation, as: :password, label: '确认密码', wrapper_html: { class: 'col-md-3' }, input_html: { class: 'col-sm-11' } %> + <%= f.input :password, as: :password, label: '修改密码', wrapper_html: { class: 'col-md-3' }, input_html: { class: 'col-sm-11', autocomplete: 'new-password' } %> + <%= f.input :password_confirmation, as: :password, label: '确认密码', wrapper_html: { class: 'col-md-3' }, input_html: { class: 'col-sm-11', autocomplete: 'new-password' } %>
    From 05b4bf893afc6793f820117e395314ef7347b72f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 26 Sep 2019 17:26:15 +0800 Subject: [PATCH 144/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/courses/graduation/tasks/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/graduation/tasks/index.js b/public/react/src/modules/courses/graduation/tasks/index.js index 4a7ee9710..49307c6fd 100644 --- a/public/react/src/modules/courses/graduation/tasks/index.js +++ b/public/react/src/modules/courses/graduation/tasks/index.js @@ -612,7 +612,7 @@ class GraduationTasks extends Component{ const category_id=this.props.match.params.Id; const graduationId=this.props.match.params.graduationId; // console.log(this.props.isCourseidentity()===isNotMember) - // console.log(category_id) + console.log(checkBoxValues) return( {/*提示*/} @@ -710,7 +710,7 @@ class GraduationTasks extends Component{ {this.props.isAdmin()?all_count===undefined?'' :all_count===0?"":
    - 已选 {checkBoxValues.length} 个 (不支持跨页勾选) + 已选 {checkBoxValues===undefined?0:checkBoxValues.length} 个 (不支持跨页勾选)
  • 删除
  • From 97fe089a725f5c691bb01230f7bd9b923ac6600a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 26 Sep 2019 17:28:31 +0800 Subject: [PATCH 145/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/courses/graduation/tasks/index.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/courses/graduation/tasks/index.js b/public/react/src/modules/courses/graduation/tasks/index.js index 49307c6fd..f33614e76 100644 --- a/public/react/src/modules/courses/graduation/tasks/index.js +++ b/public/react/src/modules/courses/graduation/tasks/index.js @@ -129,7 +129,7 @@ class GraduationTasks extends Component{ let {checkBoxValues,checkAllValue}=this.state; if(checkAllValue===false){ - if(checkBoxValues.length===0){ + if(checkBoxValues.length===0||checkAllValue===undefined){ return true } } @@ -612,7 +612,6 @@ class GraduationTasks extends Component{ const category_id=this.props.match.params.Id; const graduationId=this.props.match.params.graduationId; // console.log(this.props.isCourseidentity()===isNotMember) - console.log(checkBoxValues) return( {/*提示*/} @@ -737,7 +736,7 @@ class GraduationTasks extends Component{ border-radius: 2px; } `} - + { tasks&&tasks.map((item, index) => { // console.log(item) return ( From b0814f5600945d3d81418cd7ae99277098fd6a7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 27 Sep 2019 09:03:47 +0800 Subject: [PATCH 146/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/public/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/public/index.html b/public/react/public/index.html index 15f9780a9..321fbe0e5 100755 --- a/public/react/public/index.html +++ b/public/react/public/index.html @@ -3,7 +3,7 @@ - + From 9bd98fb62d5ee4257dc62385f629b1f126d5fc1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 27 Sep 2019 09:14:40 +0800 Subject: [PATCH 147/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/ecs/curriculum/CurriculumSubpage.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/ecs/curriculum/CurriculumSubpage.js b/public/react/src/modules/ecs/curriculum/CurriculumSubpage.js index a0df7f63b..a187e688d 100644 --- a/public/react/src/modules/ecs/curriculum/CurriculumSubpage.js +++ b/public/react/src/modules/ecs/curriculum/CurriculumSubpage.js @@ -16,7 +16,7 @@ class CurriculumSubpage extends Component { console.log(this.props.match.params); } Curriculumstructure=()=>{ - this.props.history.push(`/ecs/major_schools/${this.props.match.params.majorId}/years/${this.props.match.params.yearId}/subpage/courses`); + this.props.history.push(`/ecs/major_schools/${this.props.match.params.majorId}/years/${this.props.match.params.yearId}/subpage/courses/ec_course_support_setting/1`); } @@ -25,7 +25,7 @@ class CurriculumSubpage extends Component { // console.log(this.props); return (
    - this.Curriculumstructure()}>测试 + this.Curriculumstructure()}>点我进去课程体系
    ) } From 2e00d1413bf0ce6acf8ea295818a0327961ac021 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 27 Sep 2019 09:53:38 +0800 Subject: [PATCH 148/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/favicon.ico | Bin 0 -> 9049 bytes .../src/modules/ecs/curriculum/Curriculum.js | 1 + .../EcCompletionCalculation.js | 7 ++++--- .../EcCourseEvaluationsbottom.js | 16 +++++++++++----- .../subroute/ecCourseSupportSetting/index.js | 11 +++++++++-- 5 files changed, 25 insertions(+), 10 deletions(-) mode change 100644 => 100755 public/favicon.ico diff --git a/public/favicon.ico b/public/favicon.ico old mode 100644 new mode 100755 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..05b9d163e5267afb1d933b189a1d6210fc2fe634 GIT binary patch literal 9049 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 literal 0 HcmV?d00001 diff --git a/public/react/src/modules/ecs/curriculum/Curriculum.js b/public/react/src/modules/ecs/curriculum/Curriculum.js index f00589781..025f6740f 100644 --- a/public/react/src/modules/ecs/curriculum/Curriculum.js +++ b/public/react/src/modules/ecs/curriculum/Curriculum.js @@ -59,6 +59,7 @@ class Curriculum extends Component { // window.document.title = '课程达成评价结果'; } componentDidMount(){ + console.log("Curriculum"); console.log(this.props); } sync_course_data=()=>{ diff --git a/public/react/src/modules/ecs/subroute/ecCompletion_calculation/EcCompletionCalculation.js b/public/react/src/modules/ecs/subroute/ecCompletion_calculation/EcCompletionCalculation.js index 4be7c11d3..7480d3b83 100644 --- a/public/react/src/modules/ecs/subroute/ecCompletion_calculation/EcCompletionCalculation.js +++ b/public/react/src/modules/ecs/subroute/ecCompletion_calculation/EcCompletionCalculation.js @@ -54,9 +54,9 @@ class EcCompletionCalculation extends Component { let ec_course_id =this.props.match.params.ec_course_id; this.UpdateClassData(true); const Url =`/ec_major_schools/get_navigation_data?ec_course_id=`+ec_course_id; - axios.get(Url, { - withCredentials: true, - }) + axios.get(Url, { + withCredentials: true, + }) .then((response) => { if(response.status===200){ // if(response.data.allow_visit===false){ @@ -71,6 +71,7 @@ class EcCompletionCalculation extends Component { .catch(function (error) { console.log(error); }); + this.props.Ontitine("competition_calculation_info"); } targetsget_navigation_data=(ec_year_id,ec_course_id)=>{ diff --git a/public/react/src/modules/ecs/subroute/ecCourseEvaluations/EcCourseEvaluationsbottom.js b/public/react/src/modules/ecs/subroute/ecCourseEvaluations/EcCourseEvaluationsbottom.js index 59a8a560e..afce608f8 100644 --- a/public/react/src/modules/ecs/subroute/ecCourseEvaluations/EcCourseEvaluationsbottom.js +++ b/public/react/src/modules/ecs/subroute/ecCourseEvaluations/EcCourseEvaluationsbottom.js @@ -56,6 +56,7 @@ class EcCourseEvaluationsbottom extends Component { if(newec_course_idbottom!=undefined){ // const url ='ec_courses/:course_id/course_targets.json'; // const url = `/ec_course_achievement_methods?ec_course_id=`+newec_course_idbottom; + const url =`/ec_courses/${course_id}/course_targets/course_achievement_methods.json`; axios.get(url, { withCredentials: true, }) @@ -114,8 +115,10 @@ class EcCourseEvaluationsbottom extends Component { }); } componentDidMount(){ - let ec_course_id=this.props.match.params.ec_course_id; - const url = `/ec_course_achievement_methods?ec_course_id=`+ec_course_id; + let ec_course_id=this.props.match.params.ec_course_id; + const course_id = 706 + const url =`/ec_courses/${course_id}/course_targets/course_achievement_methods.json`; + // const url = `/ec_course_achievement_methods?ec_course_id=`+course_id; axios.get(url, { withCredentials: true, }) @@ -129,10 +132,11 @@ class EcCourseEvaluationsbottom extends Component { console.log(error); }); - this.getNavigationData(ec_course_id); + // this.getNavigationData(ec_course_id); this.setState({ - newec_course_idbottom:ec_course_id + newec_course_idbottom:course_id }) + this.props.Ontitine("evaluation_methods"); } editecCourseEvaluationslist=(e)=>{ let id =e.target.getAttribute("target_id"); @@ -555,7 +559,9 @@ class EcCourseEvaluationsbottom extends Component { } - var Url = '/ec_course_achievement_methods/create_evaluation_methods'; + // var Url = '/ec_course_achievement_methods/create_evaluation_methods'; + var Url = '/ec_courses/:course_id/course_targets/:target_id/course_achievement_methods.json'; + axios.post(Url, { ec_course_target_id: newec_course_target_id, achievement_methods:achievement_methods diff --git a/public/react/src/modules/ecs/subroute/ecCourseSupportSetting/index.js b/public/react/src/modules/ecs/subroute/ecCourseSupportSetting/index.js index bb6c2f5d9..dd6a72fe9 100644 --- a/public/react/src/modules/ecs/subroute/ecCourseSupportSetting/index.js +++ b/public/react/src/modules/ecs/subroute/ecCourseSupportSetting/index.js @@ -109,6 +109,7 @@ class EcCourseSupportSetting extends Component { } fetchCourseTargets = () => { const ec_course_id = this.props.match.params.ec_course_id; + //这里给了一个默认的参数。。。。。。。。。。。。。 const course_id = 706 const url = `/ec_courses/${course_id}/course_targets.json` // `/ec_courses/${ec_course_id}/ec_course_support_setting_data` @@ -179,11 +180,17 @@ class EcCourseSupportSetting extends Component { }); } componentDidMount = () => { - console.log('componentDidMount ' + this.props) + // console.log('componentDidMountEcCourseSupportSetting'); + // console.log(this.props); + // console.log(this.props.match); + // console.log(this.props.match.params); + // console.log(this.props.match.params.ec_course_id); + this.fetchCourseTargets(); const ec_course_id = this.props.match.params.ec_course_id; - this.getNavigationData(ec_course_id) + this.getNavigationData(ec_course_id); + this.props.Ontitine("ec_course_support_setting"); } setEditableMode = (mode) => { From a07cc733eccb6b8f7eb18e4420a1c82b352d7c49 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 27 Sep 2019 09:53:40 +0800 Subject: [PATCH 149/394] ecs: api modify --- .../ecs/course_targets/with_achievement_methods.json.jbuilder | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 app/views/ecs/course_targets/with_achievement_methods.json.jbuilder diff --git a/app/views/ecs/course_targets/with_achievement_methods.json.jbuilder b/app/views/ecs/course_targets/with_achievement_methods.json.jbuilder new file mode 100644 index 000000000..689504ec3 --- /dev/null +++ b/app/views/ecs/course_targets/with_achievement_methods.json.jbuilder @@ -0,0 +1,2 @@ + +json.course_targets @course_targets, partial: 'ecs/course_targets/shared/ec_course_target_with_achievement_methods', as: :ec_course_target From 611dc5d29c599f48625036fee67560d92b595bdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 27 Sep 2019 10:00:22 +0800 Subject: [PATCH 150/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EcCompletionCalculation.js | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/public/react/src/modules/ecs/subroute/ecCompletion_calculation/EcCompletionCalculation.js b/public/react/src/modules/ecs/subroute/ecCompletion_calculation/EcCompletionCalculation.js index 7480d3b83..05ec1805b 100644 --- a/public/react/src/modules/ecs/subroute/ecCompletion_calculation/EcCompletionCalculation.js +++ b/public/react/src/modules/ecs/subroute/ecCompletion_calculation/EcCompletionCalculation.js @@ -51,12 +51,13 @@ class EcCompletionCalculation extends Component { } componentDidMount(){ - let ec_course_id =this.props.match.params.ec_course_id; - this.UpdateClassData(true); - const Url =`/ec_major_schools/get_navigation_data?ec_course_id=`+ec_course_id; - axios.get(Url, { - withCredentials: true, - }) + // let ec_course_id =this.props.match.params.ec_course_id; + // this.UpdateClassData(true); + + // const url =`/ec_major_schools/get_navigation_data?ec_course_id=`+ec_course_id; + const ec_course_id=706; + const url =`/ec_courses/${ec_course_id}/evaluation.json`; + axios.get(url) .then((response) => { if(response.status===200){ // if(response.data.allow_visit===false){ From 994ad50fd5df42c83f188b443a0353dab93a3df9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 27 Sep 2019 10:06:36 +0800 Subject: [PATCH 151/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/graduation/tasks/GraduationTaskssettinglist.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js index c18dcfc53..30dd831bd 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js @@ -971,9 +971,8 @@ class GraduationTaskssettinglist extends Component{ white-space: nowrap; } .ant-table-tbody>tr>td, .ant-table-thead>tr>th{ - padding: 16px 10px + padding:16px 8px; } - ` } From 40363b4d975045679173418ac15dae919314c1af Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 27 Sep 2019 10:08:14 +0800 Subject: [PATCH 152/394] =?UTF-8?q?=E9=87=91=E8=AF=BE=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=E5=AD=A6=E4=B9=A0=E5=92=8C=E5=AE=9E=E8=B7=B5=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E7=9A=84=E7=AB=A0=E8=8A=82=E5=88=97=E8=A1=A8=E6=80=A7=E8=83=BD?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/courses_controller.rb | 3 +- app/controllers/exercises_controller.rb | 138 +++++++++--------- app/controllers/stages_controller.rb | 3 +- app/helpers/stages_helper.rb | 4 +- .../courses/online_learning.json.jbuilder | 2 +- app/views/stages/_stage.json.jbuilder | 2 +- app/views/stages/index.json.jbuilder | 2 +- 7 files changed, 77 insertions(+), 77 deletions(-) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 812a139dc..0e093460f 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -269,8 +269,9 @@ class CoursesController < ApplicationController def online_learning @subject = @course.subject - @stages = @course.course_stages + @stages = @course.course_stages.includes(:shixuns) @user = current_user + @myshixuns = @user.myshixuns.where(shixun_id: @course.course_stage_shixuns.pluck(:shixun_id)) @start_learning = @user_course_identity == Course::STUDENT && @course.learning?(current_user.id) end diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index 3be35345e..28b5d84ef 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -25,85 +25,83 @@ class ExercisesController < ApplicationController include ExercisesHelper def index - ActiveRecord::Base.transaction do - begin - # 按发布时间或创建时间排序 - @exercises_all = @course.exercises - member_show_exercises = @exercises_all.is_exercise_published #已发布的或已截止的试卷 - @current_user_ = current_user - - # 课堂的学生人数 - @course_all_members = @course.students #当前课堂的全部学生 - @current_student = @course_all_members.course_find_by_ids("user_id",current_user.id) #当前用户是否为课堂的学生 - - # exercises的不同用户群体的显示 - if @user_course_identity < Course::STUDENT # @is_teacher_or 1为老师/管理员/助教 - @is_teacher_or = 1 - @exercises = @exercises_all #老师能看到全部的试卷,不管是已发布的/未发布的/已截止的/统一设置的/私有设置的(看到内容不同) - elsif @user_course_identity == Course::STUDENT # 2为课堂成员,能看到统一设置的和自己班级的 - @is_teacher_or = 2 - @member_group_id = @current_student.first.try(:course_group_id).to_i # 成员的分班id,默认为0 - if @member_group_id == 0 #表示是课堂的未分班成员,只能查看统一设置的试卷(已发布的/已截止的) - @exercises = member_show_exercises.exists? ? member_show_exercises.unified_setting : [] - else #已分班级的成员,可以查看统一设置和单独设置(试卷是发布在该班级)试卷 - # 已发布 当前用户班级分组的 试卷id - not_exercise_ids = @course.exercise_group_settings.exercise_group_not_published.where("course_group_id = #{@member_group_id}").pluck(:exercise_id) - @exercises = member_show_exercises.where.not(id: not_exercise_ids) - end - else #用户未登陆或不是该课堂成员,仅显示统一设置的(已发布的/已截止的),如有公开,则不显示锁,不公开,则显示锁 - @is_teacher_or = 0 - @exercises = member_show_exercises.unified_setting + begin + # 按发布时间或创建时间排序 + @exercises_all = @course.exercises + member_show_exercises = @exercises_all.is_exercise_published #已发布的或已截止的试卷 + @current_user_ = current_user + + # 课堂的学生人数 + @course_all_members = @course.students #当前课堂的全部学生 + @current_student = @course_all_members.course_find_by_ids("user_id",current_user.id) #当前用户是否为课堂的学生 + + # exercises的不同用户群体的显示 + if @user_course_identity < Course::STUDENT # @is_teacher_or 1为老师/管理员/助教 + @is_teacher_or = 1 + @exercises = @exercises_all #老师能看到全部的试卷,不管是已发布的/未发布的/已截止的/统一设置的/私有设置的(看到内容不同) + elsif @user_course_identity == Course::STUDENT # 2为课堂成员,能看到统一设置的和自己班级的 + @is_teacher_or = 2 + @member_group_id = @current_student.first.try(:course_group_id).to_i # 成员的分班id,默认为0 + if @member_group_id == 0 #表示是课堂的未分班成员,只能查看统一设置的试卷(已发布的/已截止的) + @exercises = member_show_exercises.exists? ? member_show_exercises.unified_setting : [] + else #已分班级的成员,可以查看统一设置和单独设置(试卷是发布在该班级)试卷 + # 已发布 当前用户班级分组的 试卷id + not_exercise_ids = @course.exercise_group_settings.exercise_group_not_published.where("course_group_id = #{@member_group_id}").pluck(:exercise_id) + @exercises = member_show_exercises.where.not(id: not_exercise_ids) end + else #用户未登陆或不是该课堂成员,仅显示统一设置的(已发布的/已截止的),如有公开,则不显示锁,不公开,则显示锁 + @is_teacher_or = 0 + @exercises = member_show_exercises.unified_setting + end - if @exercises.size > 0 - if params[:type].present? - choose_type = params[:type].to_i - ex_setting_ids = [] - if @is_teacher_or != 2 - @exercises = @exercises.where("exercise_status = #{choose_type}") - else - case choose_type - when 1 - ex_setting_ids = @course.exercise_group_settings.where("course_group_id = #{@member_group_id}").exercise_group_not_published.pluck(:exercise_id) - when 2 - ex_setting_ids = @course.exercise_group_settings.where("course_group_id = #{@member_group_id}") - .where("publish_time is not null and publish_time <= ? and end_time > ?",Time.now,Time.now).pluck(:exercise_id) - when 3 - ex_setting_ids = @course.exercise_group_settings.where("course_group_id = #{@member_group_id}").exercise_group_ended.pluck(:exercise_id) - end - unified_setting_ids = @exercises.unified_setting.where("exercise_status = #{choose_type}").pluck(:id) - ex_ids = (ex_setting_ids + unified_setting_ids).uniq - @exercises = @exercises.where(id: ex_ids) + if @exercises.size > 0 + if params[:type].present? + choose_type = params[:type].to_i + ex_setting_ids = [] + if @is_teacher_or != 2 + @exercises = @exercises.where("exercise_status = #{choose_type}") + else + case choose_type + when 1 + ex_setting_ids = @course.exercise_group_settings.where("course_group_id = #{@member_group_id}").exercise_group_not_published.pluck(:exercise_id) + when 2 + ex_setting_ids = @course.exercise_group_settings.where("course_group_id = #{@member_group_id}") + .where("publish_time is not null and publish_time <= ? and end_time > ?",Time.now,Time.now).pluck(:exercise_id) + when 3 + ex_setting_ids = @course.exercise_group_settings.where("course_group_id = #{@member_group_id}").exercise_group_ended.pluck(:exercise_id) end + unified_setting_ids = @exercises.unified_setting.where("exercise_status = #{choose_type}").pluck(:id) + ex_ids = (ex_setting_ids + unified_setting_ids).uniq + @exercises = @exercises.where(id: ex_ids) end + end - if params[:search].present? - search_type = params[:search].to_s.strip - @exercises = @exercises.exercise_search(search_type) - end - - @exercises_select_count = @exercises.size # 全部页面,需返回 - @exercises = @exercises.distinct.order( "IF(ISNULL(publish_time),0,1), publish_time DESC,created_at DESC") #出现错误 - - # 分页 - @page = params[:page] || 1 - @limit = params[:limit] || 15 - @exercises = @exercises.page(@page).per(@limit) - @exercises = @exercises&.includes(:published_settings) - else - @exercises = [] + if params[:search].present? + search_type = params[:search].to_s.strip + @exercises = @exercises.exercise_search(search_type) end - @course_all_members_count = @course_all_members.size #当前课堂的学生数 - @exercises_count = @exercises_all.size # 全部页面,需返回 - @exercises_unpublish_counts = @exercises_all.exercise_by_status(1).size #未发布的试卷数 - @exercises_published_counts = @exercises_count - @exercises_unpublish_counts # 已发布的试卷数,包含已截止的 + @exercises_select_count = @exercises.size # 全部页面,需返回 + @exercises = @exercises.distinct.order( "IF(ISNULL(publish_time),0,1), publish_time DESC,created_at DESC") #出现错误 - rescue Exception => e - uid_logger_error(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback + # 分页 + @page = params[:page] || 1 + @limit = params[:limit] || 15 + @exercises = @exercises.page(@page).per(@limit) + @exercises = @exercises&.includes(:published_settings) + else + @exercises = [] end + + @course_all_members_count = @course_all_members.size #当前课堂的学生数 + @exercises_count = @exercises_all.size # 全部页面,需返回 + @exercises_unpublish_counts = @exercises_all.exercise_by_status(1).size #未发布的试卷数 + @exercises_published_counts = @exercises_count - @exercises_unpublish_counts # 已发布的试卷数,包含已截止的 + + rescue Exception => e + uid_logger_error(e.message) + tip_exception(e.message) + raise ActiveRecord::Rollback end end diff --git a/app/controllers/stages_controller.rb b/app/controllers/stages_controller.rb index b0b072f83..0abd3c362 100644 --- a/app/controllers/stages_controller.rb +++ b/app/controllers/stages_controller.rb @@ -6,7 +6,8 @@ class StagesController < ApplicationController def index @user = current_user - @stages = @subject.stages + @stages = @subject.stages.includes(:shixuns) + @myshixuns = @user.myshixuns.where(shixun_id: @subject.stage_shixuns.pluck(:shixun_id)) end def create diff --git a/app/helpers/stages_helper.rb b/app/helpers/stages_helper.rb index e0df514e3..93c466c46 100644 --- a/app/helpers/stages_helper.rb +++ b/app/helpers/stages_helper.rb @@ -1,8 +1,8 @@ module StagesHelper # 章节实训的通关情况 - def stage_myshixun_status shixun, user - myshixun = Myshixun.where(user_id: user.id, shixun_id: shixun.id).take + def stage_myshixun_status myshixun + # myshixun = Myshixun.where(user_id: user.id, shixun_id: shixun.id).take myshixun.try(:status) == 1 ? 1 : 0 end diff --git a/app/views/courses/online_learning.json.jbuilder b/app/views/courses/online_learning.json.jbuilder index b48cd9e23..95b44238c 100644 --- a/app/views/courses/online_learning.json.jbuilder +++ b/app/views/courses/online_learning.json.jbuilder @@ -1,5 +1,5 @@ json.stages @stages do |stage| - json.partial! 'stages/stage', locals: {stage: stage, user:@user, subject:@subject} + json.partial! 'stages/stage', locals: {stage: stage, user: @user, subject: @subject, myshixuns: @myshixuns} end # json.description @subject&.description diff --git a/app/views/stages/_stage.json.jbuilder b/app/views/stages/_stage.json.jbuilder index db00ad844..e5d2be82d 100644 --- a/app/views/stages/_stage.json.jbuilder +++ b/app/views/stages/_stage.json.jbuilder @@ -15,7 +15,7 @@ json.shixuns_list do json.shixun_name shixun.name json.shixun_hidden shixun.hidden json.identifier shixun.identifier - json.complete_status stage_myshixun_status(shixun, user) + json.complete_status stage_myshixun_status(myshixuns.select{|ms| ms.shixun_id == shixun.id}.first) json.shixun_status stage_shixun_status(subject.status, shixun.status, shixun.hidden) end end \ No newline at end of file diff --git a/app/views/stages/index.json.jbuilder b/app/views/stages/index.json.jbuilder index d186088c4..b7c61d9cf 100644 --- a/app/views/stages/index.json.jbuilder +++ b/app/views/stages/index.json.jbuilder @@ -1,3 +1,3 @@ json.stages @stages do |stage| - json.partial! 'stage', locals: {stage: stage, user:@user, subject:@subject} + json.partial! 'stage', locals: {stage: stage, user: @user, subject: @subject, myshixuns: @myshixuns} end \ No newline at end of file From 3aa2c03d01a75f1fe8be946f01987002e902f878 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 27 Sep 2019 10:08:54 +0800 Subject: [PATCH 153/394] ecs: fix --- app/controllers/ecs/course_targets_controller.rb | 4 +++- app/services/ecs/query_course_evaluation_service.rb | 2 +- .../shared/_ec_course_evaluation_only.json.jbuilder | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/app/controllers/ecs/course_targets_controller.rb b/app/controllers/ecs/course_targets_controller.rb index 744840c39..e5ac4b36e 100644 --- a/app/controllers/ecs/course_targets_controller.rb +++ b/app/controllers/ecs/course_targets_controller.rb @@ -19,7 +19,9 @@ class Ecs::CourseTargetsController < Ecs::CourseBaseController end def with_achievement_methods - @course_targets = current_course.ec_course_targets.includes(:ec_graduation_subitems, :ec_course_achievement_methods) + @course_targets = current_course.ec_course_targets + .includes(:ec_graduation_subitems, + ec_course_achievement_methods: [:ec_course_evaluation, :ec_course_evaluation_subitems]) end private diff --git a/app/services/ecs/query_course_evaluation_service.rb b/app/services/ecs/query_course_evaluation_service.rb index 22e0ce1f4..fd1619076 100644 --- a/app/services/ecs/query_course_evaluation_service.rb +++ b/app/services/ecs/query_course_evaluation_service.rb @@ -29,7 +29,7 @@ class Ecs::QueryCourseEvaluationService < ApplicationService support = subitem.ec_course_supports.find_by(ec_course_id: ec_course.id) - weight = support.weights.to_f + weight = support&.weights.to_f objective_achievement = (weight * ec_course.ec_year.calculation_value.to_f).round(3) target_total_rates = 0 diff --git a/app/views/ecs/course_evaluations/shared/_ec_course_evaluation_only.json.jbuilder b/app/views/ecs/course_evaluations/shared/_ec_course_evaluation_only.json.jbuilder index 776d446f7..010109524 100644 --- a/app/views/ecs/course_evaluations/shared/_ec_course_evaluation_only.json.jbuilder +++ b/app/views/ecs/course_evaluations/shared/_ec_course_evaluation_only.json.jbuilder @@ -1 +1 @@ -json.extract! ec_course_evaluation, :id, :name, :evaluation_count, :status +json.extract! ec_course_evaluation, :id, :name, :evluation_count, :status From 89aed376b890965526c3c7755b9344823742518b Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 27 Sep 2019 10:11:13 +0800 Subject: [PATCH 154/394] fix ecs column name --- app/models/ec_course_evaluation.rb | 1 + .../shared/_ec_course_evaluation_only.json.jbuilder | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/models/ec_course_evaluation.rb b/app/models/ec_course_evaluation.rb index 6b778de66..b3398d647 100644 --- a/app/models/ec_course_evaluation.rb +++ b/app/models/ec_course_evaluation.rb @@ -11,6 +11,7 @@ class EcCourseEvaluation < ApplicationRecord enum score_type: { detail: 1, average: 2 }, _suffix: :score_type # :detail_score_type?, :average_score_type? accepts_nested_attributes_for :ec_course_evaluation_subitems, allow_destroy: true + alias_method :evaluation_count, :evluation_count def imported? import_status? diff --git a/app/views/ecs/course_evaluations/shared/_ec_course_evaluation_only.json.jbuilder b/app/views/ecs/course_evaluations/shared/_ec_course_evaluation_only.json.jbuilder index 010109524..776d446f7 100644 --- a/app/views/ecs/course_evaluations/shared/_ec_course_evaluation_only.json.jbuilder +++ b/app/views/ecs/course_evaluations/shared/_ec_course_evaluation_only.json.jbuilder @@ -1 +1 @@ -json.extract! ec_course_evaluation, :id, :name, :evluation_count, :status +json.extract! ec_course_evaluation, :id, :name, :evaluation_count, :status From 4e8e88386df006a0f8c78f2d37ae8f82e898a0cb Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 27 Sep 2019 10:13:56 +0800 Subject: [PATCH 155/394] fix --- app/models/ec_course_evaluation.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/ec_course_evaluation.rb b/app/models/ec_course_evaluation.rb index b3398d647..e96f1c98b 100644 --- a/app/models/ec_course_evaluation.rb +++ b/app/models/ec_course_evaluation.rb @@ -11,7 +11,7 @@ class EcCourseEvaluation < ApplicationRecord enum score_type: { detail: 1, average: 2 }, _suffix: :score_type # :detail_score_type?, :average_score_type? accepts_nested_attributes_for :ec_course_evaluation_subitems, allow_destroy: true - alias_method :evaluation_count, :evluation_count + alias_attribute :evaluation_count, :evluation_count def imported? import_status? From 2561d437a33f6843e710752e1c18d6b72568950b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 27 Sep 2019 10:17:05 +0800 Subject: [PATCH 156/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EcCompletionCalculation.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/public/react/src/modules/ecs/subroute/ecCompletion_calculation/EcCompletionCalculation.js b/public/react/src/modules/ecs/subroute/ecCompletion_calculation/EcCompletionCalculation.js index 05ec1805b..4525afe7e 100644 --- a/public/react/src/modules/ecs/subroute/ecCompletion_calculation/EcCompletionCalculation.js +++ b/public/react/src/modules/ecs/subroute/ecCompletion_calculation/EcCompletionCalculation.js @@ -268,11 +268,11 @@ class EcCompletionCalculation extends Component { this.setState({ Spintype:true }) - let {ec_course_id}=this.state; - const Orl =`/ec_courses/`+ec_course_id+`/sync_data`; - axios.get(Orl, { - withCredentials:true, - }) + // let {ec_course_id}=this.state; + const ec_course_id=706; + // const Orl =`/ec_courses/`+ec_course_id+`/sync_data`; + const Orl =`/ec_courses/${ec_course_id}/evaluation.json`; + axios.get(Orl) .then((response) => { if(response.data.status===1){ this.setState({ From f1dd73de1c88ebaf3dc8340dfb8fc9ff2444384d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 27 Sep 2019 10:26:30 +0800 Subject: [PATCH 157/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/graduation/style.css | 16 ++++++++-------- .../courses/graduation/tasks/GraduationAcross.js | 3 +++ .../shixunchild/Repository/RepositoryAddFile.js | 4 ++-- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/public/react/src/modules/courses/graduation/style.css b/public/react/src/modules/courses/graduation/style.css index e2f497046..cf438a6a4 100644 --- a/public/react/src/modules/courses/graduation/style.css +++ b/public/react/src/modules/courses/graduation/style.css @@ -44,13 +44,13 @@ .TopicDetailTable .bottomBody li:last-child{border-bottom: none;} .acrossSureBtn{ - width:40px; - height:24px; - line-height: 20px; - /*border:1px solid rgba(76,172,255,1);*/ - /*color: #4CACFF!important;*/ - float: left; - border-radius:4px; - text-align: center + width: 40px; + height: 24px; + line-height: 18px; + /* border: 1px solid rgba(76,172,255,1); */ + /* color: #4CACFF!important; */ + float: left; + /* border-radius: 4px; */ + text-align: center; } diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js b/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js index cb322e1e7..98cb883d8 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js @@ -388,6 +388,9 @@ class GraduationAcross extends Component{ body{ overflow: hidden !important; } + .closeIcon{ + font-size: 22px !important; + } ` } :""} diff --git a/public/react/src/modules/tpm/shixunchild/Repository/RepositoryAddFile.js b/public/react/src/modules/tpm/shixunchild/Repository/RepositoryAddFile.js index 7fe6e2bcd..9ca535bb4 100644 --- a/public/react/src/modules/tpm/shixunchild/Repository/RepositoryAddFile.js +++ b/public/react/src/modules/tpm/shixunchild/Repository/RepositoryAddFile.js @@ -92,7 +92,7 @@ class RepositoryAddFile extends Component { if(!value){ callback('文件名不能为空'); }else if (value == "/" || value.indexOf('.') == -1 ) { - callback('请输入正确的文件路径,如:src/HelloWord.java'); + callback('请输入正确的文件路径,如:src/HelloWorld.java'); }else{ callback(); } @@ -162,7 +162,7 @@ class RepositoryAddFile extends Component { validator:this.checkPath }] })( - + )}
    From 1c535ff934a24c20ab52e4cb743ba42cbc78c6f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 27 Sep 2019 10:28:35 +0800 Subject: [PATCH 158/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/tpm/shixunchild/Repository/Repository.js | 2 +- .../modules/tpm/shixunchild/Repository/RepositoryAddFile.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/tpm/shixunchild/Repository/Repository.js b/public/react/src/modules/tpm/shixunchild/Repository/Repository.js index 58379b1e8..85659a3a6 100644 --- a/public/react/src/modules/tpm/shixunchild/Repository/Repository.js +++ b/public/react/src/modules/tpm/shixunchild/Repository/Repository.js @@ -151,7 +151,7 @@ class Repository extends Component {

    { $('#repository_url_tip').hide(); }}>知道了

    + onClick={() => { $('#repository_url_tip').css('display') === 'none'}}>知道了

    diff --git a/public/react/src/modules/tpm/shixunchild/Repository/RepositoryAddFile.js b/public/react/src/modules/tpm/shixunchild/Repository/RepositoryAddFile.js index 7fe6e2bcd..9ca535bb4 100644 --- a/public/react/src/modules/tpm/shixunchild/Repository/RepositoryAddFile.js +++ b/public/react/src/modules/tpm/shixunchild/Repository/RepositoryAddFile.js @@ -92,7 +92,7 @@ class RepositoryAddFile extends Component { if(!value){ callback('文件名不能为空'); }else if (value == "/" || value.indexOf('.') == -1 ) { - callback('请输入正确的文件路径,如:src/HelloWord.java'); + callback('请输入正确的文件路径,如:src/HelloWorld.java'); }else{ callback(); } @@ -162,7 +162,7 @@ class RepositoryAddFile extends Component { validator:this.checkPath }] })( - + )}
    From e683b25ead9f89b44ae402ed03972dccffa39a80 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 27 Sep 2019 10:31:46 +0800 Subject: [PATCH 159/394] =?UTF-8?q?=E5=9C=A8=E7=BA=BF=E5=AD=A6=E4=B9=A0?= =?UTF-8?q?=E7=9A=84=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/courses_controller.rb | 2 +- app/helpers/courses_helper.rb | 4 ++-- app/models/course.rb | 5 ++--- app/views/courses/online_learning.json.jbuilder | 4 ++-- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 0e093460f..4bfc236a1 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -272,7 +272,7 @@ class CoursesController < ApplicationController @stages = @course.course_stages.includes(:shixuns) @user = current_user @myshixuns = @user.myshixuns.where(shixun_id: @course.course_stage_shixuns.pluck(:shixun_id)) - @start_learning = @user_course_identity == Course::STUDENT && @course.learning?(current_user.id) + @start_learning = @user_course_identity == Course::STUDENT && @myshixuns.present? end def search_course_list diff --git a/app/helpers/courses_helper.rb b/app/helpers/courses_helper.rb index 5ca4eb773..d670614d5 100644 --- a/app/helpers/courses_helper.rb +++ b/app/helpers/courses_helper.rb @@ -269,8 +269,8 @@ module CoursesHelper group_info end - def last_subject_shixun user_id, course - myshixun = Myshixun.where(user_id: user_id, shixun_id: course.shixuns).order("updated_at desc").first + def last_subject_shixun course, myshixuns + myshixun = myshixuns.sort{|x,y| y[:updated_at] <=> x[:updated_at] }.first return "" unless myshixun stage_shixun = course.course_stage_shixuns.where(shixun_id: myshixun.shixun_id).take progress = stage_shixun&.course_stage&.position.to_s + "-" + stage_shixun&.position.to_s + " " + myshixun.shixun&.name diff --git a/app/models/course.rb b/app/models/course.rb index ba818449e..6dd361733 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -354,9 +354,8 @@ class Course < ApplicationRecord Myshixun.where(user_id: user_id, shixun_id: shixuns).exists? end - def my_subject_progress - my_challenge_count = Game.joins(:challenge).where(user_id: User.current.id, status: 2, challenges: {shixun_id: shixuns.published_closed}). - pluck(:challenge_id).uniq.size + def my_subject_progress myshixuns + my_challenge_count = Game.where(myshixun_id: myshixuns.pluck(:id), status: 2).pluck(:challenge_id).uniq.size course_challeng_count = shixuns.pluck(:challenges_count).sum count = course_challeng_count == 0 ? 0 : ((my_challenge_count.to_f / course_challeng_count).round(2) * 100).to_i end diff --git a/app/views/courses/online_learning.json.jbuilder b/app/views/courses/online_learning.json.jbuilder index 95b44238c..d6b3db136 100644 --- a/app/views/courses/online_learning.json.jbuilder +++ b/app/views/courses/online_learning.json.jbuilder @@ -7,6 +7,6 @@ end json.start_learning @start_learning json.subject_id @subject.id -json.learned @start_learning ? @course.my_subject_progress : 0 +json.learned @start_learning ? @course.my_subject_progress(@myshixuns) : 0 -json.last_shixun @start_learning ? last_subject_shixun(@user.id, @course) : "" \ No newline at end of file +json.last_shixun @start_learning ? last_subject_shixun(@course, @myshixuns) : "" \ No newline at end of file From 032e5dd3f264fc3692b470ba56efb34ae5ebf17b Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 27 Sep 2019 10:53:09 +0800 Subject: [PATCH 160/394] =?UTF-8?q?=E8=BF=99=E9=87=8C=E4=BC=9A=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E5=BE=88=E9=95=BF=E7=9A=84=E5=AD=97=E7=AC=A6=E4=B8=B2?= =?UTF-8?q?=EF=BC=8C=E5=A6=82=E6=9E=9C=E4=B8=8D=E6=8A=98=E8=A1=8C=E4=BC=9A?= =?UTF-8?q?=E5=BD=B1=E5=93=8D=E9=98=85=E8=AF=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/stylesheets/educoder/edu-all.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css index c20b648db..0b3f53503 100644 --- a/public/stylesheets/educoder/edu-all.css +++ b/public/stylesheets/educoder/edu-all.css @@ -3739,7 +3739,8 @@ a.singlepublishtwo{ } .ant-tooltip{ - max-width: 100% !important; + /* 这里会存在很长的字符串,如果不折行会影响阅读 */ + max-width: 600px !important; } .square-main p{ From c08eaf8012912e7284c586eaa4fe5f0cb85e3d03 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 27 Sep 2019 11:01:43 +0800 Subject: [PATCH 161/394] =?UTF-8?q?=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/ecs/EcSetting/RequirementVsObjective/index.js | 2 ++ .../src/modules/ecs/EcSetting/RequirementVsStandard/index.js | 2 ++ 2 files changed, 4 insertions(+) diff --git a/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/index.js b/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/index.js index dfc4aa663..ce78eb54f 100644 --- a/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/index.js +++ b/public/react/src/modules/ecs/EcSetting/RequirementVsObjective/index.js @@ -140,6 +140,8 @@ class RequirementVsObjective extends Component {

  • + 导出矩阵

    diff --git a/public/react/src/modules/ecs/EcSetting/RequirementVsStandard/index.js b/public/react/src/modules/ecs/EcSetting/RequirementVsStandard/index.js index a1d652cf2..dbc40a621 100644 --- a/public/react/src/modules/ecs/EcSetting/RequirementVsStandard/index.js +++ b/public/react/src/modules/ecs/EcSetting/RequirementVsStandard/index.js @@ -109,6 +109,8 @@ class RequirementVsObjective extends Component {

    + 导出矩阵

    From 0de464db476a850d5d159cea7d53df8035f6ce4d Mon Sep 17 00:00:00 2001 From: p31729568 Date: Fri, 27 Sep 2019 11:06:56 +0800 Subject: [PATCH 162/394] fix user center page limit --- app/controllers/users/courses_controller.rb | 2 +- app/controllers/users/projects_controller.rb | 2 +- app/controllers/users/shixuns_controller.rb | 2 +- app/controllers/users/subjects_controller.rb | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/users/courses_controller.rb b/app/controllers/users/courses_controller.rb index c7e957e1a..2c5e29d2b 100644 --- a/app/controllers/users/courses_controller.rb +++ b/app/controllers/users/courses_controller.rb @@ -3,7 +3,7 @@ class Users::CoursesController < Users::BaseController courses = Users::CourseService.new(observed_user, query_params).call @count = courses.count - @courses = paginate(courses.includes(teacher: { user_extension: :school }), special: true) + @courses = paginate(courses.includes(teacher: { user_extension: :school }), special: observed_user.is_teacher?) end private diff --git a/app/controllers/users/projects_controller.rb b/app/controllers/users/projects_controller.rb index 07f4d5cac..8ffa8fa85 100644 --- a/app/controllers/users/projects_controller.rb +++ b/app/controllers/users/projects_controller.rb @@ -5,7 +5,7 @@ class Users::ProjectsController < Users::BaseController projects = Users::ProjectService.new(observed_user, query_params).call @count = projects.count - @projects = paginate(projects.includes(:project_score, owner: { user_extension: :school }), special: true) + @projects = paginate(projects.includes(:project_score, owner: { user_extension: :school }), special: observed_user.is_teacher?) end def search diff --git a/app/controllers/users/shixuns_controller.rb b/app/controllers/users/shixuns_controller.rb index 7b840a0a1..5d8da9684 100644 --- a/app/controllers/users/shixuns_controller.rb +++ b/app/controllers/users/shixuns_controller.rb @@ -3,7 +3,7 @@ class Users::ShixunsController < Users::BaseController shixuns = Users::ShixunService.new(observed_user, query_params).call @count = shixuns.count - @shixuns = paginate(shixuns.includes(:first_tag_repertoire), special: true) + @shixuns = paginate(shixuns.includes(:first_tag_repertoire), special: observed_user.is_teacher?) ids = @shixuns.map(&:id) @finished_challenges_count_map = Game.joins(:myshixun).where(user_id: observed_user.id, status: 2) diff --git a/app/controllers/users/subjects_controller.rb b/app/controllers/users/subjects_controller.rb index 2a4a7975f..2f8f308df 100644 --- a/app/controllers/users/subjects_controller.rb +++ b/app/controllers/users/subjects_controller.rb @@ -3,7 +3,7 @@ class Users::SubjectsController < Users::BaseController subjects = Users::SubjectService.new(observed_user, query_params).call @count = subjects.count - @subjects = paginate(subjects.includes(:user, :repertoire), special: true) + @subjects = paginate(subjects.includes(:user, :repertoire), special: observed_user.is_teacher?) end private From 28b258f1cdb7f62fb31dead3bb98a9a160fdba6f Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 27 Sep 2019 11:27:07 +0800 Subject: [PATCH 163/394] =?UTF-8?q?=E5=8E=BB=E6=97=B6=E9=97=B4=E5=8F=82?= =?UTF-8?q?=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/tpm/TPMIndexHOC.js | 4 ++-- public/react/src/modules/user/AccountPage.js | 2 +- public/react/src/modules/user/usersInfo/InfosBanner.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/tpm/TPMIndexHOC.js b/public/react/src/modules/tpm/TPMIndexHOC.js index 4d2e4fbba..d4142bd06 100644 --- a/public/react/src/modules/tpm/TPMIndexHOC.js +++ b/public/react/src/modules/tpm/TPMIndexHOC.js @@ -89,8 +89,8 @@ export function TPMIndexHOC(WrappedComponent) { // header里面需要有user initCommonState(user) { - // 更新头像后,需要改变参数,不然会被图片缓存影响到 - const newUser = Object.assign({}, {...user}, { image_url: `${user.image_url}?t=${new Date().getTime()}`}); + // 更新头像后,需要改变参数,不然会被图片缓存影响到 --> 后台已加 ?t=${new Date().getTime() + const newUser = Object.assign({}, {...user}, { image_url: `${user.image_url}`}); this.setState({ user: newUser, current_user: newUser diff --git a/public/react/src/modules/user/AccountPage.js b/public/react/src/modules/user/AccountPage.js index 3d34b3e13..7268bd7bb 100644 --- a/public/react/src/modules/user/AccountPage.js +++ b/public/react/src/modules/user/AccountPage.js @@ -60,7 +60,7 @@ class AccountPage extends Component { // "authentication": "uncertified", // "uncertified" | "applying" | "certified" this.setState({ basicInfo: Object.assign({}, {...result.data}, { - avatar_url: `${result.data.avatar_url}?t=${new Date().getTime()}`, + avatar_url: `${result.data.avatar_url}`, gender: result.data.gender == null || result.data.gender == undefined ? 0 : result.data.gender }) }) diff --git a/public/react/src/modules/user/usersInfo/InfosBanner.js b/public/react/src/modules/user/usersInfo/InfosBanner.js index a3b834493..40732d757 100644 --- a/public/react/src/modules/user/usersInfo/InfosBanner.js +++ b/public/react/src/modules/user/usersInfo/InfosBanner.js @@ -39,7 +39,7 @@ class InfosBanner extends Component{

    -

    头像

    +

    头像

    {data && data.name} From d1a77755d86de418097a8a3a7ce27ec39d12db87 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 27 Sep 2019 14:23:43 +0800 Subject: [PATCH 164/394] =?UTF-8?q?=E7=BD=91=E7=BB=9C=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E6=AD=A3=E5=B8=B8=EF=BC=8C=E6=84=9F=E8=B0=A2=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/AppConfig.js | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index 025db7f5c..a92b83b4b 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -33,6 +33,7 @@ if (isDev) { } window._debugType = debugType; export function initAxiosInterceptors(props) { + initOnlineOfflineListener() // TODO 避免重复的请求 https://github.com/axios/axios#cancellation // https://github.com/axios/axios/issues/1497 @@ -203,4 +204,27 @@ export function initAxiosInterceptors(props) { }); // ----------------------------------------------------------------------------------- +} + + +function initOnlineOfflineListener() { + $(window).bind("online", () => { + notification.destroy() + notification.success({ + duration: null, + message: '网络恢复正常', + description: + '网络恢复正常,感谢使用。', + }) + }); + $(window).bind("offline", () => { + notification.destroy() + + notification.warning({ + duration: null, + message: '网络异常', + description: + '网络异常,请检测网络后重试。', + }) + }); } \ No newline at end of file From 11253a8cf83367b40134bdbf4dea3bf713dc3985 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 27 Sep 2019 14:40:53 +0800 Subject: [PATCH 165/394] =?UTF-8?q?=E6=96=B0=E7=89=88=E5=AE=9E=E8=AE=AD?= =?UTF-8?q?=E8=AF=BE=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/config/webpack.config.dev.js | 2 +- .../courses/coursesPublic/NewShixunModel.js | 204 +++++++++++++----- .../courses/shixunHomework/shixunHomework.js | 54 ++--- 3 files changed, 169 insertions(+), 91 deletions(-) diff --git a/public/react/config/webpack.config.dev.js b/public/react/config/webpack.config.dev.js index aabcd8fb7..e504d2fb6 100644 --- a/public/react/config/webpack.config.dev.js +++ b/public/react/config/webpack.config.dev.js @@ -32,7 +32,7 @@ module.exports = { // See the discussion in https://github.com/facebookincubator/create-react-app/issues/343.s // devtool: "cheap-module-eval-source-map", // 开启调试 - // devtool: "eval-source-map", // 开启调试 + devtool: "eval-source-map", // 开启调试 // These are the "entry points" to our application. // This means they will be the "root" imports that are included in JS bundle. // The first two entry points enable "hot" CSS and auto-refreshes for JS. diff --git a/public/react/src/modules/courses/coursesPublic/NewShixunModel.js b/public/react/src/modules/courses/coursesPublic/NewShixunModel.js index bae89a7ba..e3c90c7eb 100644 --- a/public/react/src/modules/courses/coursesPublic/NewShixunModel.js +++ b/public/react/src/modules/courses/coursesPublic/NewShixunModel.js @@ -19,19 +19,30 @@ class NewShixunModel extends Component{ order:'desc', diff:0, limit:15, + sort:"myshixuns_count" } } componentDidMount() { - let{page,type,keyword,order,diff,limit,status}=this.state; - this.getdatalist(page,type,status,keyword,order,diff,limit) + let{page,type,keyword,order,diff,limit,status,sort}=this.state; + if(this.props.type==='shixuns'){ + this.getdatalist(page,type,status,keyword,order,diff,limit) + }else{ + this.getdatalist(page,type,undefined,keyword,order,undefined,limit,undefined,sort); + } + } - getdatalist=(page,type,newstatus,keyword,order,diff,limit,pagetype)=>{ + getdatalist=(page,type,newstatus,keyword,order,diff,limit,pagetype,sort)=>{ this.setState({ isspinning:true }) let status=this.props.statustype===undefined?newstatus:'published'; - let url="/shixun_lists.json" + let url; + if(this.props.type==='shixuns'){ + url="/shixun_lists.json"; + }else{ + url="/subject_lists.json"; + } axios.get(url,{params:{ page, type, @@ -39,20 +50,21 @@ class NewShixunModel extends Component{ keyword, order, diff, - limit + limit, + sort }}).then((response) => { if(response.data){ if(pagetype===undefined){ this.setState({ - shixun_list:response.data.shixun_list, - shixuns_count:response.data.shixuns_count, + shixun_list:response.data.shixun_list===undefined?response.data.subject_list:response.data.shixun_list, + shixuns_count:response.data.shixuns_count===undefined?response.data.subjects_count:response.data.shixuns_count, Grouplist:[], isspinning:false }) }else if(pagetype==="pagetype"){ this.setState({ - shixun_list:response.data.shixun_list, - shixuns_count:response.data.shixuns_count, + shixun_list:response.data.shixun_list===undefined?response.data.subject_list:response.data.shixun_list, + shixuns_count:response.data.shixuns_count===undefined?response.data.subjects_count:response.data.shixuns_count, isspinning:false }) } @@ -127,8 +139,13 @@ class NewShixunModel extends Component{ newallGrouplist.push({page:pageNumber,list:[]}) } - let{type,status,keyword,order,diff,limit}=this.state; - this.getdatalist(pageNumber,type,status,keyword,order,diff,limit,"pagetype") + let{type,status,keyword,order,diff,limit,sort}=this.state; + if(this.props.type==='shixuns'){ + this.getdatalist(pageNumber,type,status,keyword,order,diff,limit,"pagetype") + }else{ + this.getdatalist(pageNumber,type,undefined,keyword,order,undefined,limit,"pagetype",sort); + } + this.setState({ page:pageNumber, allGrouplist:newallGrouplist @@ -142,8 +159,14 @@ class NewShixunModel extends Component{ keyword:undefined, page:1 }) - let{status,order,diff,limit}=this.state; - this.getdatalist(1,value,status,undefined,order,diff,limit) + let{status,order,diff,limit,sort}=this.state; + if(this.props.type==='shixuns'){ + this.getdatalist(1,value,status,undefined,order,diff,limit) + }else{ + this.getdatalist(1,value,undefined,undefined,order,undefined,limit,undefined,sort) + } + + } updatedlist=(order)=>{ @@ -205,7 +228,7 @@ class NewShixunModel extends Component{ this.setState({ hometypepvisible:false }) - this.showNotification("请先选择实训") + this.showNotification(this.props.type==='shixuns'?"请先选择实训":"请先选择课程") return } @@ -231,33 +254,64 @@ class NewShixunModel extends Component{ this.props.pathShixun(Grouplist) return; } - let url="/courses/"+coursesId+"/homework_commons/create_shixun_homework.json"; - axios.post(url, { - category_id:this.props.category_id===null||this.props.category_id===undefined?undefined:parseInt(this.props.category_id), - shixun_ids:Grouplist, - } - ).then((response) => { - if(response.data.status===-1){ - // this.props.showNotification(response.data.message) + if(this.props.type==='shixuns'){ + let url="/courses/"+coursesId+"/homework_commons/create_shixun_homework.json"; + axios.post(url, { + category_id:this.props.category_id===null||this.props.category_id===undefined?undefined:parseInt(this.props.category_id), + shixun_ids:Grouplist, + } + ).then((response) => { + if(response.data.status===-1){ + // this.props.showNotification(response.data.message) - }else{ - // this.props.courseshomeworkstart(response.data.category_id,response.data.homework_ids) - this.showNotification("操作成功") - this.props.homeworkupdatalists(this.props.Coursename,this.props.page,this.props.order); - this.props.hideNewShixunModelType() + }else{ + // this.props.courseshomeworkstart(response.data.category_id,response.data.homework_ids) + this.showNotification("操作成功") + this.props.homeworkupdatalists(this.props.Coursename,this.props.page,this.props.order); + this.props.hideNewShixunModelType() - } - this.setState({ - hometypepvisible:false + } + this.setState({ + hometypepvisible:false + }) + // category_id: 3 + // homework_ids: (5) [9171, 9172, 9173, 9174, 9175] + }).catch((error) => { + console.log(error) + this.setState({ + hometypepvisible:false + }) }) - // category_id: 3 - // homework_ids: (5) [9171, 9172, 9173, 9174, 9175] - }).catch((error) => { - console.log(error) - this.setState({ - hometypepvisible:false + }else{ + let url="/courses/"+coursesId+"/homework_commons/create_subject_homework.json"; + axios.post(url, { + category_id:this.props.category_id===null||this.props.category_id===undefined?undefined:parseInt(this.props.category_id), + subject_ids:Grouplist, + } + ).then((response) => { + if(response.data.status===-1){ + // this.props.showNotification(response.data.message) + + }else{ + // this.props.courseshomeworkstart(response.data.category_id,response.data.homework_ids) + this.showNotification("操作成功") + this.props.homeworkupdatalists(this.props.Coursename,this.props.page,this.props.order); + this.props.hideNewShixunModelType() + + } + this.setState({ + hometypepvisible:false + }) + // category_id: 3 + // homework_ids: (5) [9171, 9172, 9173, 9174, 9175] + }).catch((error) => { + console.log(error) + this.setState({ + hometypepvisible:false + }) }) - }) + } + } poststatus=(status)=>{ @@ -268,9 +322,37 @@ class NewShixunModel extends Component{ this.getdatalist(page,type,status,keyword,order,diff,limit) } + updatepathlist=(sorts,orders)=>{ + let{page,type,keyword,order,diff,limit,status,sort}=this.state; + let seartorders; + if(sort===sorts){ + if(orders==="desc"){ + this.setState({ + sort:sorts, + order:"asc" + }) + seartorders="asc" + }else{ + this.setState({ + sort:sorts, + order:"desc" + }) + seartorders="desc" + } + }else{ + this.setState({ + sort:sorts, + order:"desc" + }) + seartorders=orders + } + + this.getdatalist(page,type,undefined,keyword,seartorders,undefined,limit,undefined,sorts) + + } render() { - let {diff,Grouplist,status,shixun_list,shixuns_count,page,type,order}=this.state; + let {diff,Grouplist,status,shixun_list,shixuns_count,page,type,order,sort}=this.state; // let {visible,patheditarry}=this.props; // console.log(Grouplist) // console.log(allGrouplist) @@ -331,7 +413,7 @@ class NewShixunModel extends Component{ ); - + console.log(shixun_list) return(

    @@ -355,7 +437,7 @@ class NewShixunModel extends Component{ closable={true} destroyOnClose={true} onClose={()=>this.props.hideNewShixunModelType()} - visible={this.props.NewShixunModelType} + visible={this.props.type==='shixuns'?this.props.NewShixunModelType:this.props.shixunpath} height={'100%'} > @@ -380,7 +462,7 @@ class NewShixunModel extends Component{ 搜索} onInput={(e)=>this.setdatafunsval(e)} @@ -391,34 +473,50 @@ class NewShixunModel extends Component{
    - 已选 {Grouplist.length} 个实训 - {shixuns_count===undefined?"":shixuns_count} 个实训 + 已选 {Grouplist.length} 个{this.props.type==='shixuns'?'实训':'课程'} + {shixuns_count===undefined?"":shixuns_count} 个{this.props.type==='shixuns'?'实训':'课程'} - + {this.props.type==='shixuns'?"": + this.updatepathlist("shixuns_count",order)}>实训数 + + + + + } + + {this.props.type==='shixuns'?"": + this.updatepathlist("myshixuns_count",order)}>使用人数 + + + + + } + + {this.props.type==='shixuns'? this.updatedlist(order)}>学习人数 - + :""} - {this.props.statustype===undefined? + {this.props.type==='shixuns'?this.props.statustype===undefined? {status==='all'?"发布状态":status==='published'?"已发布":status==="unpublished"?"未发布":""} - :""} + :"":""} - + {this.props.type==='shixuns'? {diff===0?"难度":diff===1?"初级":diff===2?"中级":diff===3?"高级":diff===4?"顶级":""} - + :""}
    {/*this.props.hideNewShixunModelType()}>返回*/} - this.belongto("mine")}>我的实训 - this.belongto("all")}>全部实训 + this.belongto("mine")}>我的{this.props.type==='shixuns'?'实训':"课程"} + this.belongto("all")}>全部{this.props.type==='shixuns'?'实训':"课程"}
    @@ -461,7 +559,7 @@ class NewShixunModel extends Component{ {JSON.stringify(item.description) == "{}"?"":
    } - {item.challenge_names.length===0?"":
    + {item.challenge_names===undefined?"":item.challenge_names.length===0?"":
    {item.challenge_names.map((item,key)=>{ return( 第{key+1}关:{item} @@ -498,7 +596,7 @@ class NewShixunModel extends Component{
    - {item.subjects.length===0?"":this.ItsCourse(item.subjects)}> + {item.subjects===undefined?"":item.subjects.length===0?"":this.ItsCourse(item.subjects)}> 所属课程 diff --git a/public/react/src/modules/courses/shixunHomework/shixunHomework.js b/public/react/src/modules/courses/shixunHomework/shixunHomework.js index 5298baffc..c15a19f8f 100644 --- a/public/react/src/modules/courses/shixunHomework/shixunHomework.js +++ b/public/react/src/modules/courses/shixunHomework/shixunHomework.js @@ -908,7 +908,8 @@ class ShixunHomework extends Component{ } hideNewShixunModelType=()=>{ this.setState({ - NewShixunModelType:false + NewShixunModelType:false, + shixunpath:false }) } render(){ @@ -971,6 +972,20 @@ class ShixunHomework extends Component{ statustype={'published'} />:""} + {/*新版实训model*/} + {shixunpath===true?this.hideNewShixunModelType()} + coursesId={this.props.match.params.coursesId} + homeworkupdatalists={(Coursename,page,order)=>this.homeworkupdatalist(Coursename,page,order)} + Coursename={Coursename} + page={page} + order={order} + />:""} + {/*提示*/} {Modalstype&&Modalstype===true?this.getcourse_groupslist(id)} />:""} - {/*/!*选择实训*!/*/} - {/*{shixunmodal===true?this.homeworkupdatalist(Coursename,page,order)}*/} - {/*hometypepvisible={hometypepvisible}*/} - {/*hidecouseShixunModal={this.hidecouseShixunModal}*/} - {/*newshixunmodallist={newshixunmodallist}*/} - {/*coursesId={this.props.match.params.coursesId}*/} - {/*courseshomeworkstart={(category_id,homework_ids)=>this.newhomeworkstart(category_id,homework_ids)}*/} - {/*funpatheditarry={(patheditarry)=>this.funpatheditarry(patheditarry)}*/} - {/*patheditarry={patheditarry}*/} - {/*/>:""}*/} {shixunmodal===true||shixunpath===true?:""} - {/*选择实训路径*/} - {shixunpath===true? this.funshixunpathlist(search,type,loading,page)} - hometypepvisible={hometypepvisible} - hidecouseShixunModal={this.hidecouseShixunModal} - coursesId={this.props.match.params.coursesId} - homeworkupdatalists={(Coursename,page,order)=>this.homeworkupdatalist(Coursename,page,order)} - courseshomeworkstart={(category_id,homework_ids)=>this.newhomeworkstart(category_id,homework_ids)} - Coursename={Coursename} - page={page} - order={order} - // courseshomeworkstart={(category_id,homework_ids)=>this.newhomeworkstart(category_id,homework_ids)} - />:""} + {/*添加目录/选择目录*/} From f9d576bbc8abc3247529886e6e8513ae443ab177 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 27 Sep 2019 14:43:44 +0800 Subject: [PATCH 166/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/courses/coursesPublic/NewShixunModel.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/coursesPublic/NewShixunModel.js b/public/react/src/modules/courses/coursesPublic/NewShixunModel.js index e3c90c7eb..062390f1e 100644 --- a/public/react/src/modules/courses/coursesPublic/NewShixunModel.js +++ b/public/react/src/modules/courses/coursesPublic/NewShixunModel.js @@ -269,7 +269,7 @@ class NewShixunModel extends Component{ this.showNotification("操作成功") this.props.homeworkupdatalists(this.props.Coursename,this.props.page,this.props.order); this.props.hideNewShixunModelType() - + this.props.updataleftNavfun() } this.setState({ hometypepvisible:false @@ -297,7 +297,7 @@ class NewShixunModel extends Component{ this.showNotification("操作成功") this.props.homeworkupdatalists(this.props.Coursename,this.props.page,this.props.order); this.props.hideNewShixunModelType() - + this.props.updataleftNavfun() } this.setState({ hometypepvisible:false From c941152e721d4a1f094d0a17c14f4ea0737e3790 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 27 Sep 2019 15:01:33 +0800 Subject: [PATCH 167/394] const $ = window.$ --- public/react/src/AppConfig.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index a92b83b4b..d402da0ec 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -208,6 +208,7 @@ export function initAxiosInterceptors(props) { function initOnlineOfflineListener() { + const $ = window.$ $(window).bind("online", () => { notification.destroy() notification.success({ From e540aa155828cf6feecaeba8f22aa2b10a85b0a0 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Fri, 27 Sep 2019 15:14:44 +0800 Subject: [PATCH 168/394] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=AB=8B=E5=8D=B3?= =?UTF-8?q?=E6=88=AA=E6=AD=A2=E5=90=8E=EF=BC=8C=E7=BB=9F=E8=AE=A1=E5=AD=A6?= =?UTF-8?q?=E7=94=9F=E6=88=90=E7=BB=A9=E7=9A=84=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercises_controller.rb | 38 ++++++++++++++----------- app/jobs/end_exercise_calculate_job.rb | 29 +++++++++++++++++++ 2 files changed, 50 insertions(+), 17 deletions(-) create mode 100644 app/jobs/end_exercise_calculate_job.rb diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index 3be35345e..8a02ba06f 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -844,23 +844,27 @@ class ExercisesController < ApplicationController exercise_users = exercise.exercise_users exercise.update_attributes(:exercise_status => 3, :end_time => Time.now,:unified_setting => true) end - exercise_users.each do |user| - if user.commit_status == 0 && user.start_at.present? - objective_score = calculate_student_score(exercise,user.user)[:total_score] - user_sub_score = user.subjective_score - subjective_score = user_sub_score < 0.0 ? 0.0 : user_sub_score - total_score = objective_score + subjective_score - commit_option = { - :status => 1, - :commit_status => 1, - :end_at => Time.now, - :objective_score => objective_score, - :score => total_score, - :subjective_score => user_sub_score - } - user.update_attributes(commit_option) - end - end + + ex_user_ids = exercise_users.pluck(:id) + + EndExerciseCalculateJob.perform_later(ex_user_ids,exercise) + # exercise_users.each do |user| + # if user.commit_status == 0 && user.start_at.present? + # objective_score = calculate_student_score(exercise,user.user)[:total_score] + # user_sub_score = user.subjective_score + # subjective_score = user_sub_score < 0.0 ? 0.0 : user_sub_score + # total_score = objective_score + subjective_score + # commit_option = { + # :status => 1, + # :commit_status => 1, + # :end_at => Time.now, + # :objective_score => objective_score, + # :score => total_score, + # :subjective_score => user_sub_score + # } + # user.update_attributes(commit_option) + # end + # end end end normal_status(0, "试卷截止成功!") diff --git a/app/jobs/end_exercise_calculate_job.rb b/app/jobs/end_exercise_calculate_job.rb new file mode 100644 index 000000000..39d8bb1db --- /dev/null +++ b/app/jobs/end_exercise_calculate_job.rb @@ -0,0 +1,29 @@ +class EndExerciseCalculateJob < ApplicationJob + + include ExercisesHelper + include GitHelper + + queue_as :default + + def perform(ex_user_ids,exercise) + exercise_users = ExerciseUser.where(id: ex_user_ids) + exercise_users.each do |user| + if user.commit_status == 0 && user.start_at.present? + objective_score = calculate_student_score(exercise,user.user)[:total_score] + user_sub_score = user.subjective_score + subjective_score = user_sub_score < 0.0 ? 0.0 : user_sub_score + total_score = objective_score + subjective_score + commit_option = { + :status => 1, + :commit_status => 1, + :end_at => Time.now, + :objective_score => objective_score, + :score => total_score, + :subjective_score => user_sub_score + } + user.update_attributes(commit_option) + end + end + end + +end From 682673232ab834b3b4df992cdeac81426094f5d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 27 Sep 2019 15:38:00 +0800 Subject: [PATCH 169/394] Default Changelist --- public/favicon.ico | Bin 0 -> 9049 bytes .../shixunHomework/Listofworksstudentone.js | 30 +++--------------- 2 files changed, 4 insertions(+), 26 deletions(-) mode change 100644 => 100755 public/favicon.ico diff --git a/public/favicon.ico b/public/favicon.ico old mode 100644 new mode 100755 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..05b9d163e5267afb1d933b189a1d6210fc2fe634 GIT binary patch literal 9049 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 literal 0 HcmV?d00001 diff --git a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js index fa2490b8f..725fee431 100644 --- a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js +++ b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js @@ -2619,6 +2619,7 @@ class Listofworksstudentone extends Component { } //排序 funordert = (e) => { + debugger // if (e === "update_time") { // // 时间 // // 时间排序是从小到大 @@ -2643,7 +2644,7 @@ class Listofworksstudentone extends Component { //学号 //学号排序是从大到小 this.setState({ - order: "student_id", + orders: "student_id", loadingstate: true, }) this.Startsortingt("student_id", this.state.course_groupyslstwo, this.state.checkedValuesineinfo, this.state.searchtext, this.state.page, this.state.limit); @@ -3047,32 +3048,9 @@ class Listofworksstudentone extends Component { let {columns,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; const antIcon = ; - // console.log(this.state.student_works); - // console.log("841"); - // console.log(this.state.columns); - // console.log(datajs); - // console.log("2202"); - // console.log(this.props.isAdmin()); - // console.log("2498"); - // console.log(data); - // console.log(datas); - // console.log(this.props.isAdmin()); - let course_is_end = this.props.current_user&&this.props.current_user.course_is_end; - // try { - // if(this.props.isAdmin() === false){ - // if(teacherdata&&teacherdata.student_works){ - // if(teacherdata&&teacherdata.student_works.length>0){ - // console.log("这是双层页面。。。。"); - // - // } - // } - // - // } - // }catch (e) { - // console.log("Listofworksstudentone123"); - // console.log(e); - // } + console.log("Listofworksstudentone.js"); + console.log(orders); return ( From ee4e560895aaa8847b34c9d54ee31f40d722e64c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 27 Sep 2019 15:40:13 +0800 Subject: [PATCH 170/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/courses/shixunHomework/Listofworksstudentone.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js index 725fee431..170d3d95e 100644 --- a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js +++ b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js @@ -2619,7 +2619,6 @@ class Listofworksstudentone extends Component { } //排序 funordert = (e) => { - debugger // if (e === "update_time") { // // 时间 // // 时间排序是从小到大 @@ -3049,8 +3048,8 @@ class Listofworksstudentone extends Component { const antIcon = ; let course_is_end = this.props.current_user&&this.props.current_user.course_is_end; - console.log("Listofworksstudentone.js"); - console.log(orders); + // console.log("Listofworksstudentone.js"); + // console.log(orders); return ( From f17fa26ee5e1ef08e0f7efa6dbd04ebdada85b26 Mon Sep 17 00:00:00 2001 From: jingquan huang Date: Fri, 27 Sep 2019 15:41:44 +0800 Subject: [PATCH 171/394] =?UTF-8?q?git=20auth=E6=B7=BB=E5=8A=A0=E6=97=A5?= =?UTF-8?q?=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/gits_controller.rb | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/controllers/gits_controller.rb b/app/controllers/gits_controller.rb index b52e75353..e94c197ed 100644 --- a/app/controllers/gits_controller.rb +++ b/app/controllers/gits_controller.rb @@ -8,7 +8,11 @@ class GitsController < ApplicationController # 供 git-workhorse反向调用认证 def auth # HTTP_AUTHORIZATION: "Basic 这里base64编码的的密码(user:passwd)" + decodes = %W(2 3 4 5 6 7 8 9 a b c f e f g h i j k l m n o p q r s t u v w x y z) + rand_code = decodes.sample(10).join logger.info("11111112222223333 HTTP_AUTHORIZATION: #{request.env["HTTP_AUTHORIZATION"]}") + logger.info("1111111 git auth start: code is #{rand_code}, time is #{Time.now}") + # logger.info("#########-----request_env: #{request.env}") # {"service"=>"git-receive-pack", "controller"=>"gits", "action"=>"auth", # "url"=>"forge01/cermyt39.git/info/refs"} @@ -68,6 +72,7 @@ class GitsController < ApplicationController authenticate_or_request_with_http_basic do |username, password| result + logger.info("1111111 git auth end: code is #{rand_code}, time is #{Time.now}") end end From a2377ab13abd005afd60ea5491d30965ceb471be Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Fri, 27 Sep 2019 15:44:19 +0800 Subject: [PATCH 172/394] =?UTF-8?q?=E5=BB=B6=E6=97=B61=E5=88=86=E9=92=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercises_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index 0943f69fb..28c011434 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -783,6 +783,7 @@ class ExercisesController < ApplicationController # 首页批量或单独 立即截止,截止时间为当前时间 def end_exercise + sleep(1) ActiveRecord::Base.transaction do begin check_ids = Exercise.where(id:params[:check_ids]) From 26ad3f9723f1f0af85ba1d58b0c3d4549304547b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 27 Sep 2019 16:00:02 +0800 Subject: [PATCH 173/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../graduation/tasks/GraduationAcross.js | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js b/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js index 98cb883d8..1fab14d00 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js @@ -523,6 +523,17 @@ class GraduationAcross extends Component{
    + { + + }
    @@ -531,10 +542,10 @@ class GraduationAcross extends Component{ :"" }
    - {/*
    */} - {/*关闭*/} - {/*确认*/} - {/*
    */} +
    + 取消 + 确认 +
    ) From 0cb186a0f61a2931f53a598a9da87fb076949bf9 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 27 Sep 2019 16:01:21 +0800 Subject: [PATCH 174/394] =?UTF-8?q?=E6=B6=88=E6=81=AF=E7=9A=84=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/student_works_controller.rb | 2 +- app/decorators/tiding_decorator.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/student_works_controller.rb b/app/controllers/student_works_controller.rb index a4e08b90a..b7a6953a5 100644 --- a/app/controllers/student_works_controller.rb +++ b/app/controllers/student_works_controller.rb @@ -334,7 +334,7 @@ class StudentWorksController < ApplicationController @work.update_attributes(update_time: Time.now) # 补交附件时给评阅过作品的教师、助教发消息 - unless @work.student_works_scores.where.not(score: nil).where(reviewer_role: [1, 2]).pluck(user_id).uniq.blank? + unless @work.student_works_scores.where.not(score: nil).where(reviewer_role: [1, 2]).pluck(:user_id).uniq.blank? ResubmitStudentWorkNotifyJob.perform_later(@homework.id, [current_user.id]) end diff --git a/app/decorators/tiding_decorator.rb b/app/decorators/tiding_decorator.rb index 9dc439377..4003ffb94 100644 --- a/app/decorators/tiding_decorator.rb +++ b/app/decorators/tiding_decorator.rb @@ -135,7 +135,7 @@ module TidingDecorator end def delete_course_content - I18n.t(locale_format) % container.name + I18n.t(locale_format) % belong_container.name end def delete_course_member_content From 8bb8ba3eb543a4631176dd0d166c5c4ca7f90a9a Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Fri, 27 Sep 2019 16:02:01 +0800 Subject: [PATCH 175/394] change --- app/controllers/exercises_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index 28c011434..f2e8508f0 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -783,7 +783,7 @@ class ExercisesController < ApplicationController # 首页批量或单独 立即截止,截止时间为当前时间 def end_exercise - sleep(1) + ActiveRecord::Base.transaction do begin check_ids = Exercise.where(id:params[:check_ids]) From 2c7f62419117f9a43ed04ab699115489ec3a4024 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Fri, 27 Sep 2019 16:05:24 +0800 Subject: [PATCH 176/394] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=AF=95=E5=8D=B7?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E5=BB=B6=E6=97=B61=E5=88=86=E9=92=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercise_answers_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/exercise_answers_controller.rb b/app/controllers/exercise_answers_controller.rb index 3fc27c8f2..e5d67b2d7 100644 --- a/app/controllers/exercise_answers_controller.rb +++ b/app/controllers/exercise_answers_controller.rb @@ -110,7 +110,7 @@ class ExerciseAnswersController < ApplicationController elsif @exercise_user.commit_status == 1 normal_status(-1,"已提交/已结束的试卷不允许修改!") else - if (@exercise_user_status == Exercise::DEADLINE && @exercise_user.commit_status == 0) || (@exercise.time > 0 && @exercise_user.start_at.present? && ((@exercise_user.start_at + (@exercise.time.to_i + 1).minutes) < Time.now)) + if (@exercise_user_status == Exercise::DEADLINE && @exercise_user.commit_status == 0) || (@exercise.time > 0 && @exercise_user.start_at.present? && ((@exercise_user.start_at + @exercise.time.to_i.minutes) < Time.now)) objective_score = calculate_student_score(@exercise,current_user)[:total_score] subjective_score = @exercise_user.subjective_score < 0.0 ? 0.0 : @exercise_user.subjective_score total_score = objective_score + subjective_score From f20d8e8332f08b68a465f150da576193c9ea5012 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 27 Sep 2019 16:05:25 +0800 Subject: [PATCH 177/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/graduation/tasks/GraduationTaskDetail.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskDetail.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskDetail.js index abd40784a..0a7cf509d 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskDetail.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskDetail.js @@ -451,9 +451,9 @@ class GraduationTaskDetail extends Component{ :""} {questionslist.work_status===undefined||questionslist.work_status===null||questionslist.work_status.length===0?"":questionslist.work_status.map((item,key)=>{ return( - - {item==="提交作品"?提交作品:""} - {item==="补交作品"?补交作品:""} + + {item==="提交作品"?提交作品:""} + {item==="补交作品"?补交作品:""} {item==="修改作品"?修改作品:""} {item==="查看作品"?查看作品 :""} {item==="创建项目"?创建项目:""} From 847d5ad3708b93455f8f967ed8857f563764c0c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 27 Sep 2019 16:12:14 +0800 Subject: [PATCH 178/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/message/js/MessagSub.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index 41fc89dbd..92c30a2d4 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -493,7 +493,7 @@ class MessagSub extends Component { //belong_container_id course的id return window.open(`/courses/${item.belong_container_id}/graduation_tasks/${item.parent_container_id}`); default : - return window.open("/") + return } } From 094c15ac343b17cd05ea0dea103b94e24bbded7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 27 Sep 2019 16:15:22 +0800 Subject: [PATCH 179/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/message/js/MessagSub.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index 92c30a2d4..88613513c 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -575,7 +575,16 @@ class MessagSub extends Component { boolps = false; } } - + if (item.container_type === "DeleteCourse") { + if (item.tiding_type === "System") { + boolps = false; + } + } + if (item.container_type === "DeleteCourseMember") { + if (item.tiding_type === "System") { + boolps = false; + } + } return (
    Date: Fri, 27 Sep 2019 16:23:19 +0800 Subject: [PATCH 180/394] git log --- app/controllers/gits_controller.rb | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/controllers/gits_controller.rb b/app/controllers/gits_controller.rb index b52e75353..aa7ccd8cd 100644 --- a/app/controllers/gits_controller.rb +++ b/app/controllers/gits_controller.rb @@ -8,7 +8,10 @@ class GitsController < ApplicationController # 供 git-workhorse反向调用认证 def auth # HTTP_AUTHORIZATION: "Basic 这里base64编码的的密码(user:passwd)" + decodes = %W(2 3 4 5 6 7 8 9 a b c f e f g h i j k l m n o p q r s t u v w x y z) + rand_code = decodes.sample(10).join logger.info("11111112222223333 HTTP_AUTHORIZATION: #{request.env["HTTP_AUTHORIZATION"]}") + logger.info("1111111 git auth start: code is #{rand_code}, time is #{Time.now}") # logger.info("#########-----request_env: #{request.env}") # {"service"=>"git-receive-pack", "controller"=>"gits", "action"=>"auth", # "url"=>"forge01/cermyt39.git/info/refs"} @@ -68,6 +71,7 @@ class GitsController < ApplicationController authenticate_or_request_with_http_basic do |username, password| result + logger.info("1111111 git auth end: code is #{rand_code}, time is #{Time.now}") end end From c8e5faf931dde26381cd07c7cfa0161db1967b9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 27 Sep 2019 16:28:15 +0800 Subject: [PATCH 181/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/coursesPublic/NewShixunModel.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/courses/coursesPublic/NewShixunModel.js b/public/react/src/modules/courses/coursesPublic/NewShixunModel.js index 062390f1e..2d0271a23 100644 --- a/public/react/src/modules/courses/coursesPublic/NewShixunModel.js +++ b/public/react/src/modules/courses/coursesPublic/NewShixunModel.js @@ -536,7 +536,7 @@ class NewShixunModel extends Component{ className="fl task-hide edu-txt-left mt3" name="shixun_homework[]" > - @@ -588,13 +588,19 @@ class NewShixunModel extends Component{ } `} - + {this.props.type==='shixuns'? {item.author_name} {item.author_school_name} 难度系数:{item.level} 学习人数:{item.study_count} - - + : + + {item.author_name} + {item.author_school_name} + 学习人数:{item.myshixuns_count} + 章节:{item.stage_count} + 实训:{item.shixuns_count} + }
    {item.subjects===undefined?"":item.subjects.length===0?"":this.ItsCourse(item.subjects)}> From 9ad96e39cb96cb402495bcec956caf0e45c073f9 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 27 Sep 2019 16:34:29 +0800 Subject: [PATCH 182/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/subject_search_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/subject_search_service.rb b/app/services/subject_search_service.rb index 2366cecc2..f69c56c88 100644 --- a/app/services/subject_search_service.rb +++ b/app/services/subject_search_service.rb @@ -12,7 +12,7 @@ class SubjectSearchService < ApplicationService type = params[:type] || "all" if type == "mine" - @subjects = User.current.shixuns.visible.unhidden + @subjects = User.current.subjects.visible.unhidden else @subjects = Subject.visible.unhidden end From fbb033a0a23d6f7e3c5a8256f9290b01135e5cda Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 27 Sep 2019 16:36:09 +0800 Subject: [PATCH 183/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/decorators/tiding_decorator.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/decorators/tiding_decorator.rb b/app/decorators/tiding_decorator.rb index 4003ffb94..130e7f4b8 100644 --- a/app/decorators/tiding_decorator.rb +++ b/app/decorators/tiding_decorator.rb @@ -344,7 +344,7 @@ module TidingDecorator end def resubmit_student_work_content - I18n.t(locale_format) % container&.homework_common.try(:name) + I18n.t(locale_format) % parent_container.try(:name) end def student_works_score_content From acde3709b27bb9fa0d0f7c322012879be2b3060b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 27 Sep 2019 16:52:09 +0800 Subject: [PATCH 184/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/message/js/MessagSub.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index 88613513c..f9da5ea9d 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -488,7 +488,14 @@ class MessagSub extends Component { case "SubjectStartCourse": return window.open(`/paths/${item.container_id}`); case "ResubmitStudentWork": - return window.open(`/courses/${item.belong_container_id}/graduation_tasks/${item.container_id}/appraise`); + if (item.homework_type === "normal") { + //普通作业 + return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}/${item.container_id}/appraise`); + } + if (item.homework_type === "group") { + //分组作业 + return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}/${item.container_id}/appraise`); + } case "AdjustScore": //belong_container_id course的id return window.open(`/courses/${item.belong_container_id}/graduation_tasks/${item.parent_container_id}`); From ac07bb24aa7fbe2a754dfd32f8b635d673ad7e7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 27 Sep 2019 16:53:33 +0800 Subject: [PATCH 185/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/message/js/MessagSub.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index f9da5ea9d..f92ea71c4 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -498,7 +498,14 @@ class MessagSub extends Component { } case "AdjustScore": //belong_container_id course的id - return window.open(`/courses/${item.belong_container_id}/graduation_tasks/${item.parent_container_id}`); + if (item.homework_type === "normal") { + //普通作业 + return window.open(`/courses/${item.belong_container_id}/common_homeworks/${item.parent_container_id}`); + } + if (item.homework_type === "group") { + //分组作业 + return window.open(`/courses/${item.belong_container_id}/group_homeworks/${item.parent_container_id}`); + } default : return } From 8cf5da79fb5124a11ecb56f3457e66bc3e658b17 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Fri, 27 Sep 2019 17:07:08 +0800 Subject: [PATCH 186/394] =?UTF-8?q?=E8=AF=95=E5=8D=B7=E5=9B=9E=E7=AD=94?= =?UTF-8?q?=E7=9A=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercise_answers_controller.rb | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/app/controllers/exercise_answers_controller.rb b/app/controllers/exercise_answers_controller.rb index e5d67b2d7..b1e23071b 100644 --- a/app/controllers/exercise_answers_controller.rb +++ b/app/controllers/exercise_answers_controller.rb @@ -14,19 +14,15 @@ class ExerciseAnswersController < ApplicationController else ea = @exercise_question.exercise_answers.search_answer_users("user_id",current_user.id) #试卷的当前用户的答案 if q_type == Exercise::SINGLE || q_type == Exercise::JUDGMENT #选择题(单选)/判断题 - ea_choice = ea.search_exercise_answer("exercise_choice_id",choice_id).first - answer_option = { + if ea.exists? + ea.first.update_attribute(:exercise_choice_id,choice_id ) + else + answer_option = { :user_id => current_user.id, :exercise_question_id => @exercise_question.id, :exercise_choice_id => choice_id, :answer_text => "" - } - if ea_choice.present? #如果当前用户的答案存在,再次点击,即为删除 - ea_choice.destroy - else - if @exercise_question.exercise_standard_answers.count <= 1 #单选题的时候 - ea.first.destroy if ea.present? - end + } ex_a = ExerciseAnswer.new(answer_option) ex_a.save! end From 8cc30ccd52dbd001bb23ed5530563b8d324ecec1 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 27 Sep 2019 17:10:32 +0800 Subject: [PATCH 187/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/shixun_lists/index.json.jbuilder | 6 +++--- app/views/subject_lists/index.json.jbuilder | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/views/shixun_lists/index.json.jbuilder b/app/views/shixun_lists/index.json.jbuilder index 79ce4b09c..08baeabf9 100644 --- a/app/views/shixun_lists/index.json.jbuilder +++ b/app/views/shixun_lists/index.json.jbuilder @@ -11,12 +11,12 @@ json.shixun_list do atta_reg = /!\[.*]\(\/api\/attachments\/\d+\)/ highlights[:description]&.first&.sub!(reg, '') - highlights[:description]&.map{|des| des.gsub!(atta_reg, '')} + highlights[:description]&.map{|des| des.gsub(atta_reg, '')} highlights[:content]&.first&.sub!(reg, '') - highlights[:content]&.map{|des| des.gsub!(atta_reg, '')} + highlights[:content]&.map{|des| des.gsub(atta_reg, '')} json.title highlights.delete(:name)&.join('...') || obj.searchable_title - json.description highlights[:description]&.join('...') || Util.extract_content(obj.description)[0..300]&.sub!(atta_reg, '') + json.description highlights[:description]&.join('...') || Util.extract_content(obj.description)[0..300]&.gsub(atta_reg, '') json.content highlights json.level level_to_s(obj.trainee) diff --git a/app/views/subject_lists/index.json.jbuilder b/app/views/subject_lists/index.json.jbuilder index 6992deb1f..63ee6dcbc 100644 --- a/app/views/subject_lists/index.json.jbuilder +++ b/app/views/subject_lists/index.json.jbuilder @@ -7,15 +7,15 @@ json.subject_list do # 去除开头标点符号 reg = /^[,。?:;‘’!“”—……、]/ # 附件的替换 - atta_reg = /!\[.*]\(\/api\/attachments\/\d+\)/ + atta_reg = /!\[.*\]\(\/api\/attachments\/\d+\)/ highlights[:description]&.first&.sub!(reg, '') - highlights[:description]&.map{|des| des.gsub!(atta_reg, '')} + highlights[:description]&.map{|des| des.gsub(atta_reg, '')} highlights[:content]&.first&.sub!(reg, '') - highlights[:content]&.map{|des| des.gsub!(atta_reg, '')} + highlights[:content]&.map{|des| des.gsub(atta_reg, '')} json.title highlights.delete(:name)&.join('...') || obj.searchable_title - json.description highlights[:description]&.join('...') || Util.extract_content(obj.description)[0..300]&.sub!(atta_reg, '') + json.description highlights[:description]&.join('...') || Util.extract_content(obj.description)[0..300]&.gsub(atta_reg, '') json.content highlights end From 098049cfca16b539e406496f52e113586ccee951 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 27 Sep 2019 17:23:32 +0800 Subject: [PATCH 188/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/AppConfig.js | 4 +-- .../courses/coursesPublic/NewShixunModel.js | 2 +- .../graduation/tasks/GraduationAcross.js | 22 +++++++------- .../tasks/GraduationTasksSubmitedit.js | 29 ++++++++++++++----- .../tasks/GraduationTasksSubmitnew.js | 4 ++- 5 files changed, 38 insertions(+), 23 deletions(-) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index d402da0ec..bc7fa8070 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -84,9 +84,9 @@ export function initAxiosInterceptors(props) { } config.url = `${proxy}${url}`; if (config.url.indexOf('?') == -1) { - config.url = `${config.url}?debug=${debugType}` + config.url = `${config.url}?debug=${debugType}`; } else { - config.url = `${config.url}&debug=${debugType}` + config.url = `${config.url}&debug=${debugType}`; } } else { // 加api前缀 diff --git a/public/react/src/modules/courses/coursesPublic/NewShixunModel.js b/public/react/src/modules/courses/coursesPublic/NewShixunModel.js index 2d0271a23..5fe9c8aa0 100644 --- a/public/react/src/modules/courses/coursesPublic/NewShixunModel.js +++ b/public/react/src/modules/courses/coursesPublic/NewShixunModel.js @@ -485,7 +485,7 @@ class NewShixunModel extends Component{ } {this.props.type==='shixuns'?"": - this.updatepathlist("myshixuns_count",order)}>使用人数 + this.updatepathlist("myshixuns_count",order)}>学习人数 diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js b/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js index 1fab14d00..46b1533f7 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js @@ -523,17 +523,17 @@ class GraduationAcross extends Component{
    - { - - } + {/*{*/} + {/**/} + {/*}*/}
    diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTasksSubmitedit.js b/public/react/src/modules/courses/graduation/tasks/GraduationTasksSubmitedit.js index 7c697e31b..21d340200 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTasksSubmitedit.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTasksSubmitedit.js @@ -334,22 +334,27 @@ class GraduationTasksSubmitedit extends Component{ } - delecttask_status=(id)=>{ + delecttask_status=(id,student_id)=>{ + let newid=id===undefined||id===null?student_id:id; let{selectmemberslist,task_status}=this.state; let newlist=task_status; let selects=selectmemberslist; for(var i=0; i { @@ -401,6 +409,7 @@ class GraduationTasksSubmitedit extends Component{ // debugger return } + if(workslist.task_type===2){ if(userids.length { console.log(error) + this.setState({ + spinnings:false + }) }) @@ -785,6 +797,7 @@ class GraduationTasksSubmitedit extends Component{
    {selectmemberslist&&selectmemberslist.map((item,key)=>{ + console.log(item) if(item.group_name!=undefined) { return (
    0 ?
    this.delecttask_status(item.user_id)}> + onClick={() => this.delecttask_status(item.user_id,item.student_id)}>
    : ""}
    diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTasksSubmitnew.js b/public/react/src/modules/courses/graduation/tasks/GraduationTasksSubmitnew.js index 7438b36a4..698ab5c97 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTasksSubmitnew.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTasksSubmitnew.js @@ -383,7 +383,7 @@ class GraduationTasksSubmitnew extends Component{ let userids=[]; for(var list of selectmemberslist){ - +debugger if(list.user_id!=undefined&&list.user_id!=null){ userids.push(list.user_id) } @@ -408,6 +408,8 @@ class GraduationTasksSubmitnew extends Component{ // debugger return } + + if(workslist&&workslist.task_type===2){ if(userids!=undefined){ if(userids.length Date: Fri, 27 Sep 2019 17:45:43 +0800 Subject: [PATCH 189/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../graduation/tasks/GraduationTaskssettinglist.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js index 30dd831bd..318955479 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js @@ -514,6 +514,7 @@ class GraduationTaskssettinglist extends Component{ } showAllocationModal=(id)=>{ + this.setState({ Allocationtype:true, operationId:id @@ -861,13 +862,13 @@ class GraduationTaskssettinglist extends Component{ { tag.name && 调整学生最终成绩
    其它历史评分将全部失效:""}> - {tag.name==="评阅"?

    + {tag.name==="评阅"? {tag.name} -

    + :

    this.showModulationtype(tag.id):tag.name==="分配"?taskslistdata&&taskslistdata.cross_comment===true?"":()=>this.showAllocationModal(tag.id):""}> - {tag.name==="分配"?taskslistdata&&taskslistdata.cross_comment===true?"":tag.name:tag.name} + onClick={tag.name==="调分"?()=>this.showModulationtype(tag.id):tag.name==="分配"?taskslistdata&&taskslistdata.cross_comment===true?"":"":""}> + {tag.name==="分配"?taskslistdata&&taskslistdata.cross_comment===true?"":"":tag.name}

    }
    From e873f087fdfb2c6294de107cd262158c128c9b32 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 27 Sep 2019 17:57:26 +0800 Subject: [PATCH 190/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/graduation_work.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/graduation_work.rb b/app/models/graduation_work.rb index 89d95300a..96dce0c49 100644 --- a/app/models/graduation_work.rb +++ b/app/models/graduation_work.rb @@ -123,7 +123,7 @@ class GraduationWork < ApplicationRecord # 作品是否被评阅过 def scored? - graduation_work_scores.where.not(core: nil).exists? + graduation_work_scores.where.not(score: nil).exists? end def work_cross_teacher_ids From 7930f3d674f2cb493410f769d7087030d616cc52 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 27 Sep 2019 18:09:14 +0800 Subject: [PATCH 191/394] tiaoz --- app/views/graduation_works/edit.json.jbuilder | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/graduation_works/edit.json.jbuilder b/app/views/graduation_works/edit.json.jbuilder index 718e2f4f7..30ffd6720 100644 --- a/app/views/graduation_works/edit.json.jbuilder +++ b/app/views/graduation_works/edit.json.jbuilder @@ -13,6 +13,7 @@ end if @task.task_type == 2 json.is_leader_work @work.user_id == @commit_user_id json.members @work_members do |member| + json.user_id member.user_id json.is_leader_work @work.user_id == @commit_user_id json.user_name member.user.real_name json.group_name member.course_group_name From 4e1e83f8fe394ffcb5fef3b2ee1b223e31e5c726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 27 Sep 2019 18:13:51 +0800 Subject: [PATCH 192/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/AppConfig.js | 4 ++-- .../tasks/GraduationTasksSubmitedit.js | 18 ++++++------------ 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index bc7fa8070..42fa73857 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -84,9 +84,9 @@ export function initAxiosInterceptors(props) { } config.url = `${proxy}${url}`; if (config.url.indexOf('?') == -1) { - config.url = `${config.url}?debug=${debugType}`; + config.url = `${config.url}?debug=${'student'}`; } else { - config.url = `${config.url}&debug=${debugType}`; + config.url = `${config.url}&debug=${'student'}`; } } else { // 加api前缀 diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTasksSubmitedit.js b/public/react/src/modules/courses/graduation/tasks/GraduationTasksSubmitedit.js index 21d340200..02e7177fa 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTasksSubmitedit.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTasksSubmitedit.js @@ -334,24 +334,22 @@ class GraduationTasksSubmitedit extends Component{ } - delecttask_status=(id,student_id)=>{ - let newid=id===undefined||id===null?student_id:id; + delecttask_status=(id)=>{ + let{selectmemberslist,task_status}=this.state; let newlist=task_status; let selects=selectmemberslist; for(var i=0; i 0 ?
    this.delecttask_status(item.user_id,item.student_id)}> + onClick={() => this.delecttask_status(item.user_id)}>
    : ""}
    From 31fc3b373dbbd422e17ee2c234fb37ade837d1b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 27 Sep 2019 18:14:01 +0800 Subject: [PATCH 193/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/AppConfig.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index 42fa73857..bc7fa8070 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -84,9 +84,9 @@ export function initAxiosInterceptors(props) { } config.url = `${proxy}${url}`; if (config.url.indexOf('?') == -1) { - config.url = `${config.url}?debug=${'student'}`; + config.url = `${config.url}?debug=${debugType}`; } else { - config.url = `${config.url}&debug=${'student'}`; + config.url = `${config.url}&debug=${debugType}`; } } else { // 加api前缀 From afb8c97f639ae79aa54a7810bb200e33f42157e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Sat, 28 Sep 2019 09:02:51 +0800 Subject: [PATCH 194/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/config/webpack.config.dev.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/config/webpack.config.dev.js b/public/react/config/webpack.config.dev.js index 7990f9557..fe525154f 100644 --- a/public/react/config/webpack.config.dev.js +++ b/public/react/config/webpack.config.dev.js @@ -32,7 +32,7 @@ module.exports = { // See the discussion in https://github.com/facebookincubator/create-react-app/issues/343.s // devtool: "cheap-module-eval-source-map", // 开启调试 - // devtool: "eval-source-map", // 开启调试 + devtool: "source-map", // 开启调试 // These are the "entry points" to our application. // This means they will be the "root" imports that are included in JS bundle. // The first two entry points enable "hot" CSS and auto-refreshes for JS. From f5a31fcc5081752235c85c4d8f754f4ed99f16ba Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Sat, 28 Sep 2019 09:11:50 +0800 Subject: [PATCH 195/394] =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=8F=90=E4=BA=A4?= =?UTF-8?q?=E8=AF=95=E5=8D=B7=E7=9A=84=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27091948_change_user_p02389416_exercise.rb | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 db/migrate/20190927091948_change_user_p02389416_exercise.rb diff --git a/db/migrate/20190927091948_change_user_p02389416_exercise.rb b/db/migrate/20190927091948_change_user_p02389416_exercise.rb new file mode 100644 index 000000000..bea1e28b7 --- /dev/null +++ b/db/migrate/20190927091948_change_user_p02389416_exercise.rb @@ -0,0 +1,22 @@ +class ChangeUserP02389416Exercise < ActiveRecord::Migration[5.2] + def change + puts "====> start_to_create user exercise_answer" + + #分别为第8,11,14,15,16,20,21,26 + # 分数分别为:2分,2分,5分,2分,2分,2分,2分,2分 合计19分 + question_ids = [37411,37414,37417,37418,37419,37423,37424,37429] + choice_ids = [117788,117797,117806,117809,117811,117816,117818,117828] + question_ids.each_with_index do |q, index| + ExerciseAnswer.create(user_id: 45442, exercise_question_id: q, exercise_choice_id: choice_ids[index]) + end + ex_user = ExerciseUser.where(user_id: 45442, exercise_id: 2561)&.first + if ex_user.present? + obj_score = ex_user.objective_score.to_i + 19 + total_score = ex_user.score.to_i + 19 + + ex_user.update_attributes(score: total_score, objective_score: obj_score) + end + + puts "====> end_to_create user exercise_answer" + end +end From 2cd042f0947e442bdd0dd2224c1f409efb64ce58 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Sat, 28 Sep 2019 09:29:23 +0800 Subject: [PATCH 196/394] =?UTF-8?q?=E8=AF=95=E5=8D=B7=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E6=96=87=E4=BB=B6=E7=9A=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...27091948_change_user_p02389416_exercise.rb | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/db/migrate/20190927091948_change_user_p02389416_exercise.rb b/db/migrate/20190927091948_change_user_p02389416_exercise.rb index bea1e28b7..c4026f75b 100644 --- a/db/migrate/20190927091948_change_user_p02389416_exercise.rb +++ b/db/migrate/20190927091948_change_user_p02389416_exercise.rb @@ -6,15 +6,26 @@ class ChangeUserP02389416Exercise < ActiveRecord::Migration[5.2] # 分数分别为:2分,2分,5分,2分,2分,2分,2分,2分 合计19分 question_ids = [37411,37414,37417,37418,37419,37423,37424,37429] choice_ids = [117788,117797,117806,117809,117811,117816,117818,117828] + question_scores = [2,2,5,2,2,2,2,2] question_ids.each_with_index do |q, index| - ExerciseAnswer.create(user_id: 45442, exercise_question_id: q, exercise_choice_id: choice_ids[index]) + ex_exercise_user = ExerciseAnswer.where(user_id: 45442, exercise_question_id: q, exercise_choice_id: choice_ids[index]) + if ex_exercise_user.exists? + ex_exercise_user.first.update_attribute(:score,question_scores[index]) + else + ExerciseAnswer.create(user_id: 45442, exercise_question_id: q, exercise_choice_id: choice_ids[index], score: question_scores[index]) + end end ex_user = ExerciseUser.where(user_id: 45442, exercise_id: 2561)&.first if ex_user.present? - obj_score = ex_user.objective_score.to_i + 19 - total_score = ex_user.score.to_i + 19 + if ex_user.score > 65 || ex_user.objective_score > 65 + ex_user.update_attributes(score: 65, objective_score: 65) + else + obj_score = ex_user.objective_score.to_i + 19 + total_score = ex_user.score.to_i + 19 + + ex_user.update_attributes(score: total_score, objective_score: obj_score) + end - ex_user.update_attributes(score: total_score, objective_score: obj_score) end puts "====> end_to_create user exercise_answer" From 1a2de9b995924780d8278e36c0821df279d54ce5 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Sat, 28 Sep 2019 09:49:02 +0800 Subject: [PATCH 197/394] Checkbox --- .../modules/courses/members/teacherList.js | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/public/react/src/modules/courses/members/teacherList.js b/public/react/src/modules/courses/members/teacherList.js index 18d9a1adf..c22b490ef 100644 --- a/public/react/src/modules/courses/members/teacherList.js +++ b/public/react/src/modules/courses/members/teacherList.js @@ -164,16 +164,16 @@ function buildColumns(that) { }, }) } - // if(isAdminOrTeacher && hasGraduationModule) { - // columns.unshift({ - // title: '', - // dataIndex: 'course_member_id', - // key: 'course_member_id', - // render: (content, item, index) => { - // return content ? : '' - // } - // }) - // } + if(isAdminOrTeacher && hasGraduationModule) { + columns.unshift({ + title: '', + dataIndex: 'course_member_id', + key: 'course_member_id', + render: (content, item, index) => { + return content ? : '' + } + }) + } return columns } @@ -688,6 +688,10 @@ class studentsList extends Component{ line-height:30px!important; flex: 0 0 30px; } + + .teacher_table .ant-table-thead > tr > th, .ant-table-tbody > tr > td { + padding: 16px 10px; + } `}
    @@ -741,7 +745,7 @@ class studentsList extends Component{
    }
    } -
    +
    {combineArray.length ? {/* pagination={{ current: page, total: total_count, pageSize:20, onChange: this.onPageChange }} */} From 1aaec08579e5b551dd0f9bf8425e648ce87b5c9d Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Sat, 28 Sep 2019 10:14:07 +0800 Subject: [PATCH 198/394] =?UTF-8?q?=E8=AF=95=E5=8D=B7=E7=BB=9F=E8=AE=A1?= =?UTF-8?q?=E7=BB=93=E6=9E=9C=E7=9A=84=E7=99=BE=E5=88=86=E6=AF=94=E8=BF=94?= =?UTF-8?q?=E5=9B=9E=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/exercises_helper.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/helpers/exercises_helper.rb b/app/helpers/exercises_helper.rb index 98a580ecc..ef9261990 100644 --- a/app/helpers/exercises_helper.rb +++ b/app/helpers/exercises_helper.rb @@ -148,7 +148,7 @@ module ExercisesHelper :choice_position => c.choice_position, :choice_text => c.choice_text, :choice_users_count => answer_users_count, - :choice_percent => answer_percent.round(1).to_s, + :choice_percent => answer_percent.round(2).to_s, :right_answer => right_answer } question_answer_infos.push(answer_option) @@ -174,7 +174,7 @@ module ExercisesHelper :choice_position => index+1, :choice_text => s_choice_text, :choice_users_count => user_count, - :choice_percent => answer_percent.round(1).to_s, + :choice_percent => answer_percent.round(2).to_s, :right_answer => true } question_answer_infos.push(answer_option) @@ -194,7 +194,7 @@ module ExercisesHelper :choice_position => (standard_answer_count + 1), :choice_text => "wrong", :choice_users_count => user_wrong_count, - :choice_percent => wrong_percent.round(1).to_s, + :choice_percent => wrong_percent.round(2).to_s, :right_answer => false } question_answer_infos.push(wrong_answer_position) @@ -220,7 +220,7 @@ module ExercisesHelper :choice_position => index+1, :choice_text => index+1, :choice_users_count => s, - :choice_percent => score_percent.round(1).to_s, + :choice_percent => score_percent.round(2).to_s, :right_answer => right_answer } question_answer_infos.push(answer_option) @@ -246,7 +246,7 @@ module ExercisesHelper :choice_position => index+1, :choice_text => index+1, :choice_users_count => s, - :choice_percent => score_percent.round(1).to_s, + :choice_percent => score_percent.round(2).to_s, :right_answer => right_answer } shixun_chas.push(answer_option) @@ -256,7 +256,7 @@ module ExercisesHelper :cha_name => c.challenge.subject, :cha_position => c.position, :cha_details => shixun_chas, - :cha_percent => game_percent.round(1).to_s + :cha_percent => game_percent.round(2).to_s } question_answer_infos.push(shixun_new_chas) end @@ -266,7 +266,7 @@ module ExercisesHelper :ques_less_title => ques_less_title, #副标题,仅实训题才有 :type => ex.question_type, :position => ex.question_number, - :percent => percent.round(1).to_s, + :percent => percent.round(2).to_s, :ques_effictive_counts => effictive_users_count, :ques_details => question_answer_infos } From fec9fb7f2649b1e66fe7b159057a240a00a25257 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Sat, 28 Sep 2019 10:15:03 +0800 Subject: [PATCH 199/394] =?UTF-8?q?=E9=97=AE=E5=8D=B7=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=AD=A6=E5=91=98=E5=8D=95=E4=BD=8D=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/polls_controller.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb index 6ffe277a3..6be131d7a 100644 --- a/app/controllers/polls_controller.rb +++ b/app/controllers/polls_controller.rb @@ -1318,7 +1318,7 @@ class PollsController < ApplicationController poll_ques_titles = poll_questions.pluck(:question_title).map {|k| ActionController::Base.helpers.strip_tags(k) if k.present?} poll_un_anony = poll.un_anonymous if poll_un_anony #是否匿名,默认为false - user_info = %w(登陆名 真实姓名 邮箱 学号) + user_info = %w(登陆名 真实姓名 邮箱 学号 学员单位) else user_info = [] end @@ -1392,7 +1392,8 @@ class PollsController < ApplicationController user_login = u_user.login user_name = u_user.real_name.present? ? u_user.real_name : "--" user_student_id = u_user.student_id.present? ? u_user.student_id : "--" - user_cell += [user_login,user_name, u_user.mail, user_student_id] + user_school_name = u_user.school_name.present? ? u_user.school_name : "--" + user_cell += [user_login,user_name, u_user.mail, user_student_id, user_school_name] end all_user_cell = user_cell + user_answer_array user_commit.push(all_user_cell) From 1d2097611be3de30016dbdfa2c0ebff6a337d4b1 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Sat, 28 Sep 2019 10:23:48 +0800 Subject: [PATCH 200/394] =?UTF-8?q?=E9=80=89=E6=8B=A9=E9=A2=98=E7=AD=94?= =?UTF-8?q?=E6=A1=88=E6=98=BE=E7=A4=BA=E4=B8=8D=E4=BA=86=E5=85=AC=E5=BC=8F?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/package.json | 1 - .../react/src/modules/page/component/ChooseAnswerView.js | 8 +++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/public/react/package.json b/public/react/package.json index e91e61f03..3e86dae98 100644 --- a/public/react/package.json +++ b/public/react/package.json @@ -79,7 +79,6 @@ "react-url-query": "^1.4.0", "redux": "^4.0.0", "redux-thunk": "2.3.0", - "showdown": "^1.8.6", "store": "^2.0.12", "style-loader": "0.19.0", "styled-components": "^4.1.3", diff --git a/public/react/src/modules/page/component/ChooseAnswerView.js b/public/react/src/modules/page/component/ChooseAnswerView.js index 6edc083e2..b40c96507 100644 --- a/public/react/src/modules/page/component/ChooseAnswerView.js +++ b/public/react/src/modules/page/component/ChooseAnswerView.js @@ -6,10 +6,8 @@ import { withStyles } from 'material-ui/styles'; import Table, { TableBody, TableCell, TableHead, TableRow } from 'material-ui/Table'; import Paper from 'material-ui/Paper'; -import showdown from 'showdown' -const converter = new showdown.Converter() - // text = '# hello, markdown!', - // html = converter.makeHtml(text); +import { markdownToHTML } from 'educoder' + const styles = theme => ({ root: { @@ -34,7 +32,7 @@ const ChooseAnswerView = ({ gameAnswer, classes }) => { return (

    第{index+1}题

    -

    +

    ); })} From b5941cf2e9b2c00723103dd490ec1d124e8a4e0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Sat, 28 Sep 2019 11:13:30 +0800 Subject: [PATCH 201/394] b --- public/react/config/webpack.config.dev.js | 2 +- .../courses/coursesPublic/ModulationModal.js | 14 +++++++++++++- .../courses/graduation/tasks/GraduationAcross.js | 9 +++++---- .../graduation/tasks/GraduationTaskssettinglist.js | 12 +++++++----- .../paths/PathDetail/DetailCardsEditAndAdd.js | 1 + .../paths/PathDetail/DetailCardsEditAndEdit.js | 1 + 6 files changed, 28 insertions(+), 11 deletions(-) diff --git a/public/react/config/webpack.config.dev.js b/public/react/config/webpack.config.dev.js index fe525154f..ef38a18f8 100644 --- a/public/react/config/webpack.config.dev.js +++ b/public/react/config/webpack.config.dev.js @@ -32,7 +32,7 @@ module.exports = { // See the discussion in https://github.com/facebookincubator/create-react-app/issues/343.s // devtool: "cheap-module-eval-source-map", // 开启调试 - devtool: "source-map", // 开启调试 + //devtool: "source-map", // 开启调试 // These are the "entry points" to our application. // This means they will be the "root" imports that are included in JS bundle. // The first two entry points enable "hot" CSS and auto-refreshes for JS. diff --git a/public/react/src/modules/courses/coursesPublic/ModulationModal.js b/public/react/src/modules/courses/coursesPublic/ModulationModal.js index 974077793..1857f6814 100644 --- a/public/react/src/modules/courses/coursesPublic/ModulationModal.js +++ b/public/react/src/modules/courses/coursesPublic/ModulationModal.js @@ -94,7 +94,19 @@ class ModulationModal extends Component{
  • 原因不能为空
  • -
  • + + + +
  • e.user_name.indexOf(searchValue)>-1) : teachers; const course_groupsList = searchValue ? course_groups&&course_groups.filter(e=>e.name.indexOf(searchValue)>-1) : course_groups; - return( + const graduation_groupslist =searchValue ? graduation_groups&&graduation_groups.filter(e=>e.name.indexOf(searchValue)>-1) : graduation_groups; + return(
  • :""} {comment_status == 2 &&teacherList&&teacherList.length>2? this.checkonChange(e,teacherList)}>全选:""} - {comment_status != 2 &&course_groupsList&&course_groupsList.length>2? this.checkonChange(e,course_groupsList)}>全选:""} + {comment_status != 2 &&graduation_groupslist&&graduation_groupslist.length>2? this.checkonChange(e,graduation_groupslist)}>全选:""} {menu}
    @@ -515,7 +516,7 @@ class GraduationAcross extends Component{ teacherList && teacherList.map((i,key)=>{ return }): - course_groupsList && course_groupsList.map((i,key)=>{ + graduation_groupslist && graduation_groupslist.map((i,key)=>{ return }) } diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js index 318955479..f3495f7e4 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssettinglist.js @@ -535,10 +535,12 @@ class GraduationTaskssettinglist extends Component{ // console.log(result) if(result.data.status===0){ this.seacthdata(teacher_comment,task_status,course_group,cross_comment,order,b_order,search,this.state.page); + this.props.showNotification(result.data.message); + this.cancelmodel(); this.setState({ - Modalstype:true, + Modalstype:false, Allocationtype:false, - Modalstopval:result.data.message, + // Modalstopval:result.data.message, ModalSave:this.cancelmodel, }) } @@ -866,10 +868,10 @@ class GraduationTaskssettinglist extends Component{ {tag.name} : -

    this.showModulationtype(tag.id):tag.name==="分配"?taskslistdata&&taskslistdata.cross_comment===true?"":"":""}> {tag.name==="分配"?taskslistdata&&taskslistdata.cross_comment===true?"":"":tag.name} -

    + } } @@ -972,7 +974,7 @@ class GraduationTaskssettinglist extends Component{ white-space: nowrap; } .ant-table-tbody>tr>td, .ant-table-thead>tr>th{ - padding:16px 8px; + padding:16px 5px; } ` } diff --git a/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js b/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js index ed4cc85eb..159c40475 100644 --- a/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js +++ b/public/react/src/modules/paths/PathDetail/DetailCardsEditAndAdd.js @@ -389,6 +389,7 @@ class DetailCardsEditAndAdd extends Component{ :""} {selectShixun===true? Date: Sat, 28 Sep 2019 11:42:05 +0800 Subject: [PATCH 202/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/courses/exercise/Exercisetablesmubu.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/exercise/Exercisetablesmubu.js b/public/react/src/modules/courses/exercise/Exercisetablesmubu.js index d2d6103b8..501a7ebf5 100644 --- a/public/react/src/modules/courses/exercise/Exercisetablesmubu.js +++ b/public/react/src/modules/courses/exercise/Exercisetablesmubu.js @@ -96,7 +96,7 @@ class Exercisetablesmubus extends Component { '0%': '#29BD8B', '100%': '#29BD8B', }} - percent={record.max_score*100} showInfo={false}/>
    {record.max_score*100}%
    } + percent={(record.max_score*100).toFixed()} showInfo={false}/>
    {(record.max_score*100).toFixed()}%
    }
    ), }]; From c469e59ad160153e4ad855cd4968d657928497dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Sat, 28 Sep 2019 14:59:57 +0800 Subject: [PATCH 203/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/graduation/tasks/GraduationAcross.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js b/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js index 5ff1c0551..b672d1b81 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js @@ -472,9 +472,9 @@ class GraduationAcross extends Component{ 分配给{ comment_status && comment_status == 2 ? "老师":"答辩组"}: + +
    + +
    +
    +
    +
    + <%= check_box_tag(:online, 1, image.online?, id: nil, class: 'online-check-box', data: { id: image.id, toggle: 'tooltip', title: '首页展示' }) %> + <%= delete_link '删除', admins_carousel_path(image, element: ".custom-carousel-item-#{image.id}", not_refresh: true), class: 'delete-btn' do %> + + <% end %> +
    +
    +
    + <% end %> +
    +
    + + +<%= render partial: 'admins/carousels/shared/add_carousel_modal' %> +<%= render partial: 'admins/shared/modal/upload_file_modal' %> \ No newline at end of file diff --git a/app/views/admins/carousels/shared/_add_carousel_modal.html.erb b/app/views/admins/carousels/shared/_add_carousel_modal.html.erb new file mode 100644 index 000000000..d1e75e29e --- /dev/null +++ b/app/views/admins/carousels/shared/_add_carousel_modal.html.erb @@ -0,0 +1,36 @@ + \ No newline at end of file diff --git a/app/views/admins/shared/_sidebar.html.erb b/app/views/admins/shared/_sidebar.html.erb index 2d9461f45..553820e69 100644 --- a/app/views/admins/shared/_sidebar.html.erb +++ b/app/views/admins/shared/_sidebar.html.erb @@ -77,7 +77,8 @@
  • - <%= sidebar_item_group('#helps-submenu', '帮助中心', icon: 'info-circle') do %> + <%= sidebar_item_group('#setting-submenu', '网站建设', icon: 'cogs') do %> +
  • <%= sidebar_item(admins_carousels_path, '轮播图', icon: 'image', controller: 'admins-carousels') %>
  • <%= sidebar_item(edit_admins_about_path, '关于我们', icon: 'smile-o', controller: 'admins-abouts') %>
  • <%= sidebar_item(edit_admins_contact_us_path, '联系我们', icon: 'commenting-o', controller: 'admins-contact_us') %>
  • <%= sidebar_item(admins_cooperatives_path, '合作伙伴', icon: 'handshake-o', controller: 'admins-cooperatives') %>
  • diff --git a/config/routes.rb b/config/routes.rb index 706583619..2c02c6a79 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -962,6 +962,9 @@ Rails.application.routes.draw do post :drag, on: :collection post :replace_image_url, on: :member end + resources :carousels, only: [:index, :create, :update, :destroy] do + post :drag, on: :collection + end end resources :colleges, only: [] do diff --git a/db/migrate/20190930010405_resort_portal_image_data.rb b/db/migrate/20190930010405_resort_portal_image_data.rb new file mode 100644 index 000000000..665b48466 --- /dev/null +++ b/db/migrate/20190930010405_resort_portal_image_data.rb @@ -0,0 +1,7 @@ +class ResortPortalImageData < ActiveRecord::Migration[5.2] + def change + PortalImage.order(position: :asc).each_with_index do |image, index| + image.update!(position: index + 1) + end + end +end From a25b193015f671c7319eca96199a148e14168c61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Mon, 30 Sep 2019 10:13:16 +0800 Subject: [PATCH 243/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EcCompletionCalculation.js | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/public/react/src/modules/ecs/subroute/ecCompletion_calculation/EcCompletionCalculation.js b/public/react/src/modules/ecs/subroute/ecCompletion_calculation/EcCompletionCalculation.js index e33037d15..bbb810429 100644 --- a/public/react/src/modules/ecs/subroute/ecCompletion_calculation/EcCompletionCalculation.js +++ b/public/react/src/modules/ecs/subroute/ecCompletion_calculation/EcCompletionCalculation.js @@ -547,7 +547,7 @@ class EcCompletionCalculation extends Component { -
    +
    { graduation_list.length===0? @@ -604,16 +604,28 @@ class EcCompletionCalculation extends Component { Spintype===false?graduation_list.map((item,key)=>{ return( -
  • 5 ? (76*(ec_course_targets_count+4)+380):1160+"px"}}> - {/* {item.ec_graduation_name} */} + +

    5 ? (76*(ec_course_targets_count+4)+380+15):1200+"px"}}> {key+1} {item.content} {item.status==="not_achieved"?"未完成":"完成"} - {item.objective_achievement===null?0:item.objective_achievement} - {item.actually_achievement===null?0:item.actually_achievement} - {item.weights===null||item.weights===0?立即配置:{item.weights}} + {item.objective_achievement===null?0:item.objective_achievement} + {item.actually_achievement===null?0:item.actually_achievement} + {item.weights===null||item.weights===0?立即配置:{item.weights}} {TargetresContentList(ec_course_targets_count,item.target_position)} -

  • +

    + + + //
  • 5 ? (76*(ec_course_targets_count+4)+380):1200+"px"}}> + // {/* {item.ec_graduation_name} */} + // {key+1} + // {item.content} + // {item.status==="not_achieved"?"未完成":"完成"} + // {item.objective_achievement===null?0:item.objective_achievement} + // {item.actually_achievement===null?0:item.actually_achievement} + // {item.weights===null||item.weights===0?立即配置:{item.weights}} + // {TargetresContentList(ec_course_targets_count,item.target_position)} + //
  • ) }):"" From b7578443ae64ff276207ff978c5d168fb5c9b68d Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Mon, 30 Sep 2019 10:14:42 +0800 Subject: [PATCH 244/394] =?UTF-8?q?=E4=BA=A4=E6=B5=81=E9=97=AE=E7=AD=94?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=80=9A=E7=9F=A5=E5=85=AC=E5=91=8Atab?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/memos_controller.rb | 4 ++-- app/helpers/memos_helper.rb | 2 +- app/models/forum.rb | 1 + db/migrate/20190930020534_migrate_forum_name.rb | 9 +++++++++ 4 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 db/migrate/20190930020534_migrate_forum_name.rb diff --git a/app/controllers/memos_controller.rb b/app/controllers/memos_controller.rb index 88139fe7e..d2c386681 100644 --- a/app/controllers/memos_controller.rb +++ b/app/controllers/memos_controller.rb @@ -25,9 +25,9 @@ class MemosController < ApplicationController !search.blank? ? "forum_id = #{forum_id} and root_id is null and subject like '%#{search}%'" : "forum_id = #{forum_id} and root_id is null" elsif !search.blank? - "forum_id in(3, 5) and root_id is null and subject like '%#{search}%'" + "forum_id in(3, 5, 16) and root_id is null and subject like '%#{search}%'" else - "forum_id in(3, 5) and root_id is null" + "forum_id in(3, 5, 16) and root_id is null" end if tag_repertoire_id diff --git a/app/helpers/memos_helper.rb b/app/helpers/memos_helper.rb index 434d9b66a..ea84ec2c1 100644 --- a/app/helpers/memos_helper.rb +++ b/app/helpers/memos_helper.rb @@ -1,6 +1,6 @@ module MemosHelper def forum_list - [{id: 5, name: "技术分享"}, {id: 3, name: "操作指南"}] + [{id: 5, name: "技术分享"}, {id: 3, name: "操作指南"}, {id: 16, name: "通知公告"}] end end diff --git a/app/models/forum.rb b/app/models/forum.rb index 88aafa676..cd9b76a96 100644 --- a/app/models/forum.rb +++ b/app/models/forum.rb @@ -1,2 +1,3 @@ class Forum < ApplicationRecord + has_many :memos, dependent: :destroy end diff --git a/db/migrate/20190930020534_migrate_forum_name.rb b/db/migrate/20190930020534_migrate_forum_name.rb new file mode 100644 index 000000000..102d8c9a0 --- /dev/null +++ b/db/migrate/20190930020534_migrate_forum_name.rb @@ -0,0 +1,9 @@ +class MigrateForumName < ActiveRecord::Migration[5.2] + def change + forum = Forum.find_by(id: 16) + if forum.present? + forum.update_attributes(name: "通知公告") + forum.memos.destroy_all + end + end +end From 04bc9b9a158072e6fc217425ee7389bc3ee133c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Mon, 30 Sep 2019 10:42:51 +0800 Subject: [PATCH 245/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/forums/MemoNew.js | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/forums/MemoNew.js b/public/react/src/modules/forums/MemoNew.js index 2f6eb196d..4b3fd6550 100644 --- a/public/react/src/modules/forums/MemoNew.js +++ b/public/react/src/modules/forums/MemoNew.js @@ -119,11 +119,13 @@ function create_editorMD(id, width, high, placeholder, imageUrl, callback){ const typeNameMap = { '技术分享': 5, - '操作指南': 3, + '操作指南': 3, + '通知公告':16, } export const typeNameMap2 = { 5: '技术分享', - 3: '操作指南', + 3: '操作指南', + 16: '通知公告', } const defaultType = '技术分享' @@ -171,7 +173,8 @@ class MemoNew extends Component { currentSelectRepertoiresIndex: -1, repertoiresTagMap: {}, - fileList: [] + fileList: [], + forums:[{id:5,name:"技术分享"},{id:3,name:"技术指南"},{id:16,name:"通知公告"}], } } onCommit() { @@ -336,6 +339,13 @@ class MemoNew extends Component { $('head').append( $('') ) $('head').append( $(``) ) } + if(data.forums){ + this.setState({ + forums: data.forums===undefined||data.forums===null||data.forums.length===0? this.state.forums:data.forums + // repertoires, + // repertoiresTagMap + }) + } }).catch((error) => { console.log(error) }) @@ -607,7 +617,7 @@ class MemoNew extends Component { }); } render() { - const { match, history } = this.props + const { match, history,forums } = this.props const { // repertoires, repertoiresTagMap, currentSelectRepertoiresIndex, memoRepertoire, tag_list, @@ -750,10 +760,14 @@ class MemoNew extends Component {
    *
    + { + forums.length>0 + }
    From 91cedff462abc8e4ffe01a4676a4941c5fbca59c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Mon, 30 Sep 2019 10:54:20 +0800 Subject: [PATCH 246/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/forums/ForumsNavTab.js | 206 +++++++++--------- public/react/src/modules/forums/MemoNew.js | 3 - 2 files changed, 106 insertions(+), 103 deletions(-) diff --git a/public/react/src/modules/forums/ForumsNavTab.js b/public/react/src/modules/forums/ForumsNavTab.js index 60dc36a25..8e12912bb 100644 --- a/public/react/src/modules/forums/ForumsNavTab.js +++ b/public/react/src/modules/forums/ForumsNavTab.js @@ -1,100 +1,106 @@ -import React, { Component } from 'react'; -import { Redirect } from 'react-router'; - -import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom"; - -import PropTypes from 'prop-types'; - -import classNames from 'classnames' - -class ForumsNavTab extends Component { - constructor(props) { - super(props) - - this.state = { - - } - } - - onNavClick(active) { - // TODO 为什么事件发不过去 - // https://github.com/facebook/react/issues/3249#issuecomment-177750141 - // window.$(window).trigger('setSearchValue', '', true); - this.props.setSearchValue('') - - if (!active) { - this.props.initForumState({ - selectedHotLabelIndex: -1, - }) - } - } - render() { - const { match, history, currentPage } = this.props - - const techSharePath = `/forums/categories/5` - const guidePath = `/forums/categories/3` - - const hottestPath = `/forums/categories/all?order=hottest` // ?order=hottest - const newestPath = `/forums/categories/all?order=newest` // ?order=newest - - const shixunDiscussPath = `/forums/categories/shixun_discuss` - const locationPath = history.location.pathname + history.location.search - /* -
      -
    • - techShare -
    • -
    • - guide -
    • -
    - */ - return ( -
    -

    - {/* - 技术分享 - 219 - */} - this.onNavClick(locationPath.indexOf('order=newest') !== -1)} - > - 最新回复 - - this.onNavClick(locationPath.indexOf('order=hottest') !== -1)} - > - 热门话题 - - this.onNavClick(locationPath.indexOf('shixun_discuss') !== -1)} - > - 实训回复 - - - this.onNavClick(locationPath.indexOf(techSharePath) === 0)} - > - 技术分享 - - this.onNavClick(locationPath.indexOf(guidePath) === 0)} - > - 操作指南 - - {/* - 实训交流 - 1391 - */} -

    -
    - ); - } -} - -export default ForumsNavTab; +import React, { Component } from 'react'; +import { Redirect } from 'react-router'; + +import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom"; + +import PropTypes from 'prop-types'; + +import classNames from 'classnames' + +class ForumsNavTab extends Component { + constructor(props) { + super(props) + + this.state = { + + } + } + + onNavClick(active) { + // TODO 为什么事件发不过去 + // https://github.com/facebook/react/issues/3249#issuecomment-177750141 + // window.$(window).trigger('setSearchValue', '', true); + this.props.setSearchValue('') + + if (!active) { + this.props.initForumState({ + selectedHotLabelIndex: -1, + }) + } + } + render() { + const { match, history, currentPage } = this.props + + const techSharePath = `/forums/categories/5` + const guidePath = `/forums/categories/3` + const guidePaths = `/forums/categories/16` + const hottestPath = `/forums/categories/all?order=hottest` // ?order=hottest + const newestPath = `/forums/categories/all?order=newest` // ?order=newest + + const shixunDiscussPath = `/forums/categories/shixun_discuss` + const locationPath = history.location.pathname + history.location.search + /* +
      +
    • + techShare +
    • +
    • + guide +
    • +
    + */ + return ( +
    +

    + {/* + 技术分享 + 219 + */} + this.onNavClick(locationPath.indexOf('order=newest') !== -1)} + > + 最新回复 + + this.onNavClick(locationPath.indexOf('order=hottest') !== -1)} + > + 热门话题 + + this.onNavClick(locationPath.indexOf('shixun_discuss') !== -1)} + > + 实训回复 + + + this.onNavClick(locationPath.indexOf(techSharePath) === 0)} + > + 技术分享 + + this.onNavClick(locationPath.indexOf(guidePath) === 0)} + > + 操作指南 + + this.onNavClick(locationPath.indexOf(guidePaths) === 0)} + > + 通知公告 + + {/* + 实训交流 + 1391 + */} +

    +
    + ); + } +} + +export default ForumsNavTab; diff --git a/public/react/src/modules/forums/MemoNew.js b/public/react/src/modules/forums/MemoNew.js index 4b3fd6550..962e74f22 100644 --- a/public/react/src/modules/forums/MemoNew.js +++ b/public/react/src/modules/forums/MemoNew.js @@ -760,9 +760,6 @@ class MemoNew extends Component {
    *
    - { - forums.length>0 - } this.editlevelslist(e,key)}/> + + {key===editlevels.length-1?小于:大于或等于} + + this.editlevelslists(e,key)}/> + + + {key===editlevels.length-1? + + + this.deleteditecGrade(key)}> + + + + + this.additecGrade(key)}> + + + :""} + + ) + }) + } + 内容不能为空 + + + +
    +
    提交
    +
    取消
    +
    + +
    + + + +
    +
    +
    ) } From 2424509691c6a077496242b406bbe2c106ae00c5 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Wed, 9 Oct 2019 09:31:59 +0800 Subject: [PATCH 289/394] =?UTF-8?q?=E5=AD=A6=E7=94=9F=E8=BA=AB=E4=BB=BD?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E8=AF=95=E5=8D=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/exercise.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/models/exercise.rb b/app/models/exercise.rb index 825f7cd9f..8469d25b6 100644 --- a/app/models/exercise.rb +++ b/app/models/exercise.rb @@ -131,7 +131,7 @@ class Exercise < ApplicationRecord status = 4 else if user.present? && user.student_of_course?(course) #当为学生的时候,需根据分班来判断试卷状态 - ex_time = get_exercise_times(user_id,false) + ex_time = get_exercise_times(user.id,false) pb_time = ex_time[:publish_time] ed_time = ex_time[:end_time] if pb_time.present? && ed_time.present? && pb_time <= Time.now && ed_time > Time.now From 252a2258bf5da7ba93abcf0c0f061e441017df41 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Wed, 9 Oct 2019 09:38:53 +0800 Subject: [PATCH 290/394] ec: modify api --- .../course_achievement_methods_controller.rb | 8 ++- .../wechats/js_sdk_signatures_controller.rb | 2 +- app/libs/util/wechat.rb | 56 ++------------- app/libs/util/wechat_store.rb | 72 +++++++++++++++++++ app/models/ec_course.rb | 2 +- app/models/ec_course_evaluation.rb | 19 +++++ ...reate_course_achievement_method_service.rb | 18 ++--- ...ec_course_achievement_method.json.jbuilder | 2 + .../course_evaluations/slimmer.json.jbuilder | 8 ++- 9 files changed, 121 insertions(+), 66 deletions(-) create mode 100644 app/libs/util/wechat_store.rb diff --git a/app/controllers/ecs/course_achievement_methods_controller.rb b/app/controllers/ecs/course_achievement_methods_controller.rb index 389169258..62d609ea7 100644 --- a/app/controllers/ecs/course_achievement_methods_controller.rb +++ b/app/controllers/ecs/course_achievement_methods_controller.rb @@ -5,13 +5,17 @@ class Ecs::CourseAchievementMethodsController < Ecs::CourseBaseController end def create - @course_target = Ecs::CreateCourseAchievementMethodsService.call(current_course_target, create_params) + Ecs::CreateCourseAchievementMethodsService.call(current_course_target, create_params) + render_ok end private def create_params - params.permit(course_achievement_methods: %i[id course_evaluation_id course_evaluation_subitem_ids score percentage]) + params.permit(course_achievement_methods: [ + :id, :course_evaluation_id, :score, :percentage, + course_evaluation_relates: %i[:subitem_id position] + ]) end def current_course_target diff --git a/app/controllers/wechats/js_sdk_signatures_controller.rb b/app/controllers/wechats/js_sdk_signatures_controller.rb index 0b66cc263..f6a01b0e2 100644 --- a/app/controllers/wechats/js_sdk_signatures_controller.rb +++ b/app/controllers/wechats/js_sdk_signatures_controller.rb @@ -5,7 +5,7 @@ class Wechats::JsSdkSignaturesController < ApplicationController signature = Util::Wechat.js_sdk_signature(params[:url], noncestr, timestamp) render_ok(appid: Util::Wechat.appid, timestamp: timestamp, noncestr: noncestr, signature: signature) - rescue Util::Wechat::Error => ex + rescue Util::WechatStore::Error => ex render_error(ex.message) end end \ No newline at end of file diff --git a/app/libs/util/wechat.rb b/app/libs/util/wechat.rb index 1b064ba94..cb7b9044d 100644 --- a/app/libs/util/wechat.rb +++ b/app/libs/util/wechat.rb @@ -13,63 +13,15 @@ module Util::Wechat end def access_token - # 7200s 有效时间 - Rails.cache.fetch(access_token_cache_key, expires_in: 100.minutes) do - result = request(:get, '/cgi-bin/token', appid: appid, secret: secret, grant_type: 'client_credential') - result['access_token'] - end - end - - def refresh_access_token - Rails.cache.delete(access_token_cache_key) - access_token + wechat_store.access_token end def jsapi_ticket - # 7200s 有效时间 - Rails.cache.fetch(jsapi_ticket_cache_key, expires_in: 100.minutes) do - result = request(:get, '/cgi-bin/ticket/getticket', access_token: access_token, type: 'jsapi') - result['ticket'] - end - end - - def refresh_jsapi_ticket - Rails.cache.delete(jsapi_ticket_cache_key) - jsapi_ticket - end - - def access_token_cache_key - "#{base_cache_key}/access_token" - end - - def jsapi_ticket_cache_key - "#{base_cache_key}/jsapi_ticket" + wechat_store.jsapi_ticket end - def base_cache_key - "wechat/#{appid}" - end - - private - - def request(method, url, **params) - Rails.logger.error("[wechat] request: #{method} #{url} #{params.inspect}") - - client = Faraday.new(url: BASE_SITE) - response = client.public_send(method, url, params) - result = JSON.parse(response.body) - - Rails.logger.error("[wechat] response:#{response.status} #{result.inspect}") - - if response.status != 200 - raise Error, result.inspect - end - - if result['errcode'].present? && result['errcode'].to_i.nonzero? - raise Error, result.inspect - end - - result + def wechat_store + @_wechat_store ||= ::Util::WechatStore.new(appid, secret) end end end \ No newline at end of file diff --git a/app/libs/util/wechat_store.rb b/app/libs/util/wechat_store.rb new file mode 100644 index 000000000..a6f3ac76a --- /dev/null +++ b/app/libs/util/wechat_store.rb @@ -0,0 +1,72 @@ +class Util::WechatStore + BASE_SITE = 'https://api.weixin.qq.com'.freeze + + Error = Class.new(StandardError) + + attr_reader :appid, :secret + + def initialize(appid, secret) + @appid = appid + @secret = secret + end + + def access_token + # 7200s 有效时间 + Rails.cache.fetch(access_token_cache_key, expires_in: 100.minutes) do + result = request(:get, '/cgi-bin/token', appid: appid, secret: secret, grant_type: 'client_credential') + result['access_token'] + end + end + + def refresh_access_token + Rails.cache.delete(access_token_cache_key) + access_token + end + + def jsapi_ticket + # 7200s 有效时间 + Rails.cache.fetch(jsapi_ticket_cache_key, expires_in: 100.minutes) do + result = request(:get, '/cgi-bin/ticket/getticket', access_token: access_token, type: 'jsapi') + result['ticket'] + end + end + + def refresh_jsapi_ticket + Rails.cache.delete(jsapi_ticket_cache_key) + jsapi_ticket + end + + def access_token_cache_key + "#{base_cache_key}/access_token" + end + + def jsapi_ticket_cache_key + "#{base_cache_key}/jsapi_ticket" + end + + def base_cache_key + "wechat/#{appid}" + end + + private + + def request(method, url, **params) + Rails.logger.error("[wechat] request: #{method} #{url} #{params.inspect}") + + client = Faraday.new(url: BASE_SITE) + response = client.public_send(method, url, params) + result = JSON.parse(response.body) + + Rails.logger.error("[wechat] response:#{response.status} #{result.inspect}") + + if response.status != 200 + raise Error, result.inspect + end + + if result['errcode'].present? && result['errcode'].to_i.nonzero? + raise Error, result.inspect + end + + result + end +end \ No newline at end of file diff --git a/app/models/ec_course.rb b/app/models/ec_course.rb index 6f5480ea8..4e7202f05 100644 --- a/app/models/ec_course.rb +++ b/app/models/ec_course.rb @@ -6,7 +6,7 @@ class EcCourse < ApplicationRecord has_many :ec_graduation_subitem_course_targets, through: :ec_course_targets # 课程负责教师 has_many :ec_course_users - has_many :course_managers, through: :ec_course_users, class_name: 'User' + has_many :course_managers, through: :ec_course_users, source: :user # 课程考核标准 has_many :ec_course_evaluations, dependent: :destroy # 课程等级 diff --git a/app/models/ec_course_evaluation.rb b/app/models/ec_course_evaluation.rb index e96f1c98b..40fd10dfa 100644 --- a/app/models/ec_course_evaluation.rb +++ b/app/models/ec_course_evaluation.rb @@ -16,4 +16,23 @@ class EcCourseEvaluation < ApplicationRecord def imported? import_status? end + + def evaluation_relates + # 总成绩支撑只有课程考核标准的名称, 分项成绩支撑是课程考核标准名称与考核分项的笛卡尔积 + if status == 1 + return evaluation_count.times.map { |index| { id: -1, name: "#{name}(#{index + 1})", position: index + 1 } } + end + + if is_course_type? + ec_course_evaluation_subitems.map.with_index { |item, index| { id: item.id, name: item.name, position: index + 1 } } + else + data = [] + ec_course_evaluation_subitems.each do |item| + evaluation_count.times do |i| + data << { id: item.id, name: "#{name}(#{i + 1})#{item.name}", position: i + 1 } + end + end + data + end + end end diff --git a/app/services/ecs/create_course_achievement_method_service.rb b/app/services/ecs/create_course_achievement_method_service.rb index 01f09ff2b..0c086631f 100644 --- a/app/services/ecs/create_course_achievement_method_service.rb +++ b/app/services/ecs/create_course_achievement_method_service.rb @@ -31,8 +31,8 @@ class Ecs::CreateCourseAchievementMethodsService < ApplicationService # 创建新的评价方法时,全部为新建 if item[:id].blank? || course_target.ec_course_achievement_methods.find_by(id: item[:id]).blank? item[:ec_achievement_evaluation_relates_attributes] = - Array(*item[:course_evaluation_subitem_ids]).uniq.map do |subitem_id| - { ec_course_evaluation_subitem_id: subitem_id.to_i } + item[:course_evaluation_relates].map do |relate| + { ec_course_evaluation_subitem_id: relate[:subitem_id].to_i, position: relate[:position] } end return end @@ -41,22 +41,22 @@ class Ecs::CreateCourseAchievementMethodsService < ApplicationService relates = achievement_method.ec_achievement_evaluation_relates # 获取传入的 subitem id数组和已存在的 subitem id数组 - old_subitem_ids = relates.map(&:ec_course_evaluation_subitem_id).uniq - new_subitem_ids = Array(*item[:course_evaluation_subitem_ids]).map(&:to_i).uniq + old_data = relates.map { |e| [e.ec_course_evaluation_subitem_id, e.position] } + new_data = item[:course_evaluation_relates].map { |e| [e[:subitem_id, e[:position]]] } # 分别得到需要移除的 subitem ID数组和需要创建的 subitem ID数组 - destroy_subitem_ids = old_subitem_ids - new_subitem_ids - create_subitem_ids = new_subitem_ids - old_subitem_ids + destroy_data = old_data - new_data + create_data = new_data - old_data # 生成需要创建关系的 subitem id 数据 - create_attributes = create_subitem_ids.map { |item_id| { ec_course_evaluation_subitem_id: item_id } } + create_attributes = create_data.map { |arr| { ec_course_evaluation_subitem_id: arr[0], position: arr[1] } } # 处理需要更新或者删除的记录 exists_attributes = relates.map do |relate| - if destroy_subitem_ids.include?(relate.ec_course_evaluation_subitem_id) + if destroy_data.include?([relate.ec_course_evaluation_subitem_id, relate.position]) { id: relate.id, _destroy: true } else - relate.as_json(only: %i[id ec_course_evaluation_subitem_id ec_course_achievement_method_id]) + relate.as_json(only: %i[id ec_course_evaluation_subitem_id ec_course_achievement_method_id position]) end end diff --git a/app/views/ecs/course_achievement_methods/shared/_ec_course_achievement_method.json.jbuilder b/app/views/ecs/course_achievement_methods/shared/_ec_course_achievement_method.json.jbuilder index 5cc3220a4..868e7822c 100644 --- a/app/views/ecs/course_achievement_methods/shared/_ec_course_achievement_method.json.jbuilder +++ b/app/views/ecs/course_achievement_methods/shared/_ec_course_achievement_method.json.jbuilder @@ -7,3 +7,5 @@ end json.course_evaluation_subitems ec_course_achievement_method.ec_course_evaluation_subitems, partial: 'ecs/shared/ec_course_evaluation_subitem', as: :ec_course_evaluation_subitem + +json.course_evaluation_relates ec_course_achievement_method.ec_course_evaluation.evaluation_relates diff --git a/app/views/ecs/course_evaluations/slimmer.json.jbuilder b/app/views/ecs/course_evaluations/slimmer.json.jbuilder index 6e0faef3e..1f4dc0cc0 100644 --- a/app/views/ecs/course_evaluations/slimmer.json.jbuilder +++ b/app/views/ecs/course_evaluations/slimmer.json.jbuilder @@ -1 +1,7 @@ -json.course_evaluations @course_evaluations, partial: 'ecs/course_evaluations/shared/ec_course_evaluation_slim', as: :ec_course_evaluation +json.course_evaluations do + json.array! @course_evaluations do |course_evaluation| + json.partial! 'ecs/course_evaluations/shared/ec_course_evaluation_slim', ec_course_evaluation: course_evaluation + + json.evaluation_relates course_evaluation.evaluation_relates + end +end \ No newline at end of file From 05a0e4f8326e8b9309c6dd24363f790edd67a9ef Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Wed, 9 Oct 2019 10:00:38 +0800 Subject: [PATCH 291/394] =?UTF-8?q?=E8=AF=95=E5=8D=B7=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E7=9A=84=E6=98=BE=E7=A4=BA=EF=BC=88=E5=AD=A6=E7=94=9F=E8=BA=AB?= =?UTF-8?q?=E4=BB=BD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercises_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index f2e8508f0..cfe72effc 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -46,8 +46,8 @@ class ExercisesController < ApplicationController @exercises = member_show_exercises.exists? ? member_show_exercises.unified_setting : [] else #已分班级的成员,可以查看统一设置和单独设置(试卷是发布在该班级)试卷 # 已发布 当前用户班级分组的 试卷id - not_exercise_ids = @course.exercise_group_settings.exercise_group_not_published.where("course_group_id = #{@member_group_id}").pluck(:exercise_id) - @exercises = member_show_exercises.where.not(id: not_exercise_ids) + publish_exercise_ids = @course.exercise_group_settings.exercise_group_published.where("course_group_id = #{@member_group_id}").pluck(:exercise_id) + @exercises = member_show_exercises.unified_setting.or(id: publish_exercise_ids) end else #用户未登陆或不是该课堂成员,仅显示统一设置的(已发布的/已截止的),如有公开,则不显示锁,不公开,则显示锁 @is_teacher_or = 0 From d1f3534542f54af4afe8f3dd70cfc52a0e5114ac Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Wed, 9 Oct 2019 10:03:14 +0800 Subject: [PATCH 292/394] tiaoz --- app/controllers/exercises_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index cfe72effc..30fef596d 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -47,7 +47,7 @@ class ExercisesController < ApplicationController else #已分班级的成员,可以查看统一设置和单独设置(试卷是发布在该班级)试卷 # 已发布 当前用户班级分组的 试卷id publish_exercise_ids = @course.exercise_group_settings.exercise_group_published.where("course_group_id = #{@member_group_id}").pluck(:exercise_id) - @exercises = member_show_exercises.unified_setting.or(id: publish_exercise_ids) + @exercises = member_show_exercises.unified_setting.or(member_show_exercises.where(id: publish_exercise_ids)) end else #用户未登陆或不是该课堂成员,仅显示统一设置的(已发布的/已截止的),如有公开,则不显示锁,不公开,则显示锁 @is_teacher_or = 0 From a1f6dd67314859efc35bdd75944291fcaf656461 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 9 Oct 2019 10:09:53 +0800 Subject: [PATCH 293/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/courses/coursesPublic/ShixunChooseModal.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/react/src/modules/courses/coursesPublic/ShixunChooseModal.js b/public/react/src/modules/courses/coursesPublic/ShixunChooseModal.js index f4f00e5e0..4c360c82a 100644 --- a/public/react/src/modules/courses/coursesPublic/ShixunChooseModal.js +++ b/public/react/src/modules/courses/coursesPublic/ShixunChooseModal.js @@ -101,6 +101,7 @@ class ShixunChooseModal extends Component{ return( shixunmodal===true? Date: Wed, 9 Oct 2019 10:43:54 +0800 Subject: [PATCH 294/394] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=BC=96=E8=BE=91?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/busyWork/CommonWorkSetting.js | 5 +++-- .../modules/courses/exercise/Exercisesetting.js | 9 +++++---- .../graduation/tasks/GraduationTaskssetting.js | 7 +++++-- .../modules/courses/poll/PollDetailTabForth.js | 5 ++++- .../shixunHomework/Trainingjobsetting.js | 7 +++++-- public/stylesheets/educoder/edu-main.css | 17 +++++++++-------- 6 files changed, 31 insertions(+), 19 deletions(-) diff --git a/public/react/src/modules/courses/busyWork/CommonWorkSetting.js b/public/react/src/modules/courses/busyWork/CommonWorkSetting.js index 9f36996ef..3217b7318 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkSetting.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkSetting.js @@ -1029,8 +1029,9 @@ class CommonWorkSetting extends Component{ 发布设置 { !startEditFlag && isAdmin ? - { this.setState({startEditFlag: true}) }}> - + { this.setState({startEditFlag: true}) }}> + 编辑设置 + {/**/} :"" } diff --git a/public/react/src/modules/courses/exercise/Exercisesetting.js b/public/react/src/modules/courses/exercise/Exercisesetting.js index 54a4306d8..ca1e6eddf 100644 --- a/public/react/src/modules/courses/exercise/Exercisesetting.js +++ b/public/react/src/modules/courses/exercise/Exercisesetting.js @@ -618,10 +618,11 @@ class Exercisesetting extends Component{ 发布设置 { !flagPageEdit&&this.props.isAdmin()===true ? - - - - + + 编辑设置 + {/**/} + {/**/} + {/**/} :"" } diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js index ff7564b8f..19980cca5 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationTaskssetting.js @@ -1001,8 +1001,11 @@ debugger
    { !flagPageEdit && this.props.isAdmin() === true ? - + + 编辑设置 + {/**/} + : "" } {/*内容*/} diff --git a/public/react/src/modules/courses/poll/PollDetailTabForth.js b/public/react/src/modules/courses/poll/PollDetailTabForth.js index 57fd91cfd..a64f92b5b 100644 --- a/public/react/src/modules/courses/poll/PollDetailTabForth.js +++ b/public/react/src/modules/courses/poll/PollDetailTabForth.js @@ -518,7 +518,10 @@ class PollDetailTabForth extends Component{ { !flagPageEdit && isAdmin ? - + + 编辑设置 + {/**/} + :"" }

    diff --git a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js index 23776ab1f..c9f0b7b53 100644 --- a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js +++ b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js @@ -2150,8 +2150,11 @@ class Trainingjobsetting extends Component { 发布设置 { !flagPageEdit && this.props.isAdmin() === true ? - + + 编辑设置 + {/**/} + : "" }

    diff --git a/public/stylesheets/educoder/edu-main.css b/public/stylesheets/educoder/edu-main.css index f283c1e95..64663634c 100644 --- a/public/stylesheets/educoder/edu-main.css +++ b/public/stylesheets/educoder/edu-main.css @@ -146,14 +146,15 @@ a.decoration{text-decoration: underline} .margin20{margin:20px;} /*行高*/ -.lineh-12{line-height: 12px} -.lineh-15{line-height: 15px} -.lineh-17{line-height: 17px} -.lineh-20{line-height: 20px} -.lineh-25{line-height: 25px} -.lineh-30{line-height: 30px} -.lineh-35{line-height: 35px} -.lineh-40{line-height: 40px} +.lineh-12{line-height: 12px !important;} +.lineh-15{line-height: 15px !important;} +.lineh-17{line-height: 17px !important;} +.lineh-20{line-height: 20px !important;} +.lineh-24{line-height: 24px !important;} +.lineh-25{line-height: 25px !important;} +.lineh-30{line-height: 30px !important;} +.lineh-35{line-height: 35px !important;} +.lineh-40{line-height: 40px !important;} /*pre标签换行*/ .break_word{word-break: break-all;word-wrap: break-word;} From 693f22ee8d06a34f0d41fb2697744512cacf3aa9 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Wed, 9 Oct 2019 10:45:19 +0800 Subject: [PATCH 295/394] =?UTF-8?q?top=5Fbanner=E5=A2=9E=E5=8A=A0first=5Fc?= =?UTF-8?q?ategory=5Furl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/courses/top_banner.json.jbuilder | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/courses/top_banner.json.jbuilder b/app/views/courses/top_banner.json.jbuilder index 916fccb05..73cad0b76 100644 --- a/app/views/courses/top_banner.json.jbuilder +++ b/app/views/courses/top_banner.json.jbuilder @@ -25,4 +25,5 @@ json.excellent @course.excellent if @course.is_end == 0 json.days_remaining (@course.end_date.to_date - Time.now.to_date).to_i end +json.first_category_url module_url(@course.none_hidden_course_modules.first, @course) From 1dd52f9acc7ed40773899369e15f1426e0a7f8c9 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Wed, 9 Oct 2019 10:51:58 +0800 Subject: [PATCH 296/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/courses/top_banner.json.jbuilder | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/views/courses/top_banner.json.jbuilder b/app/views/courses/top_banner.json.jbuilder index 73cad0b76..877ffcdf1 100644 --- a/app/views/courses/top_banner.json.jbuilder +++ b/app/views/courses/top_banner.json.jbuilder @@ -24,6 +24,4 @@ json.course_identity @user_course_identity json.excellent @course.excellent if @course.is_end == 0 json.days_remaining (@course.end_date.to_date - Time.now.to_date).to_i -end -json.first_category_url module_url(@course.none_hidden_course_modules.first, @course) - +end \ No newline at end of file From 21462cd45e37ee2f42489cd43b46e24314756636 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 9 Oct 2019 10:57:38 +0800 Subject: [PATCH 297/394] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=B7=B3=E8=BD=AC?= =?UTF-8?q?=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/coursesDetail/CoursesBanner.js | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/coursesDetail/CoursesBanner.js b/public/react/src/modules/courses/coursesDetail/CoursesBanner.js index 437471436..8bd1e980e 100644 --- a/public/react/src/modules/courses/coursesDetail/CoursesBanner.js +++ b/public/react/src/modules/courses/coursesDetail/CoursesBanner.js @@ -55,7 +55,11 @@ class CoursesBanner extends Component { } } componentDidMount() { - + if(this.props.match.path==="/courses/:coursesId"){ + if(this.props.user!=undefined){ + this.props.history.push(this.props.user.first_category_url) + } + } this.onloadupdatabanner() on('updatabanner', this.updatabanner) axios.interceptors.response.use((response) => { @@ -69,9 +73,17 @@ class CoursesBanner extends Component { } return response; }, (error) => { - }); } + componentDidUpdate(prevProps) { + if(prevProps.user!=this.props.user){ + if(this.props.match.path==="/courses/:coursesId"){ + if(this.props.user!=undefined){ + this.props.history.push(this.props.user.first_category_url) + } + } + } + } componentWillUnmount() { off('updatabanner', this.updatabanner) } From 28f9f03bebc7c44c5f0084476eaf4983550777ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Wed, 9 Oct 2019 10:58:22 +0800 Subject: [PATCH 298/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/courses/coursesDetail/CoursesBanner.js | 5 ----- 1 file changed, 5 deletions(-) diff --git a/public/react/src/modules/courses/coursesDetail/CoursesBanner.js b/public/react/src/modules/courses/coursesDetail/CoursesBanner.js index 8bd1e980e..0f38971fd 100644 --- a/public/react/src/modules/courses/coursesDetail/CoursesBanner.js +++ b/public/react/src/modules/courses/coursesDetail/CoursesBanner.js @@ -55,11 +55,6 @@ class CoursesBanner extends Component { } } componentDidMount() { - if(this.props.match.path==="/courses/:coursesId"){ - if(this.props.user!=undefined){ - this.props.history.push(this.props.user.first_category_url) - } - } this.onloadupdatabanner() on('updatabanner', this.updatabanner) axios.interceptors.response.use((response) => { From 35937ad3c4fb96ac06a9eaf5e9ad91d9c026a718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Wed, 9 Oct 2019 11:46:07 +0800 Subject: [PATCH 299/394] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=B7=A6=E4=BE=A7?= =?UTF-8?q?=E8=AF=BE=E5=A0=82=E5=AF=BC=E8=88=AA=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/coursesDetail/CoursesLeftNav.js | 90 +++++++++++++++---- .../react/src/modules/courses/css/Courses.css | 1 + 2 files changed, 76 insertions(+), 15 deletions(-) diff --git a/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js b/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js index 70794be19..a97a827b6 100644 --- a/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js +++ b/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js @@ -57,6 +57,7 @@ class Coursesleftnav extends Component{ positiontype:undefined, toopvisible:false, toopvisibleindex:undefined, + toopvisibleindexs:undefined, sandiantypes:undefined, antIcon:false, chapterupdate:false, @@ -314,7 +315,11 @@ class Coursesleftnav extends Component{ twosandianshow=(e,key,type)=>{ + // console.log("twosandianshow"); + // console.log(key); + // console.log(type); this.setState({ + toopvisibleindexs:key, twosandiantype:key, toopvisible:false, toopvisibleindex:undefined, @@ -322,11 +327,29 @@ class Coursesleftnav extends Component{ }) e.stopPropagation();//阻止冒泡 } - + twosandianshowys=(e,key,type)=>{ + // console.log("twosandianshow"); + // console.log(key); + // console.log(type); + this.setState({ + toopvisibleindexs:key, + }) + e.stopPropagation();//阻止冒泡 + } + twosandianshowyss=(e,key,type)=>{ + // console.log("twosandianshow"); + // console.log(key); + // console.log(type); + this.setState({ + toopvisibleindexs:undefined, + }) + e.stopPropagation();//阻止冒泡 + } twosandianhide=(e,index,type)=>{ // console.log(index) this.setState({ + toopvisibleindexs:undefined, twosandiantype:undefined, twosandiantypenum:undefined, toopvisible:true, @@ -336,6 +359,13 @@ class Coursesleftnav extends Component{ e.stopPropagation();//阻止冒泡 } + twosandianhideys=(e,index,type)=>{ + // console.log(index) + this.setState({ + toopvisibleindexs:undefined, + }) + e.stopPropagation();//阻止冒泡 + } //置顶 editSetup=(e,id)=>{ @@ -820,6 +850,7 @@ class Coursesleftnav extends Component{ ModalSave, loadtype, twosandiantypes, + toopvisibleindexs }=this.state; let {course_modules,hidden_modules,is_teacher} =this.props; @@ -992,6 +1023,8 @@ class Coursesleftnav extends Component{ } } } + // console.log(iem.category_name); + // console.log(iem.category_name.length); return( {(provided, snapshot) => ( {/*"/courses/"+this.props.match.params.coursesId+"/"+item.type+"/"+iem.category_type+"/"+iem.category_id*/} - -
  • this.selectnavids(e,key,iem.category_id,item.type+"child",iem.second_category_url,key)} onMouseLeave={(e)=>this.twosandianhide(e,index,item.type)} onMouseEnter={(e)=>this.twosandianshow(e,index,item.type)} + +
  • this.selectnavids(e,key,iem.category_id,item.type+"child",iem.second_category_url,key)} onMouseLeave={(e)=>this.twosandianhide(e,index,item.type)} onMouseEnter={(e)=>this.twosandianshow(e,index,item.type)} key={index} ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps} - title={iem.category_name.length<10?"":iem.category_name} + // title={iem.category_name.length<10?"":iem.category_name} > - - {iem.category_name} + this.twosandianshowys(e,index,item.type)}>{iem.category_name} + {iem.category_count===0?"":iem.category_count} {item.type===twosandiantypes&&twosandiantype===index? iem.category_id===0?"": iem.category_type==="graduation_topics"||iem.category_type==="graduation_tasks"? - {iem.category_count===0?"":iem.category_count} - : + ( + iem.category_name.length<13? + {iem.category_count===0?"":iem.category_count} + : + + {iem.category_count===0?"":iem.category_count} + + ) + : + ( + iem.category_name.length<13? + this.twosandianshowyss(e)}> + + + : + + this.twosandianshowyss(e)}> - :""} + + + ) + :""} - {provided.placeholder} +
  • +
    )} @@ -1087,17 +1140,24 @@ class Coursesleftnav extends Component{ } } } + // console.log(iem.category_name); + // console.log(iem.category_name.length);一开始是10 显示是13 return( -
  • - this.selectnavids(e,key,iem.category_id,item.type+"child",iem.second_category_url,key)} > - - {/*{iem.category_name}*/} - {iem.category_name} + {/*title={iem.category_name.length<10?"":iem.category_name}*/} +
  • + + this.selectnavids(e,key,iem.category_id,item.type+"child",iem.second_category_url,key)} > + {/*{iem.category_name}*/} + {/*{iem.category_name.length<10?"":*/} + {/* iem.category_name}*/} + {iem.category_name} {iem.category_count===0?"":iem.category_count} +
  • + ) }) diff --git a/public/react/src/modules/courses/css/Courses.css b/public/react/src/modules/courses/css/Courses.css index 305c9f5f1..12c4e8d3e 100644 --- a/public/react/src/modules/courses/css/Courses.css +++ b/public/react/src/modules/courses/css/Courses.css @@ -427,6 +427,7 @@ a.white-btn.use_scope-btn:hover{ .ebebeb{border-bottom: 1px solid #EBEBEB;} .CheckboxGroup{background:rgba(249,249,249,1);} .maxwidth155{max-width: 155px; color:#666666;font-size: 14px;} +.maxwidth170{max-width: 170px; color:#666666;font-size: 14px;} .pl46{ margin-left: 46px !important; border-bottom: 1px solid #eeee; width: 90% !important;} .hidden{overflow: hidden;} .pd0{padding: 0px !important;} From e65b5730122bf5e8be009d39d819aa45f40f1583 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Wed, 9 Oct 2019 13:51:38 +0800 Subject: [PATCH 300/394] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=97=A0=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/message/js/MessagSub.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index f92ea71c4..24f2df5ed 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -6,7 +6,7 @@ import { import axios from 'axios'; import {getImageUrl, markdownToHTML} from 'educoder'; import "../css/messagemy.css" - +import NoneData from '../../../modules/courses/coursesPublic/NoneData' //消息页面 class MessagSub extends Component { constructor(props) { @@ -515,7 +515,7 @@ class MessagSub extends Component { render() { let {page, limit, typeysl, count, isSpin, data} = this.state; // console.log("6868686868"); - // console.log(data); + console.log(data); return (
    {/*头部筛选数据*/} @@ -549,11 +549,10 @@ class MessagSub extends Component { { - data === undefined ? "" : data.length === 0 ? -
    - -

    暂无数据哦~

    -
    + data === undefined ? + : + data.length === 0 ? + : data.map((item, key) => { // console.log(data) // ridinglist-subs From 8ff3babbb15285123131f3794f05a61c03b6b15d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Wed, 9 Oct 2019 13:56:01 +0800 Subject: [PATCH 301/394] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E6=96=87=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/shixunHomework/Trainingjobsetting.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js index c9f0b7b53..4ae306158 100644 --- a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js +++ b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js @@ -2443,7 +2443,7 @@ class Trainingjobsetting extends Component {

    关卡名称(需要学生完成的任务请选中)

    + className="color-grey-c font-12 ml10">(需要学生完成的任务请选中,暂不支持跳关选择)

    {this.state.challenge_settings === undefined ? "" : this.state.challenge_settings.map((object, index) => { return ( From 76f7d94349771b0e25105bf0d9c3cd4e628f97d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Wed, 9 Oct 2019 14:00:01 +0800 Subject: [PATCH 302/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shixunHomework/Trainingjobsetting.js | 72 +++++++++---------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js index 4ae306158..47f33327c 100644 --- a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js +++ b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js @@ -2147,7 +2147,7 @@ class Trainingjobsetting extends Component {

    - 发布设置 + 发布设置 { !flagPageEdit && this.props.isAdmin() === true ? @@ -2161,10 +2161,10 @@ class Trainingjobsetting extends Component { { group_settings&&group_settings.length>0?

    :
    } @@ -2180,7 +2180,7 @@ class Trainingjobsetting extends Component { unifiedsetting === undefined ? "" : unifiedsetting=== true ?
    - 发布时间: + 发布时间:
    - (学生收到作业的时间) + (学生收到作业的时间)

    { @@ -2213,7 +2213,7 @@ class Trainingjobsetting extends Component { }

    - 截止时间: + 截止时间:
    - (学生“按时”提交作品的时间截点) + (学生“按时”提交作品的时间截点)

    { @@ -2267,16 +2267,16 @@ class Trainingjobsetting extends Component { {/*补交设置*/}

    -
    补交设置
    +
    补交设置
    {/*value={this.state.allowreplenishment}*/}
    开启补交 (选中,则允许学生延时提交作品) + className={"font-14 ml10 color-grey-c"} style={{textAlign:"left",fontSize:"14px"}} >(选中,则允许学生延时提交作品)
    - 迟交扣分: + 迟交扣分: - (延时提交作品时,学生成绩将被扣减的分值) + (延时提交作品时,学生成绩将被扣减的分值) {/*{latepenaltytype===true?
    :""}*/}
    { @@ -2311,7 +2311,7 @@ class Trainingjobsetting extends Component { :"" }
    - 结束时间: + 结束时间: - (学生“延时”提交作品的时间截点) + (学生“延时”提交作品的时间截点) {/*{latetimetype===true?
    结束时间不能小于截止时间
    :""}*/} ") end @@ -335,7 +335,7 @@ class MyshixunsController < ApplicationController if edu_js.present? js_path = edu_js.split(",") js_path.each do |path| - file_content = GitService.file_content(repo_path: @repo_path, path: path)["content"] + file_content = GitService.git_fle_content(repo_path: @repo_path, path: path)["content"] file_content = tran_base64_decode64(file_content) unless file_content.blank? @contents = @contents.sub(/EDUCODERJS/, "") end From 343f33c4e4ef7fb002bf98ec0b2607f1ca7bf293 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Wed, 9 Oct 2019 21:24:04 +0800 Subject: [PATCH 321/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/myshixuns_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb index f8ab58e71..74f02f1ab 100644 --- a/app/controllers/myshixuns_controller.rb +++ b/app/controllers/myshixuns_controller.rb @@ -326,7 +326,7 @@ class MyshixunsController < ApplicationController if edu_css.present? css_path = edu_css.split(",") css_path.each do |path| - file_content = GitService.git_fle_content(repo_path: @repo_path, path: path)["content"] + file_content = git_fle_content(@repo_path, path)["content"] file_content = tran_base64_decode64(file_content) unless file_content.blank? @contents = @contents.sub(/EDUCODERCSS/, "") end @@ -335,7 +335,7 @@ class MyshixunsController < ApplicationController if edu_js.present? js_path = edu_js.split(",") js_path.each do |path| - file_content = GitService.git_fle_content(repo_path: @repo_path, path: path)["content"] + file_content = git_fle_content(@repo_path, path)["content"] file_content = tran_base64_decode64(file_content) unless file_content.blank? @contents = @contents.sub(/EDUCODERJS/, "") end From e0a80f2e49b93a145fcf46b3c8905ca732adc6f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 10 Oct 2019 09:02:28 +0800 Subject: [PATCH 322/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/coursesDetail/CoursesLeftNav.js | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js b/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js index a97a827b6..e47f83c1f 100644 --- a/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js +++ b/public/react/src/modules/courses/coursesDetail/CoursesLeftNav.js @@ -1055,7 +1055,7 @@ class Coursesleftnav extends Component{ iem.category_id===0?"": iem.category_type==="graduation_topics"||iem.category_type==="graduation_tasks"? ( - iem.category_name.length<13? + iem.category_name&&iem.category_name.length<13? {iem.category_count===0?"":iem.category_count} : @@ -1064,7 +1064,7 @@ class Coursesleftnav extends Component{ ) : ( - iem.category_name.length<13? + iem.category_name&&iem.category_name.length<13? this.twosandianshowyss(e)}> @@ -1147,15 +1147,26 @@ class Coursesleftnav extends Component{ {/*title={iem.category_name.length<10?"":iem.category_name}*/}
  • - - this.selectnavids(e,key,iem.category_id,item.type+"child",iem.second_category_url,key)} > - {/*{iem.category_name}*/} - {/*{iem.category_name.length<10?"":*/} - {/* iem.category_name}*/} - {iem.category_name} - {iem.category_count===0?"":iem.category_count} - - + { + iem.category_name&&iem.category_name.length<13? + this.selectnavids(e,key,iem.category_id,item.type+"child",iem.second_category_url,key)} > + {/*{iem.category_name}*/} + {/*{iem.category_name.length<10?"":*/} + {/* iem.category_name}*/} + {iem.category_name} + {iem.category_count===0?"":iem.category_count} + + : + + this.selectnavids(e,key,iem.category_id,item.type+"child",iem.second_category_url,key)} > + {/*{iem.category_name}*/} + {/*{iem.category_name.length<10?"":*/} + {/* iem.category_name}*/} + {iem.category_name} + {iem.category_count===0?"":iem.category_count} + + + }
  • From 5fa875bf55e15d78766b7305e787e9593e76332a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 10 Oct 2019 09:07:13 +0800 Subject: [PATCH 323/394] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=A7=81=E6=9C=89?= =?UTF-8?q?=E5=B1=9E=E6=80=A7=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/courses/Resource/Fileslistitem.js | 2 +- public/react/src/modules/courses/boards/BoardsListItem.js | 2 +- public/react/src/modules/courses/busyWork/CommonWorkItem.js | 2 +- public/react/src/modules/courses/exercise/ExerciseListItem.js | 2 +- .../src/modules/courses/graduation/tasks/GraduateTaskItem.js | 2 +- .../src/modules/courses/graduation/topics/GraduateTopicItem.js | 2 +- public/react/src/modules/courses/poll/PollListItem.js | 2 +- .../src/modules/courses/shixunHomework/ShixunhomeWorkItem.js | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/public/react/src/modules/courses/Resource/Fileslistitem.js b/public/react/src/modules/courses/Resource/Fileslistitem.js index 8027e94bb..418c201b5 100644 --- a/public/react/src/modules/courses/Resource/Fileslistitem.js +++ b/public/react/src/modules/courses/Resource/Fileslistitem.js @@ -242,7 +242,7 @@ class Fileslistitem extends Component{ { discussMessage.is_lock === true ? - + :"" diff --git a/public/react/src/modules/courses/boards/BoardsListItem.js b/public/react/src/modules/courses/boards/BoardsListItem.js index 021a41b7a..2b9c05126 100644 --- a/public/react/src/modules/courses/boards/BoardsListItem.js +++ b/public/react/src/modules/courses/boards/BoardsListItem.js @@ -70,7 +70,7 @@ class BoardsListItem extends Component{ { !!discussMessage.sticky && 置顶 } { - discussMessage.is_public == false ? ( + discussMessage.is_public == false ? ( ) : "" } diff --git a/public/react/src/modules/courses/busyWork/CommonWorkItem.js b/public/react/src/modules/courses/busyWork/CommonWorkItem.js index c92d91c48..75676557a 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkItem.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkItem.js @@ -175,7 +175,7 @@ class CommonWorkItem extends Component{ {/* 只有非课堂成员且作业是私有的情况下才会为true */} { item.private_icon===true ? - ( + ( ) : "" } diff --git a/public/react/src/modules/courses/exercise/ExerciseListItem.js b/public/react/src/modules/courses/exercise/ExerciseListItem.js index 28ead276c..ef500ba0b 100644 --- a/public/react/src/modules/courses/exercise/ExerciseListItem.js +++ b/public/react/src/modules/courses/exercise/ExerciseListItem.js @@ -134,7 +134,7 @@ class ExerciseListItem extends Component{ { item.lock_status === 0 ? - + :"" diff --git a/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js b/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js index 427ef30d4..39a2f0876 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduateTaskItem.js @@ -256,7 +256,7 @@ class GraduateTaskItem extends Component{ { this.props.discussMessage.private_icon===true? - + : diff --git a/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js b/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js index d11c90703..a2c19ecbd 100644 --- a/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js +++ b/public/react/src/modules/courses/graduation/topics/GraduateTopicItem.js @@ -103,7 +103,7 @@ class GraduateTopicItem extends Component{ } { discussMessage.private_icon===true? - + :"" diff --git a/public/react/src/modules/courses/poll/PollListItem.js b/public/react/src/modules/courses/poll/PollListItem.js index 9f13e5465..ec1eb2fa3 100644 --- a/public/react/src/modules/courses/poll/PollListItem.js +++ b/public/react/src/modules/courses/poll/PollListItem.js @@ -63,7 +63,7 @@ class PollListItem extends Component{ } { item.lock_status === 0 ? - + :"" diff --git a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js index 085e7619f..557e1ca89 100644 --- a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js +++ b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js @@ -337,7 +337,7 @@ class ShixunhomeWorkItem extends Component{ { this.props.discussMessage.private_icon===true? - + : From d35e54e948f9e9927865f564952b2020f41e4440 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 10 Oct 2019 09:17:25 +0800 Subject: [PATCH 324/394] modify wechat --- app/libs/wechat/app.rb | 11 +++++++++++ app/libs/wechat/client.rb | 6 +++++- app/libs/wechat/official_account.rb | 10 ++-------- 3 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 app/libs/wechat/app.rb diff --git a/app/libs/wechat/app.rb b/app/libs/wechat/app.rb new file mode 100644 index 000000000..54f60fa2a --- /dev/null +++ b/app/libs/wechat/app.rb @@ -0,0 +1,11 @@ +class Wechat::App + class << self + attr_accessor :appid, :secret + + delegate :access_token, :jscode2session, to: :client + + def client + @_client ||= Wechat::Client.new(appid, secret) + end + end +end \ No newline at end of file diff --git a/app/libs/wechat/client.rb b/app/libs/wechat/client.rb index 0d34b9dda..5ac0a28f2 100644 --- a/app/libs/wechat/client.rb +++ b/app/libs/wechat/client.rb @@ -34,6 +34,10 @@ class Wechat::Client jsapi_ticket end + def jscode2session(code) + request(:get, '/sns/jscode2session', appid: appid, secret: secret, js_code: code, grant_type: 'authorization_code') + end + def access_token_cache_key "#{base_cache_key}/access_token" end @@ -49,7 +53,7 @@ class Wechat::Client private def request(method, url, **params) - Rails.logger.error("[wechat] request: #{method} #{url} #{params.inspect}") + Rails.logger.error("[wechat] request: #{method} #{url} #{params.except(:secret).inspect}") client = Faraday.new(url: BASE_SITE) response = client.public_send(method, url, params) diff --git a/app/libs/wechat/official_account.rb b/app/libs/wechat/official_account.rb index 320fbdba3..88208d6f3 100644 --- a/app/libs/wechat/official_account.rb +++ b/app/libs/wechat/official_account.rb @@ -2,20 +2,14 @@ class Wechat::OfficialAccount class << self attr_accessor :appid, :secret + delegate :access_token, :jsapi_ticket, to: :client + def js_sdk_signature(url, noncestr, timestamp) data = { jsapi_ticket: jsapi_ticket, noncestr: noncestr, timestamp: timestamp, url: url } str = data.map { |k, v| "#{k}=#{v}" }.join('&') Digest::SHA1.hexdigest(str) end - def access_token - client.access_token - end - - def jsapi_ticket - client.jsapi_ticket - end - def client @_client ||= Wechat::Client.new(appid, secret) end From 564b0bdd953b4593137c9cc868e73bd45ac09bd6 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 10 Oct 2019 10:27:58 +0800 Subject: [PATCH 325/394] ecs: modify add course manager api --- .../ecs/course_managers_controller.rb | 3 ++- .../ecs/create_course_manager_service.rb | 26 ++++++++++--------- .../ecs/course_managers/create.json.jbuilder | 1 - 3 files changed, 16 insertions(+), 14 deletions(-) delete mode 100644 app/views/ecs/course_managers/create.json.jbuilder diff --git a/app/controllers/ecs/course_managers_controller.rb b/app/controllers/ecs/course_managers_controller.rb index 714dac580..132a212d7 100644 --- a/app/controllers/ecs/course_managers_controller.rb +++ b/app/controllers/ecs/course_managers_controller.rb @@ -3,7 +3,8 @@ class Ecs::CourseManagersController < Ecs::CourseBaseController before_action :check_major_manager_permission!, only: [:create, :destroy] def create - @user = Ecs::CreateCourseManagerService.call(current_course, params[:user_id]) + Ecs::CreateCourseManagerService.call(current_course, params[:user_ids]) + render_ok rescue Ecs::CreateCourseManagerService::Error => ex render_error(ex.message) end diff --git a/app/services/ecs/create_course_manager_service.rb b/app/services/ecs/create_course_manager_service.rb index 58e803bcf..162a0da55 100644 --- a/app/services/ecs/create_course_manager_service.rb +++ b/app/services/ecs/create_course_manager_service.rb @@ -3,27 +3,29 @@ class Ecs::CreateCourseManagerService < ApplicationService COURSE_MANAGER_COUNT_LIMIT = 2 # 课程管理员数量限制 - attr_reader :ec_course, :user_id + attr_reader :ec_course, :user_ids - def initialize(ec_course, user_id) + def initialize(ec_course, user_ids) @ec_course = ec_course - @user_id = user_id + @user_ids = user_ids end def call - user = User.find_by(id: params[:user_id]) - raise Error, '该用户不存在' if user.blank? + users_count = User.where(id: user_ids).count + raise Error, '用户不存在' if users_count != user_ids.size - if ec_course.ec_course_users.exists?(user_id: user.id) - raise Error, '该用户已经是该课程的管理员了' + if ec_course.ec_course_users.exists?(user_id: user_ids) + raise Error, '用户已经是该课程的管理员' end - if ec_course.ec_course_users.count >= COURSE_MANAGER_COUNT_LIMIT - raise Error, '该课程管理员数量已达上限' + if ec_course.ec_course_users.count + user_ids.size >= COURSE_MANAGER_COUNT_LIMIT + raise Error, "课程管理员数量过多(最多#{COURSE_MANAGER_COUNT_LIMIT})" end - ec_course.ec_course_users.create!(user: user) - - user + ActiveRecord::Base.transaction do + user_ids.each do |user_id| + ec_course.ec_course_users.create!(user_id: user_id) + end + end end end \ No newline at end of file diff --git a/app/views/ecs/course_managers/create.json.jbuilder b/app/views/ecs/course_managers/create.json.jbuilder deleted file mode 100644 index ff7ff01e5..000000000 --- a/app/views/ecs/course_managers/create.json.jbuilder +++ /dev/null @@ -1 +0,0 @@ -json.partial! 'ecs/shared/user', user: @user From 707d3c08ed126a3a294db1aea4e0da48770c1ed0 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 10 Oct 2019 10:38:44 +0800 Subject: [PATCH 326/394] ecs: fix api --- app/services/ecs/create_course_manager_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/services/ecs/create_course_manager_service.rb b/app/services/ecs/create_course_manager_service.rb index 162a0da55..4d3633bfd 100644 --- a/app/services/ecs/create_course_manager_service.rb +++ b/app/services/ecs/create_course_manager_service.rb @@ -18,7 +18,7 @@ class Ecs::CreateCourseManagerService < ApplicationService raise Error, '用户已经是该课程的管理员' end - if ec_course.ec_course_users.count + user_ids.size >= COURSE_MANAGER_COUNT_LIMIT + if ec_course.ec_course_users.count + user_ids.size > COURSE_MANAGER_COUNT_LIMIT raise Error, "课程管理员数量过多(最多#{COURSE_MANAGER_COUNT_LIMIT})" end From acd913a588a5b60e1c6f70fca93ede519170b697 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Thu, 10 Oct 2019 10:59:16 +0800 Subject: [PATCH 327/394] add template show api --- app/controllers/templates_controller.rb | 5 +++++ app/views/templates/show.json.jbuilder | 3 +++ config/routes.rb | 1 + 3 files changed, 9 insertions(+) create mode 100644 app/controllers/templates_controller.rb create mode 100644 app/views/templates/show.json.jbuilder diff --git a/app/controllers/templates_controller.rb b/app/controllers/templates_controller.rb new file mode 100644 index 000000000..efb114bdc --- /dev/null +++ b/app/controllers/templates_controller.rb @@ -0,0 +1,5 @@ +class TemplatesController < ApplicationController + def show + @template = EcTemplate.find_by_name!(params[:name]) + end +end \ No newline at end of file diff --git a/app/views/templates/show.json.jbuilder b/app/views/templates/show.json.jbuilder new file mode 100644 index 000000000..cff89037b --- /dev/null +++ b/app/views/templates/show.json.jbuilder @@ -0,0 +1,3 @@ +json.template do + json.partial! 'attachments/attachment_simple', attachment: @template.attachments.last +end \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 2c02c6a79..847afaa83 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -818,6 +818,7 @@ Rails.application.routes.draw do post :feedback end end + resource :template, only: [:show] end namespace :admins do From 92218bb829c12da5456247c6a99a95432c8f3ac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 10 Oct 2019 14:31:50 +0800 Subject: [PATCH 328/394] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=BE=97=E5=88=86?= =?UTF-8?q?=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/busyWork/CommonWorkDetailIndex.js | 6 +-- .../busyWork/common/WorkDetailPageHeader.js | 6 +-- .../shixunHomework/Listofworksstudentone.js | 40 ++++++++++--------- .../shixunHomework/ShixunHomeworkPage.js | 4 +- .../shixunHomework/Trainingjobsetting.js | 7 +++- 5 files changed, 32 insertions(+), 31 deletions(-) diff --git a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js index 8985aa07e..e49d4fb28 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkDetailIndex.js @@ -308,15 +308,11 @@ class CommonWorkDetailIndex extends Component{ onClick={() => this.setState({moduleName: '参考答案'})} className={`${childModuleName == '参考答案' ? 'active' : '' } `} to={`/courses/${courseId}/${moduleEngName}/${workId}/answer`}>参考答案} - - {this.props.isAdmin() ? this.setState({moduleName: '设置'})} className={`${childModuleName == '设置' ? 'active' : '' } `} style={{paddingLeft:'38px'}} - to={`/courses/${courseId}/${moduleEngName}/${workId}/setting`}>设置: - "" - } + to={`/courses/${courseId}/${moduleEngName}/${workId}/setting`}>{this.props.isAdmin()?"设置":"得分规则"} {/* { this.props.tabRightComponents } */} diff --git a/public/react/src/modules/courses/busyWork/common/WorkDetailPageHeader.js b/public/react/src/modules/courses/busyWork/common/WorkDetailPageHeader.js index 68a16d89e..89c9df772 100644 --- a/public/react/src/modules/courses/busyWork/common/WorkDetailPageHeader.js +++ b/public/react/src/modules/courses/busyWork/common/WorkDetailPageHeader.js @@ -144,13 +144,11 @@ class WorkDetailPageHeader extends Component{ {view_answer == true && 参考答案} - {this.props.isAdmin()? + 设置: - "" - } + to={`/courses/${courseId}/${moduleEngName}/${workId}/setting`}>{this.props.isAdmin()?"设置":"得分规则"} { this.props.tabRightComponents } diff --git a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js index 2380df531..73070497b 100644 --- a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js +++ b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js @@ -1535,6 +1535,7 @@ class Listofworksstudentone extends Component { // console.log("获取作品列表"); // console.log("935"); // debugger + let searchtype=this.props.history.location.search; let urll = `/homework_commons/${homeworkid}/works_list.json`; var datasysl = { search: this.state.searchtext, @@ -1587,13 +1588,14 @@ class Listofworksstudentone extends Component { if(this.props.isAdmin() === true){ if(result.data.update_score===true){ if(bool===true){ - + if(searchtype==="?tab=0"){ try { this.props.yslslowCheckresults(); }catch (e) { } - this.setComputeTimet(); + this.setComputeTimet(); + } } } } @@ -3242,21 +3244,25 @@ class Listofworksstudentone extends Component { {/*作品状态GraduationTaskssettinglist*/}
    :""} diff --git a/public/react/src/modules/courses/graduation/topics/index.js b/public/react/src/modules/courses/graduation/topics/index.js index ef4257e2e..2f02113bc 100644 --- a/public/react/src/modules/courses/graduation/topics/index.js +++ b/public/react/src/modules/courses/graduation/topics/index.js @@ -447,7 +447,7 @@ onBoardsNew=()=>{ { course_public && course_public==1 ?
  • this.onDelete(2)}>设为公开
  • :"" } -
  • this.onDelete(3)}>加入题库
  • + {/*
  • this.onDelete(3)}>加入题库
  • */} {/*
  • 加入题库
  • */}
    diff --git a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js index a7ed222cd..9f9eb3d5e 100644 --- a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js +++ b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js @@ -1723,7 +1723,7 @@ class Trainingjobsetting extends Component { flagPageEditsthrees:deadline, flagPageEditsfor:endtime, completionefficiencyscore:true, - work_efficiencys:true, + work_efficiencys:this.state.work_efficiencys, unifiedsetting:this.state.unifiedsetting, latedeductiontwo:20, }); @@ -1839,7 +1839,7 @@ class Trainingjobsetting extends Component { flagPageEditsthrees:deadline, flagPageEditsfor:endtime, completionefficiencyscore:true, - work_efficiencys:true, + work_efficiencys:result.data.work_efficiency, unifiedsetting:datas.data.unified_setting, latedeductiontwo:20, }); diff --git a/public/react/src/modules/message/js/MessagSub.js b/public/react/src/modules/message/js/MessagSub.js index 24f2df5ed..791b5c063 100644 --- a/public/react/src/modules/message/js/MessagSub.js +++ b/public/react/src/modules/message/js/MessagSub.js @@ -545,7 +545,7 @@ class MessagSub extends Component { {/*下面内容页面*/}
    {/*这里可以进行数据处理*/} -
    +
    { @@ -641,23 +641,24 @@ class MessagSub extends Component { })} - {/*页数*/} - {data === undefined ? "" - : - (count > 10 ? -
    -
    - -
    -
    : "" - ) - }
    + {/*页数*/} + {data === undefined ? "" + : + (count > 10 ? +
    +
    + +
    +
    : "" + ) + + }
    ) } diff --git a/public/react/src/modules/message/js/MessagePrivate.js b/public/react/src/modules/message/js/MessagePrivate.js index ec7c20121..dc8e32e67 100644 --- a/public/react/src/modules/message/js/MessagePrivate.js +++ b/public/react/src/modules/message/js/MessagePrivate.js @@ -8,6 +8,7 @@ import moment from 'moment'; import {getImageUrl,markdownToHTML} from 'educoder'; import "../css/messagemy.css" import WriteaprivateletterModal from '../messagemodal/WriteaprivateletterModal'; +import NoneData from '../../../modules/courses/coursesPublic/NoneData' //私信页面 class MessagePrivate extends Component{ constructor(props) { @@ -160,11 +161,8 @@ class MessagePrivate extends Component{ { - data===undefined?"":data.length===0? -
    - -

    暂无数据哦~

    -
    + data===undefined? :data.length===0? + :data.map((item,key)=>{ return(
    this.smyJump(3,item.target.id)}> diff --git a/public/react/src/modules/user/usersInfo/InfosTopics.js b/public/react/src/modules/user/usersInfo/InfosTopics.js index 76979c9f5..3b76bfa28 100644 --- a/public/react/src/modules/user/usersInfo/InfosTopics.js +++ b/public/react/src/modules/user/usersInfo/InfosTopics.js @@ -297,8 +297,8 @@ class InfosTopics extends Component{ let categorylist=[ {val:"普通作业",type:"normal"}, {val:"分组作业",type:"group"}, - {val:"毕设选题",type:"gtopic"}, - {val:"毕设任务",type:"gtask"}, + // {val:"毕设选题",type:"gtopic"}, + // {val:"毕设任务",type:"gtask"}, {val:"试卷",type:"exercise"}, {val:"问卷",type:"poll"}, ] From 164d3d4413b1e0b0f12511aba65e0085262b74ea Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Thu, 10 Oct 2019 15:20:38 +0800 Subject: [PATCH 331/394] =?UTF-8?q?=E5=88=86=E7=8F=AD=E7=9A=84=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/courses_controller.rb | 68 +++++++++++++++++++-- app/libs/util.rb | 4 +- app/models/user.rb | 15 +++++ app/views/courses/students.json.jbuilder | 7 ++- app/views/courses/teachers.json.jbuilder | 3 + app/views/users/accounts/show.json.jbuilder | 4 +- config/routes.rb | 1 + 7 files changed, 92 insertions(+), 10 deletions(-) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 4bfc236a1..d639662c2 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -27,7 +27,8 @@ class CoursesController < ApplicationController :attahcment_category_list,:export_member_scores_excel, :duplicate_course, :switch_to_teacher, :switch_to_assistant, :switch_to_student, :exit_course, :informs, :update_informs, :online_learning, :update_task_position, :tasks_list, - :join_excellent_course, :export_couser_info, :export_member_act_score, :new_informs, :delete_informs] + :join_excellent_course, :export_couser_info, :export_member_act_score, :new_informs, + :delete_informs, :change_member_role] before_action :user_course_identity, except: [:join_excellent_course, :index, :create, :new, :apply_to_join_course, :search_course_list, :get_historical_course_students, :mine, :search_slim, :board_list] before_action :teacher_allowed, only: [:update, :destroy, :settings, :search_teacher_candidate, @@ -39,7 +40,7 @@ class CoursesController < ApplicationController :set_course_group, :create_group_by_importing_file, :update_task_position, :tasks_list] before_action :teacher_or_admin_allowed, only: [:graduation_group_list, :create_graduation_group, :join_graduation_group, - :change_course_teacher, :course_group_list, + :change_course_teacher, :course_group_list, :change_member_role, :teacher_application_review, :apply_teachers, :delete_course_teacher] before_action :validate_course_name, only: [:create, :update] before_action :find_board, only: :board_list @@ -340,8 +341,8 @@ class CoursesController < ApplicationController @has_graduation_design = @course.course_modules.graduation_module_not_hidden.any? - sort = params[:sort] || "desc" - @order = params[:order].to_i + sort = params[:sort] || "asc" + @order = params[:order] ? params[:order].to_i : 1 if @order.present? case @order when 1 @@ -547,6 +548,61 @@ class CoursesController < ApplicationController end end + # 修改角色 + def change_member_role + tip_exception("请至少选择一个角色") if params[:roles].blank? + tip_exception("不能具有老师、助教两种角色") if params[:roles].include?("PROFESSOR") && params[:roles].include?("ASSISTANT_PROFESSOR") + tip_exception("管理员不能切换为助教或老师") if @user_course_identity == Course::CREATOR && + (params[:roles].include?("PROFESSOR") || params[:roles].include?("ASSISTANT_PROFESSOR")) + + course_members = @course.course_members.where(user_id: params[:user_id]) + tip_exception("非课堂成员不能修改角色") if course_members.blank? + + ActiveRecord::Base.transaction do + # 第一次修改为教师或助教身份时直接创建数据 + if params[:roles].include?("CREATOR") + teacher_member = course_members.where(role: %i[CREATOR]).take + elsif (params[:roles].include?("PROFESSOR") || params[:roles].include?("ASSISTANT_PROFESSOR")) && !course_members.exists?(role: %i[PROFESSOR ASSISTANT_PROFESSOR]) + teacher_member = CourseMember.create!(course_id: @course.id, user_id: params[:user_id], role: params[:roles].include?("PROFESSOR") ? 2 : 3) + elsif course_members.exists?(role: %i[PROFESSOR ASSISTANT_PROFESSOR]) + teacher_member = course_members.where(role: %i[PROFESSOR ASSISTANT_PROFESSOR]).take + if params[:roles].include?("PROFESSOR") || params[:roles].include?("ASSISTANT_PROFESSOR") + # 如果之前有老师身份且老师身份要调整时,只需要修改role字段 + if !params[:roles].include?(teacher_member.role) && params[:roles].include?("PROFESSOR") + teacher_member.PROFESSOR! + elsif !params[:roles].include?(teacher_member.role) && params[:roles].include?("ASSISTANT_PROFESSOR") + teacher_member.ASSISTANT_PROFESSOR! + end + teacher_member.save! + else + # 不含教师的参数时删除记录 + teacher_member.destroy! + # CourseDeleteStudentNotifyJob.perform_later(@course.id, [teacher_member.user_id], current_user.id) + end + end + + # 学生身份的处理 + student_member = course_members.where(role: %i[STUDENT]).take + if params[:roles].include?("STUDENT") && student_member.blank? + correspond_teacher_exist = CourseMember.exists?(user_id: params[:user_id], is_active: 1, course_id: @course.id, role: %i[CREATOR PROFESSOR ASSISTANT_PROFESSOR]) + new_student = CourseMember.new(user_id: params[:user_id], course_id: @course.id, role: 4) + new_student.is_active = 0 if correspond_teacher_exist + new_student.save! + + CourseAddStudentCreateWorksJob.perform_later(@course.id, [params[:user_id]]) + # StudentJoinCourseNotifyJob.perform_later(current_user.id, course.id) + elsif !params[:roles].include?("STUDENT") && student_member.present? + # 删除学生身份时激活老师身份 + teacher_member.update_attributes!(is_active: 1) if student_member.is_active && teacher_member.present? + student_member.destroy! + CourseDeleteStudentDeleteWorksJob.perform_later(@course.id, [params[:user_id]]) + # CourseDeleteStudentNotifyJob.perform_later(@course.id, [params[:user_id]], current_user.id) + end + + normal_status(0, "修改成功") + end + end + # 教师和助教角色转换的接口 def change_course_teacher begin @@ -715,8 +771,8 @@ class CoursesController < ApplicationController # 学生列表(包括各个子分班的学生列表)及搜索 def students search = params[:search].present? ? params[:search].strip : nil - order = params[:order].present? ? params[:order].to_i : 0 - sort = params[:sort].present? ? params[:sort] : "desc" + order = params[:order].present? ? params[:order].to_i : 1 + sort = params[:sort].present? ? params[:sort] : "asc" course_group_id = params[:course_group_id].present? ? params[:course_group_id].to_i : nil @students = CourseMember.students(@course) diff --git a/app/libs/util.rb b/app/libs/util.rb index ae2e4b80b..72e728ab9 100644 --- a/app/libs/util.rb +++ b/app/libs/util.rb @@ -48,8 +48,8 @@ module Util return if str.blank? case type - when :phone then "#{str[0..2]}***#{str[-4..-1]}" - when :email then "#{str[0..2]}***#{str[str.rindex('@')..-1]}" + when :phone then "#{str[0..2]}***#{str[-3..-1]}" + when :email then "#{str[0]}***#{str[(str.rindex('@')-1)..-1]}" else "#{str[0..2]}***#{str[-3..-1]}" end end diff --git a/app/models/user.rb b/app/models/user.rb index 5fdb1a713..7bfe9c36f 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -242,6 +242,11 @@ class User < ApplicationRecord user_extension&.department&.name || '' end + # 课堂的所有身份 + def course_role course + course.course_members.where(user_id: id).pluck(:role) + end + # 课堂的老师(创建者、老师、助教) def teacher_of_course?(course) course.course_members.exists?(user_id: id, role: [1,2,3], is_active: 1) || admin? || business? @@ -583,6 +588,16 @@ class User < ApplicationRecord mail.present? end + # 手机号:123***123 + def hidden_phone + Util.conceal(phone, :phone).to_s + end + + # 邮箱:w***l@qq.com + def hidden_mail + Util.conceal(mail, :email).to_s + end + # 学院的url标识 def college_identifier Department.find_by_id(department_members.pluck(:department_id).first)&.identifier diff --git a/app/views/courses/students.json.jbuilder b/app/views/courses/students.json.jbuilder index a7585672f..016efa711 100644 --- a/app/views/courses/students.json.jbuilder +++ b/app/views/courses/students.json.jbuilder @@ -1,12 +1,17 @@ json.students do json.array! @students do |student| json.user_id student.user_id - json.login student.user.try(:login) + # json.login student.user.try(:login) json.name student.user.try(:real_name) json.name_link user_path(student.user) json.student_id student.user.try(:student_id) json.course_group_name student.course_group.try(:name) json.course_member_id student.id + if @user_course_identity < Course::ASSISTANT_PROFESSOR + json.member_roles student.user.course_role(@course) + end + json.user_phone student.user.hidden_phone + json.user_mail student.user.hidden_mail end end json.students_count @students_count diff --git a/app/views/courses/teachers.json.jbuilder b/app/views/courses/teachers.json.jbuilder index 040ffb2aa..19a92790d 100644 --- a/app/views/courses/teachers.json.jbuilder +++ b/app/views/courses/teachers.json.jbuilder @@ -16,6 +16,9 @@ json.teacher_list do end json.graduation_group teacher.graduation_group.try(:name) json.graduation_group_id teacher.graduation_group.try(:id) + if @user_course_identity < Course::ASSISTANT_PROFESSOR + json.member_roles teacher.user.course_role(@course) + end end end json.teacher_list_size @teacher_list_size diff --git a/app/views/users/accounts/show.json.jbuilder b/app/views/users/accounts/show.json.jbuilder index 6b28bda55..ec81cc6bf 100644 --- a/app/views/users/accounts/show.json.jbuilder +++ b/app/views/users/accounts/show.json.jbuilder @@ -1,5 +1,7 @@ -json.extract! observed_user, :id, :nickname, :phone, :mail, :show_realname +json.extract! observed_user, :id, :nickname, :show_realname +json.phone observed_user.hidden_phone +json.mail observed_user.hidden_mail json.avatar_url url_to_avatar(observed_user) user = ActiveDecorator::Decorator.instance.decorate(observed_user) json.name user.name diff --git a/config/routes.rb b/config/routes.rb index 2c02c6a79..503210a91 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -331,6 +331,7 @@ Rails.application.routes.draw do post 'join_graduation_group' post 'set_course_group' post 'change_course_admin' + post 'change_member_role' post 'change_course_teacher' post 'delete_course_teacher' post 'teacher_application_review' From c6c37bf5d7c5c7e4f616c05eeae3d6b60bfa4dac Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Thu, 10 Oct 2019 15:21:27 +0800 Subject: [PATCH 332/394] =?UTF-8?q?=E9=97=AE=E5=8D=B7=E7=9A=84=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/polls_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb index 6be131d7a..dcbded6fe 100644 --- a/app/controllers/polls_controller.rb +++ b/app/controllers/polls_controller.rb @@ -692,7 +692,7 @@ class PollsController < ApplicationController else unified_setting = @poll.unified_setting end - show_result = params[:show_result].to_i + show_result = params[:show_result] un_anonymous = params[:un_anonymous] ? true : false # 统一设置或者分班为0,则更新问卷,并删除问卷分组 if unified_setting || (course_group_ids.size == 0) From 1c94493f2e0fab099883b73c891758931fdcba4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 10 Oct 2019 15:22:12 +0800 Subject: [PATCH 333/394] =?UTF-8?q?=E5=AE=89=E5=85=A8=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E6=89=8B=E6=9C=BA=E5=92=8C=E9=82=AE=E7=AE=B1?= =?UTF-8?q?=E8=AF=B7=E4=BB=8E=E6=8E=A5=E5=8F=A3=E4=B8=AD=E8=AF=BB=E5=8F=96?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/user/account/AccountSecure.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/user/account/AccountSecure.js b/public/react/src/modules/user/account/AccountSecure.js index e5b03e36b..797b350d2 100644 --- a/public/react/src/modules/user/account/AccountSecure.js +++ b/public/react/src/modules/user/account/AccountSecure.js @@ -284,7 +284,7 @@ class AccountSecure extends Component {
    { basicInfo && basicInfo.phone ? - { regPhoneAndEmail(basicInfo.phone) } + { basicInfo.phone } : 未绑定 } @@ -348,7 +348,7 @@ class AccountSecure extends Component {
    { basicInfo && basicInfo.mail ? - { regPhoneAndEmail(basicInfo.mail) } + { basicInfo.mail } : 未绑定 } From 05a14d2a3e75c1e12b0af066f87e76b14cb38cad Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 10 Oct 2019 15:28:12 +0800 Subject: [PATCH 334/394] =?UTF-8?q?tpi=E7=9B=AE=E5=BD=95=E6=A0=91=EF=BC=8C?= =?UTF-8?q?=E5=BD=93=E7=9B=AE=E5=BD=95=E4=B8=8B=E6=B2=A1=E6=9C=89=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=97=B6=EF=BC=8C=E4=B8=80=E7=9B=B4=E5=A4=84=E4=BA=8E?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E4=B8=AD=EF=BC=8C=E6=8A=A5=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/page/main/CodeRepositoryViewContainer.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/page/main/CodeRepositoryViewContainer.js b/public/react/src/modules/page/main/CodeRepositoryViewContainer.js index 279402e66..c30ec0386 100644 --- a/public/react/src/modules/page/main/CodeRepositoryViewContainer.js +++ b/public/react/src/modules/page/main/CodeRepositoryViewContainer.js @@ -21,8 +21,11 @@ function getNewTreeData(treeData, curKey, child, level) { data.forEach((item) => { // 这里不能用indexOf 同一级可能出现test目录和test.py文件 if (item.key == curKey) { - child = addPrePath(child, curKey); - item.children = child; + if (child && child.length) { // 可能没有子节点 + child = addPrePath(child, curKey); + item.children = child; + } + item.isLeaf = false; } else { if (item.children) { loop(item.children); @@ -153,6 +156,10 @@ class CodeRepositoryViewContainer extends Component { }); } map2OldData = (treeData) => { + if (!treeData || treeData.length == 0) { + return [] + } + if (!treeData || treeData.length === 0) return treeData; treeData = treeData.map(item => { return { From 1fd9315791837e23806072fac040e0ea19267e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 10 Oct 2019 15:34:05 +0800 Subject: [PATCH 335/394] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E8=A7=86=E9=A2=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/usersInfo/video/InfosVideo.js | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/public/react/src/modules/user/usersInfo/video/InfosVideo.js b/public/react/src/modules/user/usersInfo/video/InfosVideo.js index cb66434d0..dfda982f2 100644 --- a/public/react/src/modules/user/usersInfo/video/InfosVideo.js +++ b/public/react/src/modules/user/usersInfo/video/InfosVideo.js @@ -288,12 +288,22 @@ function InfoVideo (props) { 个视频 - {categoryObj.category == 'all' && } + {/*{categoryObj.category == 'all' && }*/} + + {categoryObj.category == 'all' &&
    +
  • + {sortKey=="published_at-desc"?"最新上传":"最早上传"} +
      +
    • onSortChange("published_at-desc",0)}>最新上传
    • +
    • onSortChange("published_at-asc",1)}>最早上传
    • +
    +
  • +
    }
    From 3f3484c8154045b190e130fdaa6a402676d3180b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 10 Oct 2019 15:42:08 +0800 Subject: [PATCH 336/394] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=AF=95=E5=8D=B7?= =?UTF-8?q?=E5=92=8C=E9=97=AE=E5=8D=B7=E7=BC=96=E8=BE=91=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/courses/exercise/Exercisesetting.js | 4 ++++ public/react/src/modules/courses/poll/PollDetailTabForth.js | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/exercise/Exercisesetting.js b/public/react/src/modules/courses/exercise/Exercisesetting.js index ca1e6eddf..7b3732c9f 100644 --- a/public/react/src/modules/courses/exercise/Exercisesetting.js +++ b/public/react/src/modules/courses/exercise/Exercisesetting.js @@ -104,6 +104,10 @@ class Exercisesetting extends Component{ if(this.props.Commonheadofthetestpaper!=undefined){ this.editSetting() } + + if(this.props.isAdmin() === false){ + this.cancelEdit() + } } componentDidUpdate = (prevProps) => { if(prevProps.Commonheadofthetestpaper!= this.props.Commonheadofthetestpaper){ diff --git a/public/react/src/modules/courses/poll/PollDetailTabForth.js b/public/react/src/modules/courses/poll/PollDetailTabForth.js index a64f92b5b..e06e30223 100644 --- a/public/react/src/modules/courses/poll/PollDetailTabForth.js +++ b/public/react/src/modules/courses/poll/PollDetailTabForth.js @@ -86,6 +86,10 @@ class PollDetailTabForth extends Component{ if(this.props.pollDetail!=undefined){ this.editSetting(); } + + if(this.props.isAdmin() === false){ + this.cancelEdit() + } } componentDidUpdate = (prevProps) => { if(prevProps.pollDetail!= this.props.pollDetail){ @@ -640,7 +644,7 @@ class PollDetailTabForth extends Component{
    { - flagPageEdit ? + flagPageEdit&& this.props.isAdmin() === true ?
    取消 From 64294fa85f6c9a2fbaa3724740d323491a8821d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 10 Oct 2019 15:46:47 +0800 Subject: [PATCH 337/394] =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/shixunHomework/Trainingjobsetting.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js index 9f9eb3d5e..d5481a391 100644 --- a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js +++ b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js @@ -1839,7 +1839,7 @@ class Trainingjobsetting extends Component { flagPageEditsthrees:deadline, flagPageEditsfor:endtime, completionefficiencyscore:true, - work_efficiencys:result.data.work_efficiency, + work_efficiencys:datas.data.work_efficiency, unifiedsetting:datas.data.unified_setting, latedeductiontwo:20, }); From f8ca6f1792d00301dfa9f4a5c904943a92a13237 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 10 Oct 2019 15:48:26 +0800 Subject: [PATCH 338/394] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/courses/Resource/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/Resource/index.js b/public/react/src/modules/courses/Resource/index.js index 02b1d5be1..1fea29f84 100644 --- a/public/react/src/modules/courses/Resource/index.js +++ b/public/react/src/modules/courses/Resource/index.js @@ -593,7 +593,7 @@ class Fileslists extends Component{ modalname:"立即发布", visible:true, typs:"start", - Topval:"学生将能立即查看和下载发布资源", + Topval:"学生将能立即收到资源", // Botvalleft:"暂不发布", // Botval:`本操作只对"未发布"的分班有效`, // starttime:"发布时间:"+moment(moment(new Date())).format("YYYY-MM-DD HH:mm"), From ba862bc5bdb08612ccac46cdd39d096ad72cce1c Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 10 Oct 2019 15:55:15 +0800 Subject: [PATCH 339/394] =?UTF-8?q?=E5=88=86=E7=8F=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/courses/Index.js | 5 ++++ .../src/modules/courses/ListPageIndex.js | 5 ++++ .../modules/courses/members/studentsList.js | 27 ++++++++++++++----- .../modules/courses/members/teacherList.js | 5 +++- 4 files changed, 35 insertions(+), 7 deletions(-) diff --git a/public/react/src/modules/courses/Index.js b/public/react/src/modules/courses/Index.js index c414df55a..70cc43f4c 100644 --- a/public/react/src/modules/courses/Index.js +++ b/public/react/src/modules/courses/Index.js @@ -661,6 +661,11 @@ class CoursesIndex extends Component{ (props) => () } > + () + } + > {/* 普通作业 */} () } > + () + } + > { const { course_groups , sortedInfo } = that.state let showSorter = isParent==true @@ -581,6 +583,16 @@ class studentsList extends Component{ // console.log(paramsString); // console.log(checkBoxValues); // console.log(searchValue); + let pageType = TYPE_STUDENTS + if (this.props.match.path.endsWith('students')) { + + } else if (course_group_id) { + pageType = TYPE_COURSE_GOURP_PARENT + } else { + pageType = TYPE_COURSE_GOURP_CHILD + } + + return( {course_group_name || '未分班'} {isAdmin && invite_code && @@ -617,15 +629,18 @@ class studentsList extends Component{ searchPlaceholder={ '请输入姓名、学号进行搜索' } firstRowRight={ - { isSuperAdmin && + { pageType !== TYPE_STUDENTS && isSuperAdmin && this.refs['createGroupByImportModal'].setVisible(true)}>导入创建分班 } - { !isCourseEnd && isAdmin && isParent && this.addDir()}>添加分班 } - { isAdmin && !isParent && course_group_id != 0 && this.deleteDir()}>删除分班 } - { isAdmin && !isParent && course_group_id != 0 && this.renameDir()}>分班重命名 } + { pageType !== TYPE_STUDENTS && + !isCourseEnd && isAdmin && isParent && this.addDir()}>添加分班 } + { + isAdmin && !isParent && course_group_id != 0 && this.deleteDir()}>删除分班 } + { + isAdmin && !isParent && course_group_id != 0 && this.renameDir()}>分班重命名 }

    - 可见:(学生可查看老师的评阅内容) + 可见(学生可查看老师的评阅内容)

    {/**/} {/*可见 (学生查看老师的评阅内容)*/} @@ -167,7 +167,7 @@ class AppraiseModal extends Component{ />

    - 不可见:(仅对课堂老师可见) + 不可见(仅对课堂老师可见)

    :""} -
    this.props.modalCloss()}> +
    :""} diff --git a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js index d5481a391..142d1e074 100644 --- a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js +++ b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js @@ -2078,7 +2078,7 @@ class Trainingjobsetting extends Component { // console.log(this.props.isAdmin()) // console.log(this.state.code_review===false) // console.log("引入的分值"); - // console.log(this.state.work_efficiencys); + console.log(this.state.work_efficiencys); @@ -2186,7 +2186,7 @@ class Trainingjobsetting extends Component {
    发布时间: - +
    截止时间: - +
    Date: Thu, 10 Oct 2019 17:01:02 +0800 Subject: [PATCH 345/394] =?UTF-8?q?=E5=88=86=E7=8F=AD=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E7=9A=84=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/courses_controller.rb | 26 ++++++++++++++++--- app/helpers/courses_helper.rb | 14 +++++++++- app/views/courses/course_groups.json.jbuilder | 11 ++++++++ app/views/courses/students.json.jbuilder | 2 +- config/routes.rb | 2 ++ 5 files changed, 50 insertions(+), 5 deletions(-) create mode 100644 app/views/courses/course_groups.json.jbuilder diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index d639662c2..a3b20c598 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -12,10 +12,10 @@ class CoursesController < ApplicationController end before_action :require_login, except: [:index, :show, :students, :teachers, :board_list, :mine, :all_course_groups, - :left_banner, :top_banner, :informs, :online_learning] + :left_banner, :top_banner, :informs, :online_learning, :course_groups] before_action :check_account, only: [:new, :create, :apply_to_join_course, :join_excellent_course] before_action :check_auth, except: [:index, :show, :students, :teachers, :board_list, :mine, :all_course_groups, - :left_banner, :top_banner, :apply_to_join_course, :exit_course] + :left_banner, :top_banner, :apply_to_join_course, :exit_course, :course_groups] before_action :set_course, only: [:show, :update, :destroy, :settings, :set_invite_code_halt, :set_public_or_private, :search_teacher_candidate, :teachers, :apply_teachers, :top_banner, :left_banner, :add_teacher_popup, :add_teacher, @@ -28,7 +28,7 @@ class CoursesController < ApplicationController :switch_to_teacher, :switch_to_assistant, :switch_to_student, :exit_course, :informs, :update_informs, :online_learning, :update_task_position, :tasks_list, :join_excellent_course, :export_couser_info, :export_member_act_score, :new_informs, - :delete_informs, :change_member_role] + :delete_informs, :change_member_role, :course_groups, :join_course_group] before_action :user_course_identity, except: [:join_excellent_course, :index, :create, :new, :apply_to_join_course, :search_course_list, :get_historical_course_students, :mine, :search_slim, :board_list] before_action :teacher_allowed, only: [:update, :destroy, :settings, :search_teacher_candidate, @@ -822,6 +822,26 @@ class CoursesController < ApplicationController end end + # 分班列表 + def course_groups + @course_groups = @course.course_groups + @course_groups = @course_groups.where("name like ?", "%#{params[:search]}%") unless params[:search].blank? + @all_group_count = @course_groups.size + @teachers = @course.teachers.includes(:user, :teacher_course_groups) if @user_course_identity < Course::NORMAL + @current_group_id = @course.students.where(user_id: current_user.id).take&.course_group_id if @user_course_identity == Course::STUDENT + end + + # 学生自动加入分班 + def join_course_group + tip_exception("学生才能加入分班") if @user_course_identity != Course::STUDENT + course_group = CourseGroup.find_by!(id: params[:course_group_id], course_id: @course.id) + member = CourseMember.find_by!(user_id: current_user.id, course_id: @course.id, role: 4) + if course_group && member + member.update_attributes!(course_group_id: course_group.id) + normal_status(0, "加入成功") + end + end + # 将学生批量移动到某个分班 def transfer_to_course_group ActiveRecord::Base.transaction do diff --git a/app/helpers/courses_helper.rb b/app/helpers/courses_helper.rb index d670614d5..fb7bd1a88 100644 --- a/app/helpers/courses_helper.rb +++ b/app/helpers/courses_helper.rb @@ -1,6 +1,18 @@ module CoursesHelper - # 是否有切换为学生的入口 + def member_manager group, teachers + str = "" + members = teachers.select{|teacher| teacher.teacher_course_groups.pluck(:course_group_id).include?(group.id) || teacher.teacher_course_groups.size == 0} + str = members.uniq.size == teachers.size ? "全部教师" : members.map{|member| member.user.real_name}.join("、") + str + # teachers.each do |member| + # if member.teacher_course_groups.exists?(course_group_id: group.id) || member.teacher_course_groups.size == 0 + # str << member.user.real_name + # end + # end + end + + # 是否有切换为学生的入口 def switch_student_role is_teacher, course, user is_teacher && course.course_members.where(user_id: user.id, role: %i(STUDENT)).exists? end diff --git a/app/views/courses/course_groups.json.jbuilder b/app/views/courses/course_groups.json.jbuilder new file mode 100644 index 000000000..48a5922a6 --- /dev/null +++ b/app/views/courses/course_groups.json.jbuilder @@ -0,0 +1,11 @@ +json.course_groups @course_groups.each do |group| + json.(group, :id, :course_members_count, :name) + json.invite_code group.invite_code if @user_course_identity < Course::STUDENT + json.member_manager member_manager(group, @teachers) if @user_course_identity < Course::NORMAL +end + +if @user_course_identity == Course::STUDENT + json.current_group_id @current_group_id +end +json.none_group_member_count @course.none_group_count +json.group_count @all_group_count \ No newline at end of file diff --git a/app/views/courses/students.json.jbuilder b/app/views/courses/students.json.jbuilder index 016efa711..0b5d7fe71 100644 --- a/app/views/courses/students.json.jbuilder +++ b/app/views/courses/students.json.jbuilder @@ -7,7 +7,7 @@ json.students do json.student_id student.user.try(:student_id) json.course_group_name student.course_group.try(:name) json.course_member_id student.id - if @user_course_identity < Course::ASSISTANT_PROFESSOR + if @user_course_identity < Course::ASSISTANT_PROFESSOR && !params[:course_group_id].present? json.member_roles student.user.course_role(@course) end json.user_phone student.user.hidden_phone diff --git a/config/routes.rb b/config/routes.rb index 503210a91..a3c2078f3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -370,6 +370,8 @@ Rails.application.routes.draw do post 'join_excellent_course' get 'tasks_list' post 'update_task_position' + get 'course_groups' + post 'join_course_group' end collection do From 31d5e0ccc2217ebfcf5419e1e8a1801fddb07be6 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 10 Oct 2019 17:13:21 +0800 Subject: [PATCH 346/394] tea --- .../modules/courses/members/ChangeRolePop.js | 0 .../modules/courses/members/studentsList.js | 2 +- .../modules/courses/members/teacherList.js | 37 ++++++++++++++----- 3 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 public/react/src/modules/courses/members/ChangeRolePop.js diff --git a/public/react/src/modules/courses/members/ChangeRolePop.js b/public/react/src/modules/courses/members/ChangeRolePop.js new file mode 100644 index 000000000..e69de29bb diff --git a/public/react/src/modules/courses/members/studentsList.js b/public/react/src/modules/courses/members/studentsList.js index 1b0b19d6f..cba7dbf54 100644 --- a/public/react/src/modules/courses/members/studentsList.js +++ b/public/react/src/modules/courses/members/studentsList.js @@ -1,5 +1,5 @@ import React,{ Component } from "react"; -import { Input,Checkbox,Table, Pagination, Modal,Menu ,Spin, Tooltip , Divider } from "antd"; +import { Input,Checkbox,Table, Pagination, Modal,Menu ,Spin, Tooltip , Divider, Popconfirm } from "antd"; import ClipboardJS from 'clipboard' import '../css/Courses.css' import '../css/members.css' diff --git a/public/react/src/modules/courses/members/teacherList.js b/public/react/src/modules/courses/members/teacherList.js index 86ae7aa0b..d3f4521b3 100644 --- a/public/react/src/modules/courses/members/teacherList.js +++ b/public/react/src/modules/courses/members/teacherList.js @@ -1,5 +1,5 @@ import React,{ Component } from "react"; -import { Input,Checkbox,Table, Divider, Tooltip,Spin, Menu } from "antd"; +import { Input,Checkbox,Table, Divider, Tooltip,Spin, Menu, Popconfirm } from "antd"; import CourseLayoutcomponent from '../common/CourseLayoutComponent' import NoneData from "../coursesPublic/NoneData" @@ -150,15 +150,34 @@ function buildColumns(that) { ) } else { return ( - - {record.role != ROLE_ADMIN && that.onDelete(record)} style={'grey'}>删除} - {(record.role == ROLE_TEACHER || record.role == ROLE_TEACHER_ASSISTANT || isAdminOrCreator) && record.role != ROLE_ADMIN - && } - { record.role == ROLE_TEACHER ? that.changeToAssistant(record)}>变更为助教 : '' } - { record.role == ROLE_TEACHER_ASSISTANT ? that.changeToTeacher(record)}>变更为教师 : '' } - { record.role == ROLE_ADMIN && isAdminOrCreator ? that.showChangeAdminModal(record)}>更换管理员 : '' } + + 删除 + + 管理员 + 助教 + 学生 + + } + > + 修改角色 + + + + + // + // {record.role != ROLE_ADMIN && that.onDelete(record)} style={'grey'}>删除} + // {(record.role == ROLE_TEACHER || record.role == ROLE_TEACHER_ASSISTANT || isAdminOrCreator) && record.role != ROLE_ADMIN + // && } + // { record.role == ROLE_TEACHER ? that.changeToAssistant(record)}>变更为助教 : '' } + // { record.role == ROLE_TEACHER_ASSISTANT ? that.changeToTeacher(record)}>变更为教师 : '' } + // { record.role == ROLE_ADMIN && isAdminOrCreator ? that.showChangeAdminModal(record)}>更换管理员 : '' } - ) + // + ) } }, From ae764f96069edb1f0f89d092087734e4c7a8f98a Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 10 Oct 2019 17:14:28 +0800 Subject: [PATCH 347/394] window.location.reload() --- public/react/src/modules/courses/members/modal/AddAdminModal.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/react/src/modules/courses/members/modal/AddAdminModal.js b/public/react/src/modules/courses/members/modal/AddAdminModal.js index 5ca1867e7..80ad75f66 100644 --- a/public/react/src/modules/courses/members/modal/AddAdminModal.js +++ b/public/react/src/modules/courses/members/modal/AddAdminModal.js @@ -95,6 +95,7 @@ class AddAdminModal extends Component{ user_id: this.state.radioBoxValue.user_id }).then((result)=>{ if(result.data.status==0){ + window.location.reload() this.props.showNotification('操作成功。') // this.fetchAll() this.setVisible(false) From 7f09f745c36bbdc6021bd60412fea60744124016 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 10 Oct 2019 17:21:10 +0800 Subject: [PATCH 348/394] =?UTF-8?q?this.props.showNotification('=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=E6=88=90=E5=8A=9F=E3=80=82')?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/courses/members/modal/AddAdminModal.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/members/modal/AddAdminModal.js b/public/react/src/modules/courses/members/modal/AddAdminModal.js index 80ad75f66..a1ec2e8f0 100644 --- a/public/react/src/modules/courses/members/modal/AddAdminModal.js +++ b/public/react/src/modules/courses/members/modal/AddAdminModal.js @@ -95,8 +95,8 @@ class AddAdminModal extends Component{ user_id: this.state.radioBoxValue.user_id }).then((result)=>{ if(result.data.status==0){ - window.location.reload() this.props.showNotification('操作成功。') + window.location.reload() // this.fetchAll() this.setVisible(false) this.props.changeAdminSuccess && this.props.changeAdminSuccess() From a86c3478052784e4ef3ebe52a822054663acbfdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Thu, 10 Oct 2019 17:30:10 +0800 Subject: [PATCH 349/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/shixunHomework/Listofworksstudentone.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js index 73070497b..0cd04f5d5 100644 --- a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js +++ b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js @@ -3344,6 +3344,7 @@ class Listofworksstudentone extends Component { ` .edu-position-hide li a:hover { background: #F0F0F0; + color: #05101A; } ` } From abb5ec8cfd871d5754cd2c3378556c7ad9e65a23 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Thu, 10 Oct 2019 17:45:08 +0800 Subject: [PATCH 350/394] if (this.props.isCourseAdmin()) { --- .../src/modules/courses/members/modal/AddAdminModal.js | 4 +++- public/react/src/modules/tpm/TPMIndexHOC.js | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/members/modal/AddAdminModal.js b/public/react/src/modules/courses/members/modal/AddAdminModal.js index a1ec2e8f0..5cbf0c204 100644 --- a/public/react/src/modules/courses/members/modal/AddAdminModal.js +++ b/public/react/src/modules/courses/members/modal/AddAdminModal.js @@ -96,7 +96,9 @@ class AddAdminModal extends Component{ }).then((result)=>{ if(result.data.status==0){ this.props.showNotification('操作成功。') - window.location.reload() + if (this.props.isCourseAdmin()) { + window.location.reload() + } // this.fetchAll() this.setVisible(false) this.props.changeAdminSuccess && this.props.changeAdminSuccess() diff --git a/public/react/src/modules/tpm/TPMIndexHOC.js b/public/react/src/modules/tpm/TPMIndexHOC.js index c39042308..dd4572bcc 100644 --- a/public/react/src/modules/tpm/TPMIndexHOC.js +++ b/public/react/src/modules/tpm/TPMIndexHOC.js @@ -222,7 +222,7 @@ export function TPMIndexHOC(WrappedComponent) { # 课程权限判断 ADMIN = 0 # 超级管理员 BUSINESS = 1 # 运营人员 - CREATOR = 2 # 课程创建者 + CREATOR = 2 # 课程创建者 课堂管理员 PROFESSOR = 3 # 课程老师 ASSISTANT_PROFESSOR = 4 # 课程助教 STUDENT = 5 # 学生 @@ -233,6 +233,9 @@ export function TPMIndexHOC(WrappedComponent) { isSuperAdmin = () => { // return false return this.state.coursedata&&this.state.coursedata.course_identity === 0 + } + isCourseAdmin = () => { + return this.state.coursedata&&this.state.coursedata.course_identity === 2 } //超管、运维0-1 isClassManagement = () => { @@ -537,6 +540,8 @@ export function TPMIndexHOC(WrappedComponent) { isSuperAdmin:this.isSuperAdmin, isAdminOrCreator:this.isAdminOrCreator, isClassManagement:this.isClassManagement, + isCourseAdmin:this.isCourseAdmin, + isAdmin: this.isAdmin, isAdminOrTeacher: this.isAdminOrTeacher, isStudent: this.isStudent, From d54d26e7b1338b55c80ee23d7cc28bbb95758a24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Thu, 10 Oct 2019 17:51:31 +0800 Subject: [PATCH 351/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/graduation/tasks/GraduationAcross.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js b/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js index b3fd37878..18dac8041 100644 --- a/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js +++ b/public/react/src/modules/courses/graduation/tasks/GraduationAcross.js @@ -189,7 +189,8 @@ class GraduationAcross extends Component{ cross_teachers: item.cross_teachers, student_id:item.student_id, user_name:item.user_name, - work_id:item.work_id + work_id:item.work_id, + cross_groups:item.cross_groups } return list; }), From a91cf878c0bb5e18f406842cccd6f88779b1a745 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com> Date: Fri, 11 Oct 2019 09:44:04 +0800 Subject: [PATCH 352/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../courses/shixunHomework/Listofworksstudentone.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js index 0cd04f5d5..5eed392d5 100644 --- a/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js +++ b/public/react/src/modules/courses/shixunHomework/Listofworksstudentone.js @@ -2627,9 +2627,11 @@ class Listofworksstudentone extends Component { // return // } this.setState({ - loadingstate: true + loadingstate: true, + page:1, + limit:20, }) - this.Startsortingt(this.state.orders, this.state.course_groupyslstwo, this.state.checkedValuesineinfo, value, this.state.page, this.state.limit); + this.Startsortingt(this.state.orders, this.state.course_groupyslstwo, this.state.checkedValuesineinfo, value, 1,20); // console.log(value) @@ -2641,9 +2643,11 @@ class Listofworksstudentone extends Component { // this.onSearch(); // console.log("使用了回车键"); this.setState({ - loadingstate: true + loadingstate: true, + page:1, + limit:20, }) - this.Startsortingt(this.state.orders, this.state.course_groupyslstwo, this.state.checkedValuesineinfo, this.state.searchtext, this.state.page, this.state.limit); + this.Startsortingt(this.state.orders, this.state.course_groupyslstwo, this.state.checkedValuesineinfo, this.state.searchtext, 1,20); } } //排序 From 764d0cc071242da038549a43e960234d78514698 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 11 Oct 2019 09:48:49 +0800 Subject: [PATCH 353/394] =?UTF-8?q?=E6=AF=95=E8=AE=BE=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=9A=84=E6=88=AA=E6=AD=A2=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/graduation_tasks/_public_navigation.json.jbuilder | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/graduation_tasks/_public_navigation.json.jbuilder b/app/views/graduation_tasks/_public_navigation.json.jbuilder index 00280c31b..992d03fd8 100644 --- a/app/views/graduation_tasks/_public_navigation.json.jbuilder +++ b/app/views/graduation_tasks/_public_navigation.json.jbuilder @@ -2,4 +2,5 @@ json.partial! "graduation_topics/show_navigation", locals: {course: course, grad json.task_status task_curr_status(graduation, course)[:status] json.task_name graduation.name json.task_id graduation.id -json.status graduation.status \ No newline at end of file +json.status graduation.status +json.end_time graduation.end_time \ No newline at end of file From e67b8e3404cc61a3087603e469478f093937d0b8 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 11 Oct 2019 09:56:04 +0800 Subject: [PATCH 354/394] style2 --- public/react/src/common/course/WordsBtn.js | 14 ++++++++++---- .../src/modules/courses/members/teacherList.js | 15 +++++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/public/react/src/common/course/WordsBtn.js b/public/react/src/common/course/WordsBtn.js index 58b000338..85a85cfb6 100644 --- a/public/react/src/common/course/WordsBtn.js +++ b/public/react/src/common/course/WordsBtn.js @@ -8,15 +8,21 @@ class WordsBtn extends Component { } render() { - let{to, href,targets}=this.props + let{to, href,targets, style2 }=this.props return( { to==undefined&&targets==undefined ? - {this.props.children}: - targets!=undefined? {this.props.children} + {this.props.children}: + targets!=undefined? {this.props.children} : - {this.props.children} + {this.props.children} } ) diff --git a/public/react/src/modules/courses/members/teacherList.js b/public/react/src/modules/courses/members/teacherList.js index d3f4521b3..1dd8cd3f9 100644 --- a/public/react/src/modules/courses/members/teacherList.js +++ b/public/react/src/modules/courses/members/teacherList.js @@ -117,7 +117,7 @@ function buildColumns(that) { const hasGraduationModule = that.hasGraduationModule() if (hasGraduationModule && showSorter) { columns.push({ - title: '答辩组', + title: '所在答辩组', // width: 90, sorter: showSorter, sortDirections: sortDirections, @@ -141,6 +141,9 @@ function buildColumns(that) { width: 150, align:'center', render: (text, record) => { + const isAdmin = record.role == ROLE_ADMIN + const isTeacher = record.role == ROLE_TEACHER + const isAssitant = record.role == ROLE_TEACHER_ASSISTANT if (record.application_id) { return ( @@ -151,19 +154,19 @@ function buildColumns(that) { } else { return ( - 删除 + that.onDelete(record)} style={'grey'}>删除 - 管理员 - 助教 + 管理员 + 助教 学生 } > - 修改角色 + 修改角色 From d2b2384b9477a93980933c05a4549a81eb0fd900 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 11 Oct 2019 11:05:16 +0800 Subject: [PATCH 355/394] =?UTF-8?q?=E6=95=99=E5=B8=88=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/courses/members/ChangeRolePop.js | 72 +++++++++++++++++++ .../modules/courses/members/teacherList.js | 18 ++++- 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/members/ChangeRolePop.js b/public/react/src/modules/courses/members/ChangeRolePop.js index e69de29bb..44dfc28fc 100644 --- a/public/react/src/modules/courses/members/ChangeRolePop.js +++ b/public/react/src/modules/courses/members/ChangeRolePop.js @@ -0,0 +1,72 @@ +import React, { useState, useEffect } from 'react' +import { trigger, WordsBtn } from 'educoder' +import { Input, Checkbox, Popconfirm } from "antd"; +import axios from 'axios' + +/** + 角色数组, CREATOR: 创建者, PROFESSOR: 教师, ASSISTANT_PROFESSOR: 助教, STUDENT: 学生 +*/ +function ChangeRolePop({ member_roles = [], record, courseId, onChangeRoleSuccess, showNotification }) { + const [checkBoxRoles, setCheckBoxRoles] = useState(member_roles) + useEffect(() => { + setCheckBoxRoles(member_roles) + }, [member_roles]) + function onCheckBoxChange(val) { + console.log(val) + + const isTeacher = checkBoxRoles.indexOf('PROFESSOR') + const isAssitant = checkBoxRoles.indexOf('ASSISTANT_PROFESSOR') + const isTeacherNew = val.indexOf('PROFESSOR') + const isAssitantNew = val.indexOf('ASSISTANT_PROFESSOR') + if (isTeacherNew > -1 && isTeacher == -1 && isAssitantNew > -1) { + val.splice(isAssitantNew, 1) + } + if (isAssitantNew > -1 && isAssitant == -1 && isTeacherNew > -1) { + val.splice(isTeacherNew, 1) + } + + setCheckBoxRoles(val) + } + function onCancel() { + setCheckBoxRoles(member_roles) + } + const onConfirm = async () => { + if (checkBoxRoles && checkBoxRoles.length == 0) { + showNotification('请至少选择一个角色') + return; + } + const url = `/courses/${courseId}/change_member_role.json` + const response = await axios.post(url, { + roles: checkBoxRoles, + user_id: record.user_id + }) + if (response.data.status == 0) { + onChangeRoleSuccess() + } + console.log(response) + } + const isAdmin = checkBoxRoles.indexOf('CREATOR') != -1 + const isTeacher = checkBoxRoles.indexOf('PROFESSOR') != -1 + const isAssitant = checkBoxRoles.indexOf('ASSISTANT_PROFESSOR') != -1 + const isStudent = checkBoxRoles.indexOf('STUDENT') != -1 + return ( + + {isAdmin && 管理员} + {!isAdmin && 教师} + 助教 + 学生 + + } + > + 修改角色 + + ) +} +export default ChangeRolePop \ No newline at end of file diff --git a/public/react/src/modules/courses/members/teacherList.js b/public/react/src/modules/courses/members/teacherList.js index 1dd8cd3f9..72b667300 100644 --- a/public/react/src/modules/courses/members/teacherList.js +++ b/public/react/src/modules/courses/members/teacherList.js @@ -24,6 +24,7 @@ import AddAdminModal from './modal/AddAdminModal' import CourseGroupChooserModal from './modal/CourseGroupChooserModal' import { ROLE_TEACHER_NUM, ROLE_ASSISTANT_NUM } from './common' import CourseGroupChooser from './CourseGroupChooser' +import ChangeRolePop from './ChangeRolePop' const Search = Input.Search; const ROLE_ADMIN = "管理员" @@ -38,6 +39,8 @@ function buildColumns(that) { const isAdminOrTeacher = that.props.isAdminOrTeacher() const { course_groups, filterKey } = that.state const showSorter = filterKey == '1' + const courseId = that.props.match.params.coursesId + const columns = [{ title: '序号', dataIndex: 'name', @@ -152,10 +155,18 @@ function buildColumns(that) { that.onAgree(record)} style={{color: '#4CACFF'}}>同意 ) } else { + return ( that.onDelete(record)} style={'grey'}>删除 - + {/* 修改角色 - + */} @@ -366,6 +377,9 @@ class studentsList extends Component{ console.log(error); }); } + onChangeRoleSuccess = () => { + this.fetchAll() + } fetchAll = async (argPage) => { this.setState({ isSpin:true From 3ed24f333d611fa69ad87defdfee4671b4045584 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 11 Oct 2019 11:09:59 +0800 Subject: [PATCH 356/394] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=AE=9E=E8=AE=AD?= =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/shixunHomework/ShixunhomeWorkItem.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js index 557e1ca89..4ebe801c5 100644 --- a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js +++ b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js @@ -354,8 +354,8 @@ class ShixunhomeWorkItem extends Component{ {/* {discussMessage.author.name} */} { discussMessage.author && {discussMessage.author} } - {discussMessage.commit_count===undefined?"":{discussMessage.commit_count} 已交} - {discussMessage.uncommit_count===undefined?"":{discussMessage.uncommit_count} 未交} + {discussMessage.commit_count===undefined?"":{discussMessage.commit_count} 已开始做题} + {discussMessage.uncommit_count===undefined?"":{discussMessage.uncommit_count} 未开始做题} {/*{discussMessage.replies_count} 3 未评*/} { From 4846cb348747d9491ea886802a338c06729a38bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 11 Oct 2019 11:24:46 +0800 Subject: [PATCH 357/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/shixunHomework/ShixunhomeWorkItem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js index 4ebe801c5..8b63a3471 100644 --- a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js +++ b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js @@ -381,7 +381,7 @@ class ShixunhomeWorkItem extends Component{ { discussMessage && discussMessage.upper_category_name && 22 }> - { {discussMessage.upper_category_name}} + { {discussMessage.upper_category_name}} } From 94852128f519468448c4c1eb22bff8b2520c9c39 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Fri, 11 Oct 2019 11:29:52 +0800 Subject: [PATCH 358/394] add_commit_method_to exercise_user --- app/controllers/admins/shixun_settings_controller.rb | 2 +- app/controllers/exercises_controller.rb | 3 ++- app/jobs/end_exercise_calculate_job.rb | 3 ++- app/models/exercise_user.rb | 1 + app/models/shixun.rb | 1 + app/tasks/exercise_publish_task.rb | 6 ++++-- app/views/exercises/_exercise_user.json.jbuilder | 1 + app/views/exercises/_user_exercise_info.json.jbuilder | 1 + .../20191011030441_add_commit_method_to_exercise_user.rb | 5 +++++ 9 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 db/migrate/20191011030441_add_commit_method_to_exercise_user.rb diff --git a/app/controllers/admins/shixun_settings_controller.rb b/app/controllers/admins/shixun_settings_controller.rb index 0ccd5725d..9202ccce6 100644 --- a/app/controllers/admins/shixun_settings_controller.rb +++ b/app/controllers/admins/shixun_settings_controller.rb @@ -92,6 +92,6 @@ class Admins::ShixunSettingsController < Admins::BaseController end def setting_params - params.permit(:use_scope,:excute_time,:close,:status,:can_copy,:webssh,:hidden,:homepage_show,:task_pass,:code_hidden,:id,tag_repertoires:[]) + params.permit(:use_scope,:excute_time,:close,:status,:can_copy,:webssh,:hidden,:homepage_show,:task_pass,:code_hidden,:page_no, :id,tag_repertoires:[]) end end diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index f2e8508f0..30f09cc64 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -1088,7 +1088,8 @@ class ExercisesController < ApplicationController :end_at => Time.now, :objective_score => objective_score, :score => total_score, - :subjective_score => subjective_score + :subjective_score => subjective_score, + :commit_method => @answer_committed_user&.commit_method.to_i > 0 ? @answer_committed_user&.commit_method.to_i : params[:commit_method].to_i } @answer_committed_user.update_attributes(commit_option) CommitExercsieNotifyJobJob.perform_later(@exercise.id, current_user.id) diff --git a/app/jobs/end_exercise_calculate_job.rb b/app/jobs/end_exercise_calculate_job.rb index 39d8bb1db..b6d8e491e 100644 --- a/app/jobs/end_exercise_calculate_job.rb +++ b/app/jobs/end_exercise_calculate_job.rb @@ -19,7 +19,8 @@ class EndExerciseCalculateJob < ApplicationJob :end_at => Time.now, :objective_score => objective_score, :score => total_score, - :subjective_score => user_sub_score + :subjective_score => user_sub_score, + :commit_method => user&.commit_method.to_i > 0 ? user&.commit_method.to_i : 4 } user.update_attributes(commit_option) end diff --git a/app/models/exercise_user.rb b/app/models/exercise_user.rb index 84f042b25..0f2e8456e 100644 --- a/app/models/exercise_user.rb +++ b/app/models/exercise_user.rb @@ -1,4 +1,5 @@ class ExerciseUser < ApplicationRecord + # commit_method 0 为默认, 1为学生的手动提交,2为倒计时结束后自动提交,3为试卷定时截止的自动提交, 4为教师手动的立即截止 belongs_to :user belongs_to :exercise diff --git a/app/models/shixun.rb b/app/models/shixun.rb index 4912ea15a..0cdb2e82b 100644 --- a/app/models/shixun.rb +++ b/app/models/shixun.rb @@ -1,5 +1,6 @@ class Shixun < ApplicationRecord include Searchable::Shixun + attr_accessor :page_no #管理员页面 实训配置更新状态时,需要接受page_no参数 # status: 0:编辑 1:申请发布 2:正式发布 3:关闭 -1:软删除 # hide_code: 隐藏代码窗口 diff --git a/app/tasks/exercise_publish_task.rb b/app/tasks/exercise_publish_task.rb index 220512664..a7b533d05 100644 --- a/app/tasks/exercise_publish_task.rb +++ b/app/tasks/exercise_publish_task.rb @@ -66,7 +66,8 @@ class ExercisePublishTask :end_at => Time.now, :objective_score => s_score, :score => total_score, - :subjective_score => subjective_score + :subjective_score => subjective_score, + :commit_method => exercise_user&.commit_method.to_i > 0 ? exercise_user&.commit_method.to_i : 3 } exercise_user.update_attributes(commit_option) end @@ -108,7 +109,8 @@ class ExercisePublishTask :end_at => Time.now, :objective_score => s_score, :score => total_score, - :subjective_score => subjective_score + :subjective_score => subjective_score, + :commit_method => exercise_user&.commit_method.to_i > 0 ? exercise_user&.commit_method.to_i : 3 } exercise_user.update_attributes(commit_option) end diff --git a/app/views/exercises/_exercise_user.json.jbuilder b/app/views/exercises/_exercise_user.json.jbuilder index d41fb9e20..5f00bbd70 100644 --- a/app/views/exercises/_exercise_user.json.jbuilder +++ b/app/views/exercises/_exercise_user.json.jbuilder @@ -8,6 +8,7 @@ json.user_group_name ex_user_info[:user_group_name] json.student_id ex_user_info[:student_id] json.commit_status ex_user_info[:commit_status] json.end_at ex_user_info[:end_at] +json.commit_method exercise_user&.commit_method.to_i if subjective_type == 1 json.objective_score ex_user_info[:ex_object_score] json.subjective_score ex_user_info[:ex_subject_score] diff --git a/app/views/exercises/_user_exercise_info.json.jbuilder b/app/views/exercises/_user_exercise_info.json.jbuilder index 0d21cc593..bdac3a985 100644 --- a/app/views/exercises/_user_exercise_info.json.jbuilder +++ b/app/views/exercises/_user_exercise_info.json.jbuilder @@ -9,6 +9,7 @@ json.exercise_answer_user do json.user_id ex_answerer.id json.login ex_answerer.login if exercise_user.present? + json.commit_method exercise_user&.commit_method.to_i json.start_at exercise_user.start_at json.score exercise_user.score.present? ? exercise_user.score.round(1).to_s : "0.0" end diff --git a/db/migrate/20191011030441_add_commit_method_to_exercise_user.rb b/db/migrate/20191011030441_add_commit_method_to_exercise_user.rb new file mode 100644 index 000000000..060e5eb5f --- /dev/null +++ b/db/migrate/20191011030441_add_commit_method_to_exercise_user.rb @@ -0,0 +1,5 @@ +class AddCommitMethodToExerciseUser < ActiveRecord::Migration[5.2] + def change + add_column :exercise_users, :commit_method, :integer, :default => 0 + end +end From 0629bc15af5cf4801e873f9bca2b052d248a81d7 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Fri, 11 Oct 2019 13:49:08 +0800 Subject: [PATCH 359/394] =?UTF-8?q?=E8=AF=95=E5=8D=B7=E7=9A=84=E6=8F=90?= =?UTF-8?q?=E4=BA=A4=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercises_controller.rb | 35 ++++++++++++++++++------- 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index 8f7d43196..e76148f20 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -1077,12 +1077,22 @@ class ExercisesController < ApplicationController def commit_exercise ActiveRecord::Base.transaction do begin - if @user_course_identity > Course::ASSISTANT_PROFESSOR #为学生时 - objective_score = calculate_student_score(@exercise,current_user)[:total_score] - subjective_score = @answer_committed_user.subjective_score - total_score_subjective_score = subjective_score < 0.0 ? 0.0 : subjective_score - total_score = objective_score + total_score_subjective_score - commit_option = { + can_commit_exercise = false + if (@user_course_identity > Course::ASSISTANT_PROFESSOR) && params[:commit_method].present? #为学生时 + if params[:commit_method].to_i == 2 #自动提交时 + user_left_time = get_exercise_left_time(@exercise,current_user) + if user_left_time.to_i <= 0 + can_commit_exercise = true + end + else + can_commit_exercise = true + end + if can_commit_exercise + objective_score = calculate_student_score(@exercise,current_user)[:total_score] + subjective_score = @answer_committed_user.subjective_score + total_score_subjective_score = subjective_score < 0.0 ? 0.0 : subjective_score + total_score = objective_score + total_score_subjective_score + commit_option = { :status => 1, :commit_status => 1, :end_at => Time.now, @@ -1090,10 +1100,15 @@ class ExercisesController < ApplicationController :score => total_score, :subjective_score => subjective_score, :commit_method => @answer_committed_user&.commit_method.to_i > 0 ? @answer_committed_user&.commit_method.to_i : params[:commit_method].to_i - } - @answer_committed_user.update_attributes(commit_option) - CommitExercsieNotifyJobJob.perform_later(@exercise.id, current_user.id) - normal_status(0,"试卷提交成功!") + } + @answer_committed_user.update_attributes(commit_option) + CommitExercsieNotifyJobJob.perform_later(@exercise.id, current_user.id) + normal_status(0,"试卷提交成功!") + else + normal_status(-1,"提交失败,请重试!") + end + else + normal_status(-1,"提交失败,请重试!") end rescue Exception => e uid_logger_error(e.message) From c4c7380162ff70c491aba83bbb81f5986a216862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 11 Oct 2019 13:58:54 +0800 Subject: [PATCH 360/394] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BA=A4=E5=8D=B7?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/courses/exercise/ExerciseReviewAndAnswer.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js b/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js index f45de9b64..59072a862 100644 --- a/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js +++ b/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js @@ -129,7 +129,9 @@ class ExerciseReviewAndAnswer extends Component{ autoCommitExercise=()=>{ let eId=this.props.match.params.Id; let url=`/exercises/${eId}/commit_exercise.json`; - axios.post(url).then((result)=>{ + axios.post(url,{ + commit_method:2 + }).then((result)=>{ if(result){ this.setState({ Modalstype:true, @@ -139,6 +141,7 @@ class ExerciseReviewAndAnswer extends Component{ ModalSave:this.sureCommit, Loadtype:true }) + this.props.showNotification(`${result.data.message}`); } }).catch((error)=>{ console.log(error); @@ -485,7 +488,9 @@ class ExerciseReviewAndAnswer extends Component{ //交卷 let eId=this.props.match.params.Id; let url=`/exercises/${eId}/commit_exercise.json`; - axios.post(url).then((result)=>{ + axios.post(url,{ + commit_method:1 + }).then((result)=>{ if(result){ this.setState({ Modalstype:false, From 4761f518d789b52f23d0831664bf44e44559df01 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 11 Oct 2019 14:00:11 +0800 Subject: [PATCH 361/394] =?UTF-8?q?=E5=AD=A6=E7=94=9F=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/courses/css/members.css | 4 + .../modules/courses/members/studentsList.css | 3 + .../modules/courses/members/studentsList.js | 124 +++++++++++++----- 3 files changed, 100 insertions(+), 31 deletions(-) create mode 100644 public/react/src/modules/courses/members/studentsList.css diff --git a/public/react/src/modules/courses/css/members.css b/public/react/src/modules/courses/css/members.css index 67524d130..ab7effaa0 100644 --- a/public/react/src/modules/courses/css/members.css +++ b/public/react/src/modules/courses/css/members.css @@ -84,4 +84,8 @@ text-overflow:ellipsis; white-space:nowrap; cursor: default; +} + +.changeRolePop .ant-checkbox-group { + width: 230px !important; } \ No newline at end of file diff --git a/public/react/src/modules/courses/members/studentsList.css b/public/react/src/modules/courses/members/studentsList.css new file mode 100644 index 000000000..49a81fa32 --- /dev/null +++ b/public/react/src/modules/courses/members/studentsList.css @@ -0,0 +1,3 @@ +.stu_table .ant-table-thead > tr > th, .stu_table .ant-table-tbody > tr > td { + padding: 14px 8px; +} \ No newline at end of file diff --git a/public/react/src/modules/courses/members/studentsList.js b/public/react/src/modules/courses/members/studentsList.js index cba7dbf54..5f614cfbc 100644 --- a/public/react/src/modules/courses/members/studentsList.js +++ b/public/react/src/modules/courses/members/studentsList.js @@ -14,6 +14,8 @@ import _ from 'lodash' import NoneData from "../coursesPublic/NoneData" import DownloadMessageysl from "../../modals/DownloadMessageysl"; import CreateGroupByImportModal from './modal/CreateGroupByImportModal' +import ChangeRolePop from './ChangeRolePop' +import "./studentsList.css" const Search =Input.Search; const TYPE_STUDENTS = 1 @@ -22,6 +24,7 @@ const TYPE_COURSE_GOURP_CHILD = 3 const buildColumns = (that,isParent) => { const { course_groups , sortedInfo } = that.state let showSorter = isParent==true + const courseId = that.props.match.params.coursesId const columns=[{ title: '序号', dataIndex: 'id', @@ -32,19 +35,21 @@ const buildColumns = (that,isParent) => { render: (id, student, index) => { return (that.state.page - 1) * 20 + index + 1 } - }, { - title: '用户id', - dataIndex: 'login', - key: 'login', - align:'center', - width:"10%", - className:"color-grey-6", - render: (login, record) => { - return 10 ? login : ''} - >{login} - } - }, { + }, + // { + // title: '用户id', + // dataIndex: 'login', + // key: 'login', + // align:'center', + // width:"10%", + // className:"color-grey-6", + // render: (login, record) => { + // return 10 ? login : ''} + // >{login} + // } + // }, + { title: '姓名', dataIndex: 'name', key: 'name', @@ -69,14 +74,45 @@ const buildColumns = (that,isParent) => { return 10 ? student_id : ''} style={{maxWidth: '160px'}} >{student_id} } - }]; + } + , { + title: '手机号', + dataIndex: 'user_phone', + key: 'user_phone', + align:'center', + width:"10%", + className:"color-grey-6", + // sorter: true, + // sortDirections: sortDirections, + // sortOrder: sortedInfo.columnKey === 'user_phone' && sortedInfo.order, + render: (user_phone, record) => { + return 10 ? user_phone : ''} + style={{maxWidth: '160px'}} >{user_phone} + } + } + , { + title: '邮箱', + dataIndex: 'user_mail', + key: 'user_mail', + align:'center', + width:"10%", + className:"color-grey-6", + // sorter: true, + // sortDirections: sortDirections, + // sortOrder: sortedInfo.columnKey === 'user_mail' && sortedInfo.order, + render: (user_mail, record) => { + return 10 ? user_mail : ''} + style={{maxWidth: '160px'}} >{user_mail} + } + } + ]; if (course_groups && course_groups.length) { columns.push({ title: '分班', dataIndex: 'course_group_name', key: 'course_group_name', align:'center', - width:"40%", + width:"25%", className:"color-grey-6", sorter:showSorter, sortDirections: sortDirections, @@ -95,14 +131,36 @@ const buildColumns = (that,isParent) => { const isAdmin = that.props.isAdmin() if (isAdmin) { columns.unshift({ - title: '', - dataIndex: 'check', - key: 'check', - render: (text, item) => { - return - }, - width:"5%" - }) + title: '', + dataIndex: 'check', + key: 'check', + render: (text, item) => { + return + }, + width:"5%" + }) + + columns.push({ + title: '操作', + key: 'action', + width: '18%', + align:'center', + render: (text, record) => { + return ( + + that.onDelete(record)} style={'grey'}>删除学生 + + + ) + }, + }) + } return columns; @@ -242,7 +300,9 @@ class studentsList extends Component{ onChange=()=>{ } - + onChangeRoleSuccess = () => { + this.fetchAll() + } componentDidMount() { this.setState({ isSpin:true @@ -451,11 +511,13 @@ class studentsList extends Component{ } } // 多选 - onDelete = () => { - const len = this.state.checkBoxValues.length - if (len == 0) { - this.props.showNotification('请先从列表选择要删除的学生') - return; + onDelete = (record) => { + if (!record) { + const len = this.state.checkBoxValues.length + if (len == 0) { + this.props.showNotification('请先从列表选择要删除的学生') + return; + } } this.props.confirm({ @@ -465,7 +527,7 @@ class studentsList extends Component{ let id = this.props.match.params.coursesId let url=`/courses/${id}/delete_from_course.json`; axios.post((url), { - students: this.state.checkBoxValues.map(item => {return {course_member_id: item} }), + students: [{course_member_id: record.user_id}] // this.state.checkBoxValues.map(item => {return {course_member_id: item} }), }).then((result)=>{ if (result.data.status == 0) { this.props.showNotification('删除成功') @@ -701,7 +763,7 @@ class studentsList extends Component{
    {isAdmin && 已选 {checkBoxValues.length} 个}
    - {isAdmin &&
  • 删除
  • } + {/* {isAdmin &&
  • 删除
  • } */} {isAdmin &&
  • 移动到...
      From 8191926264022d362aa757d4c5522a3b21873d75 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 11 Oct 2019 14:11:03 +0800 Subject: [PATCH 362/394] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E3=80=81=E9=97=AE?= =?UTF-8?q?=E5=8D=B7=E7=9A=84=E7=AB=8B=E5=8D=B3=E5=8F=91=E5=B8=83=E5=BC=B9?= =?UTF-8?q?=E6=A1=86=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../homework_commons_controller.rb | 53 +++++++++++++++---- app/controllers/polls_controller.rb | 48 ++++++++++++----- .../publish_groups.json.jbuilder | 4 +- app/views/polls/publish_groups.json.jbuilder | 6 +++ config/routes.rb | 1 + 5 files changed, 88 insertions(+), 24 deletions(-) create mode 100644 app/views/polls/publish_groups.json.jbuilder diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index 0ed5730a4..70f0345b1 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -1036,6 +1036,7 @@ class HomeworkCommonsController < ApplicationController # 可立即发布的分班:当前用户管理的分班去除已发布的分班 group_ids = @course.charge_group_ids(@current_user) - @homework.homework_group_settings.group_published.pluck(:course_group_id) @course_groups = @course.course_groups.where(id: group_ids) + @group_settings = @homework.homework_group_settings.where(id: group_ids) else tip_exception("没有可发布的分班") end @@ -1043,16 +1044,28 @@ class HomeworkCommonsController < ApplicationController def publish_homework tip_exception("请至少选择一个分班") if params[:group_ids].blank? && @course.course_groups.size != 0 - tip_exception("缺少截止时间参数") if params[:end_time].blank? - tip_exception("截止时间不能早于当前时间") if params[:end_time] <= strf_time(Time.now) - tip_exception("截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if - @course.end_date.present? && params[:end_time] > strf_time(@course.end_date.end_of_day) + if params[:detail].blank? + tip_exception("缺少截止时间参数") if params[:end_time].blank? + tip_exception("截止时间不能早于当前时间") if params[:end_time] <= strf_time(Time.now) + tip_exception("截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if + @course.end_date.present? && params[:end_time] > strf_time(@course.end_date.end_of_day) + else + group_end_times = params[:group_end_times].reject(&:blank?).map{|time| time.to_time} + group_ids = params[:group_ids].reject(&:blank?) + tip_exception("缺少截止时间参数") if group_end_times.blank? + tip_exception("截止时间和分班参数的个数不一致") if group_end_times.length != group_ids.length + group_end_times.each do |time| + tip_exception("分班截止时间不能早于当前时间") if time <= Time.now + tip_exception("分班截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if + @course.end_date.present? && time > @course.end_date.end_of_day + end + end homeworks = @course.homework_commons.where(id: params[:homework_ids]) homeworks = homeworks.includes(:homework_group_settings, :homework_detail_manual) charge_group_ids = @course.charge_group_ids(current_user) - publish_groups = charge_group_ids & params[:group_ids] if params[:group_ids] + publish_groups = charge_group_ids & group_ids if group_ids # ActiveRecord::Base.transaction do begin @@ -1062,18 +1075,26 @@ class HomeworkCommonsController < ApplicationController if !params[:group_ids].blank? # 全选即统一设置,unified_setting为true - if @course.course_groups.where(id: publish_groups).size == @course.course_groups.size + if @course.course_groups.where(id: publish_groups).size == @course.course_groups.size && + ((params[:detail] && group_end_times.min == group_end_times.max) || params[:detail].blank?) homework.homework_group_settings.destroy_all homework.unified_setting = true - homework.end_time = params[:end_time] + homework.end_time = params[:detail] ? group_end_times.max : params[:end_time] else homework.unified_setting = false # 创建作业分班设置:homework_group_setting create_homework_group_settings(homework) # 选中的分班设置的发布时间改为当前时间,截止时间改为传的截止时间参数 - homework.homework_group_settings.where(course_group_id: publish_groups).update_all(publish_time: Time.now, - end_time: params[:end_time]) + if params[:detail] + group_ids.each_with_index do |group_id, index| + homework.homework_group_settings.find_by(course_group_id: group_id)&.update_attributes!(publish_time: Time.now, + end_time: group_end_times[index]) + end + else + homework.homework_group_settings.where(course_group_id: publish_groups).update_all(publish_time: Time.now, + end_time: params[:end_time]) + end # 发消息 tiding_group_ids = publish_groups end @@ -1086,7 +1107,7 @@ class HomeworkCommonsController < ApplicationController # 截止时间的处理 if homework.end_time.nil? - homework.end_time = params[:end_time] + homework.end_time = params[:detail] ? group_end_times.max : params[:end_time] elsif homework.max_group_end_time homework.end_time = homework.max_group_end_time end @@ -1101,12 +1122,22 @@ class HomeworkCommonsController < ApplicationController create_homework_group_settings(homework) none_publish_settings = homework.homework_group_settings.where(course_group_id: publish_groups).none_published - none_publish_settings.update_all(publish_time: Time.now, end_time: params[:end_time]) + if params[:detail] + group_ids.each_with_index do |group_id, index| + none_publish_settings.find_by(course_group_id: group_id)&.update_attributes!(publish_time: Time.now, + end_time: group_end_times[index]) + end + else + none_publish_settings.update_all(publish_time: Time.now, end_time: params[:end_time]) + end + if homework.max_group_end_time homework.end_time = homework.max_group_end_time end HomeworkCommonPushNotifyJob.perform_later(homework.id, none_publish_settings.pluck(:course_group_id)) end + + if homework.end_time > Time.now && homework.homework_detail_manual.try(:comment_status) > 1 homework.homework_detail_manual.update_attribute("comment_status", 1) end diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb index dcbded6fe..a8e081cb2 100644 --- a/app/controllers/polls_controller.rb +++ b/app/controllers/polls_controller.rb @@ -2,10 +2,10 @@ class PollsController < ApplicationController # before_action :check_poll_status 问卷的发消息和定时任务没有做 before_action :require_login, :check_auth,except: [:index] before_action :find_course, except: [:show,:poll_setting,:commit_setting,:edit,:update,:start_answer,:commit_poll, - :commit_result,:poll_lists,:cancel_publish,:cancel_publish_modal,:common_header] + :commit_result,:poll_lists,:cancel_publish,:cancel_publish_modal,:common_header,:publish_groups] before_action :get_poll_and_course, only: [:show,:poll_setting,:commit_setting,:edit,:update,:start_answer, :commit_poll,:commit_result,:poll_lists,:cancel_publish, - :cancel_publish_modal,:common_header] + :cancel_publish_modal,:common_header, :publish_groups] before_action :user_course_identity before_action :is_course_teacher, except: [:index,:start_answer,:poll_setting,:commit_poll,:commit_result,:poll_lists,:common_header] #判断是否为课堂老师 before_action :check_user_status @@ -242,12 +242,35 @@ class PollsController < ApplicationController end end end + + # 详情页的立即发布弹框 + def publish_groups + @current_user = current_user + # 可立即发布的分班:当前用户管理的分班去除已发布的分班 + group_ids = @course.charge_group_ids(@current_user) - @poll.poll_group_settings.poll_group_published.pluck(:course_group_id) + @course_groups = @course.course_groups.where(id: group_ids) + @group_settings = @poll.poll_group_settings.where(id: group_ids) + end + #首页批量或单独 立即发布,应是跳出弹窗,设置开始时间和截止时间。 def publish - tip_exception("缺少截止时间参数") if params[:end_time].blank? - tip_exception("截止时间不能早于当前时间") if params[:end_time] <= strf_time(Time.now) - tip_exception("截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if - @course.end_date.present? && params[:end_time] > strf_time(@course.end_date.end_of_day) + if params[:detail].blank? + tip_exception("缺少截止时间参数") if params[:end_time].blank? + tip_exception("截止时间不能早于当前时间") if params[:end_time] <= strf_time(Time.now) + tip_exception("截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if + @course.end_date.present? && params[:end_time] > strf_time(@course.end_date.end_of_day) + else + group_end_times = params[:group_end_times].reject(&:blank?).map{|time| time.to_time} + group_ids = params[:group_ids].reject(&:blank?) + tip_exception("缺少截止时间参数") if group_end_times.blank? + tip_exception("截止时间和分班参数的个数不一致") if group_end_times.length != group_ids.length + group_end_times.each do |time| + tip_exception("分班截止时间不能早于当前时间") if time <= Time.now + tip_exception("分班截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if + @course.end_date.present? && time > @course.end_date.end_of_day + end + end + ActiveRecord::Base.transaction do begin check_ids = Poll.where(id: params[:check_ids]) @@ -259,26 +282,27 @@ class PollsController < ApplicationController pl_status = poll.poll_group_settings.find_in_poll_group("course_group_id",params[:group_ids]).poll_group_not_published.present? ? 1 : 0 #立即发布针对分组设置的全部未发布的班级才生效 end if pl_status == 1 #如果问卷存在已发布的,或者是已截止的,那么则直接跳过 - g_course = params[:group_ids] #表示是否传入分班参数,如果传入分班的参数,那么poll的统一设置需修改 + g_course = group_ids #表示是否传入分班参数,如果传入分班的参数,那么poll的统一设置需修改 if g_course - user_course_groups = @course.charge_group_ids(current_user) - if g_course.map(&:to_i).sort == user_course_groups.sort # 如果是设置为全部班级,则问卷不用分组,且问卷设定为统一设置,否则则分组设置 + user_course_groups = @course.course_groups.pluck(:id) + if g_course.map(&:to_i).sort == user_course_groups.sort && + ((params[:detail] && group_end_times.min == group_end_times.max) || params[:detail].blank?) # 如果是设置为全部班级,则问卷不用分组,且问卷设定为统一设置,否则则分组设置 poll.poll_group_settings.destroy_all poll_unified = true e_time = ex_end_time else poll_unified = false - g_course.each do |i| + g_course.each_with_index do |i, index| poll_group_setting = poll.poll_group_settings.find_in_poll_group("course_group_id",i).first #根据课堂分班的id,寻找问卷所在的班级 if poll_group_setting #如果该问卷分组存在,则更新,否则新建 - poll_group_setting.update_attributes(publish_time:Time.now,end_time:ex_end_time) + poll_group_setting.update_attributes(publish_time:Time.now, end_time: params[:detail] ? group_end_times[index] : ex_end_time) else p_course_group = { :poll_id => poll.id, :course_group_id => i, :course_id => poll.course.id, :publish_time => Time.now, - :end_time => ex_end_time, + :end_time => params[:detail] ? group_end_times[index] : ex_end_time, } new_poll_group = poll.poll_group_settings.new p_course_group new_poll_group.save diff --git a/app/views/homework_commons/publish_groups.json.jbuilder b/app/views/homework_commons/publish_groups.json.jbuilder index 67722bb04..f3a99dbca 100644 --- a/app/views/homework_commons/publish_groups.json.jbuilder +++ b/app/views/homework_commons/publish_groups.json.jbuilder @@ -1,4 +1,6 @@ json.course_groups @course_groups do |group| json.id group.id json.name group.name -end \ No newline at end of file + json.end_time @group_settings.select{|group_setting| group_setting.course_group_id == group.id}.first&.end_time +end +json.end_time @homework.end_time \ No newline at end of file diff --git a/app/views/polls/publish_groups.json.jbuilder b/app/views/polls/publish_groups.json.jbuilder new file mode 100644 index 000000000..f63a2ea90 --- /dev/null +++ b/app/views/polls/publish_groups.json.jbuilder @@ -0,0 +1,6 @@ +json.course_groups @course_groups do |group| + json.id group.id + json.name group.name + json.end_time @group_settings.select{|group_setting| group_setting.course_group_id == group.id}.first&.end_time +end +json.end_time @poll.end_time \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 847afaa83..1fd31c50c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -584,6 +584,7 @@ Rails.application.routes.draw do post :cancel_publish #撤销发布 get :cancel_publish_modal #撤销发布的弹窗 get :common_header + get :publish_groups end resources :poll_questions,only:[:new,:create] end From 213157d542ec73d313e00df13400571c1890356b Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 11 Oct 2019 14:17:54 +0800 Subject: [PATCH 363/394] course_member_id --- public/react/src/modules/courses/members/studentsList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/members/studentsList.js b/public/react/src/modules/courses/members/studentsList.js index 5f614cfbc..c4d4abbda 100644 --- a/public/react/src/modules/courses/members/studentsList.js +++ b/public/react/src/modules/courses/members/studentsList.js @@ -527,7 +527,7 @@ class studentsList extends Component{ let id = this.props.match.params.coursesId let url=`/courses/${id}/delete_from_course.json`; axios.post((url), { - students: [{course_member_id: record.user_id}] // this.state.checkBoxValues.map(item => {return {course_member_id: item} }), + students: [{course_member_id: record.course_member_id}] // this.state.checkBoxValues.map(item => {return {course_member_id: item} }), }).then((result)=>{ if (result.data.status == 0) { this.props.showNotification('删除成功') From fb95ef4d18adde4a1d3cacbf4670310cf18d58b1 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 11 Oct 2019 14:22:04 +0800 Subject: [PATCH 364/394] =?UTF-8?q?=E5=AE=BD=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/courses/members/studentsList.css | 2 +- public/react/src/modules/courses/members/studentsList.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/members/studentsList.css b/public/react/src/modules/courses/members/studentsList.css index 49a81fa32..ebab316a0 100644 --- a/public/react/src/modules/courses/members/studentsList.css +++ b/public/react/src/modules/courses/members/studentsList.css @@ -1,3 +1,3 @@ .stu_table .ant-table-thead > tr > th, .stu_table .ant-table-tbody > tr > td { - padding: 14px 8px; + padding: 14px 6px; } \ No newline at end of file diff --git a/public/react/src/modules/courses/members/studentsList.js b/public/react/src/modules/courses/members/studentsList.js index 5f614cfbc..9a4f4be3b 100644 --- a/public/react/src/modules/courses/members/studentsList.js +++ b/public/react/src/modules/courses/members/studentsList.js @@ -143,7 +143,7 @@ const buildColumns = (that,isParent) => { columns.push({ title: '操作', key: 'action', - width: '18%', + width: '20%', align:'center', render: (text, record) => { return ( From 6b0f8d1a9e2f6e4b1dacd89725273c4eda0e277e Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 11 Oct 2019 14:31:53 +0800 Subject: [PATCH 365/394] stu --- public/react/src/modules/courses/members/studentsList.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/members/studentsList.js b/public/react/src/modules/courses/members/studentsList.js index 2d26cff91..e3859345a 100644 --- a/public/react/src/modules/courses/members/studentsList.js +++ b/public/react/src/modules/courses/members/studentsList.js @@ -814,7 +814,7 @@ class studentsList extends Component{
  • - {!this.state.isSpin && + {students && students.length &&
    }
    From c180267b807bef2e02a5853c1f17c1edd223a463 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 11 Oct 2019 14:32:04 +0800 Subject: [PATCH 366/394] =?UTF-8?q?=E8=AF=95=E5=8D=B7=E7=9A=84=E7=AB=8B?= =?UTF-8?q?=E5=8D=B3=E5=8F=91=E5=B8=83=E5=BC=B9=E6=A1=86=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercises_controller.rb | 46 ++++++++++++++----- app/controllers/polls_controller.rb | 7 +-- .../exercises/publish_groups.json.jbuilder | 6 +++ config/routes.rb | 1 + 4 files changed, 46 insertions(+), 14 deletions(-) create mode 100644 app/views/exercises/publish_groups.json.jbuilder diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index 30fef596d..a51f65c6b 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -683,12 +683,34 @@ class ExercisesController < ApplicationController end end + # 详情页的立即发布弹框 + def publish_groups + @current_user = current_user + # 可立即发布的分班:当前用户管理的分班去除已发布的分班 + group_ids = @course.charge_group_ids(@current_user) - @exercise.exercise_group_settings.exercise_group_published.pluck(:course_group_id) + @course_groups = @course.course_groups.where(id: group_ids) + @group_settings = @exercise.exercise_group_settings.where(id: group_ids) + end + #首页批量或单独 立即发布,应是跳出弹窗,设置开始时间和截止时间。 def publish - tip_exception("缺少截止时间参数") if params[:end_time].blank? - tip_exception("截止时间不能早于当前时间") if params[:end_time] <= strf_time(Time.now) - tip_exception("截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if - @course.end_date.present? && params[:end_time] > strf_time(@course.end_date.end_of_day) + if params[:detail].blank? + tip_exception("缺少截止时间参数") if params[:end_time].blank? + tip_exception("截止时间不能早于当前时间") if params[:end_time] <= strf_time(Time.now) + tip_exception("截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if + @course.end_date.present? && params[:end_time] > strf_time(@course.end_date.end_of_day) + else + group_end_times = params[:group_end_times].reject(&:blank?).map{|time| time.to_time} + group_ids = params[:group_ids].reject(&:blank?) + tip_exception("缺少截止时间参数") if group_end_times.blank? + tip_exception("截止时间和分班参数的个数不一致") if group_end_times.length != group_ids.length + group_end_times.each do |time| + tip_exception("分班截止时间不能早于当前时间") if time <= Time.now + tip_exception("分班截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if + @course.end_date.present? && time > @course.end_date.end_of_day + end + end + ActiveRecord::Base.transaction do begin check_ids = Exercise.where(id: params[:check_ids]) @@ -702,28 +724,30 @@ class ExercisesController < ApplicationController .exercise_group_not_published.present? ? 1 : 0 end if ex_status == 1 #如果试卷存在已发布的,或者是已截止的,那么则直接跳过 - g_course = params[:group_ids] #表示是否传入分班参数,如果传入分班的参数,那么试卷的统一设置需修改 + g_course = group_ids #表示是否传入分班参数,如果传入分班的参数,那么试卷的统一设置需修改 tiding_group_ids = g_course if g_course - user_course_groups = @course.charge_group_ids(current_user) - if g_course.map(&:to_i).sort == user_course_groups.sort # 如果是设置为全部班级,则试卷不用分组,且试卷设定为统一设置,否则则分组设置 + user_course_groups = @course.course_groups.pluck(:id) + if g_course.map(&:to_i).sort == user_course_groups.sort && + ((params[:detail] && group_end_times.min == group_end_times.max) || params[:detail].blank?) # 如果是设置为全部班级,则试卷不用分组,且试卷设定为统一设置,否则则分组设置 exercise.exercise_group_settings.destroy_all ex_unified = true - e_time = ex_end_time + e_time = params[:detail] ? group_end_times.max : ex_end_time tiding_group_ids = [] else ex_unified = false - g_course.each do |i| + g_course.each_with_index do |i, index| exercise_group_setting = exercise.exercise_group_settings.find_in_exercise_group("course_group_id",i).first #根据课堂分班的id,寻找试卷所在的班级 + group_end_time = params[:detail] ? group_end_times[index] : ex_end_time if exercise_group_setting #如果该试卷分组存在,则更新,否则新建 - exercise_group_setting.update_attributes(publish_time:Time.now,end_time:ex_end_time) + exercise_group_setting.update_attributes(publish_time: Time.now, end_time: group_end_time) else p_course_group = { :exercise_id => exercise.id, :course_group_id => i, :course_id => exercise.course.id, :publish_time => Time.now, - :end_time => ex_end_time, + :end_time => group_end_time, } new_exercise_group = exercise.exercise_group_settings.new p_course_group new_exercise_group.save diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb index a8e081cb2..6b9fd004c 100644 --- a/app/controllers/polls_controller.rb +++ b/app/controllers/polls_controller.rb @@ -289,20 +289,21 @@ class PollsController < ApplicationController ((params[:detail] && group_end_times.min == group_end_times.max) || params[:detail].blank?) # 如果是设置为全部班级,则问卷不用分组,且问卷设定为统一设置,否则则分组设置 poll.poll_group_settings.destroy_all poll_unified = true - e_time = ex_end_time + e_time = params[:detail] ? group_end_times.max : ex_end_time else poll_unified = false g_course.each_with_index do |i, index| poll_group_setting = poll.poll_group_settings.find_in_poll_group("course_group_id",i).first #根据课堂分班的id,寻找问卷所在的班级 + group_end_time = params[:detail] ? group_end_times[index] : ex_end_time if poll_group_setting #如果该问卷分组存在,则更新,否则新建 - poll_group_setting.update_attributes(publish_time:Time.now, end_time: params[:detail] ? group_end_times[index] : ex_end_time) + poll_group_setting.update_attributes(publish_time: Time.now, end_time: group_end_time) else p_course_group = { :poll_id => poll.id, :course_group_id => i, :course_id => poll.course.id, :publish_time => Time.now, - :end_time => params[:detail] ? group_end_times[index] : ex_end_time, + :end_time => group_end_time, } new_poll_group = poll.poll_group_settings.new p_course_group new_poll_group.save diff --git a/app/views/exercises/publish_groups.json.jbuilder b/app/views/exercises/publish_groups.json.jbuilder new file mode 100644 index 000000000..72cefdd1a --- /dev/null +++ b/app/views/exercises/publish_groups.json.jbuilder @@ -0,0 +1,6 @@ +json.course_groups @course_groups do |group| + json.id group.id + json.name group.name + json.end_time @group_settings.select{|group_setting| group_setting.course_group_id == group.id}.first&.end_time +end +json.end_time @exercise.end_time \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 1fd31c50c..b94d1ca9a 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -616,6 +616,7 @@ Rails.application.routes.draw do get :exercise_result post :cancel_exercise get :begin_commit #提交前的弹窗 + get :publish_groups end resources :exercise_questions,only:[:new,:create,:index] end From 2435342ae91136272a5927cec143609c6fd6a0fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 11 Oct 2019 14:34:25 +0800 Subject: [PATCH 367/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/courses/shixunHomework/ShixunhomeWorkItem.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js index 8b63a3471..be138996f 100644 --- a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js +++ b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js @@ -354,8 +354,8 @@ class ShixunhomeWorkItem extends Component{ {/* {discussMessage.author.name} */} { discussMessage.author && {discussMessage.author} } - {discussMessage.commit_count===undefined?"":{discussMessage.commit_count} 已开始做题} - {discussMessage.uncommit_count===undefined?"":{discussMessage.uncommit_count} 未开始做题} + {discussMessage.commit_count===undefined?"":已开始做题:{discussMessage.commit_count}} + {discussMessage.uncommit_count===undefined?"":未开始做题:{discussMessage.uncommit_count}} {/*{discussMessage.replies_count} 3 未评*/} { @@ -381,7 +381,7 @@ class ShixunhomeWorkItem extends Component{ { discussMessage && discussMessage.upper_category_name && 22 }> - { {discussMessage.upper_category_name}} + { {discussMessage.upper_category_name}} } From 938b974d772cb299084a48d7ced8f7446d1d9d22 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Fri, 11 Oct 2019 14:34:57 +0800 Subject: [PATCH 368/394] check commit_method --- app/controllers/exercises_controller.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index e76148f20..f74eefabf 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -1078,6 +1078,7 @@ class ExercisesController < ApplicationController ActiveRecord::Base.transaction do begin can_commit_exercise = false + Rails.logger.info("######____________params[:commit_method]_________################{params[:commit_method]}") if (@user_course_identity > Course::ASSISTANT_PROFESSOR) && params[:commit_method].present? #为学生时 if params[:commit_method].to_i == 2 #自动提交时 user_left_time = get_exercise_left_time(@exercise,current_user) From 369bbac497959b52fcc83168ccf56e6d3d82529d Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 11 Oct 2019 14:40:32 +0800 Subject: [PATCH 369/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercises_controller.rb | 2 +- app/controllers/homework_commons_controller.rb | 2 +- app/controllers/polls_controller.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index ac18754cd..3835baf55 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -689,7 +689,7 @@ class ExercisesController < ApplicationController # 可立即发布的分班:当前用户管理的分班去除已发布的分班 group_ids = @course.charge_group_ids(@current_user) - @exercise.exercise_group_settings.exercise_group_published.pluck(:course_group_id) @course_groups = @course.course_groups.where(id: group_ids) - @group_settings = @exercise.exercise_group_settings.where(id: group_ids) + @group_settings = @exercise.exercise_group_settings.where(course_group_id: group_ids) end #首页批量或单独 立即发布,应是跳出弹窗,设置开始时间和截止时间。 diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index 70f0345b1..9941e1d42 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -1036,7 +1036,7 @@ class HomeworkCommonsController < ApplicationController # 可立即发布的分班:当前用户管理的分班去除已发布的分班 group_ids = @course.charge_group_ids(@current_user) - @homework.homework_group_settings.group_published.pluck(:course_group_id) @course_groups = @course.course_groups.where(id: group_ids) - @group_settings = @homework.homework_group_settings.where(id: group_ids) + @group_settings = @homework.homework_group_settings.where(course_group_id: group_ids) else tip_exception("没有可发布的分班") end diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb index 6b9fd004c..2259907e4 100644 --- a/app/controllers/polls_controller.rb +++ b/app/controllers/polls_controller.rb @@ -249,7 +249,7 @@ class PollsController < ApplicationController # 可立即发布的分班:当前用户管理的分班去除已发布的分班 group_ids = @course.charge_group_ids(@current_user) - @poll.poll_group_settings.poll_group_published.pluck(:course_group_id) @course_groups = @course.course_groups.where(id: group_ids) - @group_settings = @poll.poll_group_settings.where(id: group_ids) + @group_settings = @poll.poll_group_settings.where(course_group_id: group_ids) end #首页批量或单独 立即发布,应是跳出弹窗,设置开始时间和截止时间。 From ef56ceb092633add234a03a4d2b4288a42531207 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 11 Oct 2019 14:40:44 +0800 Subject: [PATCH 370/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/courses/shixunHomework/ShixunhomeWorkItem.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js index be138996f..7aa1d44de 100644 --- a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js +++ b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js @@ -354,8 +354,8 @@ class ShixunhomeWorkItem extends Component{ {/* {discussMessage.author.name} */} { discussMessage.author && {discussMessage.author} } - {discussMessage.commit_count===undefined?"":已开始做题:{discussMessage.commit_count}} - {discussMessage.uncommit_count===undefined?"":未开始做题:{discussMessage.uncommit_count}} + {discussMessage.commit_count===undefined?"":已开始做题 {discussMessage.commit_count}} + {discussMessage.uncommit_count===undefined?"":未开始做题 {discussMessage.uncommit_count}} {/*{discussMessage.replies_count} 3 未评*/} { @@ -381,7 +381,7 @@ class ShixunhomeWorkItem extends Component{ { discussMessage && discussMessage.upper_category_name && 22 }> - { {discussMessage.upper_category_name}} + { {discussMessage.upper_category_name}} } From 83b58843192d406ec5a2882c6de84a2a6e1ba2c2 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Fri, 11 Oct 2019 14:43:30 +0800 Subject: [PATCH 371/394] =?UTF-8?q?=E8=AF=95=E5=8D=B7=E7=AD=94=E9=A2=98?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E7=9A=84=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/exercises/common_header.json.jbuilder | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/exercises/common_header.json.jbuilder b/app/views/exercises/common_header.json.jbuilder index 5d33aca66..d43d7c3f8 100644 --- a/app/views/exercises/common_header.json.jbuilder +++ b/app/views/exercises/common_header.json.jbuilder @@ -1,6 +1,6 @@ json.course_is_end @course.is_end # true表示已结束,false表示未结束 json.extract! @exercise, :id,:exercise_name,:exercise_description,:show_statistic -json.time @user_left_time +json.time (@user_left_time.to_i / 60) json.exercise_status @ex_status From 36c774689307e1f7de5ffbb95bc308a40f9ac632 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 11 Oct 2019 15:04:41 +0800 Subject: [PATCH 372/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/AppConfig.js | 4 +-- .../exercise/ExerciseReviewAndAnswer.js | 32 +++++++++---------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index e1d5da561..c00c5fb62 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -84,9 +84,9 @@ export function initAxiosInterceptors(props) { } config.url = `${proxy}${url}`; if (config.url.indexOf('?') == -1) { - config.url = `${config.url}?debug=${debugType}`; + config.url = `${config.url}?debug=${'student'}`; } else { - config.url = `${config.url}&debug=${debugType}`; + config.url = `${config.url}&debug=${'student'}`; } } else { // 加api前缀 diff --git a/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js b/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js index 59072a862..a9143176c 100644 --- a/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js +++ b/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js @@ -127,25 +127,25 @@ class ExerciseReviewAndAnswer extends Component{ } //自动交卷 autoCommitExercise=()=>{ - let eId=this.props.match.params.Id; - let url=`/exercises/${eId}/commit_exercise.json`; - axios.post(url,{ + let eId=this.props.match.params.Id; + let url=`/exercises/${eId}/commit_exercise.json`; + axios.post(url,{ commit_method:2 }).then((result)=>{ - if(result){ - this.setState({ - Modalstype:true, - Modalstopval:'答题结束了,系统已自动提交试卷', - modalsBottomval:"不能再修改答题", - ModalCancel:undefined, - ModalSave:this.sureCommit, - Loadtype:true - }) + if(result){ + this.setState({ + Modalstype:true, + Modalstopval:'答题结束了,系统已自动提交试卷', + modalsBottomval:"不能再修改答题", + ModalCancel:undefined, + ModalSave:this.sureCommit, + Loadtype:true + }) this.props.showNotification(`${result.data.message}`); - } - }).catch((error)=>{ - console.log(error); - }) + } + }).catch((error)=>{ + console.log(error); + }) } sureCommit=()=>{ From e1bea29dcbf25bfc2ec643fe454ba50596c25de0 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Fri, 11 Oct 2019 15:15:07 +0800 Subject: [PATCH 373/394] =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=AF=95=E5=8D=B7?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E6=8F=90=E4=BA=A4=E7=9A=84=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercises_controller.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index bc0da8ffc..ed09b8784 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -1102,10 +1102,10 @@ class ExercisesController < ApplicationController ActiveRecord::Base.transaction do begin can_commit_exercise = false - Rails.logger.info("######____________params[:commit_method]_________################{params[:commit_method]}") - if (@user_course_identity > Course::ASSISTANT_PROFESSOR) && params[:commit_method].present? #为学生时 + if @user_course_identity > Course::ASSISTANT_PROFESSOR #为学生时 if params[:commit_method].to_i == 2 #自动提交时 user_left_time = get_exercise_left_time(@exercise,current_user) + Rails.logger.info("######__________auto_commit_user_left_time_________################{user_left_time}") if user_left_time.to_i <= 0 can_commit_exercise = true end @@ -1130,10 +1130,10 @@ class ExercisesController < ApplicationController CommitExercsieNotifyJobJob.perform_later(@exercise.id, current_user.id) normal_status(0,"试卷提交成功!") else - normal_status(-1,"提交失败,请重试!") + normal_status(-1,"提交失败,未到截止时间!") end else - normal_status(-1,"提交失败,请重试!") + normal_status(-1,"提交失败,当前用户不为课堂学生!") end rescue Exception => e uid_logger_error(e.message) From b8cc352c525604904c6749710c4f4b11aa80ce70 Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Fri, 11 Oct 2019 15:20:25 +0800 Subject: [PATCH 374/394] =?UTF-8?q?=E6=89=93=E5=9B=9E=E9=87=8D=E5=81=9A?= =?UTF-8?q?=E7=9A=84=E4=BF=AE=E6=94=B9commit=5Fmethod?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercises_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index ed09b8784..f9d9531f1 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -978,7 +978,8 @@ class ExercisesController < ApplicationController :status => nil, :commit_status => 0, :objective_score => 0.0, - :subjective_score => -1.0 + :subjective_score => -1.0, + :commit_method => 0 } redo_exercise_users = @exercise_users.exercise_commit_users(user_ids) redo_exercise_users.update_all(redo_option) From a64d6ef50214f8e29a3130edeba1dd84e7a504cd Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 11 Oct 2019 15:23:25 +0800 Subject: [PATCH 375/394] =?UTF-8?q?=E9=A2=98=E5=BA=93=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/question_banks_controller.rb | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/app/controllers/question_banks_controller.rb b/app/controllers/question_banks_controller.rb index 60b9a807c..7781b5792 100644 --- a/app/controllers/question_banks_controller.rb +++ b/app/controllers/question_banks_controller.rb @@ -90,23 +90,25 @@ class QuestionBanksController < ApplicationController def send_to_course banks = @object_type.classify.constantize.where(id: params[:object_id]) course = current_user.manage_courses.find_by!(id: params[:course_id]) + task_ids = [] banks.each do |bank| case @object_type when 'HomeworkBank' # 作业 - quote_homework_bank bank, course + task = quote_homework_bank bank, course when 'ExerciseBank' if bank.container_type == 'Exercise' # 试卷 - quote_exercise_bank bank, course + task = quote_exercise_bank bank, course else # 问卷 - quote_poll_bank bank, course + task = quote_poll_bank bank, course end when 'GtaskBank' - quote_gtask_bank bank, course + task = quote_gtask_bank bank, course when 'GtopicBank' - quote_gtopic_bank bank, course + task = quote_gtopic_bank bank, course end + task_ids << task.id if task end - normal_status("发送成功") + render :json => {task_ids: task_ids, status: 0, message: "发送成功"} end def destroy From cce35c89ff26dbaad9a0e055d3bc7d70987bec84 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 11 Oct 2019 15:31:39 +0800 Subject: [PATCH 376/394] tiaoz --- app/controllers/courses_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index a3b20c598..bab8a4189 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -552,7 +552,7 @@ class CoursesController < ApplicationController def change_member_role tip_exception("请至少选择一个角色") if params[:roles].blank? tip_exception("不能具有老师、助教两种角色") if params[:roles].include?("PROFESSOR") && params[:roles].include?("ASSISTANT_PROFESSOR") - tip_exception("管理员不能切换为助教或老师") if @user_course_identity == Course::CREATOR && + tip_exception("管理员不能切换为助教或老师") if current_user.id == @course.tea_id && (params[:roles].include?("PROFESSOR") || params[:roles].include?("ASSISTANT_PROFESSOR")) course_members = @course.course_members.where(user_id: params[:user_id]) From 450e9675348a085b852311cf25cce9b7b3bf4532 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 11 Oct 2019 15:32:09 +0800 Subject: [PATCH 377/394] tiaoz --- app/controllers/courses_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index bab8a4189..0c643d15c 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -552,7 +552,7 @@ class CoursesController < ApplicationController def change_member_role tip_exception("请至少选择一个角色") if params[:roles].blank? tip_exception("不能具有老师、助教两种角色") if params[:roles].include?("PROFESSOR") && params[:roles].include?("ASSISTANT_PROFESSOR") - tip_exception("管理员不能切换为助教或老师") if current_user.id == @course.tea_id && + tip_exception("管理员不能切换为助教或老师") if params[:user_id].to_i == @course.tea_id && (params[:roles].include?("PROFESSOR") || params[:roles].include?("ASSISTANT_PROFESSOR")) course_members = @course.course_members.where(user_id: params[:user_id]) From 2651dd7f2258c7f67590db9daec91ca68622dc58 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 11 Oct 2019 15:33:48 +0800 Subject: [PATCH 378/394] trigger('updatabanner') --- public/react/src/modules/courses/members/ChangeRolePop.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/react/src/modules/courses/members/ChangeRolePop.js b/public/react/src/modules/courses/members/ChangeRolePop.js index 44dfc28fc..896360a40 100644 --- a/public/react/src/modules/courses/members/ChangeRolePop.js +++ b/public/react/src/modules/courses/members/ChangeRolePop.js @@ -41,7 +41,9 @@ function ChangeRolePop({ member_roles = [], record, courseId, onChangeRoleSucces user_id: record.user_id }) if (response.data.status == 0) { + showNotification('保存成功') onChangeRoleSuccess() + trigger('updatabanner') } console.log(response) } From 8b65317d974fe1985218e752a5c86376d7a00ac8 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 11 Oct 2019 15:35:04 +0800 Subject: [PATCH 379/394] debug --- public/react/src/AppConfig.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index c00c5fb62..e1d5da561 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -84,9 +84,9 @@ export function initAxiosInterceptors(props) { } config.url = `${proxy}${url}`; if (config.url.indexOf('?') == -1) { - config.url = `${config.url}?debug=${'student'}`; + config.url = `${config.url}?debug=${debugType}`; } else { - config.url = `${config.url}&debug=${'student'}`; + config.url = `${config.url}&debug=${debugType}`; } } else { // 加api前缀 From b2f406aa2f75577b57cf717116235b9260609034 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 11 Oct 2019 16:14:19 +0800 Subject: [PATCH 380/394] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BD=93=E5=89=8D?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E8=A7=92=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../react/src/modules/courses/members/ChangeRolePop.js | 9 +++++++-- public/react/src/modules/courses/members/studentsList.js | 2 ++ public/react/src/modules/courses/members/teacherList.js | 3 +++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/public/react/src/modules/courses/members/ChangeRolePop.js b/public/react/src/modules/courses/members/ChangeRolePop.js index 896360a40..7f55910bf 100644 --- a/public/react/src/modules/courses/members/ChangeRolePop.js +++ b/public/react/src/modules/courses/members/ChangeRolePop.js @@ -6,7 +6,7 @@ import axios from 'axios' /** 角色数组, CREATOR: 创建者, PROFESSOR: 教师, ASSISTANT_PROFESSOR: 助教, STUDENT: 学生 */ -function ChangeRolePop({ member_roles = [], record, courseId, onChangeRoleSuccess, showNotification }) { +function ChangeRolePop({ member_roles = [], record, courseId, onChangeRoleSuccess, showNotification, getUserId, fetchUser }) { const [checkBoxRoles, setCheckBoxRoles] = useState(member_roles) useEffect(() => { setCheckBoxRoles(member_roles) @@ -43,7 +43,12 @@ function ChangeRolePop({ member_roles = [], record, courseId, onChangeRoleSucces if (response.data.status == 0) { showNotification('保存成功') onChangeRoleSuccess() - trigger('updatabanner') + + if (fetchUser && record.user_id == getUserId) { + fetchUser() + trigger('updatabanner') + } + } console.log(response) } diff --git a/public/react/src/modules/courses/members/studentsList.js b/public/react/src/modules/courses/members/studentsList.js index e3859345a..626a76baf 100644 --- a/public/react/src/modules/courses/members/studentsList.js +++ b/public/react/src/modules/courses/members/studentsList.js @@ -155,6 +155,8 @@ const buildColumns = (that,isParent) => { member_roles={record.member_roles} onChangeRoleSuccess={that.onChangeRoleSuccess} showNotification={that.props.showNotification} + getUserId={that.props.isUserid} + fetchUser={that.props.fetchUser} > ) diff --git a/public/react/src/modules/courses/members/teacherList.js b/public/react/src/modules/courses/members/teacherList.js index 72b667300..74271ea5a 100644 --- a/public/react/src/modules/courses/members/teacherList.js +++ b/public/react/src/modules/courses/members/teacherList.js @@ -165,6 +165,9 @@ function buildColumns(that) { member_roles={record.member_roles} onChangeRoleSuccess={that.onChangeRoleSuccess} showNotification={that.props.showNotification} + getUserId={that.props.isUserid} + fetchUser={that.props.fetchUser} + > {/* Date: Fri, 11 Oct 2019 16:16:21 +0800 Subject: [PATCH 381/394] =?UTF-8?q?=E7=AB=8B=E5=8D=B3=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=97=B6=E9=97=B4=E6=94=B9=E6=88=901?= =?UTF-8?q?=E5=91=A8=E4=B9=8B=E5=90=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/AppConfig.js | 4 ++-- .../react/src/modules/courses/coursesPublic/HomeworkModal.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/public/react/src/AppConfig.js b/public/react/src/AppConfig.js index c00c5fb62..e1d5da561 100644 --- a/public/react/src/AppConfig.js +++ b/public/react/src/AppConfig.js @@ -84,9 +84,9 @@ export function initAxiosInterceptors(props) { } config.url = `${proxy}${url}`; if (config.url.indexOf('?') == -1) { - config.url = `${config.url}?debug=${'student'}`; + config.url = `${config.url}?debug=${debugType}`; } else { - config.url = `${config.url}&debug=${'student'}`; + config.url = `${config.url}&debug=${debugType}`; } } else { // 加api前缀 diff --git a/public/react/src/modules/courses/coursesPublic/HomeworkModal.js b/public/react/src/modules/courses/coursesPublic/HomeworkModal.js index 89e747004..a001e6d86 100644 --- a/public/react/src/modules/courses/coursesPublic/HomeworkModal.js +++ b/public/react/src/modules/courses/coursesPublic/HomeworkModal.js @@ -48,7 +48,7 @@ class HomeworkModal extends Component{ if(this.props.starttimes!=undefined&&this.props.starttimes!=""){ this.setState({ - endtime:moment(moment(handleDateString(this.props.starttimes)).add(1, 'months')).format("YYYY-MM-DD HH:mm") + endtime:moment(moment(handleDateString(this.props.starttimes)).add(1, 'week')).format("YYYY-MM-DD HH:mm") }) } } @@ -70,7 +70,7 @@ class HomeworkModal extends Component{ if(this.props.starttimes!=undefined&&this.props.starttimes!=""){ this.setState({ - endtime:moment(moment(handleDateString(this.props.starttimes)).add(1, 'months')).format("YYYY-MM-DD HH:mm") + endtime:moment(moment(handleDateString(this.props.starttimes)).add(1, 'week')).format("YYYY-MM-DD HH:mm") }) } } From eb673fcc4b0e606da0b8fc26a43612f9de477d5d Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 11 Oct 2019 16:25:36 +0800 Subject: [PATCH 382/394] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E5=88=86=E7=8F=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/members/studentsList.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/public/react/src/modules/courses/members/studentsList.js b/public/react/src/modules/courses/members/studentsList.js index 626a76baf..5c56afbe0 100644 --- a/public/react/src/modules/courses/members/studentsList.js +++ b/public/react/src/modules/courses/members/studentsList.js @@ -547,6 +547,19 @@ class studentsList extends Component{ addDir = () => { trigger('groupAdd', this.props.coursesids) } + addToDir = async () => { + const courseId = this.props.match.params.coursesId + const url = `/courses/${courseId}/join_course_group.json` + const course_group_id = this.props.match.params.course_group_id + + const response = await axios.post(url, { + course_group_id + }) + if (response && response.data.status == 0) { + this.props.showNotification('加入成功') + this.fetchAll() + } + } renameDir = () => { const course_group_id = this.props.match.params.course_group_id trigger('groupRename', { id: parseInt(course_group_id), name: this.state.course_group_name}) @@ -593,6 +606,7 @@ class studentsList extends Component{ render(){ const isAdmin = this.props.isAdmin() + const isStudent = this.props.isStudent() const isSuperAdmin = this.props.isSuperAdmin() const isCourseEnd = this.props.isCourseEnd() let { @@ -704,6 +718,8 @@ class studentsList extends Component{ { // pageType !== TYPE_STUDENTS && !isCourseEnd && isAdmin && isParent && this.addDir()}>添加分班 } + { + isStudent && !isParent && course_group_id != 0 && this.addToDir()}>加入分班 } { isAdmin && !isParent && course_group_id != 0 && this.deleteDir()}>删除分班 } { From 038ff29699542cabdf4b6b9a2bc45119d32e4e86 Mon Sep 17 00:00:00 2001 From: cxt <853663049@qq.com> Date: Fri, 11 Oct 2019 16:27:05 +0800 Subject: [PATCH 383/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercises_controller.rb | 2 +- app/controllers/homework_commons_controller.rb | 2 +- app/controllers/polls_controller.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index f9d9531f1..e25bec7f2 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -694,6 +694,7 @@ class ExercisesController < ApplicationController #首页批量或单独 立即发布,应是跳出弹窗,设置开始时间和截止时间。 def publish + group_ids = params[:group_ids]&.reject(&:blank?) if params[:detail].blank? tip_exception("缺少截止时间参数") if params[:end_time].blank? tip_exception("截止时间不能早于当前时间") if params[:end_time] <= strf_time(Time.now) @@ -701,7 +702,6 @@ class ExercisesController < ApplicationController @course.end_date.present? && params[:end_time] > strf_time(@course.end_date.end_of_day) else group_end_times = params[:group_end_times].reject(&:blank?).map{|time| time.to_time} - group_ids = params[:group_ids].reject(&:blank?) tip_exception("缺少截止时间参数") if group_end_times.blank? tip_exception("截止时间和分班参数的个数不一致") if group_end_times.length != group_ids.length group_end_times.each do |time| diff --git a/app/controllers/homework_commons_controller.rb b/app/controllers/homework_commons_controller.rb index 9941e1d42..5d75604ee 100644 --- a/app/controllers/homework_commons_controller.rb +++ b/app/controllers/homework_commons_controller.rb @@ -1044,6 +1044,7 @@ class HomeworkCommonsController < ApplicationController def publish_homework tip_exception("请至少选择一个分班") if params[:group_ids].blank? && @course.course_groups.size != 0 + group_ids = params[:group_ids]&.reject(&:blank?) if params[:detail].blank? tip_exception("缺少截止时间参数") if params[:end_time].blank? tip_exception("截止时间不能早于当前时间") if params[:end_time] <= strf_time(Time.now) @@ -1051,7 +1052,6 @@ class HomeworkCommonsController < ApplicationController @course.end_date.present? && params[:end_time] > strf_time(@course.end_date.end_of_day) else group_end_times = params[:group_end_times].reject(&:blank?).map{|time| time.to_time} - group_ids = params[:group_ids].reject(&:blank?) tip_exception("缺少截止时间参数") if group_end_times.blank? tip_exception("截止时间和分班参数的个数不一致") if group_end_times.length != group_ids.length group_end_times.each do |time| diff --git a/app/controllers/polls_controller.rb b/app/controllers/polls_controller.rb index 2259907e4..da5917e1b 100644 --- a/app/controllers/polls_controller.rb +++ b/app/controllers/polls_controller.rb @@ -254,6 +254,7 @@ class PollsController < ApplicationController #首页批量或单独 立即发布,应是跳出弹窗,设置开始时间和截止时间。 def publish + group_ids = params[:group_ids]&.reject(&:blank?) if params[:detail].blank? tip_exception("缺少截止时间参数") if params[:end_time].blank? tip_exception("截止时间不能早于当前时间") if params[:end_time] <= strf_time(Time.now) @@ -261,7 +262,6 @@ class PollsController < ApplicationController @course.end_date.present? && params[:end_time] > strf_time(@course.end_date.end_of_day) else group_end_times = params[:group_end_times].reject(&:blank?).map{|time| time.to_time} - group_ids = params[:group_ids].reject(&:blank?) tip_exception("缺少截止时间参数") if group_end_times.blank? tip_exception("截止时间和分班参数的个数不一致") if group_end_times.length != group_ids.length group_end_times.each do |time| From 663083a63e1be5c1eea50d05a2df33ca5b8bd242 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 11 Oct 2019 16:33:00 +0800 Subject: [PATCH 384/394] isAdminOrCreator --- public/react/src/modules/courses/members/teacherList.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/members/teacherList.js b/public/react/src/modules/courses/members/teacherList.js index 74271ea5a..fe46e9bf4 100644 --- a/public/react/src/modules/courses/members/teacherList.js +++ b/public/react/src/modules/courses/members/teacherList.js @@ -649,6 +649,7 @@ class studentsList extends Component{ combineArray = this.state.application_list } const isAdminOrTeacher = this.props.isAdminOrTeacher() + const isAdminOrCreator = this.props.isAdminOrCreator() const isSuperAdmin = this.props.isSuperAdmin() const hasGraduationModule = this.hasGraduationModule() const coursesId = this.props.match.params.coursesId @@ -685,7 +686,7 @@ class studentsList extends Component{ {/* { isAdmin && this.addTeacher()}>添加教师 } { isAdmin && this.addStudent()}>添加学生 } */} - { isAdmin && this.showChangeAdminModal()}>更换管理员} + { isAdminOrCreator && this.showChangeAdminModal()}>更换管理员} } From 699d33ed9096ab67ed4bb89248f7a597ba70fffe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 11 Oct 2019 16:42:25 +0800 Subject: [PATCH 385/394] =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/busyWork/CommonWorkSetting.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/busyWork/CommonWorkSetting.js b/public/react/src/modules/courses/busyWork/CommonWorkSetting.js index 5d9a7dc16..ad25f553f 100644 --- a/public/react/src/modules/courses/busyWork/CommonWorkSetting.js +++ b/public/react/src/modules/courses/busyWork/CommonWorkSetting.js @@ -167,7 +167,12 @@ class CommonWorkSetting extends Component{ } on('commonwork_fetch_all', this.fetchAllListener) - } + + + if(this.props.isAdmin()===true){ + this.setState({startEditFlag: true}) + } + } componentWillUnmount() { off('commonwork_fetch_all', this.fetchAllListener) } From 6d84c0333a3dc653da54a8e108f790adce1bd629 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 11 Oct 2019 16:48:17 +0800 Subject: [PATCH 386/394] updatabanner --- public/react/src/modules/courses/members/ChangeRolePop.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/members/ChangeRolePop.js b/public/react/src/modules/courses/members/ChangeRolePop.js index 7f55910bf..0f9e6f5f1 100644 --- a/public/react/src/modules/courses/members/ChangeRolePop.js +++ b/public/react/src/modules/courses/members/ChangeRolePop.js @@ -44,9 +44,9 @@ function ChangeRolePop({ member_roles = [], record, courseId, onChangeRoleSucces showNotification('保存成功') onChangeRoleSuccess() + trigger('updatabanner') if (fetchUser && record.user_id == getUserId) { fetchUser() - trigger('updatabanner') } } From f35f9a8dbe3b6e4999885d3cd1d16ae120a209ee Mon Sep 17 00:00:00 2001 From: SylorHuang Date: Fri, 11 Oct 2019 16:58:53 +0800 Subject: [PATCH 387/394] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E8=AF=95=E5=8D=B7?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=90=8E=E7=AB=AF=E6=97=B6=E9=97=B4=E5=92=8C?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E4=B8=8D=E4=B8=80=E8=87=B4=E7=9A=84=E5=A4=84?= =?UTF-8?q?=E7=90=86=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/exercises_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/exercises_controller.rb b/app/controllers/exercises_controller.rb index f9d9531f1..ac86467f1 100644 --- a/app/controllers/exercises_controller.rb +++ b/app/controllers/exercises_controller.rb @@ -1103,6 +1103,7 @@ class ExercisesController < ApplicationController ActiveRecord::Base.transaction do begin can_commit_exercise = false + user_left_time = nil if @user_course_identity > Course::ASSISTANT_PROFESSOR #为学生时 if params[:commit_method].to_i == 2 #自动提交时 user_left_time = get_exercise_left_time(@exercise,current_user) @@ -1131,7 +1132,7 @@ class ExercisesController < ApplicationController CommitExercsieNotifyJobJob.perform_later(@exercise.id, current_user.id) normal_status(0,"试卷提交成功!") else - normal_status(-1,"提交失败,未到截止时间!") + normal_status(-2,"#{user_left_time.to_i}") end else normal_status(-1,"提交失败,当前用户不为课堂学生!") From 98805e123a166ea61b847770a78e9f1265de9aa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 11 Oct 2019 17:15:30 +0800 Subject: [PATCH 388/394] =?UTF-8?q?=E5=BD=93=E6=88=B7=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E8=AF=95=E5=8D=B7=E9=94=99=E8=AF=AF=E6=8F=90=E4=BA=A4=E7=9A=84?= =?UTF-8?q?=E6=97=B6=EF=BC=8C=E5=90=8C=E6=AD=A5=E6=9C=8D=E5=8A=A1=E5=99=A8?= =?UTF-8?q?=E6=97=B6=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exercise/ExerciseReviewAndAnswer.js | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js b/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js index a9143176c..75da4f2fe 100644 --- a/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js +++ b/public/react/src/modules/courses/exercise/ExerciseReviewAndAnswer.js @@ -96,8 +96,8 @@ class ExerciseReviewAndAnswer extends Component{ //window.addEventListener('scroll', this.handleScroll); } - remainTime=()=>{ - let { time } = this.state; + remainTime=(time)=>{ + // let { time } = this.state; let h=moment(parseInt(time)*1000).hour()-8; let m=moment(parseInt(time)*1000).minutes(); let s=moment(parseInt(time)*1000).seconds(); @@ -133,15 +133,21 @@ class ExerciseReviewAndAnswer extends Component{ commit_method:2 }).then((result)=>{ if(result){ - this.setState({ - Modalstype:true, - Modalstopval:'答题结束了,系统已自动提交试卷', - modalsBottomval:"不能再修改答题", - ModalCancel:undefined, - ModalSave:this.sureCommit, - Loadtype:true - }) - this.props.showNotification(`${result.data.message}`); + if(result.data.status===0){ + this.setState({ + Modalstype:true, + Modalstopval:'答题结束了,系统已自动提交试卷', + modalsBottomval:"不能再修改答题", + ModalCancel:undefined, + ModalSave:this.sureCommit, + Loadtype:true + }) + this.props.showNotification(`${result.data.message}`); + } + + if(result.data.status===-2){ + this.remainTime(parseInt(result.data.message)) + } } }).catch((error)=>{ console.log(error); @@ -238,7 +244,7 @@ class ExerciseReviewAndAnswer extends Component{ isSpin:false }) if(result.data.exercise.left_time != null){ - this.remainTime(); + this.remainTime(result.data.exercise.left_time); } } }).catch((error)=>{ From 589155e1446f1f89b6df6329c11f67d1a12a8ea5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 11 Oct 2019 17:36:18 +0800 Subject: [PATCH 389/394] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=95=88=E7=8E=87?= =?UTF-8?q?=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shixunHomework/ShixunhomeWorkItem.js | 6 ++-- .../shixunHomework/Trainingjobsetting.js | 36 +++++++++---------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js index 7aa1d44de..01bcae9a8 100644 --- a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js +++ b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js @@ -354,8 +354,8 @@ class ShixunhomeWorkItem extends Component{ {/* {discussMessage.author.name} */} { discussMessage.author && {discussMessage.author} } - {discussMessage.commit_count===undefined?"":已开始做题 {discussMessage.commit_count}} - {discussMessage.uncommit_count===undefined?"":未开始做题 {discussMessage.uncommit_count}} + {discussMessage.commit_count===undefined?"":已开始做题 {discussMessage.commit_count}人} + {discussMessage.uncommit_count===undefined?"":未开始做题 {discussMessage.uncommit_count}人} {/*{discussMessage.replies_count} 3 未评*/} { @@ -381,7 +381,7 @@ class ShixunhomeWorkItem extends Component{ { discussMessage && discussMessage.upper_category_name && 22 }> - { {discussMessage.upper_category_name}} + { {discussMessage.upper_category_name}} } diff --git a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js index 142d1e074..1b468d8ff 100644 --- a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js +++ b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js @@ -1722,20 +1722,20 @@ class Trainingjobsetting extends Component { flagPageEditstwo:releasetime, flagPageEditsthrees:deadline, flagPageEditsfor:endtime, - completionefficiencyscore:true, + completionefficiencyscore:false, work_efficiencys:this.state.work_efficiencys, unifiedsetting:this.state.unifiedsetting, - latedeductiontwo:20, + latedeductiontwo:0, }); //均分比例 try { - if(this.state.proportion==="均分比例"){ - this.Equalproportion(20); - - }else if(this.state.proportion==="经验值比例"){ - this.Empiricalvalueratio(20); - - } + // if(this.state.proportion==="均分比例"){ + // this.Equalproportion(20); + // + // }else if(this.state.proportion==="经验值比例"){ + // this.Empiricalvalueratio(20); + // + // } }catch (e) { } @@ -1838,21 +1838,21 @@ class Trainingjobsetting extends Component { flagPageEditstwo:releasetime, flagPageEditsthrees:deadline, flagPageEditsfor:endtime, - completionefficiencyscore:true, + completionefficiencyscore:false, work_efficiencys:datas.data.work_efficiency, unifiedsetting:datas.data.unified_setting, - latedeductiontwo:20, + latedeductiontwo:0, }); //均分比例 // result.data.shixun_evaluation === 0 ? "均分比例" : result.data.shixun_evaluation === 1 ? "经验值比例" : result.data.shixun_evaluation === 2 ? try { - if(datas.data.shixun_evaluation === 0){ - this.Equalproportion(20); - - }else if(datas.data.shixun_evaluation === 1){ - this.Empiricalvalueratio(20); - - } + // if(datas.data.shixun_evaluation === 0){ + // this.Equalproportion(20); + // + // }else if(datas.data.shixun_evaluation === 1){ + // this.Empiricalvalueratio(20); + // + // } }catch (e) { console.log(1); console.log(e); From 71b6c85d09cb92925ab34a303250df2ffdccdcc8 Mon Sep 17 00:00:00 2001 From: hjm <63528605@qq.com> Date: Fri, 11 Oct 2019 17:42:13 +0800 Subject: [PATCH 390/394] updataleftNavfun --- public/react/src/modules/courses/members/studentsList.js | 1 + 1 file changed, 1 insertion(+) diff --git a/public/react/src/modules/courses/members/studentsList.js b/public/react/src/modules/courses/members/studentsList.js index 5c56afbe0..175aefb6a 100644 --- a/public/react/src/modules/courses/members/studentsList.js +++ b/public/react/src/modules/courses/members/studentsList.js @@ -557,6 +557,7 @@ class studentsList extends Component{ }) if (response && response.data.status == 0) { this.props.showNotification('加入成功') + this.props.updataleftNavfun() this.fetchAll() } } From d3d43491e0c0743ad91e35c97c9b20db0b74ba2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 11 Oct 2019 18:04:29 +0800 Subject: [PATCH 391/394] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=95=88=E7=8E=87?= =?UTF-8?q?=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shixunHomework/Trainingjobsetting.js | 41 +++++++++---------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js index 1b468d8ff..da1408d4a 100644 --- a/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js +++ b/public/react/src/modules/courses/shixunHomework/Trainingjobsetting.js @@ -1013,18 +1013,17 @@ class Trainingjobsetting extends Component { //完成效率评分占比 onChangeeffectiveness = (e) => { if( e.target.checked === true){ - this.state.latedeductiontwo=20; this.setState({ completionefficiencyscore: e.target.checked, work_efficiencys:e.target.checked, - latedeductiontwo: 20, + latedeductiontwo: 0, }) //均分比例 if(this.state.proportion==="均分比例"){ - this.Equalproportion(20); + this.Equalproportion(0); }else if(this.state.proportion==="经验值比例"){ - this.Empiricalvalueratio(20); + this.Empiricalvalueratio(0); } @@ -1722,20 +1721,20 @@ class Trainingjobsetting extends Component { flagPageEditstwo:releasetime, flagPageEditsthrees:deadline, flagPageEditsfor:endtime, - completionefficiencyscore:false, + completionefficiencyscore:true, work_efficiencys:this.state.work_efficiencys, unifiedsetting:this.state.unifiedsetting, - latedeductiontwo:0, + latedeductiontwo:this.state.latedeductiontwo, }); //均分比例 try { - // if(this.state.proportion==="均分比例"){ - // this.Equalproportion(20); - // - // }else if(this.state.proportion==="经验值比例"){ - // this.Empiricalvalueratio(20); - // - // } + if(this.state.proportion==="均分比例"){ + this.Equalproportion(this.state.latedeductiontwo); + + }else if(this.state.proportion==="经验值比例"){ + this.Empiricalvalueratio(this.state.latedeductiontwo); + + } }catch (e) { } @@ -1841,18 +1840,18 @@ class Trainingjobsetting extends Component { completionefficiencyscore:false, work_efficiencys:datas.data.work_efficiency, unifiedsetting:datas.data.unified_setting, - latedeductiontwo:0, + latedeductiontwo:datas.data.eff_score, }); //均分比例 // result.data.shixun_evaluation === 0 ? "均分比例" : result.data.shixun_evaluation === 1 ? "经验值比例" : result.data.shixun_evaluation === 2 ? try { - // if(datas.data.shixun_evaluation === 0){ - // this.Equalproportion(20); - // - // }else if(datas.data.shixun_evaluation === 1){ - // this.Empiricalvalueratio(20); - // - // } + if(datas.data.shixun_evaluation === 0){ + this.Equalproportion(datas.data.eff_score); + + }else if(datas.data.shixun_evaluation === 1){ + this.Empiricalvalueratio(datas.data.eff_score); + + } }catch (e) { console.log(1); console.log(e); From a5d7d5159a9e9170330a3b4a27d3dfe290ab0931 Mon Sep 17 00:00:00 2001 From: caishi <1149225589@qq.com> Date: Fri, 11 Oct 2019 18:14:00 +0800 Subject: [PATCH 392/394] =?UTF-8?q?=E5=88=86=E7=8F=AD=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/react/src/modules/courses/members/studentsList.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/react/src/modules/courses/members/studentsList.js b/public/react/src/modules/courses/members/studentsList.js index 175aefb6a..3a5a55b71 100644 --- a/public/react/src/modules/courses/members/studentsList.js +++ b/public/react/src/modules/courses/members/studentsList.js @@ -26,11 +26,11 @@ const buildColumns = (that,isParent) => { let showSorter = isParent==true const courseId = that.props.match.params.coursesId const columns=[{ - title: '序号', + title: '序号1', dataIndex: 'id', key: 'id', align:'center', - width:"10%", + width:"8%", className:"color-grey-6", render: (id, student, index) => { return (that.state.page - 1) * 20 + index + 1 @@ -143,7 +143,7 @@ const buildColumns = (that,isParent) => { columns.push({ title: '操作', key: 'action', - width: '20%', + width: '22%', align:'center', render: (text, record) => { return ( From d7c5c4f5e9f53e5b0c01d4be3e83860989daaf0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com> Date: Fri, 11 Oct 2019 18:14:47 +0800 Subject: [PATCH 393/394] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/modules/courses/shixunHomework/ShixunhomeWorkItem.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js index 01bcae9a8..88d143011 100644 --- a/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js +++ b/public/react/src/modules/courses/shixunHomework/ShixunhomeWorkItem.js @@ -381,7 +381,7 @@ class ShixunhomeWorkItem extends Component{ { discussMessage && discussMessage.upper_category_name && 22 }> - { {discussMessage.upper_category_name}} + { {discussMessage.upper_category_name}} } From 9b8a20311c69894fd3668767e246fceaacdd3646 Mon Sep 17 00:00:00 2001 From: p31729568 Date: Sat, 12 Oct 2019 08:42:11 +0800 Subject: [PATCH 394/394] admins: laboratory manage --- .../javascripts/admins/laboratories/edit.js | 86 ++++++ .../javascripts/admins/laboratories/index.js | 164 ++++++++++++ .../stylesheets/admins/laboratories.scss | 99 +++++++ .../admins/laboratories_controller.rb | 32 +++ .../admins/laboratory_settings_controller.rb | 20 ++ .../admins/laboratory_users_controller.rb | 19 ++ app/controllers/application_controller.rb | 1 + app/controllers/concerns/laboratory_helper.rb | 15 ++ app/controllers/settings_controller.rb | 5 + app/libs/util/file_manage.rb | 28 +- app/models/laboratory.rb | 26 ++ app/models/laboratory_setting.rb | 54 ++++ app/models/laboratory_user.rb | 4 + app/queries/admins/laboratory_query.rb | 23 ++ .../admins/add_laboratory_user_service.rb | 19 ++ .../admins/create_laboratory_service.rb | 20 ++ .../admins/save_laboratory_setting_service.rb | 51 ++++ app/services/application_service.rb | 6 + app/views/admins/laboratories/index.html.erb | 19 ++ app/views/admins/laboratories/index.js.erb | 1 + .../_add_laboratory_user_modal.html.erb | 30 +++ .../shared/_create_laboratory_modal.html.erb | 28 ++ .../shared/_laboratory_item.html.erb | 40 +++ .../admins/laboratories/shared/_list.html.erb | 25 ++ .../admins/laboratory_settings/show.html.erb | 131 +++++++++ .../admins/laboratory_users/create.js.erb | 4 + .../admins/laboratory_users/destroy.js.erb | 2 + app/views/admins/shared/_sidebar.html.erb | 12 +- app/views/settings/show.json.jbuilder | 12 + config/admins/sidebar.yml | 3 +- config/locales/laboratories/zh-CN.yml | 7 + config/routes.rb | 7 +- .../20191010011844_create_laboratories.rb | 12 + .../20191010012226_create_laboratory_users.rb | 8 + ...191010063403_create_laboratory_settings.rb | 9 + ...0191011025619_init_edu_coder_laboratory.rb | 22 ++ ...fest-4627fa5586ef7fed55ca286af7c028e9.json | 2 +- ...44a8630b10354ab4e56fecc4dffcc713796cc.css} | 108 ++++++++ ...8630b10354ab4e56fecc4dffcc713796cc.css.gz} | Bin 73182 -> 73552 bytes ...00df04fef38b61530041a6dbe375ef0f0ae888.js} | 250 ++++++++++++++++++ ...f04fef38b61530041a6dbe375ef0f0ae888.js.gz} | Bin 960283 -> 961083 bytes ...2fcfba53d32a2df148e64e1d961c10651c6af.css} | 215 +++++++++++++++ ...cfba53d32a2df148e64e1d961c10651c6af.css.gz | Bin 0 -> 158390 bytes ...9cf421480fd0a3785d1956953bf94a1e8bd.css.gz | Bin 158001 -> 0 bytes ...e1c2b2e60336f0f01e19f0581663918708fb.js.gz | Bin 146867 -> 146867 bytes ...7815c096c25e0ab74aba341ae916166cd287.js.gz | Bin 711176 -> 711176 bytes 46 files changed, 1593 insertions(+), 26 deletions(-) create mode 100644 app/assets/javascripts/admins/laboratories/edit.js create mode 100644 app/assets/javascripts/admins/laboratories/index.js create mode 100644 app/assets/stylesheets/admins/laboratories.scss create mode 100644 app/controllers/admins/laboratories_controller.rb create mode 100644 app/controllers/admins/laboratory_settings_controller.rb create mode 100644 app/controllers/admins/laboratory_users_controller.rb create mode 100644 app/controllers/concerns/laboratory_helper.rb create mode 100644 app/controllers/settings_controller.rb create mode 100644 app/models/laboratory.rb create mode 100644 app/models/laboratory_setting.rb create mode 100644 app/models/laboratory_user.rb create mode 100644 app/queries/admins/laboratory_query.rb create mode 100644 app/services/admins/add_laboratory_user_service.rb create mode 100644 app/services/admins/create_laboratory_service.rb create mode 100644 app/services/admins/save_laboratory_setting_service.rb create mode 100644 app/views/admins/laboratories/index.html.erb create mode 100644 app/views/admins/laboratories/index.js.erb create mode 100644 app/views/admins/laboratories/shared/_add_laboratory_user_modal.html.erb create mode 100644 app/views/admins/laboratories/shared/_create_laboratory_modal.html.erb create mode 100644 app/views/admins/laboratories/shared/_laboratory_item.html.erb create mode 100644 app/views/admins/laboratories/shared/_list.html.erb create mode 100644 app/views/admins/laboratory_settings/show.html.erb create mode 100644 app/views/admins/laboratory_users/create.js.erb create mode 100644 app/views/admins/laboratory_users/destroy.js.erb create mode 100644 app/views/settings/show.json.jbuilder create mode 100644 config/locales/laboratories/zh-CN.yml create mode 100644 db/migrate/20191010011844_create_laboratories.rb create mode 100644 db/migrate/20191010012226_create_laboratory_users.rb create mode 100644 db/migrate/20191010063403_create_laboratory_settings.rb create mode 100644 db/migrate/20191011025619_init_edu_coder_laboratory.rb rename public/assets/{admin-896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7.css => admin-2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc.css} (99%) rename public/assets/{admin-896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7.css.gz => admin-2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc.css.gz} (78%) rename public/assets/{admin-978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a.js => admin-2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888.js} (99%) rename public/assets/{admin-978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a.js.gz => admin-2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888.js.gz} (98%) rename public/assets/{application-97f313e9bb7d25476649f7d7215959cf421480fd0a3785d1956953bf94a1e8bd.css => application-50059ae929866043b47015128702fcfba53d32a2df148e64e1d961c10651c6af.css} (99%) create mode 100644 public/assets/application-50059ae929866043b47015128702fcfba53d32a2df148e64e1d961c10651c6af.css.gz delete mode 100644 public/assets/application-97f313e9bb7d25476649f7d7215959cf421480fd0a3785d1956953bf94a1e8bd.css.gz diff --git a/app/assets/javascripts/admins/laboratories/edit.js b/app/assets/javascripts/admins/laboratories/edit.js new file mode 100644 index 000000000..63b26bbe0 --- /dev/null +++ b/app/assets/javascripts/admins/laboratories/edit.js @@ -0,0 +1,86 @@ +$(document).on('turbolinks:load', function() { + if ($('body.admins-laboratory-settings-show-page, body.admins-laboratory-settings-update-page').length > 0) { + var $container = $('.edit-laboratory-setting-container'); + var $form = $container.find('.edit_laboratory'); + + $('.logo-item-left').on("change", 'input[type="file"]', function () { + var $fileInput = $(this); + var file = this.files[0]; + var imageType = /image.*/; + if (file && file.type.match(imageType)) { + var reader = new FileReader(); + reader.onload = function () { + var $box = $fileInput.parent(); + $box.find('img').attr('src', reader.result).css('display', 'block'); + $box.addClass('has-img'); + }; + reader.readAsDataURL(file); + } else { + } + }); + + createMDEditor('laboratory-footer-editor', { height: 200, placeholder: '请输入备案信息' }); + + $form.validate({ + errorElement: 'span', + errorClass: 'danger text-danger', + errorPlacement:function(error,element){ + if(element.parent().hasClass("input-group")){ + element.parent().after(error); + }else{ + element.after(error) + } + }, + rules: { + identifier: { + required: true, + checkSite: true + }, + name: { + required: true + } + } + }); + $.validator.addMethod("checkSite",function(value,element,params){ + var checkSite = /^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/; + return this.optional(element)||(checkSite.test(value + '.educoder.com')); + },"域名不合法!"); + + $form.on('click', '.submit-btn', function(){ + $form.find('.submit-btn').attr('disabled', 'disabled'); + $form.find('.error').html(''); + var valid = $form.valid(); + + $('input[name="navbar[][name]"]').each(function(_, e){ + var $ele = $(e); + if($ele.val() === undefined || $ele.val().length === 0){ + $ele.addClass('danger text-danger'); + valid = false; + } else { + $ele.removeClass('danger text-danger'); + } + }); + + if(!valid) return; + $.ajax({ + method: 'PATCH', + dataType: 'json', + url: $form.attr('action'), + data: new FormData($form[0]), + processData: false, + contentType: false, + success: function(data){ + $.notify({ message: '保存成功' }); + window.location.reload(); + }, + error: function(res){ + var data = res.responseJSON; + $form.find('.error').html(data.message); + }, + complete: function(){ + $form.find('.submit-btn').attr('disabled', false); + } + }); + }) + } +}); \ No newline at end of file diff --git a/app/assets/javascripts/admins/laboratories/index.js b/app/assets/javascripts/admins/laboratories/index.js new file mode 100644 index 000000000..abb7cb72d --- /dev/null +++ b/app/assets/javascripts/admins/laboratories/index.js @@ -0,0 +1,164 @@ +$(document).on('turbolinks:load', function() { + if ($('body.admins-laboratories-index-page').length > 0) { + var $searchContainer = $('.laboratory-list-form'); + var $searchForm = $searchContainer.find('form.search-form'); + var $list = $('.laboratory-list-container'); + + // ============== 新建 =============== + var $modal = $('.modal.admin-create-laboratory-modal'); + var $form = $modal.find('form.admin-create-laboratory-form'); + var $schoolSelect = $modal.find('.school-select'); + + $form.validate({ + errorElement: 'span', + errorClass: 'danger text-danger', + rules: { + school_id: { + required: true + } + }, + messages: { + school_id: { + required: '请选择所属单位' + } + } + }); + + // modal ready fire + $modal.on('show.bs.modal', function () { + $schoolSelect.select2('val', ' '); + }); + + // ************** 学校选择 ************* + var matcherFunc = function(params, data){ + if ($.trim(params.term) === '') { + return data; + } + if (typeof data.text === 'undefined') { + return null; + } + + if (data.name && data.name.indexOf(params.term) > -1) { + var modifiedData = $.extend({}, data, true); + return modifiedData; + } + + // Return `null` if the term should not be displayed + return null; + }; + + var defineSchoolSelect = function(schools) { + $schoolSelect.select2({ + theme: 'bootstrap4', + placeholder: '请选择单位', + minimumInputLength: 1, + data: schools, + templateResult: function (item) { + if(!item.id || item.id === '') return item.text; + return item.name; + }, + templateSelection: function(item){ + if (item.id) { + $('#school_id').val(item.id); + } + return item.name || item.text; + }, + matcher: matcherFunc + }); + } + + $.ajax({ + url: '/api/schools/for_option.json', + dataType: 'json', + type: 'GET', + success: function(data) { + defineSchoolSelect(data.schools); + } + }); + + $modal.on('click', '.submit-btn', function(){ + $form.find('.error').html(''); + + if ($form.valid()) { + var url = $form.data('url'); + + $.ajax({ + method: 'POST', + dataType: 'json', + url: url, + data: $form.serialize(), + success: function(){ + $.notify({ message: '创建成功' }); + $modal.modal('hide'); + + setTimeout(function(){ + window.location.reload(); + }, 500); + }, + error: function(res){ + var data = res.responseJSON; + $form.find('.error').html(data.message); + } + }); + } + }); + + // ============= 添加管理员 ============== + var $addMemberModal = $('.admin-add-laboratory-user-modal'); + var $addMemberForm = $addMemberModal.find('.admin-add-laboratory-user-form'); + var $memberSelect = $addMemberModal.find('.laboratory-user-select'); + var $laboratoryIdInput = $addMemberForm.find('input[name="laboratory_id"]') + + $addMemberModal.on('show.bs.modal', function(event){ + var $link = $(event.relatedTarget); + var laboratoryId = $link.data('laboratory-id'); + $laboratoryIdInput.val(laboratoryId); + + $memberSelect.select2('val', ' '); + }); + + $memberSelect.select2({ + theme: 'bootstrap4', + placeholder: '请输入要添加的管理员姓名', + multiple: true, + minimumInputLength: 1, + ajax: { + delay: 500, + url: '/admins/users', + dataType: 'json', + data: function(params){ + return { name: params.term }; + }, + processResults: function(data){ + return { results: data.users } + } + }, + templateResult: function (item) { + if(!item.id || item.id === '') return item.text; + return item.real_name; + }, + templateSelection: function(item){ + if (item.id) { + } + return item.real_name || item.text; + } + }); + + $addMemberModal.on('click', '.submit-btn', function(){ + $addMemberForm.find('.error').html(''); + + var laboratoryId = $laboratoryIdInput.val(); + var memberIds = $memberSelect.val(); + if (laboratoryId && memberIds && memberIds.length > 0) { + $.ajax({ + method: 'POST', + dataType: 'script', + url: '/admins/laboratories/' + laboratoryId + '/laboratory_user', + data: { user_ids: memberIds } + }); + } else { + $addMemberModal.modal('hide'); + } + }); + } +}); \ No newline at end of file diff --git a/app/assets/stylesheets/admins/laboratories.scss b/app/assets/stylesheets/admins/laboratories.scss new file mode 100644 index 000000000..ad5c8c5a8 --- /dev/null +++ b/app/assets/stylesheets/admins/laboratories.scss @@ -0,0 +1,99 @@ +.admins-laboratories-index-page { + .laboratory-list-table { + .member-container { + .laboratory-user { + display: flex; + justify-content: center; + flex-wrap: wrap; + + .laboratory-user-item { + display: flex; + align-items: center; + height: 22px; + line-height: 22px; + padding: 2px 5px; + margin: 2px 2px; + border: 1px solid #91D5FF; + background-color: #E6F7FF; + color: #91D5FF; + border-radius: 4px; + } + } + } + } +} +.admins-laboratory-settings-show-page, .admins-laboratory-settings-update-page { + .edit-laboratory-setting-container { + .logo-item { + display: flex; + + &-img { + display: block; + width: 80px; + height: 80px; + } + + &-upload { + cursor: pointer; + position: absolute; + top: 0; + width: 80px; + height: 80px; + background: #F5F5F5; + border: 1px solid #E5E5E5; + + &::before { + content: ''; + position: absolute; + top: 27px; + left: 39px; + width: 2px; + height: 26px; + background: #E5E5E5; + } + + &::after { + content: ''; + position: absolute; + top: 39px; + left: 27px; + width: 26px; + height: 2px; + background: #E5E5E5; + } + } + + &-left { + position: relative; + width: 80px; + height: 80px; + + &.has-img { + .logo-item-upload { + display: none; + } + + &:hover { + .logo-item-upload { + display: block; + background: rgba(145, 145, 145, 0.8); + } + } + } + } + + &-right { + display: flex; + flex-direction: column; + justify-content: space-between; + color: #777777; + font-size: 12px; + } + + &-title { + color: #23272B; + font-size: 14px; + } + } + } +} \ No newline at end of file diff --git a/app/controllers/admins/laboratories_controller.rb b/app/controllers/admins/laboratories_controller.rb new file mode 100644 index 000000000..e393c6677 --- /dev/null +++ b/app/controllers/admins/laboratories_controller.rb @@ -0,0 +1,32 @@ +class Admins::LaboratoriesController < Admins::BaseController + def index + params[:sort_by] = params[:sort_by].presence || 'id' + params[:sort_direction] = params[:sort_direction].presence || 'desc' + + laboratories = Admins::LaboratoryQuery.call(params) + @laboratories = paginate laboratories.preload(:school, :laboratory_users) + end + + def create + Admins::CreateLaboratoryService.call(create_params) + render_ok + rescue Admins::CreateLaboratoryService::Error => ex + render_error(ex.message) + end + + def destroy + current_laboratory.destroy! + + render_delete_success + end + + private + + def current_laboratory + @_current_laboratory ||= Laboratory.find(params[:id]) + end + + def create_params + params.permit(:school_id) + end +end \ No newline at end of file diff --git a/app/controllers/admins/laboratory_settings_controller.rb b/app/controllers/admins/laboratory_settings_controller.rb new file mode 100644 index 000000000..f9676bfd3 --- /dev/null +++ b/app/controllers/admins/laboratory_settings_controller.rb @@ -0,0 +1,20 @@ +class Admins::LaboratorySettingsController < Admins::BaseController + def show + @laboratory = current_laboratory + end + + def update + Admins::SaveLaboratorySettingService.call(current_laboratory, form_params) + render_ok + end + + private + + def current_laboratory + @_current_laboratory ||= Laboratory.find(params[:laboratory_id]) + end + + def form_params + params.permit(:identifier, :name, :nav_logo, :login_logo, :tab_logo, :footer, navbar: %i[name link hidden]) + end +end \ No newline at end of file diff --git a/app/controllers/admins/laboratory_users_controller.rb b/app/controllers/admins/laboratory_users_controller.rb new file mode 100644 index 000000000..36e389a3e --- /dev/null +++ b/app/controllers/admins/laboratory_users_controller.rb @@ -0,0 +1,19 @@ +class Admins::LaboratoryUsersController < Admins::BaseController + helper_method :current_laboratory + + def create + Admins::AddLaboratoryUserService.call(current_laboratory, params.permit(user_ids: [])) + current_laboratory.reload + end + + def destroy + @laboratory_user = current_laboratory.laboratory_users.find_by(user_id: params[:user_id]) + @laboratory_user.destroy! if @laboratory_user.present? + end + + private + + def current_laboratory + @_current_laboratory ||= Laboratory.find(params[:laboratory_id]) + end +end \ No newline at end of file diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index b539a0c68..53e1be6e7 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -7,6 +7,7 @@ class ApplicationController < ActionController::Base include ControllerRescueHandler include GitHelper include LoggerHelper + include LaboratoryHelper protect_from_forgery prepend: true, unless: -> { request.format.json? } diff --git a/app/controllers/concerns/laboratory_helper.rb b/app/controllers/concerns/laboratory_helper.rb new file mode 100644 index 000000000..fbb18b36d --- /dev/null +++ b/app/controllers/concerns/laboratory_helper.rb @@ -0,0 +1,15 @@ +module LaboratoryHelper + extend ActiveSupport::Concern + + included do + helper_method :default_setting + end + + def current_laboratory + @_current_laboratory ||= (Laboratory.find_by_subdomain(request.subdomain) || Laboratory.find(1)) + end + + def default_setting + @_default_setting ||= LaboratorySetting.find_by(laboratory_id: 1) + end +end \ No newline at end of file diff --git a/app/controllers/settings_controller.rb b/app/controllers/settings_controller.rb new file mode 100644 index 000000000..ce5481147 --- /dev/null +++ b/app/controllers/settings_controller.rb @@ -0,0 +1,5 @@ +class SettingsController < ApplicationController + def show + @laboratory = current_laboratory + end +end \ No newline at end of file diff --git a/app/libs/util/file_manage.rb b/app/libs/util/file_manage.rb index 822bfca4f..2f87a3e86 100644 --- a/app/libs/util/file_manage.rb +++ b/app/libs/util/file_manage.rb @@ -10,31 +10,35 @@ module Util::FileManage File.join(Rails.root, "public", "images", relative_path) end - def disk_filename(source_type, source_id,image_file=nil) - File.join(storage_path, "#{source_type}", "#{source_id}") + def disk_filename(source_type, source_id, suffix=nil) + File.join(storage_path, "#{source_type}", "#{source_id}#{suffix}") end - def exist?(source_type, source_id) - File.exist?(disk_filename(source_type, source_id)) + def source_disk_filename(source, suffix=nil) + disk_filename(source.class.name, source.id, suffix) end - def exists?(source) - File.exist?(disk_filename(source.class, source.id)) + def exist?(source_type, source_id, suffix=nil) + File.exist?(disk_filename(source_type, source_id, suffix)) + end + + def exists?(source, suffix=nil) + File.exist?(disk_filename(source.class, source.id, suffix)) end def disk_file_url(source_type, source_id, suffix = nil) - t = ctime(source_type, source_id) + t = ctime(source_type, source_id, suffix) File.join('/images', relative_path, "#{source_type}", "#{source_id}#{suffix}") + "?t=#{t}" end - def source_disk_file_url(source) - disk_file_url(source.class, source.id) + def source_disk_file_url(source, suffix=nil) + disk_file_url(source.class, source.id, suffix) end - def ctime(source_type, source_id) - return nil unless exist?(source_type, source_id) + def ctime(source_type, source_id, suffix) + return nil unless exist?(source_type, source_id, suffix) - File.ctime(disk_filename(source_type, source_id)).to_i + File.ctime(disk_filename(source_type, source_id, suffix)).to_i end def disk_auth_filename(source_type, source_id, type) diff --git a/app/models/laboratory.rb b/app/models/laboratory.rb new file mode 100644 index 000000000..53e66ece0 --- /dev/null +++ b/app/models/laboratory.rb @@ -0,0 +1,26 @@ +class Laboratory < ApplicationRecord + belongs_to :school, optional: true + + has_many :laboratory_users, dependent: :destroy + has_many :users, through: :laboratory_users, source: :user + + has_one :laboratory_setting, dependent: :destroy + + validates :identifier, uniqueness: { case_sensitive: false }, allow_nil: true + + def site + rails_env = EduSetting.get('rails_env') + suffix = rails_env && rails_env != 'production' ? ".#{rails_env}.educoder.net" : '.educoder.net' + + identifier ? "#{identifier}#{suffix}" : '' + end + + def self.find_by_subdomain(subdomain) + return if subdomain.blank? + + rails_env = EduSetting.get('rails_env') + subdomain = subdomain.slice(0, subdomain.size - rails_env.size - 1) if subdomain.end_with?(rails_env) # winse.dev => winse + + find_by_identifier(subdomain) + end +end \ No newline at end of file diff --git a/app/models/laboratory_setting.rb b/app/models/laboratory_setting.rb new file mode 100644 index 000000000..32848dca2 --- /dev/null +++ b/app/models/laboratory_setting.rb @@ -0,0 +1,54 @@ +class LaboratorySetting < ApplicationRecord + belongs_to :laboratory + + serialize :config, JSON + + %i[name navbar footer].each do |method_name| + define_method method_name do + config&.[](method_name.to_s) + end + + define_method "#{method_name}=" do |value| + self.config ||= {} + config.[]=(method_name.to_s, value) + end + end + + def login_logo_url + logo_url('login') + end + + def nav_logo_url + logo_url('nav') + end + + def tab_logo_url + logo_url('tab') + end + + def default_navbar + self.class.default_config[:navbar] + end + + private + + def logo_url(type) + return nil unless Util::FileManage.exists?(self, type) + Util::FileManage.source_disk_file_url(self, type) + end + + def self.default_config + { + name: nil, + navbar: [ + { 'name' => '实践课程', 'link' => '/paths', 'hidden' => false }, + { 'name' => '翻转课堂', 'link' => '/courses', 'hidden' => false }, + { 'name' => '实现项目', 'link' => '/shixuns', 'hidden' => false }, + { 'name' => '在线竞赛', 'link' => '/competitions', 'hidden' => false }, + { 'name' => '教学案例', 'link' => '/moop_cases', 'hidden' => false }, + { 'name' => '交流问答', 'link' => '/forums', 'hidden' => false }, + ], + footer: nil + } + end +end \ No newline at end of file diff --git a/app/models/laboratory_user.rb b/app/models/laboratory_user.rb new file mode 100644 index 000000000..be6c0c4dd --- /dev/null +++ b/app/models/laboratory_user.rb @@ -0,0 +1,4 @@ +class LaboratoryUser < ApplicationRecord + belongs_to :laboratory + belongs_to :user +end \ No newline at end of file diff --git a/app/queries/admins/laboratory_query.rb b/app/queries/admins/laboratory_query.rb new file mode 100644 index 000000000..21020216b --- /dev/null +++ b/app/queries/admins/laboratory_query.rb @@ -0,0 +1,23 @@ +class Admins::LaboratoryQuery < ApplicationQuery + include CustomSortable + + attr_reader :params + + sort_columns :id, default_by: :id, default_direction: :desc + + def initialize(params) + @params = params + end + + def call + laboratories = Laboratory.all + + keyword = strip_param(:keyword) + if keyword.present? + like_sql = 'schools.name LIKE :keyword OR laboratories.identifier LIKE :keyword' + laboratories = laboratories.joins(:school).where(like_sql, keyword: "%#{keyword}%") + end + + custom_sort laboratories, params[:sort_by], params[:sort_direction] + end +end \ No newline at end of file diff --git a/app/services/admins/add_laboratory_user_service.rb b/app/services/admins/add_laboratory_user_service.rb new file mode 100644 index 000000000..16df30880 --- /dev/null +++ b/app/services/admins/add_laboratory_user_service.rb @@ -0,0 +1,19 @@ +class Admins::AddLaboratoryUserService < ApplicationService + attr_reader :laboratory, :params + + def initialize(laboratory, params) + @laboratory = laboratory + @params = params + end + + def call + columns = %i[] + LaboratoryUser.bulk_insert(*columns) do |worker| + Array.wrap(params[:user_ids]).compact.each do |user_id| + next if laboratory.laboratory_users.exists?(user_id: user_id) + + worker.add(laboratory_id: laboratory.id, user_id: user_id) + end + end + end +end \ No newline at end of file diff --git a/app/services/admins/create_laboratory_service.rb b/app/services/admins/create_laboratory_service.rb new file mode 100644 index 000000000..98300d5af --- /dev/null +++ b/app/services/admins/create_laboratory_service.rb @@ -0,0 +1,20 @@ +class Admins::CreateLaboratoryService < ApplicationService + Error = Class.new(StandardError) + + attr_reader :params + + def initialize(params) + @params = params + end + + def call + raise Error, '单位不能为空' if params[:school_id].blank? + raise Error, '该单位已存在' if Laboratory.exists?(school_id: params[:school_id]) + + ActiveRecord::Base.transaction do + laboratory = Laboratory.create!(school_id: params[:school_id]) + + laboratory.create_laboratory_setting! + end + end +end \ No newline at end of file diff --git a/app/services/admins/save_laboratory_setting_service.rb b/app/services/admins/save_laboratory_setting_service.rb new file mode 100644 index 000000000..00e202cd9 --- /dev/null +++ b/app/services/admins/save_laboratory_setting_service.rb @@ -0,0 +1,51 @@ +class Admins::SaveLaboratorySettingService < ApplicationService + attr_reader :laboratory, :laboratory_setting, :params + + def initialize(laboratory, params) + @params = params + @laboratory = laboratory + @laboratory_setting = laboratory.laboratory_setting + end + + def call + ActiveRecord::Base.transaction do + laboratory.identifier = strip params[:identifier] + laboratory_setting.name = strip params[:name] + laboratory_setting.navbar = navbar_config + laboratory_setting.footer = strip params[:footer] + + laboratory.save! + laboratory_setting.save! + + deal_logo_file + end + + laboratory + end + + private + + def navbar_config + params[:navbar].map do |nav| + hash = {} + hash[:name] = strip nav[:name] + hash[:link] = strip nav[:link] + hash[:hidden] = nav[:hidden].to_s == 0 + hash + end + end + + def deal_logo_file + save_logo_file(params[:nav_logo], 'nav') + save_logo_file(params[:login_logo], 'login') + save_logo_file(params[:tab_logo], 'tab') + end + + def save_logo_file(file, type) + return unless file.present? && file.is_a?(ActionDispatch::Http::UploadedFile) + + file_path = Util::FileManage.source_disk_filename(laboratory_setting, type) + File.delete(file_path) if File.exist?(file_path) # 删除之前的文件 + Util.write_file(file, file_path) + end +end \ No newline at end of file diff --git a/app/services/application_service.rb b/app/services/application_service.rb index c6f66c098..8b3819017 100644 --- a/app/services/application_service.rb +++ b/app/services/application_service.rb @@ -1,3 +1,9 @@ class ApplicationService include Callable + + private + + def strip(str) + str.to_s.strip.presence + end end \ No newline at end of file diff --git a/app/views/admins/laboratories/index.html.erb b/app/views/admins/laboratories/index.html.erb new file mode 100644 index 000000000..012eed792 --- /dev/null +++ b/app/views/admins/laboratories/index.html.erb @@ -0,0 +1,19 @@ +<% define_admin_breadcrumbs do %> + <% add_admin_breadcrumb('云上实验室') %> +<% end %> + +
    + <%= form_tag(admins_laboratories_path(unsafe_params), method: :get, class: 'form-inline search-form flex-1', remote: true) do %> + <%= text_field_tag(:keyword, params[:keyword], class: 'form-control col-6 col-md-4 ml-3', placeholder: '学校名称/二级域名前缀检索') %> + <%= submit_tag('搜索', class: 'btn btn-primary ml-3', 'data-disable-with': '搜索中...') %> + <% end %> + + <%= javascript_void_link '新建', class: 'btn btn-primary', data: { toggle: 'modal', target: '.admin-create-laboratory-modal' } %> +
    + +
    + <%= render(partial: 'admins/laboratories/shared/list', locals: { laboratories: @laboratories }) %> +
    + +<%= render 'admins/laboratories/shared/create_laboratory_modal' %> +<%= render 'admins/laboratories/shared/add_laboratory_user_modal' %> \ No newline at end of file diff --git a/app/views/admins/laboratories/index.js.erb b/app/views/admins/laboratories/index.js.erb new file mode 100644 index 000000000..dc17c6a6d --- /dev/null +++ b/app/views/admins/laboratories/index.js.erb @@ -0,0 +1 @@ +$('.laboratory-list-container').html("<%= j(render partial: 'admins/laboratories/shared/list', locals: { laboratories: @laboratories }) %>"); \ No newline at end of file diff --git a/app/views/admins/laboratories/shared/_add_laboratory_user_modal.html.erb b/app/views/admins/laboratories/shared/_add_laboratory_user_modal.html.erb new file mode 100644 index 000000000..a13565cd6 --- /dev/null +++ b/app/views/admins/laboratories/shared/_add_laboratory_user_modal.html.erb @@ -0,0 +1,30 @@ + \ No newline at end of file diff --git a/app/views/admins/laboratories/shared/_create_laboratory_modal.html.erb b/app/views/admins/laboratories/shared/_create_laboratory_modal.html.erb new file mode 100644 index 000000000..0a77477d3 --- /dev/null +++ b/app/views/admins/laboratories/shared/_create_laboratory_modal.html.erb @@ -0,0 +1,28 @@ + \ No newline at end of file diff --git a/app/views/admins/laboratories/shared/_laboratory_item.html.erb b/app/views/admins/laboratories/shared/_laboratory_item.html.erb new file mode 100644 index 000000000..5dd97b549 --- /dev/null +++ b/app/views/admins/laboratories/shared/_laboratory_item.html.erb @@ -0,0 +1,40 @@ +<% school = laboratory.school %> +<%= school&.name || 'EduCoder主站' %> + + <% if laboratory.identifier %> + <%= link_to laboratory.site, "https://#{laboratory.site}", target: '_blank' %> + <% else %> + -- + <% end %> + + + <% if school && school.identifier.present? %> + <%= link_to school.identifier.to_s, statistics_college_path(school.identifier), target: '_blank' %> + <% else %> + -- + <% end %> + + +
    + <% laboratory.users.each do |user| %> + + <%= link_to user.real_name, "/users/#{user.login}", target: '_blank', data: { toggle: 'tooltip', title: '个人主页' } %> + <%= link_to(admins_laboratory_laboratory_user_path(laboratory, user_id: user.id), + method: :delete, remote: true, class: 'ml-1 delete-laboratory-user-action', + data: { confirm: '确认删除吗?' }) do %> + + <% end %> + + <% end %> +
    + +<%= laboratory.created_at.strftime('%Y-%m-%d %H:%M') %> + + <%= link_to '定制', admins_laboratory_laboratory_setting_path(laboratory) %> + + <% if school.present? && laboratory.id != 1 %> + <%= javascript_void_link '添加管理员', class: 'action', data: { laboratory_id: laboratory.id, toggle: 'modal', target: '.admin-add-laboratory-user-modal' } %> + + <%= delete_link '删除', admins_laboratory_path(laboratory, element: ".laboratory-item-#{laboratory.id}"), class: 'delete-laboratory-action' %> + <% end %> + \ No newline at end of file diff --git a/app/views/admins/laboratories/shared/_list.html.erb b/app/views/admins/laboratories/shared/_list.html.erb new file mode 100644 index 000000000..33a47eed7 --- /dev/null +++ b/app/views/admins/laboratories/shared/_list.html.erb @@ -0,0 +1,25 @@ + + + + + + + + + + + + + <% if laboratories.present? %> + <% laboratories.each do |laboratory| %> + + <%= render 'admins/laboratories/shared/laboratory_item', laboratory: laboratory %> + + <% end %> + <% else %> + <%= render 'admins/shared/no_data_for_table' %> + <% end %> + +
    单位名称域名统计链接管理员<%= sort_tag('创建时间', name: 'id', path: admins_laboratories_path) %>操作
    + +<%= render partial: 'admins/shared/paginate', locals: { objects: laboratories } %> \ No newline at end of file diff --git a/app/views/admins/laboratory_settings/show.html.erb b/app/views/admins/laboratory_settings/show.html.erb new file mode 100644 index 000000000..120bba6cb --- /dev/null +++ b/app/views/admins/laboratory_settings/show.html.erb @@ -0,0 +1,131 @@ +<% define_admin_breadcrumbs do %> + <% add_admin_breadcrumb('云上实验室', admins_laboratories_path) %> + <% add_admin_breadcrumb('单位定制') %> +<% end %> + +
    + <%= simple_form_for(@laboratory, url: admins_laboratory_laboratory_setting_path(@laboratory), method: 'patch', html: { enctype: 'multipart/form-data' }) do |f| %> + <% setting = @laboratory.laboratory_setting %> + +
    +
    网站域名设置
    + +
    +
    +
    + https:// +
    + <%= text_field_tag :identifier, @laboratory.identifier, + maxlength: 15, class: 'form-control font-16', + 'onKeyUp': 'value=value.replace(/[^\w\.\-\/]/ig,"").toLowerCase()', + style: 'text-transform:lowercase'%> +
    + <% rails_env = EduSetting.get('rails_env') %> + <%= rails_env && rails_env != 'production' ? ".#{rails_env}.educoder.net" : '.educoder.net' %> +
    +
    + <%# if @laboratory.errors && @laboratory.errors.key?(:identifier) %> + + <%# end %> +
    +
    + +
    +
    网站名称设置
    + +
    + <%= text_field_tag :name, setting.name, placeholder: '输入20个字以内的网站名称', maxlength: 20, class: 'form-control col-12 col-md-4' %> +
    +
    + +
    +
    Logo设置
    + +
    +
    + <% nav_logo_img = setting.nav_logo_url %> + +
    +
    网站导航logo
    +
    格式:PNG、JPG
    +
    尺寸:高度38px以内,宽等比例缩放
    +
    +
    + +
    + <% login_logo_img = setting.login_logo_url %> + +
    +
    登录页面logo
    +
    格式:PNG、JPG
    +
    尺寸:高度90px以内,宽等比例缩放
    +
    +
    + +
    + <% tab_logo_img = setting.tab_logo_url %> +
    + + <%= file_field_tag(:tab_logo, accept: 'image/x-icon', style: 'display: none', value: params[:tab_logo]) %> + +
    +
    +
    浏览器导航栏logo
    +
    格式:ico
    +
    尺寸:16*16 32*32 48*48 64*64
    +
    +
    +
    +
    + +
    +
    导航设置
    + +
    + + + + + + + + + + <% (setting.navbar || setting.default_navbar).each do |nav| %> + + + + + + <% end %> + +
    导航名称导航链接是否展示
    <%= text_field_tag('navbar[][name]', nav['name'], id: nil, class: 'form-control') %><%= text_field_tag('navbar[][link]', nav['link'], id: nil, class: 'form-control') %> + <%= check_box_tag('navbar[][hidden]', 0, !nav['hidden'], id: nil, class: 'font-16') %> +
    +
    +
    + +
    +
    底部备案信息设置
    + + +
    + +
    + +
    + <%= javascript_void_link '保存', class: 'btn btn-primary mr-3 px-4 submit-btn' %> + <%= link_to '取消', admins_laboratories_path, class: 'btn btn-secondary px-4' %> +
    + <% end %> +
    \ No newline at end of file diff --git a/app/views/admins/laboratory_users/create.js.erb b/app/views/admins/laboratory_users/create.js.erb new file mode 100644 index 000000000..f43fd7887 --- /dev/null +++ b/app/views/admins/laboratory_users/create.js.erb @@ -0,0 +1,4 @@ +$('.modal.admin-add-laboratory-user-modal').modal('hide'); +$.notify({ message: '操作成功' }); + +$('.laboratory-list-table .laboratory-item-<%= current_laboratory.id %>').html("<%= j(render partial: 'admins/laboratories/shared/laboratory_item', locals: { laboratory: current_laboratory }) %>") \ No newline at end of file diff --git a/app/views/admins/laboratory_users/destroy.js.erb b/app/views/admins/laboratory_users/destroy.js.erb new file mode 100644 index 000000000..16ef62910 --- /dev/null +++ b/app/views/admins/laboratory_users/destroy.js.erb @@ -0,0 +1,2 @@ +$.notify({ message: '操作成功' }); +$('.laboratory-list-container .laboratory-item-<%= current_laboratory.id %> .laboratory-user-item-<%= @laboratory_user.user_id %>').remove(); \ No newline at end of file diff --git a/app/views/admins/shared/_sidebar.html.erb b/app/views/admins/shared/_sidebar.html.erb index 553820e69..145910928 100644 --- a/app/views/admins/shared/_sidebar.html.erb +++ b/app/views/admins/shared/_sidebar.html.erb @@ -33,23 +33,13 @@ <%= sidebar_item_group('#schools-submenu', '单位管理', icon: 'building') do %>
  • <%= sidebar_item(admins_schools_path, '单位列表', icon: 'university', controller: 'admins-schools') %>
  • <%= sidebar_item(admins_departments_path, '部门列表', icon: 'sitemap', controller: 'admins-departments') %>
  • +
  • <%= sidebar_item(admins_laboratories_path, '云上实验室', icon: 'cloud', controller: 'admins-laboratories') %>
  • <% end %> - - <%#= sidebar_item_group('#course-submenu', '课堂+', icon: 'mortar-board') do %> - - - - - <%# end %> - -
  • <%= sidebar_item_group('#user-submenu', '用户', icon: 'user') do %>
  • <%= sidebar_item(admins_users_path, '用户列表', icon: 'user', controller: 'admins-users') %>
  • - - <% end %> diff --git a/app/views/settings/show.json.jbuilder b/app/views/settings/show.json.jbuilder new file mode 100644 index 000000000..0765e303b --- /dev/null +++ b/app/views/settings/show.json.jbuilder @@ -0,0 +1,12 @@ +json.setting do + setting = @laboratory.laboratory_setting + + json.name setting.name || default_setting.name + json.nav_logo_url setting.nav_logo_url || default_setting.nav_logo_url + json.login_logo_url setting.login_logo_url || default_setting.login_logo_url + json.tab_logo_url setting.tab_logo_url || default_setting.tab_logo_url + + json.navbar setting.navbar || default_setting.navbar + + json.footer setting.footer || default_setting.footer +end \ No newline at end of file diff --git a/config/admins/sidebar.yml b/config/admins/sidebar.yml index 30af794b7..9da34a014 100644 --- a/config/admins/sidebar.yml +++ b/config/admins/sidebar.yml @@ -1 +1,2 @@ -admins-mirror_scripts: 'admins-mirror_repositories' \ No newline at end of file +admins-mirror_scripts: 'admins-mirror_repositories' +admins-laboratory_settings: 'admins-laboratories' \ No newline at end of file diff --git a/config/locales/laboratories/zh-CN.yml b/config/locales/laboratories/zh-CN.yml new file mode 100644 index 000000000..42127f0a1 --- /dev/null +++ b/config/locales/laboratories/zh-CN.yml @@ -0,0 +1,7 @@ +zh-CN: + activerecord: + models: + laboratory: '' + attributes: + laboratory: + identifier: '二级域名' \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 50b61c463..4b7addc0b 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -824,6 +824,7 @@ Rails.application.routes.draw do end end resource :template, only: [:show] + resource :setting, only: [:show] end namespace :admins do @@ -953,7 +954,7 @@ Rails.application.routes.draw do resources :choose_mirror_repositories, only: [:new, :create] resources :schools, only: [:index, :destroy] resources :departments, only: [:index, :create, :edit, :update, :destroy] do - resource :department_member, only: [:create, :update, :destroy] + resource :department_member, only: [:create, :destroy] post :merge, on: :collection end resources :myshixuns, only: [:index] @@ -971,6 +972,10 @@ Rails.application.routes.draw do resources :carousels, only: [:index, :create, :update, :destroy] do post :drag, on: :collection end + resources :laboratories, only: [:index, :create, :destroy] do + resource :laboratory_setting, only: [:show, :update] + resource :laboratory_user, only: [:create, :destroy] + end end resources :colleges, only: [] do diff --git a/db/migrate/20191010011844_create_laboratories.rb b/db/migrate/20191010011844_create_laboratories.rb new file mode 100644 index 000000000..3dfb442f0 --- /dev/null +++ b/db/migrate/20191010011844_create_laboratories.rb @@ -0,0 +1,12 @@ +class CreateLaboratories < ActiveRecord::Migration[5.2] + def change + create_table :laboratories do |t| + t.references :school + t.string :identifier + + t.timestamps + + t.index :identifier, unique: true + end + end +end diff --git a/db/migrate/20191010012226_create_laboratory_users.rb b/db/migrate/20191010012226_create_laboratory_users.rb new file mode 100644 index 000000000..1b7ae762d --- /dev/null +++ b/db/migrate/20191010012226_create_laboratory_users.rb @@ -0,0 +1,8 @@ +class CreateLaboratoryUsers < ActiveRecord::Migration[5.2] + def change + create_table :laboratory_users do |t| + t.references :laboratory + t.references :user + end + end +end diff --git a/db/migrate/20191010063403_create_laboratory_settings.rb b/db/migrate/20191010063403_create_laboratory_settings.rb new file mode 100644 index 000000000..7f0a5f015 --- /dev/null +++ b/db/migrate/20191010063403_create_laboratory_settings.rb @@ -0,0 +1,9 @@ +class CreateLaboratorySettings < ActiveRecord::Migration[5.2] + def change + create_table :laboratory_settings do |t| + t.references :laboratory + + t.text :config + end + end +end diff --git a/db/migrate/20191011025619_init_edu_coder_laboratory.rb b/db/migrate/20191011025619_init_edu_coder_laboratory.rb new file mode 100644 index 000000000..831ca3985 --- /dev/null +++ b/db/migrate/20191011025619_init_edu_coder_laboratory.rb @@ -0,0 +1,22 @@ +class InitEduCoderLaboratory < ActiveRecord::Migration[5.2] + def change + ActiveRecord::Base.transaction do + laboratory = Laboratory.create!(id: 1, identifier: 'www') + setting = laboratory.build_laboratory_setting + footer = %Q{ + + } + config = setting.class.default_config.merge(name: 'EduCoder', footer: footer) + setting.config = config + setting.save! + end + end +end diff --git a/public/assets/.sprockets-manifest-4627fa5586ef7fed55ca286af7c028e9.json b/public/assets/.sprockets-manifest-4627fa5586ef7fed55ca286af7c028e9.json index 52d2a4e9b..b8b49cc9d 100644 --- a/public/assets/.sprockets-manifest-4627fa5586ef7fed55ca286af7c028e9.json +++ b/public/assets/.sprockets-manifest-4627fa5586ef7fed55ca286af7c028e9.json @@ -1 +1 @@ -{"files":{"admin-cd9ca8bacc973ce2dbace30c97f6c40bc08e2c2ee44972f668e738e1902c0121.js":{"logical_path":"admin.js","mtime":"2019-09-11T16:20:07+08:00","size":4350881,"digest":"cd9ca8bacc973ce2dbace30c97f6c40bc08e2c2ee44972f668e738e1902c0121","integrity":"sha256-zZyousyXPOLbrOMMl/bEC8COLC7kSXL2aOc44ZAsASE="},"admin-a1b3356efe50ff4717cf22475639b5333c5354ba03fd107c9b7a8d4ae76f47aa.css":{"logical_path":"admin.css","mtime":"2019-09-11T16:20:07+08:00","size":773445,"digest":"a1b3356efe50ff4717cf22475639b5333c5354ba03fd107c9b7a8d4ae76f47aa","integrity":"sha256-obM1bv5Q/0cXzyJHVjm1MzxTVLoD/RB8m3qNSudvR6o="},"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot":{"logical_path":"font-awesome/fontawesome-webfont.eot","mtime":"2019-08-14T17:22:43+08:00","size":165742,"digest":"7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979","integrity":"sha256-e/yrbbmdXPvxcFygU23ceFhUMsxfpBu9etDwCQM7KXk="},"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2":{"logical_path":"font-awesome/fontawesome-webfont.woff2","mtime":"2019-08-14T17:22:43+08:00","size":77160,"digest":"2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe","integrity":"sha256-Kt78vAQefRj88tQXh53FoJmXqmTWdbejxLbOM9oT8/4="},"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff":{"logical_path":"font-awesome/fontawesome-webfont.woff","mtime":"2019-08-14T17:22:43+08:00","size":98024,"digest":"ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07","integrity":"sha256-ugxZ3rVFD1y0Gz+TYJ7i0NmVQVh33foiPoqKdTNHTwc="},"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf":{"logical_path":"font-awesome/fontawesome-webfont.ttf","mtime":"2019-08-14T17:22:43+08:00","size":165548,"digest":"aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8","integrity":"sha256-qljzPyOaD7AvXHpsRcBD16msmgkzNYBmlOzW1O3A1qg="},"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg":{"logical_path":"font-awesome/fontawesome-webfont.svg","mtime":"2019-08-14T17:22:43+08:00","size":444379,"digest":"ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4","integrity":"sha256-rWFXkmwWIrpOHQPUePFUE2hSS/xG9R5C/g2UX37zI+Q="},"college-18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287.js":{"logical_path":"college.js","mtime":"2019-09-26T14:40:40+08:00","size":3352744,"digest":"18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287","integrity":"sha256-GPXoQAMxY06JijWswhh4FcCWwl4Kt0q6NBrpFhZs0oc="},"college-944d4273f62c7538368b9017fdd3387b5e3bea31a87873770eb231324546d4d9.css":{"logical_path":"college.css","mtime":"2019-09-11T16:20:07+08:00","size":546841,"digest":"944d4273f62c7538368b9017fdd3387b5e3bea31a87873770eb231324546d4d9","integrity":"sha256-lE1Cc/YsdTg2i5AX/dM4e1476jGoeHN3DrIxMkVG1Nk="},"logo-7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423.png":{"logical_path":"logo.png","mtime":"2019-09-03T08:55:53+08:00","size":2816,"digest":"7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423","integrity":"sha256-f/ESVocJv5f5iY/ockm3qPIA/x9I1TfYWvhyFfGHBCM="},"application-9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb.js":{"logical_path":"application.js","mtime":"2019-09-26T14:40:40+08:00","size":600706,"digest":"9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb","integrity":"sha256-nPvD15JZmh0N5ce4QgnhwrLmAzbw8B4Z8FgWY5GHCPs="},"application-5eb87c6e13676d0183317debce17fade27e68c4acee28c419438da15d53c94f2.css":{"logical_path":"application.css","mtime":"2019-09-11T16:20:07+08:00","size":1844002,"digest":"5eb87c6e13676d0183317debce17fade27e68c4acee28c419438da15d53c94f2","integrity":"sha256-Xrh8bhNnbQGDMX3rzhf63ifmjErO4oxBlDjaFdU8lPI="},"admin-c9e5ebe6191548550e27514196ea125cfbb402820ec125a0c9acf99d2d378fe4.js":{"logical_path":"admin.js","mtime":"2019-09-21T15:28:08+08:00","size":4382031,"digest":"c9e5ebe6191548550e27514196ea125cfbb402820ec125a0c9acf99d2d378fe4","integrity":"sha256-yeXr5hkVSFUOJ1FBluoSXPu0AoIOwSWgyaz5nS03j+Q="},"admin-59c59f8cae8bef4a8359286c985458110c9d03ea121516595c988943f4717c38.css":{"logical_path":"admin.css","mtime":"2019-09-21T14:49:04+08:00","size":840093,"digest":"59c59f8cae8bef4a8359286c985458110c9d03ea121516595c988943f4717c38","integrity":"sha256-WcWfjK6L70qDWShsmFRYEQydA+oSFRZZXJiJQ/RxfDg="},"college-38f953d6ba5b85d3fab63cb3c2bbf0d057ccc6454d07cfaafac3b06da37b8437.css":{"logical_path":"college.css","mtime":"2019-09-16T13:56:09+08:00","size":579109,"digest":"38f953d6ba5b85d3fab63cb3c2bbf0d057ccc6454d07cfaafac3b06da37b8437","integrity":"sha256-OPlT1rpbhdP6tjyzwrvw0FfMxkVNB8+q+sOwbaN7hDc="},"application-646b1158a4e8c1f13e684d6fe9025abc75f8d3ba5256e440802c0398223374f3.css":{"logical_path":"application.css","mtime":"2019-09-21T14:49:04+08:00","size":1988767,"digest":"646b1158a4e8c1f13e684d6fe9025abc75f8d3ba5256e440802c0398223374f3","integrity":"sha256-ZGsRWKTowfE+aE1v6QJavHX407pSVuRAgCwDmCIzdPM="},"admin-a47e37c0ec7cf5f22380249776d1e82d65b6b6aa272ed7389185aa200fa40751.js":{"logical_path":"admin.js","mtime":"2019-09-25T15:33:05+08:00","size":4383107,"digest":"a47e37c0ec7cf5f22380249776d1e82d65b6b6aa272ed7389185aa200fa40751","integrity":"sha256-pH43wOx89fIjgCSXdtHoLWW2tqonLtc4kYWqIA+kB1E="},"admin-432c4eac09b036c57ff1e88d902b8aa7df81164e4b419bac557cf1366c1d3ad9.js":{"logical_path":"admin.js","mtime":"2019-09-25T15:35:20+08:00","size":4383103,"digest":"432c4eac09b036c57ff1e88d902b8aa7df81164e4b419bac557cf1366c1d3ad9","integrity":"sha256-QyxOrAmwNsV/8eiNkCuKp9+BFk5LQZusVXzxNmwdOtk="},"admin-978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a.js":{"logical_path":"admin.js","mtime":"2019-09-30T14:43:41+08:00","size":4387200,"digest":"978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a","integrity":"sha256-l45c5gf3fCaBShdPSA2nmsJGwiAYaO+EZUqgO7Zye1o="},"admin-896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7.css":{"logical_path":"admin.css","mtime":"2019-09-30T14:43:41+08:00","size":842269,"digest":"896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7","integrity":"sha256-iWKB9HMXIrDAhNuxryHQ80pbwULViv9Xs5GGSrcd3Kc="},"application-97f313e9bb7d25476649f7d7215959cf421480fd0a3785d1956953bf94a1e8bd.css":{"logical_path":"application.css","mtime":"2019-09-30T14:43:41+08:00","size":1993118,"digest":"97f313e9bb7d25476649f7d7215959cf421480fd0a3785d1956953bf94a1e8bd","integrity":"sha256-l/MT6bt9JUdmSffXIVlZz0IUgP0KN4XRlWlTv5Sh6L0="}},"assets":{"admin.js":"admin-978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a.js","admin.css":"admin-896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7.css","font-awesome/fontawesome-webfont.eot":"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot","font-awesome/fontawesome-webfont.woff2":"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2","font-awesome/fontawesome-webfont.woff":"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff","font-awesome/fontawesome-webfont.ttf":"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf","font-awesome/fontawesome-webfont.svg":"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg","college.js":"college-18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287.js","college.css":"college-38f953d6ba5b85d3fab63cb3c2bbf0d057ccc6454d07cfaafac3b06da37b8437.css","logo.png":"logo-7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423.png","application.js":"application-9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb.js","application.css":"application-97f313e9bb7d25476649f7d7215959cf421480fd0a3785d1956953bf94a1e8bd.css"}} \ No newline at end of file +{"files":{"admin-cd9ca8bacc973ce2dbace30c97f6c40bc08e2c2ee44972f668e738e1902c0121.js":{"logical_path":"admin.js","mtime":"2019-09-11T16:20:07+08:00","size":4350881,"digest":"cd9ca8bacc973ce2dbace30c97f6c40bc08e2c2ee44972f668e738e1902c0121","integrity":"sha256-zZyousyXPOLbrOMMl/bEC8COLC7kSXL2aOc44ZAsASE="},"admin-a1b3356efe50ff4717cf22475639b5333c5354ba03fd107c9b7a8d4ae76f47aa.css":{"logical_path":"admin.css","mtime":"2019-09-11T16:20:07+08:00","size":773445,"digest":"a1b3356efe50ff4717cf22475639b5333c5354ba03fd107c9b7a8d4ae76f47aa","integrity":"sha256-obM1bv5Q/0cXzyJHVjm1MzxTVLoD/RB8m3qNSudvR6o="},"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot":{"logical_path":"font-awesome/fontawesome-webfont.eot","mtime":"2019-08-14T17:22:43+08:00","size":165742,"digest":"7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979","integrity":"sha256-e/yrbbmdXPvxcFygU23ceFhUMsxfpBu9etDwCQM7KXk="},"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2":{"logical_path":"font-awesome/fontawesome-webfont.woff2","mtime":"2019-08-14T17:22:43+08:00","size":77160,"digest":"2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe","integrity":"sha256-Kt78vAQefRj88tQXh53FoJmXqmTWdbejxLbOM9oT8/4="},"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff":{"logical_path":"font-awesome/fontawesome-webfont.woff","mtime":"2019-08-14T17:22:43+08:00","size":98024,"digest":"ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07","integrity":"sha256-ugxZ3rVFD1y0Gz+TYJ7i0NmVQVh33foiPoqKdTNHTwc="},"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf":{"logical_path":"font-awesome/fontawesome-webfont.ttf","mtime":"2019-08-14T17:22:43+08:00","size":165548,"digest":"aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8","integrity":"sha256-qljzPyOaD7AvXHpsRcBD16msmgkzNYBmlOzW1O3A1qg="},"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg":{"logical_path":"font-awesome/fontawesome-webfont.svg","mtime":"2019-08-14T17:22:43+08:00","size":444379,"digest":"ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4","integrity":"sha256-rWFXkmwWIrpOHQPUePFUE2hSS/xG9R5C/g2UX37zI+Q="},"college-18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287.js":{"logical_path":"college.js","mtime":"2019-09-26T14:40:40+08:00","size":3352744,"digest":"18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287","integrity":"sha256-GPXoQAMxY06JijWswhh4FcCWwl4Kt0q6NBrpFhZs0oc="},"college-944d4273f62c7538368b9017fdd3387b5e3bea31a87873770eb231324546d4d9.css":{"logical_path":"college.css","mtime":"2019-09-11T16:20:07+08:00","size":546841,"digest":"944d4273f62c7538368b9017fdd3387b5e3bea31a87873770eb231324546d4d9","integrity":"sha256-lE1Cc/YsdTg2i5AX/dM4e1476jGoeHN3DrIxMkVG1Nk="},"logo-7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423.png":{"logical_path":"logo.png","mtime":"2019-09-03T08:55:53+08:00","size":2816,"digest":"7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423","integrity":"sha256-f/ESVocJv5f5iY/ockm3qPIA/x9I1TfYWvhyFfGHBCM="},"application-9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb.js":{"logical_path":"application.js","mtime":"2019-09-26T14:40:40+08:00","size":600706,"digest":"9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb","integrity":"sha256-nPvD15JZmh0N5ce4QgnhwrLmAzbw8B4Z8FgWY5GHCPs="},"application-5eb87c6e13676d0183317debce17fade27e68c4acee28c419438da15d53c94f2.css":{"logical_path":"application.css","mtime":"2019-09-11T16:20:07+08:00","size":1844002,"digest":"5eb87c6e13676d0183317debce17fade27e68c4acee28c419438da15d53c94f2","integrity":"sha256-Xrh8bhNnbQGDMX3rzhf63ifmjErO4oxBlDjaFdU8lPI="},"admin-c9e5ebe6191548550e27514196ea125cfbb402820ec125a0c9acf99d2d378fe4.js":{"logical_path":"admin.js","mtime":"2019-09-21T15:28:08+08:00","size":4382031,"digest":"c9e5ebe6191548550e27514196ea125cfbb402820ec125a0c9acf99d2d378fe4","integrity":"sha256-yeXr5hkVSFUOJ1FBluoSXPu0AoIOwSWgyaz5nS03j+Q="},"admin-59c59f8cae8bef4a8359286c985458110c9d03ea121516595c988943f4717c38.css":{"logical_path":"admin.css","mtime":"2019-09-21T14:49:04+08:00","size":840093,"digest":"59c59f8cae8bef4a8359286c985458110c9d03ea121516595c988943f4717c38","integrity":"sha256-WcWfjK6L70qDWShsmFRYEQydA+oSFRZZXJiJQ/RxfDg="},"college-38f953d6ba5b85d3fab63cb3c2bbf0d057ccc6454d07cfaafac3b06da37b8437.css":{"logical_path":"college.css","mtime":"2019-09-16T13:56:09+08:00","size":579109,"digest":"38f953d6ba5b85d3fab63cb3c2bbf0d057ccc6454d07cfaafac3b06da37b8437","integrity":"sha256-OPlT1rpbhdP6tjyzwrvw0FfMxkVNB8+q+sOwbaN7hDc="},"application-646b1158a4e8c1f13e684d6fe9025abc75f8d3ba5256e440802c0398223374f3.css":{"logical_path":"application.css","mtime":"2019-09-21T14:49:04+08:00","size":1988767,"digest":"646b1158a4e8c1f13e684d6fe9025abc75f8d3ba5256e440802c0398223374f3","integrity":"sha256-ZGsRWKTowfE+aE1v6QJavHX407pSVuRAgCwDmCIzdPM="},"admin-a47e37c0ec7cf5f22380249776d1e82d65b6b6aa272ed7389185aa200fa40751.js":{"logical_path":"admin.js","mtime":"2019-09-25T15:33:05+08:00","size":4383107,"digest":"a47e37c0ec7cf5f22380249776d1e82d65b6b6aa272ed7389185aa200fa40751","integrity":"sha256-pH43wOx89fIjgCSXdtHoLWW2tqonLtc4kYWqIA+kB1E="},"admin-432c4eac09b036c57ff1e88d902b8aa7df81164e4b419bac557cf1366c1d3ad9.js":{"logical_path":"admin.js","mtime":"2019-09-25T15:35:20+08:00","size":4383103,"digest":"432c4eac09b036c57ff1e88d902b8aa7df81164e4b419bac557cf1366c1d3ad9","integrity":"sha256-QyxOrAmwNsV/8eiNkCuKp9+BFk5LQZusVXzxNmwdOtk="},"admin-978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a.js":{"logical_path":"admin.js","mtime":"2019-09-30T14:43:41+08:00","size":4387200,"digest":"978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a","integrity":"sha256-l45c5gf3fCaBShdPSA2nmsJGwiAYaO+EZUqgO7Zye1o="},"admin-896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7.css":{"logical_path":"admin.css","mtime":"2019-09-30T14:43:41+08:00","size":842269,"digest":"896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7","integrity":"sha256-iWKB9HMXIrDAhNuxryHQ80pbwULViv9Xs5GGSrcd3Kc="},"application-97f313e9bb7d25476649f7d7215959cf421480fd0a3785d1956953bf94a1e8bd.css":{"logical_path":"application.css","mtime":"2019-09-30T14:43:41+08:00","size":1993118,"digest":"97f313e9bb7d25476649f7d7215959cf421480fd0a3785d1956953bf94a1e8bd","integrity":"sha256-l/MT6bt9JUdmSffXIVlZz0IUgP0KN4XRlWlTv5Sh6L0="},"admin-2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888.js":{"logical_path":"admin.js","mtime":"2019-10-11T14:38:33+08:00","size":4394616,"digest":"2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888","integrity":"sha256-LNsjRC+nNQJThbiPKQDfBP7zi2FTAEGm2+N17w8K6Ig="},"admin-2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc.css":{"logical_path":"admin.css","mtime":"2019-10-10T17:12:05+08:00","size":846514,"digest":"2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc","integrity":"sha256-LChUuaAhWN7VqAmq9xRKhjCxA1SrTlb+zE3/zHE3lsw="},"application-50059ae929866043b47015128702fcfba53d32a2df148e64e1d961c10651c6af.css":{"logical_path":"application.css","mtime":"2019-10-10T17:12:05+08:00","size":2001607,"digest":"50059ae929866043b47015128702fcfba53d32a2df148e64e1d961c10651c6af","integrity":"sha256-UAWa6SmGYEO0cBUShwL8+6U9MqLfFI5k4dlhwQZRxq8="}},"assets":{"admin.js":"admin-2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888.js","admin.css":"admin-2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc.css","font-awesome/fontawesome-webfont.eot":"font-awesome/fontawesome-webfont-7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979.eot","font-awesome/fontawesome-webfont.woff2":"font-awesome/fontawesome-webfont-2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe.woff2","font-awesome/fontawesome-webfont.woff":"font-awesome/fontawesome-webfont-ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07.woff","font-awesome/fontawesome-webfont.ttf":"font-awesome/fontawesome-webfont-aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8.ttf","font-awesome/fontawesome-webfont.svg":"font-awesome/fontawesome-webfont-ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4.svg","college.js":"college-18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287.js","college.css":"college-38f953d6ba5b85d3fab63cb3c2bbf0d057ccc6454d07cfaafac3b06da37b8437.css","logo.png":"logo-7ff112568709bf97f9898fe87249b7a8f200ff1f48d537d85af87215f1870423.png","application.js":"application-9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb.js","application.css":"application-50059ae929866043b47015128702fcfba53d32a2df148e64e1d961c10651c6af.css"}} \ No newline at end of file diff --git a/public/assets/admin-896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7.css b/public/assets/admin-2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc.css similarity index 99% rename from public/assets/admin-896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7.css rename to public/assets/admin-2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc.css index fe1e75888..5b6bef77a 100644 --- a/public/assets/admin-896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7.css +++ b/public/assets/admin-2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc.css @@ -25274,6 +25274,114 @@ input.form-control { color: #6c757d; } +/* line 4, app/assets/stylesheets/admins/laboratories.scss */ +.admins-laboratories-index-page .laboratory-list-table .member-container .laboratory-user { + display: -webkit-box; + display: flex; + -webkit-box-pack: center; + justify-content: center; + flex-wrap: wrap; +} + +/* line 9, app/assets/stylesheets/admins/laboratories.scss */ +.admins-laboratories-index-page .laboratory-list-table .member-container .laboratory-user .laboratory-user-item { + display: -webkit-box; + display: flex; + -webkit-box-align: center; + align-items: center; + height: 22px; + line-height: 22px; + padding: 2px 5px; + margin: 2px 2px; + border: 1px solid #91D5FF; + background-color: #E6F7FF; + color: #91D5FF; + border-radius: 4px; +} + +/* line 27, app/assets/stylesheets/admins/laboratories.scss */ +.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item { + display: -webkit-box; + display: flex; +} + +/* line 30, app/assets/stylesheets/admins/laboratories.scss */ +.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-img, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-img { + display: block; + width: 80px; + height: 80px; +} + +/* line 36, app/assets/stylesheets/admins/laboratories.scss */ +.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-upload, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-upload { + cursor: pointer; + position: absolute; + top: 0; + width: 80px; + height: 80px; + background: #F5F5F5; + border: 1px solid #E5E5E5; +} + +/* line 45, app/assets/stylesheets/admins/laboratories.scss */ +.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-upload::before, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-upload::before { + content: ''; + position: absolute; + top: 27px; + left: 39px; + width: 2px; + height: 26px; + background: #E5E5E5; +} + +/* line 55, app/assets/stylesheets/admins/laboratories.scss */ +.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-upload::after, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-upload::after { + content: ''; + position: absolute; + top: 39px; + left: 27px; + width: 26px; + height: 2px; + background: #E5E5E5; +} + +/* line 66, app/assets/stylesheets/admins/laboratories.scss */ +.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-left, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-left { + position: relative; + width: 80px; + height: 80px; +} + +/* line 72, app/assets/stylesheets/admins/laboratories.scss */ +.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-left.has-img .logo-item-upload, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-left.has-img .logo-item-upload { + display: none; +} + +/* line 77, app/assets/stylesheets/admins/laboratories.scss */ +.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-left.has-img:hover .logo-item-upload, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-left.has-img:hover .logo-item-upload { + display: block; + background: rgba(145, 145, 145, 0.8); +} + +/* line 85, app/assets/stylesheets/admins/laboratories.scss */ +.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-right, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-right { + display: -webkit-box; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + flex-direction: column; + -webkit-box-pack: justify; + justify-content: space-between; + color: #777777; + font-size: 12px; +} + +/* line 93, app/assets/stylesheets/admins/laboratories.scss */ +.admins-laboratory-settings-show-page .edit-laboratory-setting-container .logo-item-title, .admins-laboratory-settings-update-page .edit-laboratory-setting-container .logo-item-title { + color: #23272B; + font-size: 14px; +} + /* line 4, app/assets/stylesheets/admins/library_applies.scss */ .admins-library-applies-index-page .library-applies-list-container span.apply-status-agreed { color: #28a745; diff --git a/public/assets/admin-896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7.css.gz b/public/assets/admin-2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc.css.gz similarity index 78% rename from public/assets/admin-896281f4731722b0c084dbb1af21d0f34a5bc142d58aff57b391864ab71ddca7.css.gz rename to public/assets/admin-2c2854b9a02158ded5a809aaf7144a8630b10354ab4e56fecc4dffcc713796cc.css.gz index 581305db57795b3963f725c81b9c0c188d680b14..bfac93da936570ba06fae0f60742b64870f50070 100644 GIT binary patch delta 15257 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 WNcB_YjQqQQ_WuB3he!Jz+6(}0u-t_J diff --git a/public/assets/admin-978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a.js b/public/assets/admin-2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888.js similarity index 99% rename from public/assets/admin-978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a.js rename to public/assets/admin-2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888.js index 49e1025c7..6203a3ce8 100644 --- a/public/assets/admin-978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a.js +++ b/public/assets/admin-2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888.js @@ -134528,6 +134528,256 @@ $(document).on('turbolinks:load', function() { } }) ; +$(document).on('turbolinks:load', function() { + if ($('body.admins-laboratory-settings-show-page, body.admins-laboratory-settings-update-page').length > 0) { + var $container = $('.edit-laboratory-setting-container'); + var $form = $container.find('.edit_laboratory'); + + $('.logo-item-left').on("change", 'input[type="file"]', function () { + var $fileInput = $(this); + var file = this.files[0]; + var imageType = /image.*/; + if (file && file.type.match(imageType)) { + var reader = new FileReader(); + reader.onload = function () { + var $box = $fileInput.parent(); + $box.find('img').attr('src', reader.result).css('display', 'block'); + $box.addClass('has-img'); + }; + reader.readAsDataURL(file); + } else { + } + }); + + createMDEditor('laboratory-footer-editor', { height: 200, placeholder: '请输入备案信息' }); + + $form.validate({ + errorElement: 'span', + errorClass: 'danger text-danger', + errorPlacement:function(error,element){ + if(element.parent().hasClass("input-group")){ + element.parent().after(error); + }else{ + element.after(error) + } + }, + rules: { + identifier: { + required: true, + checkSite: true + }, + name: { + required: true + } + } + }); + $.validator.addMethod("checkSite",function(value,element,params){ + var checkSite = /^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/; + return this.optional(element)||(checkSite.test(value + '.educoder.com')); + },"域名不合法!"); + + $form.on('click', '.submit-btn', function(){ + $form.find('.submit-btn').attr('disabled', 'disabled'); + $form.find('.error').html(''); + var valid = $form.valid(); + + $('input[name="navbar[][name]"]').each(function(_, e){ + var $ele = $(e); + if($ele.val() === undefined || $ele.val().length === 0){ + $ele.addClass('danger text-danger'); + valid = false; + } else { + $ele.removeClass('danger text-danger'); + } + }); + + if(!valid) return; + $.ajax({ + method: 'PATCH', + dataType: 'json', + url: $form.attr('action'), + data: new FormData($form[0]), + processData: false, + contentType: false, + success: function(data){ + $.notify({ message: '保存成功' }); + window.location.reload(); + }, + error: function(res){ + var data = res.responseJSON; + $form.find('.error').html(data.message); + }, + complete: function(){ + $form.find('.submit-btn').attr('disabled', false); + } + }); + }) + } +}); +$(document).on('turbolinks:load', function() { + if ($('body.admins-laboratories-index-page').length > 0) { + var $searchContainer = $('.laboratory-list-form'); + var $searchForm = $searchContainer.find('form.search-form'); + var $list = $('.laboratory-list-container'); + + // ============== 新建 =============== + var $modal = $('.modal.admin-create-laboratory-modal'); + var $form = $modal.find('form.admin-create-laboratory-form'); + var $schoolSelect = $modal.find('.school-select'); + + $form.validate({ + errorElement: 'span', + errorClass: 'danger text-danger', + rules: { + school_id: { + required: true + } + }, + messages: { + school_id: { + required: '请选择所属单位' + } + } + }); + + // modal ready fire + $modal.on('show.bs.modal', function () { + $schoolSelect.select2('val', ' '); + }); + + // ************** 学校选择 ************* + var matcherFunc = function(params, data){ + if ($.trim(params.term) === '') { + return data; + } + if (typeof data.text === 'undefined') { + return null; + } + + if (data.name && data.name.indexOf(params.term) > -1) { + var modifiedData = $.extend({}, data, true); + return modifiedData; + } + + // Return `null` if the term should not be displayed + return null; + }; + + var defineSchoolSelect = function(schools) { + $schoolSelect.select2({ + theme: 'bootstrap4', + placeholder: '请选择单位', + minimumInputLength: 1, + data: schools, + templateResult: function (item) { + if(!item.id || item.id === '') return item.text; + return item.name; + }, + templateSelection: function(item){ + if (item.id) { + $('#school_id').val(item.id); + } + return item.name || item.text; + }, + matcher: matcherFunc + }); + } + + $.ajax({ + url: '/api/schools/for_option.json', + dataType: 'json', + type: 'GET', + success: function(data) { + defineSchoolSelect(data.schools); + } + }); + + $modal.on('click', '.submit-btn', function(){ + $form.find('.error').html(''); + + if ($form.valid()) { + var url = $form.data('url'); + + $.ajax({ + method: 'POST', + dataType: 'json', + url: url, + data: $form.serialize(), + success: function(){ + $.notify({ message: '创建成功' }); + $modal.modal('hide'); + + setTimeout(function(){ + window.location.reload(); + }, 500); + }, + error: function(res){ + var data = res.responseJSON; + $form.find('.error').html(data.message); + } + }); + } + }); + + // ============= 添加管理员 ============== + var $addMemberModal = $('.admin-add-laboratory-user-modal'); + var $addMemberForm = $addMemberModal.find('.admin-add-laboratory-user-form'); + var $memberSelect = $addMemberModal.find('.laboratory-user-select'); + var $laboratoryIdInput = $addMemberForm.find('input[name="laboratory_id"]') + + $addMemberModal.on('show.bs.modal', function(event){ + var $link = $(event.relatedTarget); + var laboratoryId = $link.data('laboratory-id'); + $laboratoryIdInput.val(laboratoryId); + + $memberSelect.select2('val', ' '); + }); + + $memberSelect.select2({ + theme: 'bootstrap4', + placeholder: '请输入要添加的管理员姓名', + multiple: true, + minimumInputLength: 1, + ajax: { + delay: 500, + url: '/admins/users', + dataType: 'json', + data: function(params){ + return { name: params.term }; + }, + processResults: function(data){ + return { results: data.users } + } + }, + templateResult: function (item) { + if(!item.id || item.id === '') return item.text; + return item.real_name; + }, + templateSelection: function(item){ + if (item.id) { + } + return item.real_name || item.text; + } + }); + + $addMemberModal.on('click', '.submit-btn', function(){ + $addMemberForm.find('.error').html(''); + + var laboratoryId = $laboratoryIdInput.val(); + var memberIds = $memberSelect.val(); + if (laboratoryId && memberIds && memberIds.length > 0) { + $.ajax({ + method: 'POST', + dataType: 'script', + url: '/admins/laboratories/' + laboratoryId + '/laboratory_user', + data: { user_ids: memberIds } + }); + } else { + $addMemberModal.modal('hide'); + } + }); + } +}); $(document).on('turbolinks:load', function() { if ($('body.admins-library-applies-index-page').length > 0) { var $searchFrom = $('.library-applies-list-form'); diff --git a/public/assets/admin-978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a.js.gz b/public/assets/admin-2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888.js.gz similarity index 98% rename from public/assets/admin-978e5ce607f77c26814a174f480da79ac246c2201868ef84654aa03bb6727b5a.js.gz rename to public/assets/admin-2cdb23442fa735025385b88f2900df04fef38b61530041a6dbe375ef0f0ae888.js.gz index 13e36b4f64ee1b4baf2eba0c6a154bdcdb331ab9..492769a782c4adc6ee8915a133b1af69aa04b256 100644 GIT binary patch delta 11464 zcmV;(EH~4e&N{o)ItL$%2mom#pn(U42LXi#0)+D68+tO#f`|@D-V+FgkkrsA#fltGwc~Y4heJKd3j## zwRB|*Bwej^9TJSrfx|$;M~3hiz5^jlfH1Q|;4K50B)}i@EZP2ve_^|-yKh&2+^Z{F zCRuPeB=+s@>gw*Q>gwvM>RWh8wOOws1F-@oLZQ2v!Gv?l(bMaH*IMjo!fN@Ir68`Y zl!I2QTw4iiPn4IU6IN@_1NpWeD=>og4l#J~O0&-g1JETL1!K0-?L}SI6MP8)qojSM z*)RGFvS60a^z2LyG{>RHhH;pKMI5bWs#8f8peDP~=M{|c>GNcdQ6V5lHJB3XGW989 zRKjS5(MNb9ox10L=Dafb^c|`e_8JD2C0o96FpLI#JwzY@95v$s^2y=MT@G+4%Ge zrr5CkXZ_06jnA(7-k`LGM>JMk2Q97VdxNAiI7GmvAb%f-fBCcpam>V2z1a_zT1aMb zZ#9(62Pg!O2PcXOCp#7Vz&9&dvg#_<^d~U#->Hge)k6fwpAkQs!>-`kD1_&y7x>9lms4pCSSr z6{H0Z#(h8h_z=SRP0*>g!k((eG{SBxgfo&&wQ73BPOVQe?N=@eo*fgE3`S$D2FJs* zpsjCx^5)iszYV{9W8>mgqtY0*TLIEQzKc2xxiC|IB_a9J%;(kt3fuIq&(zO}!T^`x*=;W(2kxE*=0DlzF%n^x0Z4 zKmV48@_aDc=5~4uRi|a`YXdfoFBgT;Sbl}1s(>F(l|I^=L3Bw zA7s$;9SM=L0Uuy!NnNnQ$nyRc9z5us9U;V9A0wshY7=m1o;Jcq3Efkc*9-Xih(t?;mwix|xptu6dPyi;&Lu8b97OnqN4urDq@-aNH_ z?Q2N{>9~`_#p+U<9p}xHMKV)#`9<%zut~?hQaJF?WRgp9c9u*#E#_S-eP6qO)X3HM z=H+krxQFk3xAEdBwOI@_J<%S%Qu2&>PgC)riqh_m%`f5_^w|%StrNnz8^Php$78&a zjKW;KnG`K|>(m)0HrB7aw0`|VK601*n49Z`-BwTwIS*9X=9j3xREVs0;RwtpLC6rC zB>sIt>`@wlmppBs;=)Eq4=}cWjnl_amUC@@?Tv)g2@E-hP9SX6JoZ1slzI@7ktO#%A^1JFRR#;0HiVb1M^PnKk`qm5d_BjQ zY8ZJNHP{!uN-UR>H@7|u`LTM-ng%?V!qP}lRS35kn3A)G%_A0n<*4o)CsK9TBv7an zBWKQjt=H_vJ}t!qE&I!Cu^`Z3N6sc2*;8S0R#jm~lzP+&iz#*kI_Lc21ZhUI7&sNJ z!Sqb+QPd540T@hn!P*{0pg&~T+S!C|*VN8{=M~`ul|(VZ=83He@Ninjr(%>Qb3B*y zJryIMq{`j3{@p}>#^|4ixr`FbO=~gxnHZ|143pL;xEE~(9d@3AWtyVViePkbGK?6v zr6O}M6`6xMk-2R$WWxGtDl)gFB6HgfFy|>Qn}S7;0K3sfJ%&q_t;uBeyq|46I^wpd%S3wLdCVIF4v}Y*XGZg-R=!Qb3XSSEAnb6dN)69dF zZq$#9DH^QVjKT5kflvuF{Ye*>Or%0Qn;j*;VQk^kDIlzM8MyDcUa{JVW%Gq&7?y9KaA1@@cxSt9c!>zQp5jAA-P zx_(o3ldK2*m8FQCEc2XON9Rs+ePQE|mqw?*nNiApCtf+c67;~X8`j{5ex=!AgH6?V zut}Nw7@#j>vTZ3~Y!Ty!yNJJ}gP1LN-0afL81~YC1+M`6a6#$Paj&_&3|f&7%t7>c z?o1wI(OPYOK#G=v+7rvYXth&69JN3b_j}7rL2|5g5Jmdz-eh0W()8NG8kY1L(l z3%K`s$Np!@J21Zpb%rlIzxmzYH@|sb>Gmh$UU0bIKgxb!fR~~Z<^D=g2h``;f46l{ zc-Yy0!P{>ydFrqE$}eZ{z-~w1Fb)30t+&4#e*0wtH8|1iKN2-NIGi;=ZutJ$(TArt zzx`_T%BhWuSBLLh0(D=0-2C*D;j6FlXa}Or2#ud3h}QS z)yqtlvoCOJ06!z&dpc=iD?oBq!JrfN*=BHmEU82FDDDX6Z+`y$)?1&C-v4-X^{i$u z5}0+Hq4v2K)SKY7F(y>Jgp+#-qq%_9JNBGUl4SPROs}kFaMdq-b@QkSf z)mHG7XxgW=JtUK!>j}IWsGJ(RsYTJUt7QO-0yig%{Uh;72>M$ac!NdR zc#uk=wlH9I(&d3{Jyr}L#yPlw%pMT|sAy}0cMP8hi$$_9$uQFJaEOd#il%2FuZLaM z8IQIYqiCSg&Gom$x*;@g1x4w4n!SNHllBG!2(>v7{ZIn{U{gBNT&(y;VRm4D9Kis( zaK}wQgb|#z6ETqTp#ncj;xSl=KB*>~M`5;ThqOOv+qrgi>$yu?Z(TCV4yh5hQ;a+O z)JGQ1VcwA{c{{}+zye{-w<>#x5qaVp&~V!aRP8E!F#G}dd4NZGnOIfiVF62Th&MnI zpEIdzm@(?fEKw4S3{##6BXWX&fAN{&mmdtzys`f68GoF;E7dijox>@CSZEx?VO`47 zMVCR8Mc6NZ13ed){6hQV4gdPd=)((qlzN#u-#{c!*fVcG7;-_oZbneNXWkxu099MD<**;Im(9ZE?8Z8)ae3Y6;Od^ zHP(d?B=}ls*5R^D{wRr0%o~0Nnz}>ddQ}G0;k>w%xbWG+D0=0%4cO?&a1<*t&2A2Kr%Hp>2lVUM0-cd{X+ZZb2!Q4LSo*&X5GJT(|5!*>t-icy6FaK15zreLklMUu^P_V$}o406~e&4V}kp}$!`28 z(#EwP88r3ru*ZplpME9oKy-d{Xm;-UiQzbX7q|9sk(%OvlV>@ZLJA#8qr*>MAD&fP zdV3XYS72YD&b*o1JP5-DP2@AhW&s$yl;Xz%cE`PG|kD>t-+9Z6bMs^3_Mp7YrQ^*)}lDbpFz@SeumaP&}3=`Ri&&`uPGG`CY_ zz*Dv;bR^WUgj-l5Sviu9JBBq6D4R)MM(Ao-&dt!e{WsRw>9o2#j;dj;EXh2V9S#$h zB)e{*qP6dYPx1^TYA2J0Rk(Doip&ZL5OJMak+t}L)jYqBr%-}84r(i6XXDvSvcOce z`c8Cenjz5`hi=^~D6M7V`kR~Iy|(qv@7J$=Jwru=f(I*6KnBH3c$jJ?86MPPNEO`X z4MecYgYEf6G{3noVCoDt5Lq+HQ(@IbTbN#3BAVVP!P3#X+U_sATd{(ap3(-A^g~Ca z*3w9Sbz>G=OU+6!7^5Hr8se%N+LVJ*iC~$d6U^BI=<>E%ji_q?{GIp(@byY>#}q?w z?IqL0sHI?%K*@7q4uL0R+9B|yP(Dx~8aH?6vKj1U>$)y%kr>2k}=nNTSQ~hotumKwBtP>TT7t! z91iZ>lPsMw@Tvv`_bq%As%i+DwBe9?Sx&t!kP!8hxYrq8cvZ2^3?|!IJy7AmZc03V zjA*S2BLpzP7C5E}Mj7!Gg1#^&t~7>D4YFFGUArk$+~=Anhx_=ML@(Plg0yLA3Q}xZ za;&1su}rvmw+B3888*|jJy6z7=bN3Vnnlb|$Fh;f-()9oSNK&gl0L#I&}_E_(o`JSx#>z6`FMUR6^;rrzu8%THeC>~ zxnV0%9uDO=Sjrz9X!s>4#HjI6c&j?&WG5UE-zRv?no@A7Igxw+h&xnLpB$-GzC|1& zb=I&p1slN%M+)|m7@O!@fPI3`>dxFga&$Ky!@NY{HYzD}A#o|%kH&diqeRb{4s&dF zLrD4i{AqDF`o^IR9X*WSU^<95#9?*8sRaZLIk{8adNqgV^Vko@AArK3^ z#`J3;he^vcPD#O0HN?;yB2>i%)XY&?RpqJ+eg55@cR>sNhzO-M* zUv;^$F>k%(O_oN5t|Xi0CG=pt`ZT5es1+#%4!tPB+o;C;B5-*fFMUi$I5h5MCDPgLdm!jO)}X+Baj0BTD<$vzgE_6D;>Q3 z_QC$yV?p_;d&>WNzWmRN$I9yGwfWLN9vl?^PbIT__SXH0G!Y5{iX!et#IyuS8c#o6 zOpvI=VL#?b!(9}UrK`0FIII@6lhBGmsW3c$et7l_yo7Oo_VnmK-}vGBvjv^hx9<%^ z>dx9pI~+MC#`qGcsm4W1{Dp)|5jiDmM~qHzd@1N1TNKF<7p+X8T=&w%@BUCkvr;-Jn>9iiNqeP-Z7#L}O`8d(+ML5$uM+m@L(%x*?13UZ&uEnv# zSwm~Kw9RdQq)0*KlrI;j1R1btdL3vcOKiY4+u3~Pz$`Q3Ze(E|uX^r6R*p$Ms|FL~ zfyvLkIJ+tIvjA6O1E9 zK~J_ z0yUgqkb;IL1St^FiutpCDj^E3=29FZb8IO(A%jUoXo>@l9iSqf?2}D(KlfVHY6abXh}Y~H4(`=PK%5ta z<7t6L89)_sHQ5Lt34IusdvFb_-A-andXHgMR@W!0h#e+6szc-AG6N)U=Yl9Yo1%!y zwBL#Y2G!)bK*CM%-ne6%TZwr-d4Z>$^7amYIVh(+gF$xIw)=$($6cJlud>=%f(BN8 zN%IZs2l+^GJ17FYl2;2_Ey$|&qs&tZ%J3MbKm+4o)Xg5-y@fF{sepn^j!Mcg0+>qj zWN>^!X2#Di{KZk#PTMefFoeOhLjn^rKqwElCN2vIH?!pKHZ+Q=7p7R56_+Vg^hq62N)slk}Bj{ zzsx;l>Rod^bsT}oT7p|e?*h=DFYa&ABZS~agb8{XzP;lrxqI3Apr33_T!o80e zq{FQ0gIKlFU1I=e`|(o%v|< z!Yi^GWLCTfbD{p04N`}}h8+_Ylt&FZ+mHeA2$(;8zyy@%f1IE1p17eBhU0fktR_!E z{}Yif$`r}BF6y%GvcDM@)hkg1PX}@yO;bX$@46izCb{R1Q467^$$b_8GT#AXNe z=5kZ+w`2E+n}9=8?@Tip)bJvlB8To0lVy^BvyCrOu=VW0K4Ya4%RH&)VGm~q)<$MO z`a`!f^sHYa@!-O%8-J{|K$h`cs!&kx0AV4wq!eeioJ+Sgz=7SdaV&`_yk3Lhx+xo%QDN zyM~vq51;>d)jA?AK-0}jEr7{oy8mc)E zMETc04bNTTlvt@$e0>t8>#C$eP!ZcI-={pzcz&Fx%%e6f3i z>b5`VG@^-rxLd3@iC-+KDmOC2DOP@V8j(mn-DzIm7I6{e7d1U8TOZbT=MD!nj2L6p zd&yI;VrD!APa-1Vppgt)PxG4|E|H}-J3=P%1WkA;l7~xQDs!^JH1|R&b}N)3J8{ik zD8-FE0Eico9oL9ER{ssqb|?jYCn|f2Ly+gVOSF`KcK$s@VFw2Z=??pg#n7b%Y zU8Pwsp~F0})>3r&&RBP+Y!F>F>w4NWSo<+ephvqA$#XgQ@y{7-@~X+KPxjVY=0PJD zTx!kyf?wtCZcy>g)Bs5%#`fMc6aZfBA(2a*RK%3m3S>f=MG3e>+L9XqLj2ibGdV8+ zsBf!(Lc#}d{-oXVXisgm%TgX1mndo%c0ryzu15y-49}h({{8EXcYn_*NDJqgBydN! z>zQ735Ly6wj}S3aj@}Wj>OV>V4Rv@xLlTklihqao$_oOsE-(5H!rhesR5?QPoGm{4 zj>;k-pK0%}wrY|IstlPh&pUDS6yHMZ8)w#Mi)tn&m-KLwl z*VBUyQUuC-R?&-#d2umJ|u|ZZIn8$lRQN z_oU7gY4|$E7(++G4V^NbiCXKc?lpxP4(qXmsN{{J)2(gE_2 zXVn+ou?%)e(U1wtkvuE`23;3_z$zjYL#Zcl1KWK|R#WZ2k z6f6aUZx2IgJPx~L{?DG<`0At4D=%*S-!YRb1b7i**p`NU`gw5JPZDP9 z`-T~>NkWH`g|0=d)pkc->0A1lF(8{VC7>z?l)Ue^znI#II4$HE8*Y++NpYGsPLBe0Fv8*4IB=e`V|3GjK7Cq6a>r zfZ4k6H`1lP1CbdmfIBaL-C2w>b#}G)4in6nDh_XBWi~dvjh*=J%fNSEeth?h$9LZ( z_}cbyN)ftDGb7FLrez#$98wJ7;wjop=Mp*sx?QN`SW*}(wO$HrExVRo&BikkLB0V^ zQ?aaLgj1tSjw`BKi;0V03uxGB#%YF*b<8;AaI>bwF;-}nJx`s@wYSD=&5%>rPM~H_gzvTo>e8mS0btwx zXU%c0p7So!QqT_{MxSZ0X|9p9LbX=ZHxmLe3AxIRc2BL84?mO`33;AF_W30HQ*O7* z^}5PH9|t{LepY;caQ?tQmFIt1om1o;-h3d;xTKJ_;w@g3mv1JcTTQ_)`l)m;!3t`wdR8JXmiGhiVWDzT)iLeBZs&eHrTJNU7Ghsv;kl-6)NZIEI!dYhuH zRKyYNN(MHxOvb^Iyd0p`O!Y{oY2@q^7ajQ3l|d4}Z_`xDcgdr{lKs3Uhb!sR0643^ zXvV=1i)jLvJgKHvn)V%Rf2Db1wS#x1QLp*bPA*?vp!RNE_wozxc79<&cgX|4V~DpE z#-8gjwL-;z1eDOOREJelWi2-!Pb-uR;BuACx7Q3?h}pTr7LumeX>S8_Lj|tF7{|1^ zIY^&y>S{W6oVN^Io;#Y%2Va9aEi>&m=~%5JXvmk){`?4uXtRh$`f^I`g~raBccK{ zVDM3c1oy(ABo4H;NW-MDc-giPGc+pw=28pBu4V&rX_h+?D+5>L1P_3Hj3crLHYbiW zEi3?=R9Q=2j@^oK({_ZWqqJq5!zE<1ml%%tt#09w$BrhsI+ZQS@*w6`C_rh3XjEj~ zIXm2ck}P{1EQ`d4I3s#sffhVaP|tXseqrOwYZ9HH)ry`x496)I^rD$F$M^svi&(y2 zO3gIF+Hvc_=dndtkG^YSN!d@5=t#F-wad`9+B??#r4AbNsa4hY0lln))FP8qojNmm z^9%0#=G(7cZbw$TMRmG}UXznAmYb}yZ>@5FzGZfEM3ou%O!o&R|A z@<*Jk=JuY-&3q~s-yO^IUasdYhlI5;0!CIWrQ}ID_#?l#J2qw1!L*!Fa$?B03R81e znvJ*!{?K@F;g`fihyLi?pSiq3?_hKTc=hu7l{4%k<@$XtaR_(D``xMDlKfPEY^Px` z;kAgXFKj;d?eOCH;d>tpFZ_jPluBNjaLQV7@lBY^)zfqsZ0ntm=BzANE(V+b`6j`V zOm@>Gz@lto^R)ezIT%sYBTH-B%HsrPtQ(rhN#dU`brapvfVoe9r!+a!2ixhc8}#HfpFZNu|xt z{~z`sYKUJIjF&!REffI$>tNB$X<-hiAFsm5tpPD2-}vKsYd~Y+(QqXT==zn{*)ptO zy*m8UU()7k{ra=44u2ha^O@(95t-kUk@Ky`ZeV^_4gT`>#??=U-+a7r>18^l=65x> zR#jJ}mp+5{ob9T{ceNyc`0rw3Zoy}b%aRT=c!}?wlwjpl0`K6{HjLMfyO_v?&X_0; zYb%{5lZ<6n&>CYK3l&>r}^5r69#~M_V30|FIm?P+XUd&? zb>()K{-FbgS5F~46U|uL>_rPi|M%6Pbu?nU#dRv#Phr9YVH04fx?I0O1 z`0!aC3c)n~^()V8p8BegnmBBC9v9oTRXx@6lVPn?F6WFTj&McfAq=T>dp4?oOY;o? zGYm9Ysx?!=llNDDrs|q(@vW%#1U{Or$lfA$ zxEDSd^y=PnFQ|ti<>xP)Ct+MyUi;Tj`9YGiO?YY`o$@MW1eoz$p9#s4q|F9*!yfO$ z?(@Fa=YD8^uQXwzRcnHFGv_MVrQI1<)7C33#V{(ZO?3gvJ1~Mfld&If_L~f|JfrW7 zc@J(vJaJ(W%LY>~`_ACXZ0h#(Ol{c-W~P;2GFh&atZe4=?_LJ!T_XjVoSNH;p3_DtX;w~&P`>?2P`{~9^t9lwiYt)mL z=4FEPV#)@LFMDy@*bMQX16QiY*d#re{Z=K;sx9|bd+ESyKump`5&?=VoioCbPH&m- zsYur|jBXq<9%S^=@Sfo9$^4y;dxg?95xe$2WbSeA=%q+WA=x=B^}5^0W;r2%w7iy1 zFne!*N$$NRdDFcm=@b>Y^P}dWbLab#8aw~@cw-Wkg|Sad>chLKADJ|le($--l#H!8 zsQf0#-Flp@TeP#RcshtZf7`uWc*@5%^ADH2N7!D|Me(~7vIPx~FtCJMPptGL`LQ3_ z%Eym}|GvtY^EYe*24(htl@A|z^jGDh(Gy{R2crvoCcXoKbFJTNlw&ADym`1yau6fD zG(+rJ;{Nxbx7>=B*y#lCxt5b+hIgYQJ;5qZI720$a8 zHvq6Xny@m|dZZUEGfC6GH|X6Lwt|zzgZO0DjJz@uS6zLaMdK<6B;iv$AZ)?=XZ8nw zKGXrqg2%wj^U)`!AE2tLXj^SCJ!wV6mFTxq={HmIR?5DSf{q3=+lgr5VGum(gsE*& z)QX#39vaDihP|F2Zs2&Z5*=3wNUi4Gs0-!TT>LC78gN{F@4Jl`PmRuhym9X3;l)qc zuN*|Py^QyY&G1Pc;>8*#OZ+?bl>)(kY4d_s*o#N6p53^3b#&o{%~O9KzI18${C{q} z_17e%N*qnGCbcEt2UkQ@=EG~_04}f=Z;Y;5F+7HqFe*FqJkaHl#5)5DJ2(uB=rF~w!*NtbQM#w9R~C{!nA~cV~aw% zm~@X%8TFa4bG^jD>Ki%Spt>ij^ICWCS_BV}73j@UoS$_R;)Vg=`6yD6szvQ?D>Slg zWFtnJj7RQ(13A7Iaj(G_wl4f_^w!twSI%sH`pNLs*WkSP@u|@>e^$7s%%&rJbIgP$ iEeP6KU2y#^e+RO@0iF@KPPp(3@xK5Nlf>V64nqJ!`B!-W delta 10633 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�?qD@V>e^eBk&WfL+4`@Z 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ഈi-6`csM&ScixllWHe4cNq(h`M-7-P| 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�?qD@V>e^eBk&WfL+4`@Z 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 Jf?A$w9st)g-qipA diff --git a/public/assets/application-9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb.js.gz b/public/assets/application-9cfbc3d792599a1d0de5c7b84209e1c2b2e60336f0f01e19f0581663918708fb.js.gz index af63ccbfca481acff607967fc65cf6df7329d276..d17b8f444c2f4cfd5c4dd71760185a6a55ab338c 100644 GIT binary patch delta 24 fcmdn|n`85D4tDu&4u*`_o<{aocE+vjOlxcbbwvm> delta 24 gcmdn|n`85D4tDu&4u(k=S{vD0*%`O8Gp(@&0DOK3$p8QV diff --git a/public/assets/college-18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287.js.gz b/public/assets/college-18f5e8400331634e898a35acc2187815c096c25e0ab74aba341ae916166cd287.js.gz index 3a4c01edc0767b3d156ec9a3c885818476104e46..d4b8b22dcb0fc0b93625588cfa2b1111decd807e 100644 GIT binary patch delta 48 zcmeC!qTR7Yn_a$}gCQffr;)vtow1djsg<3%m7S%Powb#nt(6@p$kEEqxs{!Z@fH9` CG7K94 delta 48 zcmeC!qTR7Yn_a$}gJIHz)<*VLcE(nArdD?5R(6(FcGgyQwpMnaAV(`Z=T>$u##;bg CdknDv