diff --git a/app/controllers/challenges_controller.rb b/app/controllers/challenges_controller.rb index c7fcb4423..695f264e7 100644 --- a/app/controllers/challenges_controller.rb +++ b/app/controllers/challenges_controller.rb @@ -10,11 +10,10 @@ class ChallengesController < ApplicationController # 关卡访问的权限控制 before_action :shixun_access_allowed, only: [:index] - include ShixunsHelper include ChallengesHelper - + # 新建实践题 def new @@ -163,7 +162,7 @@ class ChallengesController < ApplicationController @shixun.increment!(:visits) end - + def show @tab = params[:tab].nil? ? 1 : params[:tab].to_i diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index d0a2e5e4b..75cb22b6c 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -1,6 +1,5 @@ class CoursesController < ApplicationController include MessagesHelper - include ExportHelper include CustomSortable # model validation error diff --git a/app/controllers/graduation_tasks_controller.rb b/app/controllers/graduation_tasks_controller.rb deleted file mode 100644 index 6196aa5f5..000000000 --- a/app/controllers/graduation_tasks_controller.rb +++ /dev/null @@ -1,755 +0,0 @@ -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, - :cross_comment_setting, :assign_works, :commit_comment_setting, :sonar] - before_action :find_task, only: [:edit, :update, :settings, :update_settings, :tasks_list, :show, :show_comment, - :cross_comment_setting, :assign_works, :commit_comment_setting, :sonar] - 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, :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 - search = "#{params[:search].to_s.strip.downcase}" - order = params[:order] - page = params[:page] ? params[:page].to_i : 1 - - default_order = "IF(ISNULL(graduation_tasks.publish_time),0,1), graduation_tasks.publish_time DESC, graduation_tasks.created_at DESC" - @identity = current_user.course_identity(@course) - if @identity < Course::STUDENT - @tasks = @course.graduation_tasks.where("graduation_tasks.name like ?", "%#{search}%") - else - @tasks = @course.graduation_tasks.where("graduation_tasks.name like ? and publish_time <= '#{Time.now}'", "%#{search}%") - end - - if order.present? && order != "all" - if @course.is_end - @tasks = @tasks.none - elsif order.to_i == 4 # 补交 - @tasks = @tasks.where("status > 1 and allow_late = 1 and (late_time is null or late_time > '#{Time.now}')") - else - @tasks = @tasks.where(status: order) - end - end - - @member = @course.course_members.find_by(user_id: current_user.id, is_active: 1) - @all_count = @course.graduation_tasks.size - @published_count = @course.graduation_tasks.where("publish_time <= '#{Time.now}'").size - @task_count = @tasks.size - @tasks = @tasks.reorder("#{default_order}").page(page).per(15).includes(:graduation_works) - end - - # 任务问答 - def show - @attachments = @task.attachments - @current_user = current_user - end - - # 毕设任务列表 - def tasks_list - # 搜索栏数据 - @current_user = current_user - - # 分页参数 - page = params[:page] || 1 - limit = params[:limit] || 20 - @work = @task.graduation_works.where(user_id: current_user.id) - @students = @course.students - @assign_power = @user_course_identity < Course::STUDENT && @task.cross_comment && @task.comment_status == 2 - #end_time @task.allow_late ? @task.late_time : @task.end_time - # 任务发布的情况下: 是老师身份或者任务已截止的情况下公开任务了作品设置的学生也能查看其他人的作品 - if @task.published? && (@user_course_identity < Course::STUDENT || - (@user_course_identity == Course::STUDENT && @work.present? && @work.take.work_status > 0 && - ((!@task.allow_late && @task.status > 1) || (@task.allow_late && @task.late_time && @task.late_time < Time.now)) && - (@task.open_work || @task.open_score))) - - _tasks_list - - # 排序 - rorder = params[:order].blank? ? "update_time" : params[:order] - b_order = params[:b_order].blank? ? "desc" : params[:b_order] - if rorder == "update_time" || rorder == "work_score" - @work_list = @work_list.order("graduation_works.#{rorder} #{b_order}") - elsif rorder == "student_id" - @work_list = @work_list.joins(user: :user_extension).order("user_extensions.#{rorder} #{b_order}") - end - - @view_work = @task.open_work || @user_course_identity < Course::STUDENT - - @work_count = @work_list.count - @work_excel = @work_list - @work_list = @work_list.page(page).per(limit) - - if params[:format] == "xlsx" - complete_works = @work_excel.where("work_status > 0").size - if @user_course_identity >= Course::STUDENT - tip_exception(403, "无权限操作") - elsif complete_works == 0 - normal_status(-1,"暂无用户提交") - elsif params[:export].present? && params[:export] - normal_status(0,"正在下载中") - else - respond_to do |format| - format.xlsx{ - set_export_cookies - graduation_work_to_xlsx(@work_excel,@task,current_user) - task_export_name_ = "#{current_user.real_name}_#{@course.name}_#{@task.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}" - render xlsx: "#{task_export_name_.strip}",template: "graduation_tasks/tasks_list.xlsx.axlsx",locals: {table_columns:@head_cells_column, task_users:@task_cells_column} - } - end - end - elsif params[:format] == "zip" - if @user_course_identity >= Course::STUDENT - tip_exception(403, "无权限操作") - else - zip_works = @work_excel.where("work_status > 0") - status = checkfileSize(zip_works) - if status == 0 - if params[:export].present? && params[:export] - normal_status(0,"正在下载中") - else - respond_to do |format| - format.zip{ - set_export_cookies - zipfile = zip_homework_common @task, zip_works - file = decode64(zipfile[0][:base64file]) - send_file "#{OUTPUT_FOLDER}/#{file}", filename: filename_for_content_disposition(file), type: 'application/zip' - } - end - end - else - normal_status(status,status == -2 ? "500M" : "无附件可下载") - end - end - end - else - @work_list = !@task.published? ? [] : @work - @view_work = false - @work_count = @work_list.count - @all_work_count = @work_list.count - if params[:format] == "xlsx" || params[:format] == "zip" - normal_status(-1,"毕设任务未发布") - end - end - end - - - # 评论列表接口、 包含一级和二级评论的获取 - def show_comment - @page = params[:page] || 1 - @limit = params[:limit] || 10 - @parent = params[:parent_id] - @current_user = current_user - - @messages = @task.journals_for_messages - @messages_count = @messages.count - if @parent - @messages = @messages.where(m_parent_id: @parent).order("created_on asc") - else - @messages = @messages.parent_comment.order("created_on desc") - end - - @messages = @messages.page(@page).per(@limit) - end - - def create - ActiveRecord::Base.transaction do - begin - @graduation_task = GraduationTask.new(graduation_task_params) - @graduation_task.course_id = @course.id - @graduation_task.user_id = current_user.id - @graduation_task.base_on_project = @graduation_task.task_type == 2 ? 1 : 0 - if @graduation_task.save! - # 为学生创建作品 - @graduation_task.create_work_list - - Attachment.associate_container(params[:attachment_ids], @graduation_task.id, @graduation_task.class) if params[:attachment_ids] - end - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - end - - def new - left_banner_content = @course.course_modules.search_by_module_type("graduation") - if left_banner_content.present? - banner = left_banner_content.first.course_second_categories.last - @left_banner_id = banner.id - @left_banner_name = banner.name - else - normal_status(-1,"左侧导航不存在!") - end - end - - def edit - left_banner_content = @course.course_modules.search_by_module_type("graduation") - if left_banner_content.present? - banner = left_banner_content.first.course_second_categories.last - @left_banner_id = banner.id - @left_banner_name = banner.name - end - end - - def update - ActiveRecord::Base.transaction do - begin - @task.update_attributes(graduation_task_params) - Attachment.associate_container(params[:attachment_ids], @task.id, @task.class) if params[:attachment_ids] - normal_status(0, "更新成功") - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - end - - # 代码检测 - def sonar - tip_exception(403, "无权限访问") unless current_user.admin_or_business? - - _tasks_list - @work_list = @work_list.where("work_status > 0") - - person_list = @work_list.map do |work| - o = { - name: "#{work.user&.real_name}", - uid: "#{work.user&.student_id}", - downloadUrl: '' - } - attachment = work.attachments.last - if attachment - o[:downloadUrl] = "#{edu_setting('host_name')}"+download_url(attachment) - end - - o - end - filename = "#{@task.name}_#{Time.now.strftime('%Y%m%d%H%M%S')}.json" - json = File.open("/tmp/#{filename}", "w+") - json.puts(person_list.to_json) - json.close - - send_file json.path, filename: filename - end - - # 设为公开 - def set_public - tip_exception("仅公开课堂才能公开毕设任务") if @course.is_public == 0 - tasks = @course.graduation_tasks.where(id: params[:task_ids]) - tasks.update_all(is_public: 1) - normal_status(0, "更新成功") - end - - # 删除多个任务 - def multi_destroy - ActiveRecord::Base.transaction do - begin - tasks = @course.graduation_tasks.where(id: params[:task_ids]) - - tasks.destroy_all - - # 这些写是因为model中的关联删除无法删除is_delete=0的作品 - GraduationWork.where(graduation_work_id: tasks.pluck(:id)).destroy_all - normal_status(0, "删除成功") - - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - end - - # 加入题库 - def add_to_bank - ActiveRecord::Base.transaction do - begin - tasks = @course.graduation_tasks.where(id: params[:task_ids]) - - tasks.each do |task| - task_bank = current_user.gtask_banks.find_by(graduation_task_id: task.id) - - # 已加入的更新,未加入的新建 - if task_bank.present? - task_bank.update_attributes(name: task.name, description: task.description, course_list_id: @course.course_list_id, - min_num: task.min_num, max_num: task.max_num, base_on_project: task.base_on_project) - task_bank.attachments.destroy_all - else - task_bank = GtaskBank.new(name: task.name, description: task.description, user_id: current_user.id, - task_type: task.task_type, quotes: 1, graduation_task_id: task.id, - min_num: task.min_num, max_num: task.max_num, base_on_project: task.base_on_project, - course_list_id: @course.course_list_id) - - task_bank.save! - task.update_attributes!(gtask_bank_id: task_bank.id) - end - task.attachments.each do |attachment| - att = attachment.copy - att.author_id = task_bank.user_id - att.copy_from = attachment.id - task_bank.attachments << att - end - end - - normal_status(0,"加入题库成功") - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - end - - def publish_task - 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) - - # ActiveRecord::Base.transaction do - begin - tasks = @course.graduation_tasks.where(id: params[:task_ids], status: 0). - where("publish_time is null or publish_time > '#{Time.now}'") - - tasks.each do |task| - task.publish_time = Time.now - task.status = 1 - - task.end_time = params[:end_time] - - # 补交结束时间 - task.late_time = Time.at(task.end_time.to_i + 30*24*3600) if task.allow_late && task.late_time.nil? - - task.save! - GraduationTaskPublishNotifyJob.perform_later(task.id) - task.act_as_course_activity - end - normal_status(0, "发布成功") - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - # end - end - - def end_task - ActiveRecord::Base.transaction do - begin - tasks = @course.graduation_tasks.where(id: params[:task_ids], status: 1) - - tasks.each do |task| - task.end_time = Time.now - task.status = 2 - task.save! - end - normal_status(0, "更新成功") - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - end - - def settings - @current_user = current_user - end - - def update_settings - ActiveRecord::Base.transaction do - begin - unless @course.is_end - - # 分组设置 已有提交作品或关联项目的,则“基于项目实施”不能修改, 已有提交作品的人数限制的范围只能扩大,不能缩小 - if @task.task_type == 2 - @task.min_num = @task.student_commit_works ? (params[:min_num].to_i > @task.min_num ? @task.min_num : params[:min_num]) - : params[:min_num] - @task.max_num = @task.student_commit_works ? (params[:max_num].to_i < @task.max_num ? @task.max_num : params[:max_num]) - : params[:max_num] - unless @task.student_relate_projects - tip_exception("base_on_project参数不能为空") if params[:base_on_project].blank? - @task.base_on_project = params[:base_on_project].to_i - end - end - - # 发布设置 - if @task.status == 0 - tip_exception("发布时间不能为空") if params[:publish_time].blank? - tip_exception("截止时间不能为空") if params[:end_time].blank? - tip_exception("发布时间不能早于当前时间") if params[:publish_time].to_time <= Time.now - tip_exception("截止时间不能早于当前时间") if params[:end_time].to_time <= Time.now - tip_exception("截止时间必须晚于发布时间") if params[:publish_time].to_time >= params[:end_time].to_time - tip_exception("截止时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if - @course.end_date.present? && params[:end_time].to_time > @course.end_date.end_of_day - - @task.publish_time = params[:publish_time] - @task.end_time = params[:end_time] - if @task.publish_time <= Time.now - @task.status = 1 - send_tiding = true - end - - elsif @task.status < 2 - tip_exception("截止时间不能为空") if params[:end_time].blank? - tip_exception("截止时间不能早于当前时间") if params[:end_time] <= Time.now.strftime("%Y-%m-%d %H:%M:%S") - 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) - @task.end_time = params[:end_time] - end - - # 补交设置 - # @task.allow_late = params[:allow_late] - # @task.late_penalty = params[:allow_late].to_i == 1 ? params[:late_penalty] : 0 - current_late_penalty = @task.late_penalty - if params[:allow_late].to_i == 1 - tip_exception("补交结束时间不能为空") if params[:late_time].blank? - tip_exception("补交结束时间不能早于截止时间") if params[:late_time] <= @task.end_time - tip_exception("补交结束时间不能晚于课堂结束时间(#{@course.end_date.end_of_day.strftime("%Y-%m-%d %H:%M")})") if - @course.end_date.present? && params[:late_time] > strf_time(@course.end_date.end_of_day) - tip_exception("迟交扣分应为正整数") if params[:late_penalty] && params[:late_penalty].to_i < 0 - - @task.allow_late = true - @task.late_time = params[:late_time] - @task.late_penalty = params[:late_penalty].to_i - else - @task.allow_late = false - @task.late_penalty = 0 - end - - # 迟交扣分有变动则更新迟交学生的成绩 - if @task.late_penalty != current_late_penalty - @task.graduation_works.where(work_status: 2).each do |work| - work.late_penalty = @task.late_penalty - work.save! - end - end - - # 评分设置 - unless @task.cross_comment && @task.comment_time && @task.comment_time < Time.now - @task.cross_comment = params[:cross_comment].to_i - - tip_exception("评阅时间不能为空") if @task.cross_comment && params[:comment_time].blank? - tip_exception("评阅时间应当大于截止时间") if @task.cross_comment && params[:comment_time] <= @task.end_time - - @task.comment_time = @task.cross_comment ? params[:comment_time] : nil - - @task.comment_status = 2 if @task.cross_comment && @task.comment_status == 0 - - @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 - # 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 - - # 公开设置 - @task.open_work = params[:open_work] ? params[:open_work].to_i : 0 - @task.open_score = params[:open_score] ? params[:open_score].to_i : 0 - @task.save! - - if send_tiding - GraduationTaskPublishNotifyJob.perform_later(@task.id) - @task.act_as_course_activity - end - - normal_status(0, "更新成功") - else - tip_exception("课堂已结束不能再更新") - end - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - end - - def cross_comment_setting - @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].map(&:to_i) unless params[:group_ids].blank? - page = params[:page] ? params[:page].to_i : 1 - limit = params[:limit] ? params[:limit].to_i : 10 - - # 取所有课堂的作品 - 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)) - 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? - @task.update_attributes(comment_status: 2) - works.each do |work| - # 之前分配的老师但现在未分配时需要删除 - 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) - 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]).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) - 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 - def find_task - begin - @task = GraduationTask.find(params[:id]) - @course = @task.course - rescue Exception => e - uid_logger(e.message) - tip_exception("id不存在") - end - end - - # 未发布时非老师角色不能访问,发布后非课堂成员不能访问未公开的任务 - def task_publish - if (@user_course_identity >= Course::STUDENT && @task.status < 1) || - (@user_course_identity > Course::STUDENT && (@course.is_public == 0 || !@task.is_public)) - tip_exception(-1,"任务还未发布,无法查看") - end - end - - def graduation_task_params - tip_exception("类型参数不能为空") if params[:task_type].blank? - tip_exception("名称不能为空") if params[:name].blank? - tip_exception("名称不能超过60个字符") if params[:name].length > 60 #6.11 -hs - tip_exception("描述不能为空") if params[:description].blank? - params.require(:graduation_task).permit(:task_type, :name, :description) - end - - def require_id_params - tip_exception("请至少选择一个毕设任务") if params[:task_ids].blank? - tip_exception("批量设置不能超过15个") if params[:task_ids].length > 15 - end - - def valid_params - if @task.task_type == 2 - tip_exception("最小人数不能为空") if params[:min_num].blank? - tip_exception("最大人数不能为空") if params[:max_num].blank? - tip_exception("最小人数不能少于1") if params[:min_num].to_i <= 0 - 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 _tasks_list - # 如有有分班则看分班内的学生,否则看所有学生的作品 - user_ids = - if @user_course_identity < Course::STUDENT - @course.teacher_group_user_ids(current_user.id) - else - course_group_id = @course.course_member(current_user.id).course_group_id - @course.students.where(course_group_id: course_group_id).pluck(:user_id) - end - - @work_list = @task.graduation_works.where(user_id: user_ids).includes(user: [:user_extension]) - @all_work_count = @work_list.count - @teachers = @course.teachers.where.not(user_id: current_user.id).includes(:user) - # 教师评阅搜索 0: 未评, 1 已评 - unless params[:teacher_comment].blank? - graduation_work_ids = GraduationWorkScore.where(graduation_work_id: @work_list.map(&:id)).pluck(:graduation_work_id) - if params[:teacher_comment].to_i == 0 - @work_list = @work_list.where("work_status != 0") - elsif params[:teacher_comment].to_i == 1 - @work_list = @work_list.where("work_status != 0").where(id: graduation_work_ids) - end - end - - # 作品状态 0: 未提交, 1 按时提交, 2 延迟提交 - unless params[:task_status].blank? - @work_list = @work_list.where(work_status: params[:task_status]) - end - - # 分班情况 - unless params[:course_group].blank? - group_user_ids = @course.students.where(course_group_id: params[:course_group]).pluck(:user_id) - # 有分组只可能是老师身份查看列表 - @work_list = @work_list.where(user_id: group_user_ids) - end - - # 只看我的交叉评阅 - 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 - @work_list = @task.graduation_works.where(id: graduation_work_id) - end - - # 组员、组长作品的筛选 - if @task.task_type == 2 && !params[:member_work].blank? - if params[:member_work].to_i == 1 - @work_list = @work_list.where("user_id = commit_user_id") - elsif params[:member_work].to_i == 0 - @work_list = @work_list.where("user_id != commit_user_id") - end - end - - # 输入姓名和学号搜索 - # TODO user_extension 如果修改 请调整 - unless params[:search].blank? - @work_list = @work_list.joins(user: :user_extension).where("concat(lastname, firstname) like ? - or student_id like ?", "%#{params[:search]}%", "%#{params[:search]}%") - end - end - - # - # def graduation_work_to_xls items - # xls_report = StringIO.new - # book = Spreadsheet::Workbook.new - # sheet1 = book.create_worksheet :name => "学生成绩" - # blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 - # sheet1.row(0).default_format = blue - # course = @task.course - # count_row = 1 - # list = 0 - # if @task.task_type == 1 - # if @task.cross_comment - # sheet1.row(0).concat(["学生id","真实姓名", "登录名", "学号", "电子邮箱", "分班", "作品描述", "教师评分","交叉评分", "迟交扣分", - # "成绩", "更新时间"]) - # else - # sheet1.row(0).concat(["学生id", "真实姓名", "登录名", "学号", "电子邮箱", "分班", "作品描述", "教师评分", "迟交扣分", - # "成绩", "更新时间"]) - # end - # items.each do |work| - # sheet1[count_row,list] = work.user.id - # sheet1[count_row,list+=1] = work.user.full_name - # sheet1[count_row,list+=1] = work.user.login - # sheet1[count_row,list+=1] = work.user.student_id - # sheet1[count_row,list+=1] = work.user.mail - # sheet1[count_row,list+=1] = work.class_grouping_name - # sheet1[count_row,list+=1] = strip_html work.description if work.description - # sheet1[count_row,list+=1] = work.teacher_score.nil? ? "未评分" : work.teacher_score.round(1) - # if @task.cross_comment - # sheet1[count_row,list+=1] = work.cross_score.nil? ? "未评分" : work.cross_score.round(1) - # end - # sheet1[count_row,list+=1] = work.late_penalty - # sheet1[count_row,list+=1] = work.respond_to?("work_score") ? work.work_score.nil? ? "未评分" : work.work_score.round(1) : "未评分" - # sheet1[count_row,list+=1] = format_time(work.update_time) - # count_row += 1 - # list = 0 - # end - # elsif @task.task_type == 2 - # if @task.cross_comment - # sheet1.row(0).concat(["分组", "组员","分班", "作品描述", "教师评分","交叉评分","迟交扣分", "成绩", "更新时间"]) - # else - # sheet1.row(0).concat(["分组", "组员","分班", "作品描述", "教师评分", "迟交扣分", "成绩", "更新时间"]) - # end - # items.each do |work| - # sheet1[count_row,list] = work.group_id - # sheet1[count_row,list+=1] = work.user.full_name - # sheet1[count_row,list+=1] = work.class_grouping_name - # sheet1[count_row,list+=1] = strip_html work.description if work.description - # sheet1[count_row,list+=1] = work.teacher_score.nil? ? "未评分" : work.teacher_score.round(1) - # if @task.cross_comment - # sheet1[count_row,list+=1] = work.cross_score.nil? ? "未评分" : work.cross_score.round(1) - # end - # sheet1[count_row,list+=1] = work.late_penalty - # sheet1[count_row,list+=1] = work.respond_to?("work_score") ? work.work_score.nil? ? "未评分" : work.work_score.round(1) : "未评分" - # sheet1[count_row,list+=1] = format_time(work.update_time) - # count_row += 1 - # list = 0 - # end - # end - # book.write xls_report - # xls_report.string - # end - -end diff --git a/app/controllers/student_works_controller.rb b/app/controllers/student_works_controller.rb deleted file mode 100644 index 59da73703..000000000 --- a/app/controllers/student_works_controller.rb +++ /dev/null @@ -1,896 +0,0 @@ -class StudentWorksController < ApplicationController - include HomeworkCommonsHelper - include StudentWorksHelper - - before_action :require_login, :check_auth - before_action :find_homework, only: [:new, :create, :search_member_list, :check_project, :relate_project, - :cancel_relate_project, :delete_work] - before_action :find_work, only: [:shixun_work_report, :adjust_review_score, :shixun_work, :commit_des, :update_des, - :adjust_score, :show, :adjust_score, :supply_attachments, :revise_attachment, - :comment_list, :add_score, :add_score_reply, :destroy_score, :appeal_anonymous_score, - :deal_appeal_score, :cancel_appeal, :edit, :update, :export_shixun_work_report, - :shixun_work_comment, :destroy_work_comment] - before_action :user_course_identity - before_action :allow_add_score, only: [:add_score] - before_action :homework_publish - - before_action :teacher_allowed, only: [:adjust_score, :adjust_review_score, :deal_appeal_score, :shixun_work_comment, - :destroy_work_comment] - - before_action :course_student, only: [:new, :commit_des, :update_des, :create, :edit, :update, :search_member_list, :relate_project, - :cancel_relate_project, :relate_project, :delete_work] - - before_action :my_work, only: [:commit_des, :update_des, :edit, :update, :revise_attachment, :appeal_anonymous_score, - :cancel_appeal] - - before_action :edit_duration, only: [:edit, :update, :delete_work] - before_action :end_or_late, only: [:new, :create, :search_member_list, :commit_des, :update_des] - - before_action :require_score_id, only: [:destroy_score, :add_score_reply, :appeal_anonymous_score, :deal_appeal_score, :cancel_appeal] - - before_action :is_evaluation, :open_work, only: [:show, :supply_attachments] - - def new - uid_logger("#######new current_user : 1111") - @current_user = current_user - uid_logger("#######new current_user : #{@current_user.id}") - if @homework.homework_type == "group" && @homework.homework_detail_group.try(:base_on_project) - work = @homework.student_works.find_by(user_id: @current_user.id) - if work.present? && (work.work_status != 0 || work.project_id == 0) - normal_status(403, "") - end - end - end - - # 搜索课堂学生 - def search_member_list - # 统一设置的作业取所有学生,否则取已发布的分班学生 - students = @homework.unified_setting? ? @course.students : @course.students.where(course_group_id: @homework.published_settings.pluck(:course_group_id)) - if !params[:search].blank? - @members = students.joins(user: :user_extension).where("course_members.user_id != #{current_user.id} and (concat(users.lastname, users.firstname) - like ? or user_extensions.student_id like ?)", "%#{params[:search]}%", "%#{params[:search]}%") - else - - # 没有搜索条件时搜索课堂所有未提交的学生 - user_ids = @homework.student_works.where("work_status = 0").pluck(:user_id) - [current_user.id] - @members = students.where(user_id: user_ids) - end - - page = params[:page] ? params[:page].to_i : 1 - limit = params[:limit] ? params[:limit].to_i : 10 - - # todo user_extension - @members = @members.page(page).per(limit).includes(:course_group, user: :user_extension) - end - - def delete_work - ActiveRecord::Base.transaction do - begin - work = @homework.student_works.find_by!(user_id: params[:user_id]) - tip_exception("只有组长才能删除组员") if work.commit_user_id != current_user.id - work.update_attributes!(description: nil, project_id: 0, - late_penalty: 0, work_status: 0, - commit_time: nil, update_time: nil, group_id: 0, - commit_user_id: nil, final_score: nil, work_score: nil, teacher_score: nil, teaching_asistant_score: nil) - work.attachments.destroy_all - work.tidings.destroy_all - normal_status("删除成功") - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - end - end - end - - def create - student_work = @homework.student_works.find_or_create_by(user_id: current_user.id) - - tip_exception("作业不可重复提交") if student_work.work_status != 0 - update_check student_work - - student_ids = [current_user.id] - ActiveRecord::Base.transaction do - begin - student_work.description = params[:description] - student_work.commit_time = Time.now - student_work.update_time = Time.now - student_work.commit_user_id = current_user.id - student_work.update_user_id = current_user.id - student_work.group_id = @homework.homework_type == "group" ? @homework.max_group_id : 0 - - #提交作品时,计算是否迟交 - homework_setting = @homework.homework_group_setting(current_user.id) - student_work.late_penalty = homework_setting.end_time < Time.now ? @homework.late_penalty : 0 - student_work.work_status = homework_setting.end_time < Time.now ? 2 : 1 - - if student_work.save! - Attachment.associate_container(params[:attachment_ids], student_work.id, student_work.class) - - if @homework.homework_type == "group" - members = (params[:user_ids] || []).collect(&:to_i) - [current_user.id] - members = @course.students.pluck(:user_id) & members - student_ids += members - for i in 0 .. members.count-1 - stu_work = @homework.student_works.find_or_initialize_by(user_id: members[i].to_i) - stu_work.update_attributes!(user_id: members[i].to_i, description: student_work.description, - homework_common_id: @homework.id, project_id: student_work.project_id, - late_penalty: student_work.late_penalty, work_status: student_work.work_status, - commit_time: Time.now, update_time: Time.now, group_id: student_work.group_id, - commit_user_id: current_user.id, update_user_id: current_user.id) - stu_work.save! - student_work.attachments.each do |attachment| - att = attachment.copy - att.author_id = attachment.author_id - stu_work.attachments << att - end - end - end - @homework.update_column(:updated_at, Time.now) - # todo 更新对应的作业课堂动态 - # update_course_activity(@taskhomework.class,@task.id) - - @work_id = student_work.id - end - - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - - SubmitStudentWorkNotifyJob.perform_later(@homework.id, student_ids) - end - - def edit - @current_user = current_user - if @homework.homework_type == "group" - # todo user_extension - @commit_user_id = @work.commit_user_id - @work_members = @course.students.where(user_id: @homework.student_works.where(group_id: @work.group_id).pluck(:user_id)). - order("course_members.user_id=#{@work.commit_user_id} desc").includes(:course_group, user: :user_extension) - end - end - - def update - update_check @work - - student_ids = [] - ActiveRecord::Base.transaction do - begin - @work.description = params[:description] - @work.update_time = Time.now - @work.update_user_id = current_user.id - # @work.commit_user_id = current_user.id - if @work.save! - Attachment.associate_container(params[:attachment_ids], @work.id, @work.class) - - #如果学生作品被打分后修改,应该给老师提示 - student_ids << @work.user_id if @work.scored? - - if @homework.homework_type == "group" - student_works = @homework.student_works.where("group_id = #{@work.group_id} and user_id != #{@work.user_id}") - work_user_ids = student_works.pluck(:user_id) - params_user_ids = (params[:user_ids] || []).collect(&:to_i) - [@work.user_id] - params_user_ids = @course.students.pluck(:user_id) & params_user_ids - - # 原成员更新描述、更新时间以及附件 - @homework.student_works.where(group_id: @work.group_id, user_id: (work_user_ids & params_user_ids)).each do |work| - # work.update_attributes(update_time: Time.now, description: @work.description, commit_user_id: current_user.id) - work.update_attributes!(update_time: Time.now, description: @work.description, update_user_id: current_user.id) - work.attachments.destroy_all - @work.attachments.each do |attachment| - att = attachment.copy - att.author_id = attachment.author_id - work.attachments << att - end - student_ids << work.user_id if work.scored? - end - - # 删除的成员 - delete_user_ids = work_user_ids - params_user_ids - @homework.student_works.where(group_id: @work.group_id, user_id: delete_user_ids).each do |work| - work.attachments.destroy_all - # work.student_works_scores.destroy_all - work.tidings.destroy_all - end - @homework.student_works.where(group_id: @work.group_id, user_id: delete_user_ids). - update_all(work_status: 0, description: nil, late_penalty: 0, commit_time: nil, update_time: nil, - final_score: nil, teacher_score: nil, student_score: nil, teaching_asistant_score: nil, - work_score: nil, project_id: 0, group_id: 0, commit_user_id: nil, update_user_id: nil) - - # 新增加的成员 - (params_user_ids - work_user_ids).each do |user_id| - stu_work = @homework.student_works.find_or_initialize_by(user_id: user_id) - stu_work.update_attributes!(user_id: user_id, description: @work.description, homework_common_id: @homework.id, - project_id: @work.project_id, late_penalty: @work.late_penalty, - work_status: @work.work_status, commit_time: Time.now, update_time: Time.now, - group_id: @work.group_id, commit_user_id: @work.commit_user_id, update_user_id: current_user.id) - @work.attachments.each do |attachment| - att = attachment.copy - att.author_id = attachment.author_id - stu_work.attachments << att - end - - student_ids << user_id - end - end - - normal_status(0,"更新成功") - end - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - - ResubmitStudentWorkNotifyJob.perform_later(@homework.id, student_ids) if student_ids.present? - end - end - - def show - @current_user = current_user - @work_members = @homework.homework_type != "group" ? [] : @homework.student_works.where.not(user_id: @work.user_id). - where(group_id: @work.group_id).includes(:user) - @attachments = @work.attachments.where("attachtype != 7 or attachtype is null") - end - - # 判断项目是否已有其他作品关联上了 - def check_project - tip_exception("项目id不能为空") if params[:project_id].blank? - work = @homework.student_works.find_by_project_id(params[:project_id]) - @is_relate = work.present? - @relate_user = work.present? ? work.user.real_name : "" - end - - def relate_project - tip_exception("项目id不能为空") if params[:project_id].blank? - - ActiveRecord::Base.transaction do - begin - # 判断项目是否存在且当前用户是项目管理员 - project = Project.find_by_id(params[:project_id]) - member = Member.find_by_project_id_and_user_id(project.try(:id), current_user.id) - - if project.present? && member.present? && member.member_roles.take.try(:role_id) == 3 - - work = @homework.student_works.find_or_create_by(user_id: current_user.id) - - if work.work_status == 0 && work.project_id == 0 - work.update_attributes!(project_id: project.id, update_time: Time.now) - - # 将老师加入项目 - project_member = project.members.find_by_user_id(@homework.user_id) - if project_member.present? - project_member.member_roles.take.update_attributes!(role_id: 3) if project_member.member_roles.take.present? - else - member = Member.create!(user_id: @homework.user_id, project_id: project.id) - member.member_roles << MemberRole.new(role_id: 3) - Tiding.create(user_id: @homework.user_id, trigger_user_id: current_user.id, container_id: project.id, - container_type: 'ManagerJoinProject', belong_container_id: project.id, - belong_container_type: "Project", tiding_type: "System", extra: 3) - end - normal_status(0,"关联成功") - else - tip_exception("不能重复关联项目") - end - else - tip_exception("该项目不存在") - end - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - end - - def cancel_relate_project - work = @homework.student_works.find_by_user_id_and_work_status(current_user.id, 0) - if work.present? && work.project.present? - ActiveRecord::Base.transaction do - begin - member = work.project.members.find_by_user_id(@homework.user_id) - member.destroy if member.present? - Tiding.where(user_id: @homework.user_id, trigger_user_id: current_user.id, container_id: work.project.id, - container_type: 'ManagerJoinProject').destroy_all - - work.update_attributes!(project_id: 0) - normal_status(0,"取消关联成功") - - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - else - tip_exception("无法取消关联") - end - end - - def supply_attachments - @revise_attachments = @work.attachments.where(attachtype: 7) - @last_atta = @revise_attachments.last - end - - def revise_attachment - tip_exception("不在补交阶段内") unless @homework.late_duration - tip_exception("附件参数有误") if params[:attachment_ids].blank? || !params[:attachment_ids].is_a?(Array) - tip_exception("补交附件原因不能为空") if params[:description].blank? - - ActiveRecord::Base.transaction do - begin - # 补交作业附件不覆盖之前上传的附件 - # revise_attachment = @work.attachments.where(attachtype: 7).reorder("created_on desc").last - # if revise_attachment.present? && @work.student_works_scores.where("created_at > '#{revise_attachment.created_on}' - # and score is not null").count == 0 - # revise_attachment.destroy - # end - Attachment.associate_container(params[:attachment_ids], @work.id, @work.class, 7) - revise_attachment = Attachment.where(attachtype: 7, container_id: @work.id, container_type: "StudentWork").last - revise_attachment.update_attributes!(description: params[:description]) if revise_attachment.present? - - @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? - ResubmitStudentWorkNotifyJob.perform_later(@homework.id, [current_user.id]) - end - - normal_status(0, "提交成功") - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - end - - def comment_list - @current_user = current_user - @last_comment = @work.student_works_scores.where(user_id: @current_user.id).last - # todo user_extension - @comment_scores = (@user_course_identity < Course::STUDENT || current_user == @work.user) ? - @work.student_works_scores.reorder("created_at desc") : - @work.student_works_scores.where(user_id: current_user.id).reorder("created_at desc") - @comment_scores = @comment_scores.includes(:student_works_scores_appeal, :attachments, journals_for_messages: :user, user: :user_extension) - end - - # 给作品评分 - def add_score - tip_exception("该学生的分数已经过调整,不能再评阅") if @work.ultimate_score - tip_exception("分数和评语不能都为空") if params[:score].blank? && params[:comment].blank? - tip_exception("分数不能超过0-100") if params[:score] && (params[:score].to_f < 0 || params[:score].to_f > 100) - - ActiveRecord::Base.transaction do - begin - # 没传score则取上次评分成绩 - reviewer_role = @user_course_identity == Course::STUDENT ? 3 : @user_course_identity == Course::ASSISTANT_PROFESSOR ? 2 : 1 - new_score = StudentWorksScore.new - score = StudentWorksScore.where(user_id: current_user.id, student_work_id: @work.id, reviewer_role: reviewer_role).last - new_score.score = params[:score].blank? ? score.try(:score) : params[:score].to_f - new_score.comment = params[:comment] if params[:comment] && params[:comment].strip != "" - new_score.user_id = current_user.id - new_score.student_work_id = @work.id - - # 如果作品是未提交的状态则更新为已提交 - if @user_course_identity < Course::STUDENT && !new_score.score.nil? && @work.work_status == 0 - @work.update_attributes!(work_status: 1, commit_time: Time.now) - # 分组作业更新分组id - @work.update_attributes!(group_id: @homework.max_group_id) if @homework.homework_type == "group" - end - - new_score.reviewer_role = reviewer_role - - if new_score.save! - Attachment.associate_container(params[:attachment_ids], new_score.id, new_score.class) - - # 该用户的历史评阅无效 - score.update_column('is_invalid', true) if score.present? && score.score.present? - - Tiding.create(user_id: @work.user_id, trigger_user_id: User.current.id, container_id: new_score.id, - container_type: "StudentWorksScore", parent_container_id: @work.id, - parent_container_type: "HomeworkCommon", belong_container_id: @homework.course_id, - belong_container_type: "Course", viewed: 0, tiding_type: new_score.reviewer_role == 3 ? "System" : "HomeworkCommon", extra: new_score.reviewer_role) - - case new_score.reviewer_role - when 1 #教师评分:最后一个教师评分为最终评分 - @work.teacher_score = new_score.score - if @homework.homework_type == "group" && params[:same_score] - add_score_to_member @work, @homework, new_score - end - when 2 #教辅评分 教辅评分显示平均分 - # 助教评分:普通模式则是平均分,复审模式则是最新评分 - if @homework.homework_detail_manual.ta_mode == 1 - @work.teaching_asistant_score = new_score.ta_score @work.id - else - @work.teaching_asistant_score = new_score.score - end - - if @homework.homework_type == "group" && params[:same_score] - add_score_to_member @work, @homework, new_score - end - when 3 #学生评分 学生评分显示平均分 - # 匿评分 - @work.student_score = new_score.stu_score(@work.id) - if @homework.homework_type == "group" && new_score.score.present? - add_score_to_member @work, @homework, new_score - end - - current_user.student_works_scores.where(student_work_id: @work.id, reviewer_role: 3, appeal_status: 1).update_all(appeal_status: 5) - end - - @homework.update_column('updated_at', Time.now) - # update_course_activity(@homework.class,@homework.id) - @work.save! - - normal_status(0,"提交成功") - end - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - end - - # 实训作品的提交总结 - def commit_des - @current_user = current_user - end - - # 实训作品的总结 - def update_des - @work.update_attributes!(des_params) - tip_exception(0, "提交成功") - end - - # 实训作品弹框 - def shixun_work - @myshixun = @work.myshixun - if @myshixun.present? - @current_user = current_user - @work_user = @work.user - @shixun = @homework.shixuns.take - else - tip_exception("作品还未提交") - end - end - - # 实训报告 - def shixun_work_report - @user = @work.user - @shixun = @homework.shixuns.take - # 提示: 这里如果includes outputs表的话: sum(:evaluate_count)会出现错误 - @games = @work.myshixun.games.joins(:challenge).reorder("challenges.position asc") if @work.myshixun - @challenges = @shixun.challenges if @shixun - @comment = @work.shixun_work_comments.find_by(challenge_id: 0) - - # 用户最大评测次数 - if @games - @user_evaluate_count = @games.pluck(:evaluate_count).sum - @games = @games.includes(:challenge, :game_codes, :outputs) - else - @user_evaluate_count = 0 - end - - # 图形效率图的数据 - @echart_data = student_efficiency(@homework, @work) if @work.myshixun - end - - # 实训作品的评阅 - def shixun_work_comment - tip_exception("请至少输入一个评阅") if params[:comment].blank? && params[:hidden_comment].blank? - ActiveRecord::Base.transaction do - challenge = @homework.shixuns.first&.challenges.find_by(id: params[:challenge_id]) unless params[:challenge_id].blank? - if challenge.present? - @comment = @work.shixun_work_comments.find_by(challenge_id: challenge.id) || - ShixunWorkComment.new(student_work_id: @work.id, user_id: current_user.id, challenge_id: challenge.id) - else - @comment = @work.shixun_work_comments.find_by(challenge_id: 0) || - ShixunWorkComment.new(student_work_id: @work.id, user_id: current_user.id, challenge_id: 0) - end - @comment.comment = params[:comment] - @comment.hidden_comment = params[:hidden_comment] - @comment.save! - if @work.work_status == 0 - @work.update_attributes!(work_status: 1, commit_time: @homework.end_time, update_time: Time.now, work_score: 0, final_score: 0) - end - end - end - - # 删除实训作品评阅 - def destroy_work_comment - ActiveRecord::Base.transaction do - # tip_exception("visible_comment参数有误") if params[:visible_comment].nil? - - comment = @work.shixun_work_comments.find_by!(id: params[:comment_id]) - comment.destroy! - # params[:visible_comment] ? comment.comment = nil : comment.hidden_comment = nil - # if comment.comment.nil? && comment.hidden_comment.nil? - # comment.destroy! - # else - # comment.save! - # end - normal_status("删除成功") - end - end - - def export_shixun_work_report - @user = @work.user - @shixun = @homework.shixuns.take - @games = @work.myshixun.games.includes(:challenge, :game_codes, :outputs) if @work.myshixun - @challenges = @shixun.challenges if @shixun - - # 用户最大评测次数 - @user_evaluate_count = @games.pluck(:evaluate_count).sum if @games - # 图形效率图的数据 - @echart_data = student_efficiency(@homework, @work) - @myself_eff = @echart_data[:efficiency_list].find { |item| item.last == @user.id } - @myself_consume = @echart_data[:consume_list].find { |item| item.last == @user.id } - filename_ = "#{@homework.course&.user_group_name(@work.user_id)}_#{@user&.student_id}_#{@user&.real_name}_#{@shixun&.name}_#{Time.now.strftime('%Y%m%d_%H%M%S')}.pdf" - filename = filename_.strip.tr("+/", "-_") - stylesheets = %w(shixun_work/shixun_work.css shared/codemirror.css) - if params[:export].present? && params[:export] - normal_status(0,"正在下载中") - else - set_export_cookies - render pdf: 'shixun_work/shixun_work', filename: filename, stylesheets: stylesheets, disposition: 'inline', type:"pdf_attachment.content_type",stream:false - end - # render pdf: 'shixun_work/shixun_work', filename: filename, stylesheets: stylesheets, disposition: 'inline', type:"pdf_attachment.content_type",stream:false - end - - # 作品调分 - def adjust_score - tip_exception("成绩不能为空") if params[:score].blank? - tip_exception("成绩不能小于零") if params[:score].to_f < 0 - tip_exception("成绩不能大于100") if params[:score].to_f.round(1) > 100 - tip_exception("调分原因不能超过100个字符") if params[:comment].present? && params[:comment].length > 100 - ActiveRecord::Base.transaction do - begin - # 分数不为空的历史评阅都置为失效 - @work.student_works_scores.where.not(score: nil).update_all(is_invalid: 1) - reviewer_role = @user_course_identity == Course::ASSISTANT_PROFESSOR ? 2 : 1 - new_score = StudentWorksScore.new(student_work_id: @work.id, score: params[:score].to_f, comment: "使用调分功能调整了作业最终成绩:#{params[:comment]}", - user_id: current_user.id, reviewer_role: reviewer_role, is_ultimate: 1) - new_score.save! - - # 如果作品是未提交的状态则更新为已提交 - if @work.work_status == 0 - @work.work_status = 1 - @work.commit_time = Time.now - @work.compelete_status = 1 if @homework.homework_type == "practice" - # 分组作业更新分组id - @work.group_id = @homework.max_group_id if @homework.homework_type == "group" - end - - @work.ultimate_score = true - @work.work_score = params[:score].to_f - @work.save! - - Tiding.create!(user_id: @work.user_id, trigger_user_id: current_user.id, container_id: new_score.id, - container_type: "AdjustScore", parent_container_id: @homework.id, - parent_container_type: "HomeworkCommon", belong_container_id: @course.id, - belong_container_type: 'Course', tiding_type: "HomeworkCommon") - - normal_status(0,"调分成功") - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - end - - #添加评分的回复 - def add_score_reply - tip_exception("回复内容不能为空") if params[:comment].blank? - ActiveRecord::Base.transaction do - begin - score = @work.student_works_scores.find_by!(id: params[:score_id]) - jour = score.journals_for_messages.new(user_id: current_user.id, notes: params[:comment], reply_id: score.user_id) - jour.save! - normal_status(0,"回复成功") - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - end - - # 删除教师/教辅的评分记录 - def destroy_score - score = @work.student_works_scores.find_by(id: params[:score_id]) - tip_exception("该评阅记录不存在") unless score.present? - tip_exception("该评阅记录不能删除") unless score.allow_delete(current_user) - begin - score.destroy - normal_status(0,"删除成功") - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - - # 对学生匿评进行申诉 - def appeal_anonymous_score - tip_exception("申诉原因不能为空") if params[:comment].blank? - score = @work.student_works_scores.find_by(id: params[:score_id].to_i) - tip_exception("无法申诉") unless score.present? && @homework.appeal_duration && - score.reviewer_role == 3 && score.appeal_status == 0 - score_appeal = nil - ActiveRecord::Base.transaction do - begin - score.update_attributes!(appeal_status: 1) - score_appeal = StudentWorksScoresAppeal.create!(user_id: current_user.id, student_works_score_id: score.id, - comment: params[:comment], appeal_status: 1) - - normal_status(0,"提交成功") - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - # 提交后给老师和助教、匿评人发消息 - StudentWorkScoreAppealNotifyJob.perform_later(@course.id, score_appeal.id, current_user.id) - end - - # 撤销申诉 - def cancel_appeal - score = @work.student_works_scores.find_by(id: params[:score_id].to_i) - if score.present? && score.appeal_status == 1 - ActiveRecord::Base.transaction do - begin - score.update_attributes!(appeal_status: 2) - score_appeal = score.student_works_scores_appeal - score_appeal.update_attributes!(appeal_status: 2) - score_appeal.tidings.destroy_all - normal_status(0,"撤销成功") - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - else - tip_exception("无法撤销") - end - end - - # status 3 接受 4 拒绝 - def deal_appeal_score - tip_exception("缺少status参数") if params[:status].blank? - tip_exception("status值不合要求") unless params[:status].to_i == 3 || params[:status].to_i == 4 - score = @work.student_works_scores.find_by(id: params[:score_id].to_i) - if score.present? && score.appeal_status == 1 - ActiveRecord::Base.transaction do - begin - # 更新appeal_status的值 - score.update_attributes!(appeal_status: params[:status].to_i) - score_appeal = score.student_works_scores_appeal - score_appeal.update_attributes!(appeal_status: params[:status].to_i) - score_appeal.tidings.update_all(status: 1) - - if params[:status].to_i == 3 - # 申诉成功后该评分失效 - score.update_attributes!(is_invalid: 1) - - # 申诉成功后 扣匿评学生的违规匿评扣分 - sw = @homework.student_works.find_by(user_id: score.user_id) - sw.update_attributes!(appeal_penalty: @homework.homework_detail_manual.appeal_penalty + sw.appeal_penalty) if sw.present? - - # 申诉成功 重新计算申诉者的匿评分 - if @work.student_works_scores.where("reviewer_role = 3 AND appeal_status != 3").count > 0 - @work.student_score = score.stu_score(@work.id) - else - @work.student_score = nil - end - @work.save! - end - - # todo tiding - Tiding.create(user_id: score_appeal.user_id, trigger_user_id: current_user.id, container_id: score_appeal.id, - container_type: "StudentWorksScoresAppeal", parent_container_id: @work.id, - parent_container_type: 'UserAppealResult', belong_container_id: @course.id, - belong_container_type: "Course", viewed: 0, status: params[:status].to_i == 3 ? 1 : 2, - tiding_type: "HomeworkCommon") - Tiding.create(user_id: score.user_id, trigger_user_id: current_user.id, container_id: score_appeal.id, - container_type: "StudentWorksScoresAppeal", parent_container_id: @work.id, - parent_container_type: 'AppealResult', belong_container_id: @course.id, belong_container_type: "Course", - viewed: 0, status: params[:status].to_i == 3 ? 1 : 2, tiding_type: "HomeworkCommon") - - normal_status(0,"提交成功") - rescue Exception => e - uid_logger(e.message) - tip_exception(e.message) - raise ActiveRecord::Rollback - end - end - else - tip_exception("该申诉不存在") - end - end - - # 查重作品调分 - def adjust_review_score - tip_exception("缺少type参数") if params[:type].blank? || !["review", "report"].include?(params[:type]) - if params[:type] == "review" && (params[:score].blank? || params[:challenge_id].blank? || params[:code_rate].blank? || params[:copy_user_id].blank?) - tip_exception("参数错误,score和challenge_id和code_rate和copy_user_id不能为空") - elsif params[:type] == "report" && (params[:score].blank? || params[:challenge_id].blank?) - tip_exception("参数错误,score和challenge_id不能为空") - end - challenge_setting = @homework.homework_challenge_settings.find_by(challenge_id: params[:challenge_id]) - if challenge_setting - challenge = challenge_setting&.challenge - tip_exception("不能小于零") if params[:score].to_i < 0 - tip_exception("不能大于关卡分值:#{challenge_setting.score}分") if challenge_setting && challenge_setting.score < params[:score].to_i - - ActiveRecord::Base.transaction do - begin - if params[:type] == "review" - copy_user = User.find params[:copy_user_id] - comment = "代码查重结果显示与#{copy_user.try(:show_real_name)}的代码相似度#{params[:code_rate]}%" - else - comment = "根据实训报告中最终提交的代码调整第#{challenge.position}关分数" - end - challenge_score = @work.challenge_work_scores.create!(challenge_id: params[:challenge_id], user_id: current_user.id, score: params[:score], - comment: comment) - challenge_score.create_tiding current_user.id - if @work.work_status != 0 && @work.myshixun - games = @work.myshixun.games.where(challenge_id: @homework.homework_challenge_settings.pluck(:challenge_id)) - HomeworksService.new.update_myshixun_work_score @work, @work.myshixun, games, @homework, @homework.homework_challenge_settings - else - update_none_commit_work @work, @homework - end - rescue Exception => e - uid_logger(e.message) - tip_exception("调分失败") - raise ActiveRecord::Rollback - end - end - else - tip_exception("该关卡不记分") - end - end - - - private - - def find_homework - begin - @homework = HomeworkCommon.find params[:homework_common_id] - @course = @homework.course - rescue Exception => e - uid_logger_error("##########{e.message}") - missing_template - end - end - - def find_work - begin - @work = StudentWork.find params[:id] - @homework = @work.homework_common - @course = @homework.course - rescue Exception => e - uid_logger_error("##########{e.message}") - missing_template - end - end - - def homework_public - tip_exception(403,"没有操作权限") unless @user_course_identity <= Course::STUDENT || - (@course.is_public == 1 && @homework.is_public) - end - - def course_student - uid_logger("#########course-student") - tip_exception(403,"没有操作权限") if @user_course_identity != Course::STUDENT - end - - def my_work - tip_exception(403,"没有操作权限") if @work.user_id != current_user.id || @work.work_status == 0 - end - - def edit_duration - tip_exception("已过了修改时间") if @homework.end_time && @homework.end_time < Time.now - end - - def end_or_late - tip_exception("不在提交/更新阶段") if @homework.end_or_late - end - - def des_params - tip_exception("description参数不能为空") if params[:description].blank? - params.require(:student_work).permit(:description) - end - - def require_score_id - tip_exception("score_id参数不能为空") if params[:score_id].blank? - end - - # 是否匿评阶段 - def is_evaluation - @is_author = @work.user_id == current_user.id - @is_evaluation = @user_course_identity == Course::STUDENT && !@is_author && @homework.anonymous_comment && - [3, 4].include?(@homework.homework_detail_manual.comment_status) - end - - # 作品是否公开 - def open_work - tip_exception(403,"没有操作权限") unless (@user_course_identity < Course::STUDENT || current_user == @work.user || @homework.work_public || @is_evaluation) - end - - def allow_add_score - # 老师始终有评阅权限,匿评阶段内,学生对分配给该学生的作品有评阅权限 - tip_exception(403, "没有权限") unless allow_score(@homework, @user_course_identity, current_user.id, @work) - end - - def update_check work - tip_exception("作品描述不能为空") if params[:description].blank? - if @homework.homework_type == "group" - tip_exception("小组成员不能为空") if params[:user_ids].blank? - tip_exception("小组成员人数不合要求") if params[:user_ids].length > @homework.homework_detail_group.max_num || - params[:user_ids].length < @homework.homework_detail_group.min_num - tip_exception("请先关联项目") if @homework.homework_detail_group.base_on_project && work.project_id == 0 - end - end - - - def add_score_to_member student_work, homework, new_score - student_works = homework.student_works.where("group_id = #{student_work.group_id} and id != #{student_work.id} and ultimate_score = 0") - student_works.each do |st_work| - st_score = StudentWorksScore.new(user_id: new_score.user_id, score: new_score.score, - reviewer_role: new_score.reviewer_role, comment: new_score.comment) - - score = StudentWorksScore.where(user_id: new_score.user_id, student_work_id: st_work.id, reviewer_role: new_score.reviewer_role).last - # 该用户的历史评阅无效 - score.update_column('is_invalid', true) if score.present? && score.score.present? - st_work.student_works_scores << st_score - - if new_score.reviewer_role == 1 - st_work.teacher_score = new_score.score if new_score.score.present? - elsif new_score.reviewer_role == 2 - if homework.homework_detail_manual.ta_mode == 1 - st_work.teaching_asistant_score = new_score.ta_score st_work.id - else - st_work.teaching_asistant_score = new_score.score if new_score.score.present? - end - else - st_work.student_score = student_work.student_score - end - st_work.save! - - Tiding.create(user_id: st_work.user_id, trigger_user_id: current_user.id, container_id: st_score.id, - container_type: "StudentWorksScore", parent_container_id: st_work.id, parent_container_type: "StudentWork", - belong_container_id: homework.course_id, belong_container_type: "Course", viewed: 0, - tiding_type: "HomeworkCommon", extra: new_score.reviewer_role) - - new_score.attachments.each do |attachment| - att = attachment.copy - att.author_id = st_score.user_id - st_score.attachments << att - end - end - end - - def update_none_commit_work work, homework - if work.work_status == 0 - work.work_status = 1 - work.compelete_status = 1 - work.commit_time = homework.end_time - work.update_time = Time.now - end - final_score = 0 - homework.homework_challenge_settings.each do |cha_setting| - adjust_score = work.challenge_work_scores.select{|work_score| work_score.challenge_id == cha_setting.challenge_id}.last - final_score += adjust_score.score if adjust_score.present? - end - work.final_score = final_score - work.work_score = final_score - work.save! - end -end diff --git a/app/jobs/end_exercise_calculate_job.rb b/app/jobs/end_exercise_calculate_job.rb deleted file mode 100644 index 251496cb5..000000000 --- a/app/jobs/end_exercise_calculate_job.rb +++ /dev/null @@ -1,30 +0,0 @@ -class EndExerciseCalculateJob < ApplicationJob - - include ExercisesHelper - include GitHelper - - queue_as :default - - def perform(ex_user_ids,exercise,end_time) - 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,end_time.to_time)[: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, - :commit_method => user&.commit_method.to_i > 0 ? user&.commit_method.to_i : 4 - } - user.update_attributes(commit_option) - end - end - end - -end diff --git a/app/jobs/sync_forge_job.rb b/app/jobs/sync_forge_job.rb index a8047e7f5..316d562af 100644 --- a/app/jobs/sync_forge_job.rb +++ b/app/jobs/sync_forge_job.rb @@ -15,10 +15,11 @@ class SyncForgeJob < ApplicationJob user_params = sync_params["user_params"]["user_params"] owner_extension_params = sync_params["user_params"]["user_extension_params"] platform = sync_params["platform"] - sync_roles(roles_params) - + sync_roles(roles_params, platform) + user_params = user_params["user"] if platform == "trustie" #trustie上需要 if user_params.present? - owner_params = user_params.except!(*keys_to_delete) + owner_params = user_params&.except!(*keys_to_delete) + if User.exists?(login: owner_params["login"]) new_user = User.find_by(login: owner_params["login"]) else @@ -31,8 +32,9 @@ class SyncForgeJob < ApplicationJob new_user.gitea_token = result['sha1'] new_user.gitea_uid = gitea_user['id'] if new_user.save! + owner_extension_params = owner_extension_params["user_extensions"] if platform == "trustie" #trustie上需要 if owner_extension_params.present? - owner_extension_params = owner_extension_params.except!(*keys_other_delete).merge(user_id: new_user.id) + owner_extension_params = owner_extension_params&.except!(*keys_other_delete).merge(user_id: new_user.id) UserExtension.create!(owner_extension_params) end end @@ -69,8 +71,8 @@ class SyncForgeJob < ApplicationJob #同步项目 def sync_projects(new_user,old_user_id, targets,platform) - Rails.logger.info("#######__projects_sync__start__#########") - keys_to_delete = %w(id created_on updated_on user_id) + Rails.logger.info("#######__projects_sync__start__########") + keys_to_delete = %w(id created_on updated_on user_id language) score_to_delete = %w(id created_at updated_at project_id) begin if targets.present? @@ -81,8 +83,9 @@ class SyncForgeJob < ApplicationJob version_params = targets[:versions_params] member_params = targets[:member_params] project_score = targets[:project_score_params] + project = project["project"] if platform == "trustie" #trustie上需要 if project.present? - new_project = Project.new(project.except!(*keys_to_delete).merge(user_id: new_user.id)) + new_project = Project.new(project&.except!(*keys_to_delete).merge(user_id: new_user.id)) if new_project.save! repository_params = { hidden: project["is_public"], @@ -90,14 +93,15 @@ class SyncForgeJob < ApplicationJob identifier: project["identifier"] } Repositories::CreateService.new(new_user, new_project, repository_params).call + project_score = project_score["project_role"] if platform == "trustie" #trustie上需要 if project_score.present? - ProjectScore.create!(project_score.except!(*score_to_delete).merge(project_id: new_project.id)) + ProjectScore.create!(project_score&.except!(*score_to_delete).merge(project_id: new_project.id)) end - sync_user_issues(new_project.id, new_user.id,old_user_id,issue_params) + sync_user_issues(new_project.id, new_user.id,old_user_id,issue_params, platform) sync_members(new_project.id, member_params,platform) - sync_commits(new_project.id,new_project.gpid, pr_params) - sync_pull_requests(new_project.id,new_user.id, pr_params) - sync_versions(new_project.id, new_user.id, version_params) + sync_commits(new_project.id,new_project.gpid, commit_params,platform) + sync_pull_requests(new_project.id,new_user.id, pr_params,platform) + sync_versions(new_project.id, new_user.id, version_params,platform) end end end @@ -107,7 +111,7 @@ class SyncForgeJob < ApplicationJob end end - def sync_roles(roles) + def sync_roles(roles,platform) Rails.logger.info("#######______sync_roles_start__#######") roles_other_delete = %w(id) ActiveRecord::Base.transaction do @@ -116,13 +120,14 @@ class SyncForgeJob < ApplicationJob if roles.present? Role.transaction do roles.each do |r| + r = r["role"] if platform == "trustie" #trustie上需要 unless Role.exists?(name: r["name"]) - Role.create!(r.except!(*roles_other_delete)) if r.present? + Role.create!(r&.except!(*roles_other_delete)) if r.present? end end end end - Rails.logger.info("#######______sync_roles_end__########{roles}") + Rails.logger.info("#######______sync_roles_end__#######") rescue Exception => e Rails.logger.info("#######_______sync_roles__failed__#########{e}") @@ -146,10 +151,11 @@ class SyncForgeJob < ApplicationJob member_user_exten = m["member_extension"] member_roles = m["member_roles"] member_issues = m["member_issues"] - + member_user = member_user["user"] if platform == "trustie" #trustie上需要 if member_user.present? + unless User.exists?(login: member_user["login"]) - u = User.new(member_user.except!(*member_user_delete).merge(platform: platform)) + u = User.new(member_user&.except!(*member_user_delete).merge(platform: platform)) user_password = random_password interactor = Gitea::RegisterInteractor.call({username: member_user["login"], email: member_user["mail"], password: user_password}) if interactor.success? @@ -158,15 +164,17 @@ class SyncForgeJob < ApplicationJob u.gitea_token = result['sha1'] u.gitea_uid = gitea_user['id'] if u.save! + member_user_exten = member_user_exten["user_extensions"] if platform == "trustie" #trustie上需要 if member_user_exten.present? - UserExtension.create!(member_user_exten.except!(*keys_other_delete).merge(user_id: u.id)) + UserExtension.create!(member_user_exten&.except!(*keys_other_delete).merge(user_id: u.id)) end end + member = member["member"] if platform == "trustie" #trustie上需要 if member.present? - new_member = Member.new(member.except!(*member_to_delete).merge(project_id: project_id, user_id: u.id)) + new_member = Member.new(member&.except!(*member_to_delete).merge(project_id: project_id, user_id: u.id)) if new_member.save! - sync_user_issues(project_id, u.id, member["user_id"],member_issues) - sync_member_roles(new_member.id, member_roles) + sync_user_issues(project_id, u.id, member["user_id"],member_issues, platform) + sync_member_roles(new_member.id, member_roles,platform) end end else @@ -185,15 +193,19 @@ class SyncForgeJob < ApplicationJob end end - def sync_member_roles(member_id,members) + def sync_member_roles(member_id,members,platform) Rails.logger.info("#######______sync_members___roles_start__#######") member_role_delete = %w(id member_id role_id) begin if members.present? MemberRole.transaction do + Rails.logger.info("##########____________members__________________########{members}") members.each do |m| - role_id = Role.select(:id,:position)&.where(position: m["role_id"])&.first&.id - MemberRole.create!(m.except!(*member_role_delete).merge(member_id: member_id, role_id: role_id)) if m.present? + m = m["member_role"] if platform == "trustie" #trustie上需要 + if m.present? + role_id = Role.select(:id,:position)&.where(position: m["role_id"])&.first&.id + MemberRole.create!(m&.except!(*member_role_delete).merge(member_id: member_id, role_id: role_id)) if m.present? + end end end end @@ -205,30 +217,33 @@ class SyncForgeJob < ApplicationJob end #同步该用户的issues - def sync_user_issues(project_id, new_user_id,old_user_id,issues_all_params) + def sync_user_issues(project_id, new_user_id,old_user_id,issues_all_params,platform) Rails.logger.info("#######______sync_issues_start__##########{issues_all_params}") issue_to_delete = %w(id project_id author_id created_on updated_on assigned_to_id) ActiveRecord::Base.transaction do begin if issues_all_params.present? - issue_params = issues_all_params[0]["issue_params"] - jours_params = issues_all_params[0]["jours_params"] - commit_params = issues_all_params[0]["commit_params"] - Issue.select(:id, :assigned_to_id).where(assigned_to_id: old_user_id)&.update_all(assigned_to_id: new_user_id) - if issue_params.present? - assgin_user = issue_params["assigned_to_id"] - if issue_params["assigned_to_id"].to_i == old_user_id - assgin_user = new_user_id - end - issue = Issue.new(issue_params.except!(*issue_to_delete).merge(project_id: project_id, author_id: new_user_id, assigned_to_id: assgin_user)) - if issue.save! - sync_journals(new_user_id, issue.id, jours_params) - sync_commit_issues(issue.id,project_id, commit_params) - else - Rails.logger.info("############______.errors.full_messages_____________##########{issue.errors.full_messages}") + issues_all_params.each do |is_params| + issue_params = is_params["issue_params"] + jours_params = is_params["jours_params"] + commit_params = is_params["commit_params"] + Issue.select(:id, :assigned_to_id).where(assigned_to_id: old_user_id)&.update_all(assigned_to_id: new_user_id) + issue_params = issue_params["issue"] if platform == "trustie" #trustie上需要 + if issue_params.present? + assgin_user = issue_params["assigned_to_id"] + if issue_params["assigned_to_id"].to_i == old_user_id + assgin_user = new_user_id + end + issue = Issue.new(issue_params&.except!(*issue_to_delete).merge(project_id: project_id, author_id: new_user_id, assigned_to_id: assgin_user)) + if issue.save! + sync_journals(new_user_id, issue.id, jours_params, platform) + sync_commit_issues(issue.id,project_id, commit_params, platform) + else + Rails.logger.info("############______.errors.full_messages_____________##########{issue.errors.full_messages}") + end end + Rails.logger.info("#######______sync_issues_end_######") end - Rails.logger.info("#######______sync_issues_end_######") end rescue Exception => e Rails.logger.info("#######______sync_issues__failed__#########{e}") @@ -238,7 +253,7 @@ class SyncForgeJob < ApplicationJob end - def sync_journals(user_id, issue_id, jours_params) + def sync_journals(user_id, issue_id, jours_params,platform) Rails.logger.info("#######______sync_journals_start__########") jour_to_delete = %w(id created_on journalized_id) @@ -247,7 +262,8 @@ class SyncForgeJob < ApplicationJob if jours_params.present? Journal.transaction do jours_params.each do |i| - Journal.create!(i.except!(*jour_to_delete).merge(journalized_id: issue_id, user_id: user_id)) if i.present? + i = i["journal"] if platform == "trustie" #trustie上需要 + Journal.create!(i&.except!(*jour_to_delete).merge(journalized_id: issue_id, user_id: user_id)) if i.present? end end end @@ -260,7 +276,7 @@ class SyncForgeJob < ApplicationJob end end - def sync_commit_issues(issue_id, project_id, commit_params) + def sync_commit_issues(issue_id, project_id, commit_params,platform) Rails.logger.info("#######______sync_commit_issues_start__########") commit_to_delete = %w(id created_at updated_at) @@ -269,7 +285,8 @@ class SyncForgeJob < ApplicationJob if commit_params.present? CommitIssue.transaction do commit_params.each do |i| - CommitIssue.create!(i.except!(*commit_to_delete).merge(issue_id: issue_id, project_id: project_id)) if i.present? + i = i["commit_issues"] if platform == "trustie" #trustie上需要 + CommitIssue.create!(i&.except!(*commit_to_delete).merge(issue_id: issue_id, project_id: project_id)) if i.present? end end end @@ -282,16 +299,17 @@ class SyncForgeJob < ApplicationJob end end - def sync_pull_requests(project_id, user_id, pull_params) + def sync_pull_requests(project_id, user_id, pull_params,platform) Rails.logger.info("#######______sync_project_pull_requests_start__########") - commit_to_delete = %w(id user_id project_id created_at updated_at) + commit_to_delete = %w(id user_id project_id created_at updated_at jenkins_output) ActiveRecord::Base.transaction do begin if pull_params.present? PullRequest.transaction do pull_params.each do |i| - PullRequest.create!(i.except!(*commit_to_delete).merge(user_id: user_id, project_id: project_id)) if i.present? + i = i["pull_request"] if platform == "trustie" #trustie上需要 + PullRequest.create!(i&.except!(*commit_to_delete).merge(user_id: user_id, project_id: project_id)) if i.present? end end end @@ -303,7 +321,7 @@ class SyncForgeJob < ApplicationJob end end - def sync_commits(project_id, repository_id, commit_params) + def sync_commits(project_id, repository_id, commit_params,platform) Rails.logger.info("#######______sync_project_commits_start__########") commit_to_delete = %w(id created_at updated_at) @@ -312,7 +330,8 @@ class SyncForgeJob < ApplicationJob if commit_params.present? Commit.transaction do commit_params.each do |i| - Commit.create!(i.except!(*commit_to_delete).merge(repository_id: repository_id, project_id: project_id)) if i.present? + i = i["commit"] if platform == "trustie" #trustie上需要 + Commit.create!(i&.except!(*commit_to_delete).merge(repository_id: repository_id, project_id: project_id)) if i.present? end end end @@ -324,7 +343,7 @@ class SyncForgeJob < ApplicationJob end end - def sync_versions(project_id, new_user_id,version_params) + def sync_versions(project_id, new_user_id,version_params,platform) Rails.logger.info("#######______sync_project_versions_start__########") version_to_delete = %w(id created_on updated_on project_id user_id) @@ -333,7 +352,8 @@ class SyncForgeJob < ApplicationJob if version_params.present? Version.transaction do version_params.each do |i| - Version.create!(i.except!(*version_to_delete).merge(user_id: new_user_id, project_id: project_id)) if i.present? + i = i["version"] if platform == "trustie" #trustie上需要 + Version.create!(i&.except!(*version_to_delete).merge(user_id: new_user_id, project_id: project_id)) if i.present? end end end diff --git a/app/models/course_message.rb b/app/models/course_message.rb deleted file mode 100644 index b09613ec4..000000000 --- a/app/models/course_message.rb +++ /dev/null @@ -1,45 +0,0 @@ -class CourseMessage < ApplicationRecord - enum status: { UNHANDLED: 0, PASSED: 1, REJECTED: 2 } - belongs_to :course - belongs_to :user - has_one :course_act, class_name: 'CourseActivity', as: :course_act, dependent: :destroy - - scope :find_by_course, ->(course) { where(course_id: course.id) } - scope :join_course_requests, -> { where(course_message_type: "JoinCourseRequest") } - scope :unhandled, -> { where(status: :UNHANDLED) } - - scope :unhandled_join_course_requests_by_course, ->(course) { find_by_course(course).join_course_requests.unhandled } - - after_create :act_as_course_activity - - def pass! - update!(status: :PASSED) - send_deal_tiding(1) - end - - def application_user - User.find_by(id: course_message_id) - end - - def reject! - update!(status: :REJECTED) - send_deal_tiding(2) - end - - private - - #课程动态公共表记录 - def act_as_course_activity - self.course_act << CourseActivity.new(user_id: course_message_id, course_id: course_id) - end - - def send_deal_tiding deal_status - # 发送申请处理结果消息 - Tiding.create!( - user_id: course_message_id, trigger_user_id: 0, container_id: course_id, container_type: 'DealCourse', - belong_container: course, extra: content.to_i == 2 ? '9' : '7', tiding_type: 'System', status: deal_status - ) - # 将申请消息置为已处理 - Tiding.where(trigger_user_id: course_message_id, container_id: course_id, container_type: 'JoinCourse', status: 0).update_all(status: 1) - end -end \ No newline at end of file diff --git a/app/models/message.rb b/app/models/message.rb deleted file mode 100644 index 59dd84b5b..000000000 --- a/app/models/message.rb +++ /dev/null @@ -1,102 +0,0 @@ -class Message < ApplicationRecord - attr_accessor :total_replies_count - - belongs_to :board, counter_cache: true - belongs_to :author, class_name: "User", foreign_key: 'author_id' - belongs_to :parent, class_name: "Message", foreign_key: "parent_id", counter_cache: :replies_count, optional: true - belongs_to :root, class_name: 'Message', foreign_key: :root_id, counter_cache: :descendants_count, optional: true - - has_one :message_detail, dependent: :destroy - accepts_nested_attributes_for :message_detail, update_only: true - - has_many :children, -> { order(updated_on: :desc ) }, class_name: "Message", foreign_key: "parent_id", dependent: :destroy - has_many :praise_treads, as: :praise_tread_object, dependent: :destroy - has_many :tidings, as: :container, dependent: :destroy - has_many :attachments, as: :container, dependent: :destroy - has_many :course_acts, :class_name => 'CourseActivity',:as =>:course_act ,:dependent => :destroy # 课程动态 - has_many :descendants, class_name: 'Message', foreign_key: :root_id, dependent: :destroy - - scope :root_nodes, -> { where("parent_id IS NULL") } #判断该信息是帖子还是回复。null为发布的帖子 - scope :reply_nodes, -> { where("parent_id IS NOT NULL") } - scope :visible, -> { where(is_hidden: false) } - scope :by_user, ->(user) { visible if user.nil? || !user.admin? } - scope :preload_messages, -> { includes(:author, :message_detail) } - scope :short, -> { select(:id, :subject, :created_on, :replies_count, :visits, :sticky, :praises_count) } - scope :ordered, -> (opts={}) { reorder("created_on #{opts[:sort] == 1 ? 'asc': 'desc'}") } - scope :by_ids, lambda { |ids| where(id: ids) unless ids.blank? } - scope :find_by_boards, ->(ids) {where(board_id: ids)} - scope :by_keywords, lambda { |keywords| - where("subject LIKE ?", "%#{keywords.split(" ").join('|')}%") unless keywords.blank? - } - - - #转发表 - # has_many :forwards, as: :from, dependent: :destroy - - validates :subject, length: { maximum: 255, too_long: "不能超过255个字符" } - - def update_content(content) - message_detail.update_attributes(content: content) - end - - # 主贴的名称 - def main_subject - Rails.logger.info("##########parent: #{parent&.subject}") - parent.present? ? parent.subject : subject - end - - def copy_attachments_to_new_message(new_message, user) - attachments.each do |attach| - new_message.attachments << Attachment.new(attach.attributes.except("id").merge( - quotes: 0, - downloads: 0, - author_id: user.id, - created_on: Time.now - )) - end - end - - def self.bulk_move_to_other_board(message_ids, to_board_id) - to_board = Board.find(to_board_id) - - messages = Message.where(id: message_ids, parent_id: nil).select(:id, :board_id).to_a - return if messages.blank? - - from_board = Board.find(messages.first.board_id) - - root_ids = messages.map(&:id) - children_ids = Message.where(parent_id: root_ids).pluck(:id) - second_children_ids = Message.where(parent_id: children_ids).pluck(:id) - - ids = root_ids.concat(children_ids).concat(second_children_ids).uniq - - ActiveRecord::Base.transaction do - Message.where(id: ids, board_id: from_board.id).update_all(board_id: to_board.id) - to_board.increment!(:messages_count, ids.size) - from_board.increment!(:messages_count, - ids.size) - end - end - - # 包含二级回复的总点赞数 - def total_praises_count - praises_count + descendants.sum(:praises_count) - end - - # 包含二级回复数的总回复数 - def total_replies_count - descendants_count - end - - def has_replies - children.exists? - end - - # - def by_user_with_visible(user) - user.nil? || !user.admin? ? children.visible.limit(5) : children.limit(5) - end - - def update_visits - update_attributes(:visits => visits + 1) - end -end diff --git a/app/models/project.rb b/app/models/project.rb index 5c4e9db18..efe2aef34 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -73,7 +73,8 @@ class Project < ApplicationRecord } user_member = Member.new(member_params) if user_member.save - MemberRole.create!(member_id: user_member.id ,role_id: 3) + role_id = Role.select(:id,:position).where(position: 3)&.first&.id + MemberRole.create!(member_id: user_member.id ,role_id: role_id) end end end diff --git a/app/models/user_extension.rb b/app/models/user_extension.rb index 916404c88..cc4189dd4 100644 --- a/app/models/user_extension.rb +++ b/app/models/user_extension.rb @@ -15,8 +15,8 @@ class UserExtension < ApplicationRecord private def set_laboratory_school - return unless new_record? + # return unless new_record? - self.school_id = Laboratory.current.school_id if school_id.blank? && !Laboratory.current.main_site? + # self.school_id = Laboratory.current.school_id if school_id.blank? && !Laboratory.current.main_site? end end diff --git a/public/react/build/asset-manifest.json b/public/react/build/asset-manifest.json index 0fa441ee9..55553b4c4 100644 --- a/public/react/build/asset-manifest.json +++ b/public/react/build/asset-manifest.json @@ -282,7 +282,7 @@ "./static/js/98.4c2c8b49.chunk.js": "./static/js/98.4c2c8b49.chunk.js", "./static/js/99.4ecedbde.chunk.js": "./static/js/99.4ecedbde.chunk.js", "main.css": "./static/css/main.fd229636.css", - "main.js": "./static/js/main.19b9fc67.js", + "main.js": "./static/js/main.62f0e757.js", "static/media/KaTeX_AMS-Regular.ttf": "static/media/KaTeX_AMS-Regular.aaf4eee9.ttf", "static/media/KaTeX_AMS-Regular.woff": "static/media/KaTeX_AMS-Regular.7f06b4e3.woff", "static/media/KaTeX_AMS-Regular.woff2": "static/media/KaTeX_AMS-Regular.e78e28b4.woff2", diff --git a/public/react/build/index.html b/public/react/build/index.html index 26f4775af..903fbd13b 100644 --- a/public/react/build/index.html +++ b/public/react/build/index.html @@ -24,7 +24,7 @@ _host = 'https://ali-cdn.educoder.net/react/build/' } document.write(' \ No newline at end of file diff --git a/public/react/build/service-worker.js b/public/react/build/service-worker.js index 3bc1d252d..0b7250d04 100644 --- a/public/react/build/service-worker.js +++ b/public/react/build/service-worker.js @@ -1 +1 @@ -"use strict";var precacheConfig=[["/react/build/index.html","957ca76bab563520855e0fb0ae075751"],["/react/build/static/css/main.fd229636.css","fd2296369bdb93090b9d732b4f26607b"],["/react/build/static/js/0.6cbf3a43.chunk.js","fe9889e790a6accd6881c2d807a864f7"],["/react/build/static/js/100.9e9ffcd4.chunk.js","fd232d3f6fc2ecc2da1bdbbee08321fe"],["/react/build/static/js/101.b17c926c.chunk.js","b3997a9fb394580a64867ea0661290ae"],["/react/build/static/js/102.7dc4fb98.chunk.js","a6981a193eac236b776c070b6d293ab6"],["/react/build/static/js/103.84643aea.chunk.js","63af0c8924744f2c22f0e9e7d5d4414c"],["/react/build/static/js/104.05130412.chunk.js","7545c23dd8f2b7140732736bc7105949"],["/react/build/static/js/105.d75f7668.chunk.js","8585a2a0474c1d6d0bbbec0cf64b893c"],["/react/build/static/js/106.1b08f95c.chunk.js","d5a89eafe042c7b60b1c235a5b3f081e"],["/react/build/static/js/107.3cc0a749.chunk.js","25d0505aed7189a0eb2adf498c6dee8a"],["/react/build/static/js/108.c3eadb03.chunk.js","1707a6037a315343e405396dff404d0e"],["/react/build/static/js/109.4f1983f7.chunk.js","0aac60c3dfdcb42c7e953061aaffba9e"],["/react/build/static/js/11.d5b27e7f.chunk.js","ef58106ccf499f2d9f00b7dc72105d54"],["/react/build/static/js/110.8adff765.chunk.js","27e9d699c914111a38b88749f75fc9dd"],["/react/build/static/js/111.9d57ee50.chunk.js","0ad579119538b5cba382eff26c723a30"],["/react/build/static/js/112.7748d553.chunk.js","95b93e8008e4a6b40175454e36bf2256"],["/react/build/static/js/113.dba99a48.chunk.js","880ca70daf5755e2be56c49be8539edf"],["/react/build/static/js/114.f6cd4a20.chunk.js","e18a3f76038c6c3cb56198febedc257d"],["/react/build/static/js/115.c504d39d.chunk.js","a5c03421f5cdc0c980227257c616be4d"],["/react/build/static/js/117.ea2ebf58.chunk.js","f9a4d53511380170a17f9342b35edf3b"],["/react/build/static/js/118.990a3d42.chunk.js","137f8f73751d7a9b3d79f1fbd0079987"],["/react/build/static/js/119.98cb07da.chunk.js","6ba1404c0f7a75024c0bee033821e95d"],["/react/build/static/js/12.21861ea8.chunk.js","a9675091825d7b8cf4100a61498e9b09"],["/react/build/static/js/120.8433dd63.chunk.js","33b662e1c6efc8ac8790c4a40a1ebe9d"],["/react/build/static/js/121.c8330841.chunk.js","bad58a557fb4c3f0f2c6ed871ed9d5d3"],["/react/build/static/js/122.afd8c97f.chunk.js","aeedec8eb17f0fff1d3542ea33ee8c1c"],["/react/build/static/js/123.3adba548.chunk.js","2fc1ce58d48a7118d74d415e5e12dc4c"],["/react/build/static/js/125.716b34a2.chunk.js","d4555a989aacfb8999c312751ee31979"],["/react/build/static/js/126.bc1d7a08.chunk.js","acc667cafe58192c0acc07a7abe47443"],["/react/build/static/js/127.e6dcaee0.chunk.js","1ae4e073f9a89d5093cfafb1d93aee9e"],["/react/build/static/js/128.d5b214b7.chunk.js","e65896774767b0bd8618438542ad46d4"],["/react/build/static/js/129.90267e0c.chunk.js","6f64b6c7224a059e01bb8acca63df740"],["/react/build/static/js/13.a577dbc3.chunk.js","0a94554884746fe2ad13e42282f0ac1f"],["/react/build/static/js/130.8dee28ad.chunk.js","09ba33aae9356bc4f05000c0faec9e2f"],["/react/build/static/js/131.1507b5ad.chunk.js","1f0f29a9109d475aab39e342f48dc58e"],["/react/build/static/js/132.0676057d.chunk.js","cb43d4ccc56bdb69cbad883095379887"],["/react/build/static/js/133.ee74a67e.chunk.js","0da30bf572116a009955445bb2c54bd3"],["/react/build/static/js/134.1042152b.chunk.js","71d3acaef01d45dfb30f5b43ccd06782"],["/react/build/static/js/135.405044a4.chunk.js","b9acb2fe1650d4b77494e13f8c0c57c3"],["/react/build/static/js/136.547a1f81.chunk.js","983f3fb494b77509242607ca971f5346"],["/react/build/static/js/137.aa9652f6.chunk.js","fdd0c5475c3e0b16178a3aa670037bf3"],["/react/build/static/js/138.6d81073e.chunk.js","e90bf2893c8e073a862339f910bb7bb7"],["/react/build/static/js/139.336eb8a9.chunk.js","2fbe6c30244da899d029ef32142b338e"],["/react/build/static/js/14.9b387a30.chunk.js","36e8e4fb051972165451fa14de8c06e6"],["/react/build/static/js/140.73d08f99.chunk.js","2d26d8a8ed98b46477864c9924c84d54"],["/react/build/static/js/141.c204b053.chunk.js","9df282c8e12a2c924593f95d927fed5d"],["/react/build/static/js/142.5c361af9.chunk.js","324516ec2d86a114cad04c7d41ff34f8"],["/react/build/static/js/143.50002176.chunk.js","9bb244dda09b46a2a05efdf451736ccc"],["/react/build/static/js/144.0546d0e8.chunk.js","f8c293a94344dd7db12596d73fb9026c"],["/react/build/static/js/145.42a464de.chunk.js","f445b7224a04df53d1dc17ce7a50aee3"],["/react/build/static/js/146.ddf3afc3.chunk.js","236012abe9d1cd73b55605e072794f73"],["/react/build/static/js/147.077b7476.chunk.js","14a224413fad465b23a8d04f4ca9cb7a"],["/react/build/static/js/148.5d5bbdb4.chunk.js","5008454f9ba039f621b0e522a52a3ec1"],["/react/build/static/js/149.1aa2be7e.chunk.js","be69ecfa048952293c17e7c8ad7c8d7f"],["/react/build/static/js/15.481a375b.chunk.js","290a5f356d468f22a4e6f6e3dd76fc9d"],["/react/build/static/js/150.92b4b72a.chunk.js","3ec5210fa3fb5f9b2fd8c2ae9e254198"],["/react/build/static/js/151.de2797a9.chunk.js","4ee6300cc31149ed91546b275551b179"],["/react/build/static/js/152.33524f88.chunk.js","810d8c5c4d0949e8406332e8a16708ba"],["/react/build/static/js/153.5d717dcb.chunk.js","1d44687ad83a8e9bff737b4f2bf6091c"],["/react/build/static/js/154.896bcfd6.chunk.js","b21457b4469074f258c643bc9233b9c1"],["/react/build/static/js/155.c7ea89ff.chunk.js","0e7aa4920292da6bebe0a6a634eaaaf2"],["/react/build/static/js/156.e309d4b3.chunk.js","aa5f21bdb4c48f2ca0a6ad19cecc10da"],["/react/build/static/js/157.d4fb925e.chunk.js","a51b7196079f852d0939b2d29155d22c"],["/react/build/static/js/158.7fed5f26.chunk.js","9e6c359dfc6219cb5ecc280e796fd956"],["/react/build/static/js/159.d0c7b286.chunk.js","9ad939754ea699e5e3a4b2df12dd0fc4"],["/react/build/static/js/16.f5208d04.chunk.js","01ee0f9744d4b106cc371920e6f3569e"],["/react/build/static/js/160.c3c3e4c6.chunk.js","cd69beebbdc70dc85726cf2565cbd8eb"],["/react/build/static/js/161.aca1d5df.chunk.js","c04b5c5e56f164e000b77daf02c3d1b3"],["/react/build/static/js/162.bd274198.chunk.js","52b881ac94e0b0ccd4afd115a20dfc52"],["/react/build/static/js/163.b713fe5d.chunk.js","d0f6b0429f834640455727d0d36b25dd"],["/react/build/static/js/164.c4629f51.chunk.js","c08c6b0c60aae829345e9597b22f65a4"],["/react/build/static/js/165.218a5560.chunk.js","f4e54ad1d02822e771ce709750efcb6e"],["/react/build/static/js/166.68f61142.chunk.js","c73f42320b8977c13d285fda6f26d7bd"],["/react/build/static/js/167.f5226e09.chunk.js","f84d78b559260ad61cd227e95d3c1eef"],["/react/build/static/js/168.bc78cd9b.chunk.js","51e744b9a7d74ccfa0b809e22c2a527f"],["/react/build/static/js/169.76cc22e9.chunk.js","2155d1287c84ec58b300dcb38bbf4d37"],["/react/build/static/js/17.a4471a8c.chunk.js","5c540eb9b1d0272d75a8f7d831d86dab"],["/react/build/static/js/170.60891690.chunk.js","b6d654ba69c8757debefa3caa2059c84"],["/react/build/static/js/171.1ae8f31b.chunk.js","f2d54e0d32c5063e161ddc040e322df6"],["/react/build/static/js/172.aaa0bdff.chunk.js","2af0b07afd8514296dc9ec93ac2434e5"],["/react/build/static/js/173.c36bfb35.chunk.js","6b0fa99d6fb4a89485c1f5eafbb7493f"],["/react/build/static/js/174.fb7f8bd6.chunk.js","8af8d3942608520d12d644337653bef8"],["/react/build/static/js/175.d0921c3e.chunk.js","8208c1a770579fcf1e2a02597a309bed"],["/react/build/static/js/176.7f48a483.chunk.js","61bfa2c195d30c7170d9c5a6d70975be"],["/react/build/static/js/177.ba6b3db3.chunk.js","06b6b6347f643300f0f9951dba4286db"],["/react/build/static/js/178.c7793f3d.chunk.js","bf0ef41e97b9865bc6c60af8968d954e"],["/react/build/static/js/179.40d2a4bc.chunk.js","1fbcac9b9babd6996747010f1a3cda7b"],["/react/build/static/js/18.8828ef97.chunk.js","b1290a04f6ac7bd5f44bcc66b8cad73c"],["/react/build/static/js/180.9354340c.chunk.js","39ad200c7bac884716bb798d25444eed"],["/react/build/static/js/181.8d94b21c.chunk.js","6dc4a7fee49241376dd8b1dd86fc7680"],["/react/build/static/js/182.5da215c2.chunk.js","9a09e9b688623849d0ab01d1280afeaa"],["/react/build/static/js/183.52491e86.chunk.js","af989e1361f227d9881278a11b8383c4"],["/react/build/static/js/184.2e7a74f1.chunk.js","8438801dd9b1cf8ad500e81a8eb31a86"],["/react/build/static/js/185.6ffe9bde.chunk.js","6c4aa79b24a8c461287a0819fc1e9e55"],["/react/build/static/js/186.ea7d32cb.chunk.js","172a127b62cb70250566b18e127cd108"],["/react/build/static/js/187.aebe3147.chunk.js","e24a0ca61be14d357967a4b040a950f3"],["/react/build/static/js/188.80d8184a.chunk.js","31ad61b4d5065400c51ecffa95d7a9c3"],["/react/build/static/js/189.5bd03381.chunk.js","0503c8e563eb6b4560461533a11bb6e9"],["/react/build/static/js/19.7aa0952c.chunk.js","92e6650e92f52a221b63597e9d304f3b"],["/react/build/static/js/190.96c35b32.chunk.js","7a847dee02454b71193db9c7bf970216"],["/react/build/static/js/191.4cf1b62a.chunk.js","de379d0afdfe60eb67a1fd70bd8c55dc"],["/react/build/static/js/192.3321260a.chunk.js","49e22b063f30bcf6192fa3cf1f220c19"],["/react/build/static/js/193.13cddb64.chunk.js","09cefc2b98a430dd01443c3df6e78750"],["/react/build/static/js/194.05c3c286.chunk.js","af4adcb50f60c7b0e84200f74925daee"],["/react/build/static/js/195.725f8560.chunk.js","9f9393cc87bc3c5dadf03be2ceeaf266"],["/react/build/static/js/196.c3b35993.chunk.js","7591e9581ca948ca24711858cf7f29f5"],["/react/build/static/js/197.e5f9cdaf.chunk.js","66e3ca87ffb533433d2f9d93882f59bb"],["/react/build/static/js/198.56e68293.chunk.js","41b3631b162b1a1836fb1c3590543851"],["/react/build/static/js/199.c1d38441.chunk.js","4e67e386f4f81b197a0041c8496d8645"],["/react/build/static/js/20.ada00052.chunk.js","06419243f01cda074fe7f5b56fb24d39"],["/react/build/static/js/200.b9bde2be.chunk.js","ef53574b70e01dddee6740a611f1c08d"],["/react/build/static/js/201.8037b377.chunk.js","1659068e553e2be272b3d37fbfc061a6"],["/react/build/static/js/202.eec499d7.chunk.js","d503746e17e70a2ecce7ab7854d69cae"],["/react/build/static/js/203.bfe11e20.chunk.js","477fa78c2b870a07a76dc8e6b58a67f7"],["/react/build/static/js/204.283a7a23.chunk.js","d75ec5b786ee719b9aa740023bf4691a"],["/react/build/static/js/205.3c8d5328.chunk.js","c4dcbb67edaf7bc2bffdb559b06af71c"],["/react/build/static/js/206.d68b23ad.chunk.js","bcd7dc154e18b869b0be3f79fa25a439"],["/react/build/static/js/207.a4dd700a.chunk.js","ca1b26e21123816698808374f83f192b"],["/react/build/static/js/208.676d85b2.chunk.js","4dd6f0b6bdba00f5cb81c06d08c4f042"],["/react/build/static/js/209.b7fa21e1.chunk.js","fcddabea787a4f57bc22d4bb747aa185"],["/react/build/static/js/21.c4c72e09.chunk.js","3951475548bc959e75c6a2fea80022e2"],["/react/build/static/js/210.1db5f581.chunk.js","c922f8ed4c154506d250317a460edc0c"],["/react/build/static/js/211.07843e2a.chunk.js","09ce5bbeabdc499d036ebe9d504f963c"],["/react/build/static/js/212.d383296f.chunk.js","acc1a6177d4c3d940b167ac4679302e4"],["/react/build/static/js/213.dbafcad3.chunk.js","5b567ae2260f8254f20aea278d8d249d"],["/react/build/static/js/214.11727123.chunk.js","b46f07d7e23d618bb004d41a6dba1840"],["/react/build/static/js/215.541b10e3.chunk.js","7c1433d371c80ab6ab31940430440988"],["/react/build/static/js/216.86b49945.chunk.js","43b18a376f907b513cc270447dda32e8"],["/react/build/static/js/217.0fabecd8.chunk.js","f1fabca2bafaa5f54408c5efa928bd4f"],["/react/build/static/js/218.582ecdf4.chunk.js","e87c433c09860ae6849db6162c38dff0"],["/react/build/static/js/219.89b1b046.chunk.js","0e471cd44b3a3740aff1a6313e6f1042"],["/react/build/static/js/22.d79dbd3f.chunk.js","6a776d923b5fee0cd029d3c6fb6d4e1f"],["/react/build/static/js/220.8d2dd559.chunk.js","f7bfd7a6f14cb63ea114b3fac0211bff"],["/react/build/static/js/221.8466c9d9.chunk.js","3da30fe465eb5c391559477cf634241f"],["/react/build/static/js/222.c937f238.chunk.js","493a6333ae6864186695af6a0785d803"],["/react/build/static/js/223.dabff569.chunk.js","d5ba81fa57f044913ec5903f632ff9c0"],["/react/build/static/js/224.91ff3d9b.chunk.js","4c1acee0086aca77d6e95620c899ddab"],["/react/build/static/js/225.636bbb2d.chunk.js","bb188a5b2336b70de9226dbbf71c6a10"],["/react/build/static/js/226.be0e40f1.chunk.js","549a3a274df3b0346501f8547cca1221"],["/react/build/static/js/227.13a7c0fe.chunk.js","4ffbfd4940aaa81f2a07cfd5b02da0ef"],["/react/build/static/js/228.9df9baf0.chunk.js","d142b6600d0ba3358404bdeb91d37e5c"],["/react/build/static/js/229.a6ebc932.chunk.js","a2feda7719eff7b82f310301adf766eb"],["/react/build/static/js/23.03b1924f.chunk.js","d2519a5fd4f2623b374dda12a56bb1ef"],["/react/build/static/js/230.e9c51cdd.chunk.js","40277e8f887b807fdc3e6e45ec69431a"],["/react/build/static/js/231.29cefeb3.chunk.js","366862cfeac6a4fe8dce24ef5dcc7687"],["/react/build/static/js/232.f3e2b3b6.chunk.js","5abda910d08a678e073857ba18d6796e"],["/react/build/static/js/233.9c04de12.chunk.js","200708e976cc70a7831874f11eb5c24f"],["/react/build/static/js/234.dd9bf9b0.chunk.js","7196b0eaeddaa53b4b5efb8c1ac42b08"],["/react/build/static/js/235.68528770.chunk.js","4318052b65d5c4ddafcd2f38f283d607"],["/react/build/static/js/236.9a958ee9.chunk.js","31bb320360b3eac1e8e1f9628278a913"],["/react/build/static/js/237.ca535ae6.chunk.js","c9c961adf3f49d5f9c680ab4cea87dd0"],["/react/build/static/js/238.b7b581af.chunk.js","c0500cb9fd917e12a4f00f2033aab703"],["/react/build/static/js/239.65a3109b.chunk.js","d91ef9844cd44dff346df76f8e3e8273"],["/react/build/static/js/24.340d959b.chunk.js","feccc0ead150ec747bf2e31f7c958101"],["/react/build/static/js/240.5b21e38b.chunk.js","9cdc0a950c173361b38a9aec61c50358"],["/react/build/static/js/241.846826f8.chunk.js","36fa2fc7d15f39bcaf94690b16d22c69"],["/react/build/static/js/242.faf5aa19.chunk.js","6628adda733db8f9e0480836144e231a"],["/react/build/static/js/243.bbb8a67b.chunk.js","a09a2e6a0e49d435ed5e09f5c0d00eb4"],["/react/build/static/js/244.637f4a1c.chunk.js","4c7cc576650fbb23369af31b20ef9f91"],["/react/build/static/js/245.04a36e8c.chunk.js","3a46bb7f40f539ac0a50d0c9afb5ae02"],["/react/build/static/js/246.7d297525.chunk.js","72022e97a013be5127771f020a59c1d7"],["/react/build/static/js/247.39174b85.chunk.js","79d0d56d6035cd07f4ac2a216b8bd12a"],["/react/build/static/js/248.de0106d1.chunk.js","197df1a0c4aab20d7f966d505a657c16"],["/react/build/static/js/249.72d30189.chunk.js","4550916960c5428c2cb8f811af6ba95f"],["/react/build/static/js/25.c01cc121.chunk.js","d36f61623bf47550a71763acc0d18261"],["/react/build/static/js/250.845e052b.chunk.js","cea64ab76b63c6d93ff48eeeb17ea789"],["/react/build/static/js/251.fd617788.chunk.js","55ea0b9cc75b3c5d4c8e3d9d28ee1e62"],["/react/build/static/js/252.5a8c3a4b.chunk.js","950e34690cae33afc7c893f0ae56032c"],["/react/build/static/js/253.efa9425e.chunk.js","81c270aab4b10bd51a2eec6d85398b07"],["/react/build/static/js/254.4e8cc1bf.chunk.js","912560dde8c1d55583d79b69607e41db"],["/react/build/static/js/255.f0ac6c13.chunk.js","63e6bbd6ce9b0f3ffecc2ed35e542f5a"],["/react/build/static/js/256.45fc6f1c.chunk.js","d07d7efdb69ad6f24a9a8e76c088b8a3"],["/react/build/static/js/257.d15a375f.chunk.js","94ed438fb8f943d617e11a2188dfac17"],["/react/build/static/js/258.2c9054a9.chunk.js","e67f3fc9fd4610a6dceab5e1f75a6b96"],["/react/build/static/js/259.2dd45d09.chunk.js","f6de3b4345ad6c93df2a0a4b88461d4d"],["/react/build/static/js/26.88e3521d.chunk.js","88433e2b1a8492d2963bcff028caae96"],["/react/build/static/js/260.4eed7902.chunk.js","92a2e8e7e909a364eab7850ee649ba84"],["/react/build/static/js/261.92832c38.chunk.js","aaea8db0cbaab1d985b9908d06f7a5b7"],["/react/build/static/js/262.187b5a16.chunk.js","c7710972f23b82414d862a974ca288ff"],["/react/build/static/js/263.e8f99d16.chunk.js","b337fe904b281433d8541f392a4fddab"],["/react/build/static/js/264.f45787c3.chunk.js","3d9e1b73ffdf9777aad932b3cf8fb9e2"],["/react/build/static/js/265.b8d823dc.chunk.js","b946608e9756a2bc7b17b284a05b5d82"],["/react/build/static/js/266.0d065e69.chunk.js","f5f4053839fdf70bd6957dfb2942aa9d"],["/react/build/static/js/267.b4ae9fa9.chunk.js","238d40ef55cd90e81e359e2218dd5f7c"],["/react/build/static/js/268.e4db0ff5.chunk.js","4a559b92ad1edca127d7d4cec9687166"],["/react/build/static/js/269.a595926e.chunk.js","f7e7cec8be5480dbb23ec9ab4997ba1d"],["/react/build/static/js/27.e5bab7df.chunk.js","f727b6b050d3d375fd5708f3e2ae58ce"],["/react/build/static/js/270.5887d7e7.chunk.js","36b45722f755fdc5454dd441d2249f28"],["/react/build/static/js/271.646bfed1.chunk.js","836b57e7c54f2a8a1a4a3a4599ffc2b8"],["/react/build/static/js/272.7b18371f.chunk.js","edd7bbca4f57fc01bff6ce4cd6bfb58b"],["/react/build/static/js/273.33c382d7.chunk.js","54e10d9c8c9120d4cbb5e910109ecb71"],["/react/build/static/js/274.e27dcfa8.chunk.js","c709ec1fdb918dc16642e9d56ca27ba0"],["/react/build/static/js/275.c590be45.chunk.js","680a4cc8d064cb37493388bcab91af1e"],["/react/build/static/js/276.f116cd29.chunk.js","9ad8fa2a90e00658ed6f15667410ac33"],["/react/build/static/js/277.df77d226.chunk.js","0926ba33f5e3d59c46b13e68b4d5a90d"],["/react/build/static/js/278.9571e31d.chunk.js","2da2381fd5083a78141bb7e48262a070"],["/react/build/static/js/279.94ffda0b.chunk.js","1904b1e1cb29f0d7b660a925c2309b08"],["/react/build/static/js/28.a915e959.chunk.js","729a239de0670a7d4539562a75e7f04b"],["/react/build/static/js/280.33003f17.chunk.js","15f0b5decf6305d75312fd053c2f824f"],["/react/build/static/js/281.ac0d0514.chunk.js","bb3b89dd7a7f4751252351e37e1ddefd"],["/react/build/static/js/29.c8087b62.chunk.js","a1b33ad587817d4014208fed34ecec77"],["/react/build/static/js/30.6b85aa3e.chunk.js","4dcacd57d57e0e9455bc9a0cd9710384"],["/react/build/static/js/31.d46ce4c7.chunk.js","43a5654020404587397028fc9cfbb50b"],["/react/build/static/js/32.33c6a9c4.chunk.js","0643bd222699563ed02bab47ff003203"],["/react/build/static/js/33.dc87b769.chunk.js","992ec560d0c3f8d3f76cf41cf6f4db99"],["/react/build/static/js/34.2741f759.chunk.js","8fe780f69232d6380412b5a77a28b4b4"],["/react/build/static/js/35.46c5e9ac.chunk.js","4e3362ba14c31be008374cbfe36c7a03"],["/react/build/static/js/36.e38fca6d.chunk.js","528e1badc53e3c45998da980d725d4f1"],["/react/build/static/js/37.6b41d509.chunk.js","ab026178a32faa43b0cd1eed1e5c42e6"],["/react/build/static/js/38.c1783279.chunk.js","2515020804b7a4f1174ce7d0f714a15e"],["/react/build/static/js/39.e5de792f.chunk.js","e1f0401dd4d26afb0a832afee79d0125"],["/react/build/static/js/40.b4a7645c.chunk.js","0b3f5d87d279cf2149678e44364179e9"],["/react/build/static/js/41.5a901a33.chunk.js","d8f78f60b77f3b89638901ce4e3ee3c3"],["/react/build/static/js/42.fcb23173.chunk.js","f0c05e48f25faa5c052143fce33036ad"],["/react/build/static/js/43.037da1d0.chunk.js","bec27dec24265552777c117a73140d6b"],["/react/build/static/js/44.b6c3b1fb.chunk.js","1894a5ef9d03660a93805e16d3c3b8f7"],["/react/build/static/js/45.98b6bbb5.chunk.js","9f4f0a496335c7e0dae15d455cda00d5"],["/react/build/static/js/46.a99df4ee.chunk.js","e5da0f7a33fac43df254fa2bc1e64137"],["/react/build/static/js/47.e06dd4de.chunk.js","abec883d724c69b8faf00dca040c2c70"],["/react/build/static/js/48.bbdc2f93.chunk.js","64a3dc4a622d3798dca9052c75717586"],["/react/build/static/js/49.f3a1e05c.chunk.js","c04186e1e9a0ac138ccbc180c110d4ab"],["/react/build/static/js/50.0ad9ca7e.chunk.js","617505982ad86fe7ec839979148eaf30"],["/react/build/static/js/51.2e4c0d09.chunk.js","adefe484d8f7646dd4bdcb8d1d9d4af8"],["/react/build/static/js/52.69591260.chunk.js","1f60cf0b2e1b9eb7c822f8169f81a213"],["/react/build/static/js/53.56f0275e.chunk.js","08ae68ca7b9b8a4ab1737ef7a103d91f"],["/react/build/static/js/54.6f4e533a.chunk.js","ceadf003235a2264bf665b633eea4c07"],["/react/build/static/js/55.c182677a.chunk.js","8c60a6e05dcab8596b534578c3878b35"],["/react/build/static/js/56.04a9dd3a.chunk.js","8e1f2d8b0da1439e165e5fc4c7bacfd7"],["/react/build/static/js/57.23c6a8c8.chunk.js","28e293e49a197d0926f940cb74696b46"],["/react/build/static/js/58.2a19efe1.chunk.js","273a0899cd9376ddbdffcb43d2343e0c"],["/react/build/static/js/59.1afe7551.chunk.js","19e39fa92c010e450f06de26cf9c2afe"],["/react/build/static/js/65.23482fc0.chunk.js","7babc82c22cc19d8c4a78441c26c59ab"],["/react/build/static/js/71.1fae9954.chunk.js","21d2c1065cac9af4e57aeb289cea4560"],["/react/build/static/js/72.566df07d.chunk.js","7619bd477809c175f7be8acedadbc0a5"],["/react/build/static/js/73.72054aec.chunk.js","69f1b4259a28b5f0717c5247e0ee280b"],["/react/build/static/js/74.afd6ad85.chunk.js","8e74092c4c2c43ba6f8a3ed9b285d950"],["/react/build/static/js/75.88aeb9c3.chunk.js","79ec63980ccdd2eec81571886ad50284"],["/react/build/static/js/77.e1fc75bb.chunk.js","e28b2f548f1f98f851206ec384f5d69c"],["/react/build/static/js/78.ab545a36.chunk.js","8aa1b9bd6ed0297a69d6a545519de1da"],["/react/build/static/js/79.fc5af457.chunk.js","1350b55b2fb8a45459de13e4301ea55c"],["/react/build/static/js/80.d358e547.chunk.js","ae06b49dfc926058a6ddc67e92a6d0ad"],["/react/build/static/js/81.c2a9bf71.chunk.js","d66bbb1e9590e218224b42b12de57ef9"],["/react/build/static/js/83.c716f0ba.chunk.js","0ed397d397abfa898c18fc1259ffd989"],["/react/build/static/js/84.30f8dc49.chunk.js","1c257b72c6eadf25d0a8d594f4698a0b"],["/react/build/static/js/86.211f1548.chunk.js","97b0ce684e91d061cf16177add1b8a13"],["/react/build/static/js/87.a1ade9a1.chunk.js","469c65874afaed7a9b42e5baea502252"],["/react/build/static/js/88.5e7d925c.chunk.js","02404756e246c072ee8538f1535711c9"],["/react/build/static/js/89.a44f4ff3.chunk.js","189dd45d8aca671a50638aa652e5309a"],["/react/build/static/js/90.567f61ca.chunk.js","948f2df08306d90e298cc1f0b76d6840"],["/react/build/static/js/91.b1fabdb5.chunk.js","e5081d9d6e0074dea1d9a380425bdf33"],["/react/build/static/js/92.b449ca08.chunk.js","a4240f86a129697fe3d9e68a5149692b"],["/react/build/static/js/93.6266a14e.chunk.js","fd4a84e4a0ce70870736aa2d16a54684"],["/react/build/static/js/94.90a9d0fc.chunk.js","5adccc3088629994a02e186710d97a2a"],["/react/build/static/js/95.600297ee.chunk.js","f6ccf344503f86fa5c5217477d83781a"],["/react/build/static/js/96.bb33bc7c.chunk.js","b933b9efbd231eb3eb10309465e5fdb9"],["/react/build/static/js/97.c8763fd2.chunk.js","249ed1d32bd6712776f23461dd876ad6"],["/react/build/static/js/98.4c2c8b49.chunk.js","0077070436cf6e6a267896656bc9c1dc"],["/react/build/static/js/99.4ecedbde.chunk.js","67cea9cdeb3638083d3cf663c7278b64"],["/react/build/static/media/KaTeX_AMS-Regular.7f06b4e3.woff","7f06b4e30317f784d61d26686aed0ab2"],["/react/build/static/media/KaTeX_AMS-Regular.aaf4eee9.ttf","aaf4eee9fba9907d61c3935e0b6a54ae"],["/react/build/static/media/KaTeX_AMS-Regular.e78e28b4.woff2","e78e28b4834954df047e4925e9dbf354"],["/react/build/static/media/KaTeX_Caligraphic-Bold.021dd4dc.ttf","021dd4dc61ee5f5cdf315f43b48c094b"],["/react/build/static/media/KaTeX_Caligraphic-Bold.1e802ca9.woff","1e802ca9dedc4ed4e3c6f645e4316128"],["/react/build/static/media/KaTeX_Caligraphic-Bold.4ec58bef.woff2","4ec58befa687e9752c3c91cd9bcf1bcb"],["/react/build/static/media/KaTeX_Caligraphic-Regular.7edb53b6.woff2","7edb53b6693d75b8a2232481eea1a52c"],["/react/build/static/media/KaTeX_Caligraphic-Regular.d3b46c3a.woff","d3b46c3a530116933081d9d74e3e9fe8"],["/react/build/static/media/KaTeX_Caligraphic-Regular.d49f2d55.ttf","d49f2d55ce4f40f982d8ba63d746fbf9"],["/react/build/static/media/KaTeX_Fraktur-Bold.a31e7cba.ttf","a31e7cba7b7221ebf1a2ae545fb306b2"],["/react/build/static/media/KaTeX_Fraktur-Bold.c4c8cab7.woff","c4c8cab7d5be97b2bb283e531c077355"],["/react/build/static/media/KaTeX_Fraktur-Bold.d5b59ec9.woff2","d5b59ec9764e10f4a82369ae29f3ac58"],["/react/build/static/media/KaTeX_Fraktur-Regular.32a5339e.woff2","32a5339eb809f381a7357ba56f82aab3"],["/react/build/static/media/KaTeX_Fraktur-Regular.a48dad4f.ttf","a48dad4f58c82e38a10da0ceebb86370"],["/react/build/static/media/KaTeX_Fraktur-Regular.b7d9c46b.woff","b7d9c46bff5d51da6209e355cc4a235d"],["/react/build/static/media/KaTeX_Main-Bold.22086eb5.woff","22086eb5d97009c3e99bcc1d16ce6865"],["/react/build/static/media/KaTeX_Main-Bold.8e1e01c4.woff2","8e1e01c4b1207c0a383d9a2b4f86e637"],["/react/build/static/media/KaTeX_Main-Bold.9ceff51b.ttf","9ceff51b3cb7ce6eb4e8efa8163a1472"],["/react/build/static/media/KaTeX_Main-BoldItalic.284a17fe.woff2","284a17fe5baf72ff8217d4c7e70c0f82"],["/react/build/static/media/KaTeX_Main-BoldItalic.4c57dbc4.woff","4c57dbc44bfff1fdf08a59cf556fdab3"],["/react/build/static/media/KaTeX_Main-BoldItalic.e8b44b99.ttf","e8b44b990516dab7937bf240fde8b46a"],["/react/build/static/media/KaTeX_Main-Italic.29c86397.ttf","29c86397e75cdcb3135af8295f1c2e28"],["/react/build/static/media/KaTeX_Main-Italic.99be0e10.woff","99be0e10c38cd42466e6fe1665ef9536"],["/react/build/static/media/KaTeX_Main-Italic.e533d5a2.woff2","e533d5a2506cf053cd671b335ec04dde"],["/react/build/static/media/KaTeX_Main-Regular.5c734d78.woff2","5c734d78610fa35282f3379f866707f2"],["/react/build/static/media/KaTeX_Main-Regular.5c94aef4.ttf","5c94aef490324b0925dbe5f643e8fd04"],["/react/build/static/media/KaTeX_Main-Regular.b741441f.woff","b741441f6d71014d0453ca3ebc884dd4"],["/react/build/static/media/KaTeX_Math-BoldItalic.9a2834a9.ttf","9a2834a9ff8ab411153571e0e55ac693"],["/react/build/static/media/KaTeX_Math-BoldItalic.b13731ef.woff","b13731ef4e2bfc3d8d859271e39550fc"],["/react/build/static/media/KaTeX_Math-BoldItalic.d747bd1e.woff2","d747bd1e7a6a43864285edd73dcde253"],["/react/build/static/media/KaTeX_Math-Italic.291e76b8.ttf","291e76b8871b84560701bd29f9d1dcc7"],["/react/build/static/media/KaTeX_Math-Italic.4ad08b82.woff2","4ad08b826b8065e1eab85324d726538c"],["/react/build/static/media/KaTeX_Math-Italic.f0303906.woff","f0303906c2a67ac63bf1e8ccd638a89e"],["/react/build/static/media/KaTeX_SansSerif-Bold.3fb41955.woff","3fb419559955e3ce75619f1a5e8c6c84"],["/react/build/static/media/KaTeX_SansSerif-Bold.6e0830be.woff2","6e0830bee40435e72165345e0682fbfc"],["/react/build/static/media/KaTeX_SansSerif-Bold.7dc027cb.ttf","7dc027cba9f7b11ec92af4a311372a85"],["/react/build/static/media/KaTeX_SansSerif-Italic.4059868e.ttf","4059868e460d2d2e6be18e180d20c43d"],["/react/build/static/media/KaTeX_SansSerif-Italic.727a9b0d.woff","727a9b0d97d72d2fc0228fe4e07fb4d8"],["/react/build/static/media/KaTeX_SansSerif-Italic.fba01c9c.woff2","fba01c9c6fb2866a0f95bcacb2c187a5"],["/react/build/static/media/KaTeX_SansSerif-Regular.2555754a.woff","2555754a67062cac3a0913b715ab982f"],["/react/build/static/media/KaTeX_SansSerif-Regular.5c58d168.ttf","5c58d168c0b66d2c32234a6718e74dfb"],["/react/build/static/media/KaTeX_SansSerif-Regular.d929cd67.woff2","d929cd671b19f0cfea55b6200fb47461"],["/react/build/static/media/KaTeX_Script-Regular.755e2491.woff2","755e2491f13b5269f0afd5a56f7aa692"],["/react/build/static/media/KaTeX_Script-Regular.d12ea9ef.ttf","d12ea9efb375f9dc331f562e69892638"],["/react/build/static/media/KaTeX_Script-Regular.d524c9a5.woff","d524c9a5b62a17f98f4a97af37fea735"],["/react/build/static/media/KaTeX_Size1-Regular.048c39cb.woff2","048c39cba4dfb0460682a45e84548e4b"],["/react/build/static/media/KaTeX_Size1-Regular.08b5f00e.woff","08b5f00e7140f7a10e62c8e2484dfa5a"],["/react/build/static/media/KaTeX_Size1-Regular.7342d45b.ttf","7342d45b052c3a2abc21049959fbab7f"],["/react/build/static/media/KaTeX_Size2-Regular.81d6b8d5.woff2","81d6b8d5ca77d63d5033d6991549a659"],["/react/build/static/media/KaTeX_Size2-Regular.af24b0e4.woff","af24b0e4b7e52656ca77914695c99930"],["/react/build/static/media/KaTeX_Size2-Regular.eb130dcc.ttf","eb130dcc661de766c999c60ba1525a88"],["/react/build/static/media/KaTeX_Size3-Regular.0d892640.woff","0d8926405d832a4b065e516bd385d812"],["/react/build/static/media/KaTeX_Size3-Regular.7e02a40c.ttf","7e02a40c41e52dc3b2b6b197bbdf05ea"],["/react/build/static/media/KaTeX_Size3-Regular.b311ca09.woff2","b311ca09df2c89a10fbb914b5a053805"],["/react/build/static/media/KaTeX_Size4-Regular.68895bb8.woff","68895bb880a61a7fc019dbfaa5121bb4"],["/react/build/static/media/KaTeX_Size4-Regular.6a3255df.woff2","6a3255dfc1ba41c46e7e807f8ab16c49"],["/react/build/static/media/KaTeX_Size4-Regular.ad767252.ttf","ad7672524b64b730dfd176140a8945cb"],["/react/build/static/media/KaTeX_Typewriter-Regular.25702356.ttf","257023560753aeb0b89b7e434d3da17f"],["/react/build/static/media/KaTeX_Typewriter-Regular.3fe216d2.woff","3fe216d2a5f736c560cde71984554b64"],["/react/build/static/media/KaTeX_Typewriter-Regular.6cc31ea5.woff2","6cc31ea5c223c88705a13727a71417fa"],["/react/build/static/media/auth.43f1c749.png","43f1c7490f28c59e28637c7db9318878"],["/react/build/static/media/banner_list.ad510bee.png","ad510bee30a694aaedd0e2a96442ffe4"],["/react/build/static/media/banner_sub.c6034810.png","c6034810c9bd0d58dfee1ccf66f2b592"],["/react/build/static/media/beian.d0289dc0.png","d0289dc0a46fc5b15b3363ffa78cf6c7"],["/react/build/static/media/beijintulogontwo.245dc9e1.png","245dc9e1ed09d34f605c2d5799ee3327"],["/react/build/static/media/bg.88a774b5.jpg","88a774b50bcc4fcb43abbe7ca5d34886"],["/react/build/static/media/douyu.e5ea5a90.jpg","e5ea5a904483e1c25f47a090e83319ed"],["/react/build/static/media/firefox_icon.cfd87a8f.png","cfd87a8f62ae37a34dab9f4b5c79b168"],["/react/build/static/media/guihome1.eca5276e.png","eca5276e17b07d59b37f161cf1ab7b3a"],["/react/build/static/media/guihome2.c65f40bf.jpg","c65f40bff07ed7c4e1d9abca9d77358c"],["/react/build/static/media/guihome3.0e1dc34b.jpg","0e1dc34b920481e8bc1bb1954eada1f1"],["/react/build/static/media/guihome4.6cc0d72b.jpg","6cc0d72b6f3f8cf8dedce533b9083810"],["/react/build/static/media/guihome5.1ac2c872.jpg","1ac2c8722fe3be81805dcc16df845ffb"],["/react/build/static/media/guihome6.7fc4fe9d.jpg","7fc4fe9d191f769592826b692fbf0560"],["/react/build/static/media/internet-explorer@2x.f122e0ab.png","f122e0abfbe49c051dba0e2d7f3d00f5"],["/react/build/static/media/job.b2881c7d.png","b2881c7d0317f7109101f3db1bcae775"],["/react/build/static/media/logo.c72d4a3b.svg","c72d4a3ba95e0b700fae9febca0e3200"],["/react/build/static/media/match_ad.4e957369.jpg","4e957369790f079662eb2dca03ece6be"],["/react/build/static/media/message.e7922cf2.svg","e7922cf2a56f9b54e44709e40626460b"],["/react/build/static/media/messagegrey.80d0b058.svg","80d0b0580c10b5e7fc571c3064a991c5"],["/react/build/static/media/mytc.4ef5faf4.png","4ef5faf4ec6fdee6a4909d34b9a1a171"],["/react/build/static/media/oj_banner.25ca233e.jpg","25ca233e22299a2a1e2f577eed32e745"],["/react/build/static/media/passall.46817e26.png","46817e2696bbb2ac4bf0e5bc4e8b101e"],["/react/build/static/media/passpart.4aaf3e6b.png","4aaf3e6b4667dc531eee7f4e5f807d70"],["/react/build/static/media/rc-tree.776c7fe6.png","776c7fe67df0637005b1a1372066ed84"],["/react/build/static/media/skzbdx.01cb5862.png","01cb58627ee7981e0bcb65c8467d4975"],["/react/build/static/media/teach_ex.a415d7a9.jpg","a415d7a9bbc72fe5d3aafd002181cc09"]],cacheName="sw-precache-v3-sw-precache-webpack-plugin-"+(self.registration?self.registration.scope:""),ignoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(a,c){var e=new URL(a);return"/"===e.pathname.slice(-1)&&(e.pathname+=c),e.toString()},cleanResponse=function(c){return c.redirected?("body"in c?Promise.resolve(c.body):c.blob()).then(function(a){return new Response(a,{headers:c.headers,status:c.status,statusText:c.statusText})}):Promise.resolve(c)},createCacheKey=function(a,c,e,d){var t=new URL(a);return d&&t.pathname.match(d)||(t.search+=(t.search?"&":"")+encodeURIComponent(c)+"="+encodeURIComponent(e)),t.toString()},isPathWhitelisted=function(a,c){if(0===a.length)return!0;var e=new URL(c).pathname;return a.some(function(a){return e.match(a)})},stripIgnoredUrlParameters=function(a,e){var c=new URL(a);return c.hash="",c.search=c.search.slice(1).split("&").map(function(a){return a.split("=")}).filter(function(c){return e.every(function(a){return!a.test(c[0])})}).map(function(a){return a.join("=")}).join("&"),c.toString()},hashParamName="_sw-precache",urlsToCacheKeys=new Map(precacheConfig.map(function(a){var c=a[0],e=a[1],d=new URL(c,self.location),t=createCacheKey(d,hashParamName,e,/\.\w{8}\./);return[d.toString(),t]}));function setOfCachedUrls(a){return a.keys().then(function(a){return a.map(function(a){return a.url})}).then(function(a){return new Set(a)})}self.addEventListener("install",function(a){a.waitUntil(caches.open(cacheName).then(function(d){return setOfCachedUrls(d).then(function(e){return Promise.all(Array.from(urlsToCacheKeys.values()).map(function(c){if(!e.has(c)){var a=new Request(c,{credentials:"same-origin"});return fetch(a).then(function(a){if(!a.ok)throw new Error("Request for "+c+" returned a response with status "+a.status);return cleanResponse(a).then(function(a){return d.put(c,a)})})}}))})}).then(function(){return self.skipWaiting()}))}),self.addEventListener("activate",function(a){var e=new Set(urlsToCacheKeys.values());a.waitUntil(caches.open(cacheName).then(function(c){return c.keys().then(function(a){return Promise.all(a.map(function(a){if(!e.has(a.url))return c.delete(a)}))})}).then(function(){return self.clients.claim()}))}),self.addEventListener("fetch",function(c){if("GET"===c.request.method){var a,e=stripIgnoredUrlParameters(c.request.url,ignoreUrlParametersMatching),d="index.html";(a=urlsToCacheKeys.has(e))||(e=addDirectoryIndex(e,d),a=urlsToCacheKeys.has(e));var t="/index.html";!a&&"navigate"===c.request.mode&&isPathWhitelisted(["^(?!\\/__).*"],c.request.url)&&(e=new URL(t,self.location).toString(),a=urlsToCacheKeys.has(e)),a&&c.respondWith(caches.open(cacheName).then(function(a){return a.match(urlsToCacheKeys.get(e)).then(function(a){if(a)return a;throw Error("The cached response that was expected is missing.")})}).catch(function(a){return console.warn('Couldn\'t serve response for "%s" from cache: %O',c.request.url,a),fetch(c.request)}))}}); \ No newline at end of file +"use strict";var precacheConfig=[["/react/build/index.html","1fe448d0c924291265950417391c6038"],["/react/build/static/css/main.fd229636.css","fd2296369bdb93090b9d732b4f26607b"],["/react/build/static/js/0.6cbf3a43.chunk.js","fe9889e790a6accd6881c2d807a864f7"],["/react/build/static/js/100.9e9ffcd4.chunk.js","fd232d3f6fc2ecc2da1bdbbee08321fe"],["/react/build/static/js/101.b17c926c.chunk.js","b3997a9fb394580a64867ea0661290ae"],["/react/build/static/js/102.7dc4fb98.chunk.js","a6981a193eac236b776c070b6d293ab6"],["/react/build/static/js/103.84643aea.chunk.js","63af0c8924744f2c22f0e9e7d5d4414c"],["/react/build/static/js/104.05130412.chunk.js","7545c23dd8f2b7140732736bc7105949"],["/react/build/static/js/105.d75f7668.chunk.js","8585a2a0474c1d6d0bbbec0cf64b893c"],["/react/build/static/js/106.1b08f95c.chunk.js","d5a89eafe042c7b60b1c235a5b3f081e"],["/react/build/static/js/107.3cc0a749.chunk.js","25d0505aed7189a0eb2adf498c6dee8a"],["/react/build/static/js/108.c3eadb03.chunk.js","1707a6037a315343e405396dff404d0e"],["/react/build/static/js/109.4f1983f7.chunk.js","0aac60c3dfdcb42c7e953061aaffba9e"],["/react/build/static/js/11.d5b27e7f.chunk.js","ef58106ccf499f2d9f00b7dc72105d54"],["/react/build/static/js/110.8adff765.chunk.js","27e9d699c914111a38b88749f75fc9dd"],["/react/build/static/js/111.9d57ee50.chunk.js","0ad579119538b5cba382eff26c723a30"],["/react/build/static/js/112.7748d553.chunk.js","95b93e8008e4a6b40175454e36bf2256"],["/react/build/static/js/113.dba99a48.chunk.js","880ca70daf5755e2be56c49be8539edf"],["/react/build/static/js/114.f6cd4a20.chunk.js","e18a3f76038c6c3cb56198febedc257d"],["/react/build/static/js/115.c504d39d.chunk.js","a5c03421f5cdc0c980227257c616be4d"],["/react/build/static/js/117.ea2ebf58.chunk.js","f9a4d53511380170a17f9342b35edf3b"],["/react/build/static/js/118.990a3d42.chunk.js","137f8f73751d7a9b3d79f1fbd0079987"],["/react/build/static/js/119.98cb07da.chunk.js","6ba1404c0f7a75024c0bee033821e95d"],["/react/build/static/js/12.21861ea8.chunk.js","a9675091825d7b8cf4100a61498e9b09"],["/react/build/static/js/120.8433dd63.chunk.js","33b662e1c6efc8ac8790c4a40a1ebe9d"],["/react/build/static/js/121.c8330841.chunk.js","bad58a557fb4c3f0f2c6ed871ed9d5d3"],["/react/build/static/js/122.afd8c97f.chunk.js","aeedec8eb17f0fff1d3542ea33ee8c1c"],["/react/build/static/js/123.3adba548.chunk.js","2fc1ce58d48a7118d74d415e5e12dc4c"],["/react/build/static/js/125.716b34a2.chunk.js","d4555a989aacfb8999c312751ee31979"],["/react/build/static/js/126.bc1d7a08.chunk.js","acc667cafe58192c0acc07a7abe47443"],["/react/build/static/js/127.e6dcaee0.chunk.js","1ae4e073f9a89d5093cfafb1d93aee9e"],["/react/build/static/js/128.d5b214b7.chunk.js","e65896774767b0bd8618438542ad46d4"],["/react/build/static/js/129.90267e0c.chunk.js","6f64b6c7224a059e01bb8acca63df740"],["/react/build/static/js/13.a577dbc3.chunk.js","0a94554884746fe2ad13e42282f0ac1f"],["/react/build/static/js/130.8dee28ad.chunk.js","09ba33aae9356bc4f05000c0faec9e2f"],["/react/build/static/js/131.1507b5ad.chunk.js","1f0f29a9109d475aab39e342f48dc58e"],["/react/build/static/js/132.0676057d.chunk.js","cb43d4ccc56bdb69cbad883095379887"],["/react/build/static/js/133.ee74a67e.chunk.js","0da30bf572116a009955445bb2c54bd3"],["/react/build/static/js/134.1042152b.chunk.js","71d3acaef01d45dfb30f5b43ccd06782"],["/react/build/static/js/135.405044a4.chunk.js","b9acb2fe1650d4b77494e13f8c0c57c3"],["/react/build/static/js/136.547a1f81.chunk.js","983f3fb494b77509242607ca971f5346"],["/react/build/static/js/137.aa9652f6.chunk.js","fdd0c5475c3e0b16178a3aa670037bf3"],["/react/build/static/js/138.6d81073e.chunk.js","e90bf2893c8e073a862339f910bb7bb7"],["/react/build/static/js/139.336eb8a9.chunk.js","2fbe6c30244da899d029ef32142b338e"],["/react/build/static/js/14.9b387a30.chunk.js","36e8e4fb051972165451fa14de8c06e6"],["/react/build/static/js/140.73d08f99.chunk.js","2d26d8a8ed98b46477864c9924c84d54"],["/react/build/static/js/141.c204b053.chunk.js","9df282c8e12a2c924593f95d927fed5d"],["/react/build/static/js/142.5c361af9.chunk.js","324516ec2d86a114cad04c7d41ff34f8"],["/react/build/static/js/143.50002176.chunk.js","9bb244dda09b46a2a05efdf451736ccc"],["/react/build/static/js/144.0546d0e8.chunk.js","f8c293a94344dd7db12596d73fb9026c"],["/react/build/static/js/145.42a464de.chunk.js","f445b7224a04df53d1dc17ce7a50aee3"],["/react/build/static/js/146.ddf3afc3.chunk.js","236012abe9d1cd73b55605e072794f73"],["/react/build/static/js/147.077b7476.chunk.js","14a224413fad465b23a8d04f4ca9cb7a"],["/react/build/static/js/148.5d5bbdb4.chunk.js","5008454f9ba039f621b0e522a52a3ec1"],["/react/build/static/js/149.1aa2be7e.chunk.js","be69ecfa048952293c17e7c8ad7c8d7f"],["/react/build/static/js/15.481a375b.chunk.js","290a5f356d468f22a4e6f6e3dd76fc9d"],["/react/build/static/js/150.92b4b72a.chunk.js","3ec5210fa3fb5f9b2fd8c2ae9e254198"],["/react/build/static/js/151.de2797a9.chunk.js","4ee6300cc31149ed91546b275551b179"],["/react/build/static/js/152.33524f88.chunk.js","810d8c5c4d0949e8406332e8a16708ba"],["/react/build/static/js/153.5d717dcb.chunk.js","1d44687ad83a8e9bff737b4f2bf6091c"],["/react/build/static/js/154.896bcfd6.chunk.js","b21457b4469074f258c643bc9233b9c1"],["/react/build/static/js/155.c7ea89ff.chunk.js","0e7aa4920292da6bebe0a6a634eaaaf2"],["/react/build/static/js/156.e309d4b3.chunk.js","aa5f21bdb4c48f2ca0a6ad19cecc10da"],["/react/build/static/js/157.d4fb925e.chunk.js","a51b7196079f852d0939b2d29155d22c"],["/react/build/static/js/158.7fed5f26.chunk.js","9e6c359dfc6219cb5ecc280e796fd956"],["/react/build/static/js/159.d0c7b286.chunk.js","9ad939754ea699e5e3a4b2df12dd0fc4"],["/react/build/static/js/16.f5208d04.chunk.js","01ee0f9744d4b106cc371920e6f3569e"],["/react/build/static/js/160.c3c3e4c6.chunk.js","cd69beebbdc70dc85726cf2565cbd8eb"],["/react/build/static/js/161.aca1d5df.chunk.js","c04b5c5e56f164e000b77daf02c3d1b3"],["/react/build/static/js/162.bd274198.chunk.js","52b881ac94e0b0ccd4afd115a20dfc52"],["/react/build/static/js/163.b713fe5d.chunk.js","d0f6b0429f834640455727d0d36b25dd"],["/react/build/static/js/164.c4629f51.chunk.js","c08c6b0c60aae829345e9597b22f65a4"],["/react/build/static/js/165.218a5560.chunk.js","f4e54ad1d02822e771ce709750efcb6e"],["/react/build/static/js/166.68f61142.chunk.js","c73f42320b8977c13d285fda6f26d7bd"],["/react/build/static/js/167.f5226e09.chunk.js","f84d78b559260ad61cd227e95d3c1eef"],["/react/build/static/js/168.bc78cd9b.chunk.js","51e744b9a7d74ccfa0b809e22c2a527f"],["/react/build/static/js/169.76cc22e9.chunk.js","2155d1287c84ec58b300dcb38bbf4d37"],["/react/build/static/js/17.a4471a8c.chunk.js","5c540eb9b1d0272d75a8f7d831d86dab"],["/react/build/static/js/170.60891690.chunk.js","b6d654ba69c8757debefa3caa2059c84"],["/react/build/static/js/171.1ae8f31b.chunk.js","f2d54e0d32c5063e161ddc040e322df6"],["/react/build/static/js/172.aaa0bdff.chunk.js","2af0b07afd8514296dc9ec93ac2434e5"],["/react/build/static/js/173.c36bfb35.chunk.js","6b0fa99d6fb4a89485c1f5eafbb7493f"],["/react/build/static/js/174.fb7f8bd6.chunk.js","8af8d3942608520d12d644337653bef8"],["/react/build/static/js/175.d0921c3e.chunk.js","8208c1a770579fcf1e2a02597a309bed"],["/react/build/static/js/176.7f48a483.chunk.js","61bfa2c195d30c7170d9c5a6d70975be"],["/react/build/static/js/177.ba6b3db3.chunk.js","06b6b6347f643300f0f9951dba4286db"],["/react/build/static/js/178.c7793f3d.chunk.js","bf0ef41e97b9865bc6c60af8968d954e"],["/react/build/static/js/179.40d2a4bc.chunk.js","1fbcac9b9babd6996747010f1a3cda7b"],["/react/build/static/js/18.8828ef97.chunk.js","b1290a04f6ac7bd5f44bcc66b8cad73c"],["/react/build/static/js/180.9354340c.chunk.js","39ad200c7bac884716bb798d25444eed"],["/react/build/static/js/181.8d94b21c.chunk.js","6dc4a7fee49241376dd8b1dd86fc7680"],["/react/build/static/js/182.5da215c2.chunk.js","9a09e9b688623849d0ab01d1280afeaa"],["/react/build/static/js/183.52491e86.chunk.js","af989e1361f227d9881278a11b8383c4"],["/react/build/static/js/184.2e7a74f1.chunk.js","8438801dd9b1cf8ad500e81a8eb31a86"],["/react/build/static/js/185.6ffe9bde.chunk.js","6c4aa79b24a8c461287a0819fc1e9e55"],["/react/build/static/js/186.ea7d32cb.chunk.js","172a127b62cb70250566b18e127cd108"],["/react/build/static/js/187.aebe3147.chunk.js","e24a0ca61be14d357967a4b040a950f3"],["/react/build/static/js/188.80d8184a.chunk.js","31ad61b4d5065400c51ecffa95d7a9c3"],["/react/build/static/js/189.5bd03381.chunk.js","0503c8e563eb6b4560461533a11bb6e9"],["/react/build/static/js/19.7aa0952c.chunk.js","92e6650e92f52a221b63597e9d304f3b"],["/react/build/static/js/190.96c35b32.chunk.js","7a847dee02454b71193db9c7bf970216"],["/react/build/static/js/191.4cf1b62a.chunk.js","de379d0afdfe60eb67a1fd70bd8c55dc"],["/react/build/static/js/192.3321260a.chunk.js","49e22b063f30bcf6192fa3cf1f220c19"],["/react/build/static/js/193.13cddb64.chunk.js","09cefc2b98a430dd01443c3df6e78750"],["/react/build/static/js/194.05c3c286.chunk.js","af4adcb50f60c7b0e84200f74925daee"],["/react/build/static/js/195.725f8560.chunk.js","9f9393cc87bc3c5dadf03be2ceeaf266"],["/react/build/static/js/196.c3b35993.chunk.js","7591e9581ca948ca24711858cf7f29f5"],["/react/build/static/js/197.e5f9cdaf.chunk.js","66e3ca87ffb533433d2f9d93882f59bb"],["/react/build/static/js/198.56e68293.chunk.js","41b3631b162b1a1836fb1c3590543851"],["/react/build/static/js/199.c1d38441.chunk.js","4e67e386f4f81b197a0041c8496d8645"],["/react/build/static/js/20.ada00052.chunk.js","06419243f01cda074fe7f5b56fb24d39"],["/react/build/static/js/200.b9bde2be.chunk.js","ef53574b70e01dddee6740a611f1c08d"],["/react/build/static/js/201.8037b377.chunk.js","1659068e553e2be272b3d37fbfc061a6"],["/react/build/static/js/202.eec499d7.chunk.js","d503746e17e70a2ecce7ab7854d69cae"],["/react/build/static/js/203.bfe11e20.chunk.js","477fa78c2b870a07a76dc8e6b58a67f7"],["/react/build/static/js/204.283a7a23.chunk.js","d75ec5b786ee719b9aa740023bf4691a"],["/react/build/static/js/205.3c8d5328.chunk.js","c4dcbb67edaf7bc2bffdb559b06af71c"],["/react/build/static/js/206.d68b23ad.chunk.js","bcd7dc154e18b869b0be3f79fa25a439"],["/react/build/static/js/207.a4dd700a.chunk.js","ca1b26e21123816698808374f83f192b"],["/react/build/static/js/208.676d85b2.chunk.js","4dd6f0b6bdba00f5cb81c06d08c4f042"],["/react/build/static/js/209.b7fa21e1.chunk.js","fcddabea787a4f57bc22d4bb747aa185"],["/react/build/static/js/21.c4c72e09.chunk.js","3951475548bc959e75c6a2fea80022e2"],["/react/build/static/js/210.1db5f581.chunk.js","c922f8ed4c154506d250317a460edc0c"],["/react/build/static/js/211.07843e2a.chunk.js","09ce5bbeabdc499d036ebe9d504f963c"],["/react/build/static/js/212.d383296f.chunk.js","acc1a6177d4c3d940b167ac4679302e4"],["/react/build/static/js/213.dbafcad3.chunk.js","5b567ae2260f8254f20aea278d8d249d"],["/react/build/static/js/214.11727123.chunk.js","b46f07d7e23d618bb004d41a6dba1840"],["/react/build/static/js/215.541b10e3.chunk.js","7c1433d371c80ab6ab31940430440988"],["/react/build/static/js/216.86b49945.chunk.js","43b18a376f907b513cc270447dda32e8"],["/react/build/static/js/217.0fabecd8.chunk.js","f1fabca2bafaa5f54408c5efa928bd4f"],["/react/build/static/js/218.582ecdf4.chunk.js","e87c433c09860ae6849db6162c38dff0"],["/react/build/static/js/219.89b1b046.chunk.js","0e471cd44b3a3740aff1a6313e6f1042"],["/react/build/static/js/22.d79dbd3f.chunk.js","6a776d923b5fee0cd029d3c6fb6d4e1f"],["/react/build/static/js/220.8d2dd559.chunk.js","f7bfd7a6f14cb63ea114b3fac0211bff"],["/react/build/static/js/221.8466c9d9.chunk.js","3da30fe465eb5c391559477cf634241f"],["/react/build/static/js/222.c937f238.chunk.js","493a6333ae6864186695af6a0785d803"],["/react/build/static/js/223.dabff569.chunk.js","d5ba81fa57f044913ec5903f632ff9c0"],["/react/build/static/js/224.91ff3d9b.chunk.js","4c1acee0086aca77d6e95620c899ddab"],["/react/build/static/js/225.636bbb2d.chunk.js","bb188a5b2336b70de9226dbbf71c6a10"],["/react/build/static/js/226.be0e40f1.chunk.js","549a3a274df3b0346501f8547cca1221"],["/react/build/static/js/227.13a7c0fe.chunk.js","4ffbfd4940aaa81f2a07cfd5b02da0ef"],["/react/build/static/js/228.9df9baf0.chunk.js","d142b6600d0ba3358404bdeb91d37e5c"],["/react/build/static/js/229.a6ebc932.chunk.js","a2feda7719eff7b82f310301adf766eb"],["/react/build/static/js/23.03b1924f.chunk.js","d2519a5fd4f2623b374dda12a56bb1ef"],["/react/build/static/js/230.e9c51cdd.chunk.js","40277e8f887b807fdc3e6e45ec69431a"],["/react/build/static/js/231.29cefeb3.chunk.js","366862cfeac6a4fe8dce24ef5dcc7687"],["/react/build/static/js/232.f3e2b3b6.chunk.js","5abda910d08a678e073857ba18d6796e"],["/react/build/static/js/233.9c04de12.chunk.js","200708e976cc70a7831874f11eb5c24f"],["/react/build/static/js/234.dd9bf9b0.chunk.js","7196b0eaeddaa53b4b5efb8c1ac42b08"],["/react/build/static/js/235.68528770.chunk.js","4318052b65d5c4ddafcd2f38f283d607"],["/react/build/static/js/236.9a958ee9.chunk.js","31bb320360b3eac1e8e1f9628278a913"],["/react/build/static/js/237.ca535ae6.chunk.js","c9c961adf3f49d5f9c680ab4cea87dd0"],["/react/build/static/js/238.b7b581af.chunk.js","c0500cb9fd917e12a4f00f2033aab703"],["/react/build/static/js/239.65a3109b.chunk.js","d91ef9844cd44dff346df76f8e3e8273"],["/react/build/static/js/24.340d959b.chunk.js","feccc0ead150ec747bf2e31f7c958101"],["/react/build/static/js/240.5b21e38b.chunk.js","9cdc0a950c173361b38a9aec61c50358"],["/react/build/static/js/241.846826f8.chunk.js","36fa2fc7d15f39bcaf94690b16d22c69"],["/react/build/static/js/242.faf5aa19.chunk.js","6628adda733db8f9e0480836144e231a"],["/react/build/static/js/243.bbb8a67b.chunk.js","a09a2e6a0e49d435ed5e09f5c0d00eb4"],["/react/build/static/js/244.637f4a1c.chunk.js","4c7cc576650fbb23369af31b20ef9f91"],["/react/build/static/js/245.04a36e8c.chunk.js","3a46bb7f40f539ac0a50d0c9afb5ae02"],["/react/build/static/js/246.7d297525.chunk.js","72022e97a013be5127771f020a59c1d7"],["/react/build/static/js/247.39174b85.chunk.js","79d0d56d6035cd07f4ac2a216b8bd12a"],["/react/build/static/js/248.de0106d1.chunk.js","197df1a0c4aab20d7f966d505a657c16"],["/react/build/static/js/249.72d30189.chunk.js","4550916960c5428c2cb8f811af6ba95f"],["/react/build/static/js/25.c01cc121.chunk.js","d36f61623bf47550a71763acc0d18261"],["/react/build/static/js/250.845e052b.chunk.js","cea64ab76b63c6d93ff48eeeb17ea789"],["/react/build/static/js/251.fd617788.chunk.js","55ea0b9cc75b3c5d4c8e3d9d28ee1e62"],["/react/build/static/js/252.5a8c3a4b.chunk.js","950e34690cae33afc7c893f0ae56032c"],["/react/build/static/js/253.efa9425e.chunk.js","81c270aab4b10bd51a2eec6d85398b07"],["/react/build/static/js/254.4e8cc1bf.chunk.js","912560dde8c1d55583d79b69607e41db"],["/react/build/static/js/255.f0ac6c13.chunk.js","63e6bbd6ce9b0f3ffecc2ed35e542f5a"],["/react/build/static/js/256.45fc6f1c.chunk.js","d07d7efdb69ad6f24a9a8e76c088b8a3"],["/react/build/static/js/257.d15a375f.chunk.js","94ed438fb8f943d617e11a2188dfac17"],["/react/build/static/js/258.2c9054a9.chunk.js","e67f3fc9fd4610a6dceab5e1f75a6b96"],["/react/build/static/js/259.2dd45d09.chunk.js","f6de3b4345ad6c93df2a0a4b88461d4d"],["/react/build/static/js/26.88e3521d.chunk.js","88433e2b1a8492d2963bcff028caae96"],["/react/build/static/js/260.4eed7902.chunk.js","92a2e8e7e909a364eab7850ee649ba84"],["/react/build/static/js/261.92832c38.chunk.js","aaea8db0cbaab1d985b9908d06f7a5b7"],["/react/build/static/js/262.187b5a16.chunk.js","c7710972f23b82414d862a974ca288ff"],["/react/build/static/js/263.e8f99d16.chunk.js","b337fe904b281433d8541f392a4fddab"],["/react/build/static/js/264.f45787c3.chunk.js","3d9e1b73ffdf9777aad932b3cf8fb9e2"],["/react/build/static/js/265.b8d823dc.chunk.js","b946608e9756a2bc7b17b284a05b5d82"],["/react/build/static/js/266.0d065e69.chunk.js","f5f4053839fdf70bd6957dfb2942aa9d"],["/react/build/static/js/267.b4ae9fa9.chunk.js","238d40ef55cd90e81e359e2218dd5f7c"],["/react/build/static/js/268.e4db0ff5.chunk.js","4a559b92ad1edca127d7d4cec9687166"],["/react/build/static/js/269.a595926e.chunk.js","f7e7cec8be5480dbb23ec9ab4997ba1d"],["/react/build/static/js/27.e5bab7df.chunk.js","f727b6b050d3d375fd5708f3e2ae58ce"],["/react/build/static/js/270.5887d7e7.chunk.js","36b45722f755fdc5454dd441d2249f28"],["/react/build/static/js/271.646bfed1.chunk.js","836b57e7c54f2a8a1a4a3a4599ffc2b8"],["/react/build/static/js/272.7b18371f.chunk.js","edd7bbca4f57fc01bff6ce4cd6bfb58b"],["/react/build/static/js/273.33c382d7.chunk.js","54e10d9c8c9120d4cbb5e910109ecb71"],["/react/build/static/js/274.e27dcfa8.chunk.js","c709ec1fdb918dc16642e9d56ca27ba0"],["/react/build/static/js/275.c590be45.chunk.js","680a4cc8d064cb37493388bcab91af1e"],["/react/build/static/js/276.f116cd29.chunk.js","9ad8fa2a90e00658ed6f15667410ac33"],["/react/build/static/js/277.df77d226.chunk.js","0926ba33f5e3d59c46b13e68b4d5a90d"],["/react/build/static/js/278.9571e31d.chunk.js","2da2381fd5083a78141bb7e48262a070"],["/react/build/static/js/279.94ffda0b.chunk.js","1904b1e1cb29f0d7b660a925c2309b08"],["/react/build/static/js/28.a915e959.chunk.js","729a239de0670a7d4539562a75e7f04b"],["/react/build/static/js/280.33003f17.chunk.js","15f0b5decf6305d75312fd053c2f824f"],["/react/build/static/js/281.ac0d0514.chunk.js","bb3b89dd7a7f4751252351e37e1ddefd"],["/react/build/static/js/29.c8087b62.chunk.js","a1b33ad587817d4014208fed34ecec77"],["/react/build/static/js/30.6b85aa3e.chunk.js","4dcacd57d57e0e9455bc9a0cd9710384"],["/react/build/static/js/31.d46ce4c7.chunk.js","43a5654020404587397028fc9cfbb50b"],["/react/build/static/js/32.33c6a9c4.chunk.js","0643bd222699563ed02bab47ff003203"],["/react/build/static/js/33.dc87b769.chunk.js","992ec560d0c3f8d3f76cf41cf6f4db99"],["/react/build/static/js/34.2741f759.chunk.js","8fe780f69232d6380412b5a77a28b4b4"],["/react/build/static/js/35.46c5e9ac.chunk.js","4e3362ba14c31be008374cbfe36c7a03"],["/react/build/static/js/36.e38fca6d.chunk.js","528e1badc53e3c45998da980d725d4f1"],["/react/build/static/js/37.6b41d509.chunk.js","ab026178a32faa43b0cd1eed1e5c42e6"],["/react/build/static/js/38.c1783279.chunk.js","2515020804b7a4f1174ce7d0f714a15e"],["/react/build/static/js/39.e5de792f.chunk.js","e1f0401dd4d26afb0a832afee79d0125"],["/react/build/static/js/40.b4a7645c.chunk.js","0b3f5d87d279cf2149678e44364179e9"],["/react/build/static/js/41.5a901a33.chunk.js","d8f78f60b77f3b89638901ce4e3ee3c3"],["/react/build/static/js/42.fcb23173.chunk.js","f0c05e48f25faa5c052143fce33036ad"],["/react/build/static/js/43.037da1d0.chunk.js","bec27dec24265552777c117a73140d6b"],["/react/build/static/js/44.b6c3b1fb.chunk.js","1894a5ef9d03660a93805e16d3c3b8f7"],["/react/build/static/js/45.98b6bbb5.chunk.js","9f4f0a496335c7e0dae15d455cda00d5"],["/react/build/static/js/46.a99df4ee.chunk.js","e5da0f7a33fac43df254fa2bc1e64137"],["/react/build/static/js/47.e06dd4de.chunk.js","abec883d724c69b8faf00dca040c2c70"],["/react/build/static/js/48.bbdc2f93.chunk.js","64a3dc4a622d3798dca9052c75717586"],["/react/build/static/js/49.f3a1e05c.chunk.js","c04186e1e9a0ac138ccbc180c110d4ab"],["/react/build/static/js/50.0ad9ca7e.chunk.js","617505982ad86fe7ec839979148eaf30"],["/react/build/static/js/51.2e4c0d09.chunk.js","adefe484d8f7646dd4bdcb8d1d9d4af8"],["/react/build/static/js/52.69591260.chunk.js","1f60cf0b2e1b9eb7c822f8169f81a213"],["/react/build/static/js/53.56f0275e.chunk.js","08ae68ca7b9b8a4ab1737ef7a103d91f"],["/react/build/static/js/54.6f4e533a.chunk.js","ceadf003235a2264bf665b633eea4c07"],["/react/build/static/js/55.c182677a.chunk.js","8c60a6e05dcab8596b534578c3878b35"],["/react/build/static/js/56.04a9dd3a.chunk.js","8e1f2d8b0da1439e165e5fc4c7bacfd7"],["/react/build/static/js/57.23c6a8c8.chunk.js","28e293e49a197d0926f940cb74696b46"],["/react/build/static/js/58.2a19efe1.chunk.js","273a0899cd9376ddbdffcb43d2343e0c"],["/react/build/static/js/59.1afe7551.chunk.js","19e39fa92c010e450f06de26cf9c2afe"],["/react/build/static/js/65.23482fc0.chunk.js","7babc82c22cc19d8c4a78441c26c59ab"],["/react/build/static/js/71.1fae9954.chunk.js","21d2c1065cac9af4e57aeb289cea4560"],["/react/build/static/js/72.566df07d.chunk.js","7619bd477809c175f7be8acedadbc0a5"],["/react/build/static/js/73.72054aec.chunk.js","69f1b4259a28b5f0717c5247e0ee280b"],["/react/build/static/js/74.afd6ad85.chunk.js","8e74092c4c2c43ba6f8a3ed9b285d950"],["/react/build/static/js/75.88aeb9c3.chunk.js","79ec63980ccdd2eec81571886ad50284"],["/react/build/static/js/77.e1fc75bb.chunk.js","e28b2f548f1f98f851206ec384f5d69c"],["/react/build/static/js/78.ab545a36.chunk.js","8aa1b9bd6ed0297a69d6a545519de1da"],["/react/build/static/js/79.fc5af457.chunk.js","1350b55b2fb8a45459de13e4301ea55c"],["/react/build/static/js/80.d358e547.chunk.js","ae06b49dfc926058a6ddc67e92a6d0ad"],["/react/build/static/js/81.c2a9bf71.chunk.js","d66bbb1e9590e218224b42b12de57ef9"],["/react/build/static/js/83.c716f0ba.chunk.js","0ed397d397abfa898c18fc1259ffd989"],["/react/build/static/js/84.30f8dc49.chunk.js","1c257b72c6eadf25d0a8d594f4698a0b"],["/react/build/static/js/86.211f1548.chunk.js","97b0ce684e91d061cf16177add1b8a13"],["/react/build/static/js/87.a1ade9a1.chunk.js","469c65874afaed7a9b42e5baea502252"],["/react/build/static/js/88.5e7d925c.chunk.js","02404756e246c072ee8538f1535711c9"],["/react/build/static/js/89.a44f4ff3.chunk.js","189dd45d8aca671a50638aa652e5309a"],["/react/build/static/js/90.567f61ca.chunk.js","948f2df08306d90e298cc1f0b76d6840"],["/react/build/static/js/91.b1fabdb5.chunk.js","e5081d9d6e0074dea1d9a380425bdf33"],["/react/build/static/js/92.b449ca08.chunk.js","a4240f86a129697fe3d9e68a5149692b"],["/react/build/static/js/93.6266a14e.chunk.js","fd4a84e4a0ce70870736aa2d16a54684"],["/react/build/static/js/94.90a9d0fc.chunk.js","5adccc3088629994a02e186710d97a2a"],["/react/build/static/js/95.600297ee.chunk.js","f6ccf344503f86fa5c5217477d83781a"],["/react/build/static/js/96.bb33bc7c.chunk.js","b933b9efbd231eb3eb10309465e5fdb9"],["/react/build/static/js/97.c8763fd2.chunk.js","249ed1d32bd6712776f23461dd876ad6"],["/react/build/static/js/98.4c2c8b49.chunk.js","0077070436cf6e6a267896656bc9c1dc"],["/react/build/static/js/99.4ecedbde.chunk.js","67cea9cdeb3638083d3cf663c7278b64"],["/react/build/static/media/KaTeX_AMS-Regular.7f06b4e3.woff","7f06b4e30317f784d61d26686aed0ab2"],["/react/build/static/media/KaTeX_AMS-Regular.aaf4eee9.ttf","aaf4eee9fba9907d61c3935e0b6a54ae"],["/react/build/static/media/KaTeX_AMS-Regular.e78e28b4.woff2","e78e28b4834954df047e4925e9dbf354"],["/react/build/static/media/KaTeX_Caligraphic-Bold.021dd4dc.ttf","021dd4dc61ee5f5cdf315f43b48c094b"],["/react/build/static/media/KaTeX_Caligraphic-Bold.1e802ca9.woff","1e802ca9dedc4ed4e3c6f645e4316128"],["/react/build/static/media/KaTeX_Caligraphic-Bold.4ec58bef.woff2","4ec58befa687e9752c3c91cd9bcf1bcb"],["/react/build/static/media/KaTeX_Caligraphic-Regular.7edb53b6.woff2","7edb53b6693d75b8a2232481eea1a52c"],["/react/build/static/media/KaTeX_Caligraphic-Regular.d3b46c3a.woff","d3b46c3a530116933081d9d74e3e9fe8"],["/react/build/static/media/KaTeX_Caligraphic-Regular.d49f2d55.ttf","d49f2d55ce4f40f982d8ba63d746fbf9"],["/react/build/static/media/KaTeX_Fraktur-Bold.a31e7cba.ttf","a31e7cba7b7221ebf1a2ae545fb306b2"],["/react/build/static/media/KaTeX_Fraktur-Bold.c4c8cab7.woff","c4c8cab7d5be97b2bb283e531c077355"],["/react/build/static/media/KaTeX_Fraktur-Bold.d5b59ec9.woff2","d5b59ec9764e10f4a82369ae29f3ac58"],["/react/build/static/media/KaTeX_Fraktur-Regular.32a5339e.woff2","32a5339eb809f381a7357ba56f82aab3"],["/react/build/static/media/KaTeX_Fraktur-Regular.a48dad4f.ttf","a48dad4f58c82e38a10da0ceebb86370"],["/react/build/static/media/KaTeX_Fraktur-Regular.b7d9c46b.woff","b7d9c46bff5d51da6209e355cc4a235d"],["/react/build/static/media/KaTeX_Main-Bold.22086eb5.woff","22086eb5d97009c3e99bcc1d16ce6865"],["/react/build/static/media/KaTeX_Main-Bold.8e1e01c4.woff2","8e1e01c4b1207c0a383d9a2b4f86e637"],["/react/build/static/media/KaTeX_Main-Bold.9ceff51b.ttf","9ceff51b3cb7ce6eb4e8efa8163a1472"],["/react/build/static/media/KaTeX_Main-BoldItalic.284a17fe.woff2","284a17fe5baf72ff8217d4c7e70c0f82"],["/react/build/static/media/KaTeX_Main-BoldItalic.4c57dbc4.woff","4c57dbc44bfff1fdf08a59cf556fdab3"],["/react/build/static/media/KaTeX_Main-BoldItalic.e8b44b99.ttf","e8b44b990516dab7937bf240fde8b46a"],["/react/build/static/media/KaTeX_Main-Italic.29c86397.ttf","29c86397e75cdcb3135af8295f1c2e28"],["/react/build/static/media/KaTeX_Main-Italic.99be0e10.woff","99be0e10c38cd42466e6fe1665ef9536"],["/react/build/static/media/KaTeX_Main-Italic.e533d5a2.woff2","e533d5a2506cf053cd671b335ec04dde"],["/react/build/static/media/KaTeX_Main-Regular.5c734d78.woff2","5c734d78610fa35282f3379f866707f2"],["/react/build/static/media/KaTeX_Main-Regular.5c94aef4.ttf","5c94aef490324b0925dbe5f643e8fd04"],["/react/build/static/media/KaTeX_Main-Regular.b741441f.woff","b741441f6d71014d0453ca3ebc884dd4"],["/react/build/static/media/KaTeX_Math-BoldItalic.9a2834a9.ttf","9a2834a9ff8ab411153571e0e55ac693"],["/react/build/static/media/KaTeX_Math-BoldItalic.b13731ef.woff","b13731ef4e2bfc3d8d859271e39550fc"],["/react/build/static/media/KaTeX_Math-BoldItalic.d747bd1e.woff2","d747bd1e7a6a43864285edd73dcde253"],["/react/build/static/media/KaTeX_Math-Italic.291e76b8.ttf","291e76b8871b84560701bd29f9d1dcc7"],["/react/build/static/media/KaTeX_Math-Italic.4ad08b82.woff2","4ad08b826b8065e1eab85324d726538c"],["/react/build/static/media/KaTeX_Math-Italic.f0303906.woff","f0303906c2a67ac63bf1e8ccd638a89e"],["/react/build/static/media/KaTeX_SansSerif-Bold.3fb41955.woff","3fb419559955e3ce75619f1a5e8c6c84"],["/react/build/static/media/KaTeX_SansSerif-Bold.6e0830be.woff2","6e0830bee40435e72165345e0682fbfc"],["/react/build/static/media/KaTeX_SansSerif-Bold.7dc027cb.ttf","7dc027cba9f7b11ec92af4a311372a85"],["/react/build/static/media/KaTeX_SansSerif-Italic.4059868e.ttf","4059868e460d2d2e6be18e180d20c43d"],["/react/build/static/media/KaTeX_SansSerif-Italic.727a9b0d.woff","727a9b0d97d72d2fc0228fe4e07fb4d8"],["/react/build/static/media/KaTeX_SansSerif-Italic.fba01c9c.woff2","fba01c9c6fb2866a0f95bcacb2c187a5"],["/react/build/static/media/KaTeX_SansSerif-Regular.2555754a.woff","2555754a67062cac3a0913b715ab982f"],["/react/build/static/media/KaTeX_SansSerif-Regular.5c58d168.ttf","5c58d168c0b66d2c32234a6718e74dfb"],["/react/build/static/media/KaTeX_SansSerif-Regular.d929cd67.woff2","d929cd671b19f0cfea55b6200fb47461"],["/react/build/static/media/KaTeX_Script-Regular.755e2491.woff2","755e2491f13b5269f0afd5a56f7aa692"],["/react/build/static/media/KaTeX_Script-Regular.d12ea9ef.ttf","d12ea9efb375f9dc331f562e69892638"],["/react/build/static/media/KaTeX_Script-Regular.d524c9a5.woff","d524c9a5b62a17f98f4a97af37fea735"],["/react/build/static/media/KaTeX_Size1-Regular.048c39cb.woff2","048c39cba4dfb0460682a45e84548e4b"],["/react/build/static/media/KaTeX_Size1-Regular.08b5f00e.woff","08b5f00e7140f7a10e62c8e2484dfa5a"],["/react/build/static/media/KaTeX_Size1-Regular.7342d45b.ttf","7342d45b052c3a2abc21049959fbab7f"],["/react/build/static/media/KaTeX_Size2-Regular.81d6b8d5.woff2","81d6b8d5ca77d63d5033d6991549a659"],["/react/build/static/media/KaTeX_Size2-Regular.af24b0e4.woff","af24b0e4b7e52656ca77914695c99930"],["/react/build/static/media/KaTeX_Size2-Regular.eb130dcc.ttf","eb130dcc661de766c999c60ba1525a88"],["/react/build/static/media/KaTeX_Size3-Regular.0d892640.woff","0d8926405d832a4b065e516bd385d812"],["/react/build/static/media/KaTeX_Size3-Regular.7e02a40c.ttf","7e02a40c41e52dc3b2b6b197bbdf05ea"],["/react/build/static/media/KaTeX_Size3-Regular.b311ca09.woff2","b311ca09df2c89a10fbb914b5a053805"],["/react/build/static/media/KaTeX_Size4-Regular.68895bb8.woff","68895bb880a61a7fc019dbfaa5121bb4"],["/react/build/static/media/KaTeX_Size4-Regular.6a3255df.woff2","6a3255dfc1ba41c46e7e807f8ab16c49"],["/react/build/static/media/KaTeX_Size4-Regular.ad767252.ttf","ad7672524b64b730dfd176140a8945cb"],["/react/build/static/media/KaTeX_Typewriter-Regular.25702356.ttf","257023560753aeb0b89b7e434d3da17f"],["/react/build/static/media/KaTeX_Typewriter-Regular.3fe216d2.woff","3fe216d2a5f736c560cde71984554b64"],["/react/build/static/media/KaTeX_Typewriter-Regular.6cc31ea5.woff2","6cc31ea5c223c88705a13727a71417fa"],["/react/build/static/media/auth.43f1c749.png","43f1c7490f28c59e28637c7db9318878"],["/react/build/static/media/banner_list.ad510bee.png","ad510bee30a694aaedd0e2a96442ffe4"],["/react/build/static/media/banner_sub.c6034810.png","c6034810c9bd0d58dfee1ccf66f2b592"],["/react/build/static/media/beian.d0289dc0.png","d0289dc0a46fc5b15b3363ffa78cf6c7"],["/react/build/static/media/beijintulogontwo.245dc9e1.png","245dc9e1ed09d34f605c2d5799ee3327"],["/react/build/static/media/bg.88a774b5.jpg","88a774b50bcc4fcb43abbe7ca5d34886"],["/react/build/static/media/douyu.e5ea5a90.jpg","e5ea5a904483e1c25f47a090e83319ed"],["/react/build/static/media/firefox_icon.cfd87a8f.png","cfd87a8f62ae37a34dab9f4b5c79b168"],["/react/build/static/media/guihome1.eca5276e.png","eca5276e17b07d59b37f161cf1ab7b3a"],["/react/build/static/media/guihome2.c65f40bf.jpg","c65f40bff07ed7c4e1d9abca9d77358c"],["/react/build/static/media/guihome3.0e1dc34b.jpg","0e1dc34b920481e8bc1bb1954eada1f1"],["/react/build/static/media/guihome4.6cc0d72b.jpg","6cc0d72b6f3f8cf8dedce533b9083810"],["/react/build/static/media/guihome5.1ac2c872.jpg","1ac2c8722fe3be81805dcc16df845ffb"],["/react/build/static/media/guihome6.7fc4fe9d.jpg","7fc4fe9d191f769592826b692fbf0560"],["/react/build/static/media/internet-explorer@2x.f122e0ab.png","f122e0abfbe49c051dba0e2d7f3d00f5"],["/react/build/static/media/job.b2881c7d.png","b2881c7d0317f7109101f3db1bcae775"],["/react/build/static/media/logo.c72d4a3b.svg","c72d4a3ba95e0b700fae9febca0e3200"],["/react/build/static/media/match_ad.4e957369.jpg","4e957369790f079662eb2dca03ece6be"],["/react/build/static/media/message.e7922cf2.svg","e7922cf2a56f9b54e44709e40626460b"],["/react/build/static/media/messagegrey.80d0b058.svg","80d0b0580c10b5e7fc571c3064a991c5"],["/react/build/static/media/mytc.4ef5faf4.png","4ef5faf4ec6fdee6a4909d34b9a1a171"],["/react/build/static/media/oj_banner.25ca233e.jpg","25ca233e22299a2a1e2f577eed32e745"],["/react/build/static/media/passall.46817e26.png","46817e2696bbb2ac4bf0e5bc4e8b101e"],["/react/build/static/media/passpart.4aaf3e6b.png","4aaf3e6b4667dc531eee7f4e5f807d70"],["/react/build/static/media/rc-tree.776c7fe6.png","776c7fe67df0637005b1a1372066ed84"],["/react/build/static/media/skzbdx.01cb5862.png","01cb58627ee7981e0bcb65c8467d4975"],["/react/build/static/media/teach_ex.a415d7a9.jpg","a415d7a9bbc72fe5d3aafd002181cc09"]],cacheName="sw-precache-v3-sw-precache-webpack-plugin-"+(self.registration?self.registration.scope:""),ignoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(a,c){var e=new URL(a);return"/"===e.pathname.slice(-1)&&(e.pathname+=c),e.toString()},cleanResponse=function(c){return c.redirected?("body"in c?Promise.resolve(c.body):c.blob()).then(function(a){return new Response(a,{headers:c.headers,status:c.status,statusText:c.statusText})}):Promise.resolve(c)},createCacheKey=function(a,c,e,d){var t=new URL(a);return d&&t.pathname.match(d)||(t.search+=(t.search?"&":"")+encodeURIComponent(c)+"="+encodeURIComponent(e)),t.toString()},isPathWhitelisted=function(a,c){if(0===a.length)return!0;var e=new URL(c).pathname;return a.some(function(a){return e.match(a)})},stripIgnoredUrlParameters=function(a,e){var c=new URL(a);return c.hash="",c.search=c.search.slice(1).split("&").map(function(a){return a.split("=")}).filter(function(c){return e.every(function(a){return!a.test(c[0])})}).map(function(a){return a.join("=")}).join("&"),c.toString()},hashParamName="_sw-precache",urlsToCacheKeys=new Map(precacheConfig.map(function(a){var c=a[0],e=a[1],d=new URL(c,self.location),t=createCacheKey(d,hashParamName,e,/\.\w{8}\./);return[d.toString(),t]}));function setOfCachedUrls(a){return a.keys().then(function(a){return a.map(function(a){return a.url})}).then(function(a){return new Set(a)})}self.addEventListener("install",function(a){a.waitUntil(caches.open(cacheName).then(function(d){return setOfCachedUrls(d).then(function(e){return Promise.all(Array.from(urlsToCacheKeys.values()).map(function(c){if(!e.has(c)){var a=new Request(c,{credentials:"same-origin"});return fetch(a).then(function(a){if(!a.ok)throw new Error("Request for "+c+" returned a response with status "+a.status);return cleanResponse(a).then(function(a){return d.put(c,a)})})}}))})}).then(function(){return self.skipWaiting()}))}),self.addEventListener("activate",function(a){var e=new Set(urlsToCacheKeys.values());a.waitUntil(caches.open(cacheName).then(function(c){return c.keys().then(function(a){return Promise.all(a.map(function(a){if(!e.has(a.url))return c.delete(a)}))})}).then(function(){return self.clients.claim()}))}),self.addEventListener("fetch",function(c){if("GET"===c.request.method){var a,e=stripIgnoredUrlParameters(c.request.url,ignoreUrlParametersMatching),d="index.html";(a=urlsToCacheKeys.has(e))||(e=addDirectoryIndex(e,d),a=urlsToCacheKeys.has(e));var t="/index.html";!a&&"navigate"===c.request.mode&&isPathWhitelisted(["^(?!\\/__).*"],c.request.url)&&(e=new URL(t,self.location).toString(),a=urlsToCacheKeys.has(e)),a&&c.respondWith(caches.open(cacheName).then(function(a){return a.match(urlsToCacheKeys.get(e)).then(function(a){if(a)return a;throw Error("The cached response that was expected is missing.")})}).catch(function(a){return console.warn('Couldn\'t serve response for "%s" from cache: %O',c.request.url,a),fetch(c.request)}))}}); \ No newline at end of file diff --git a/public/react/build/static/js/main.19b9fc67.js b/public/react/build/static/js/main.62f0e757.js similarity index 99% rename from public/react/build/static/js/main.19b9fc67.js rename to public/react/build/static/js/main.62f0e757.js index 24b42f7f7..b83f506b8 100644 --- a/public/react/build/static/js/main.19b9fc67.js +++ b/public/react/build/static/js/main.62f0e757.js @@ -72577,7 +72577,7 @@ var proxy="http://localhost:3000";// proxy = "http://testbdweb.trustie.net" //proxy="http://192.168.2.63:3001" var//proxy = "http://localhost:3000" // proxy="http://123.59.135.93:56666" -proxy="http://localhost:3000";// 在这里使用requestMap控制,避免用户通过双击等操作发出重复的请求; +proxy="https://testforgeplus.trustie.net";// 在这里使用requestMap控制,避免用户通过双击等操作发出重复的请求; // 如果需要支持重复的请求,考虑config里面自定义一个allowRepeat参考来控制 var requestMap={};window.setfalseInRequestMap=function(keyName){requestMap[keyName]=false;};//响应前的设置 __WEBPACK_IMPORTED_MODULE_3_axios___default.a.interceptors.request.use(function(config){setpostcookie();clearAllCookie();// config.headers['Content-Type']= 'no-cache'