From 6fe571cc99889cc241ec52fbd3fd88bfbbe46b74 Mon Sep 17 00:00:00 2001 From: cxt Date: Fri, 5 May 2017 19:36:32 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E8=B5=84=E6=BA=90=E5=BA=93?= =?UTF-8?q?=E5=92=8C=E8=AF=BE=E7=A8=8B=E9=A2=98=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/attachments_controller.rb | 47 +++++ app/controllers/files_controller.rb | 4 + app/controllers/syllabuses_controller.rb | 134 ++++++++++++- app/helpers/application_helper.rb | 9 + app/models/homework_bank.rb | 15 ++ app/views/layouts/base_edu.html.erb | 2 +- .../syllabuses/_search_course_list.html.erb | 12 ++ .../syllabuses/_sy_send_homework.html.erb | 35 ++++ .../syllabuses/_sy_send_resource.html.erb | 35 ++++ .../syllabuses/_syllabus_homeworks.html.erb | 93 +++++---- .../syllabuses/_syllabus_resources.html.erb | 17 +- .../syllabuses/choose_user_course.js.erb | 10 + .../send_homeworks_to_course.js.erb | 7 + .../send_resources_to_course.js.erb | 7 + app/views/syllabuses/show.html.erb | 22 +-- .../syllabuses/syllabus_homeworks.js.erb | 7 + .../syllabuses/syllabus_resources.js.erb | 7 + config/routes.rb | 4 + .../20170502083644_update_bank_created_at.rb | 4 +- .../20170505025616_add_columns_to_course.rb | 22 +++ public/javascripts/edu/application.js | 8 + public/javascripts/edu/base_edu.js | 121 ++++++++++++ public/javascripts/edu/syllabus.js | 179 ++++++------------ public/stylesheets/css/edu-common.css | 2 +- public/stylesheets/css/edu-public.css | 3 +- 25 files changed, 611 insertions(+), 195 deletions(-) create mode 100644 app/views/syllabuses/_search_course_list.html.erb create mode 100644 app/views/syllabuses/_sy_send_homework.html.erb create mode 100644 app/views/syllabuses/_sy_send_resource.html.erb create mode 100644 app/views/syllabuses/choose_user_course.js.erb create mode 100644 app/views/syllabuses/send_homeworks_to_course.js.erb create mode 100644 app/views/syllabuses/send_resources_to_course.js.erb create mode 100644 app/views/syllabuses/syllabus_homeworks.js.erb create mode 100644 app/views/syllabuses/syllabus_resources.js.erb create mode 100644 db/migrate/20170505025616_add_columns_to_course.rb create mode 100644 public/javascripts/edu/base_edu.js diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb index ff74403a0..bee294f5c 100644 --- a/app/controllers/attachments_controller.rb +++ b/app/controllers/attachments_controller.rb @@ -79,6 +79,51 @@ class AttachmentsController < ApplicationController :disposition => 'attachment' #inline can open in browser end + def direct_download_resource + @resource = ResourceBank.find(params[:id]) + storage_path = Redmine::Configuration['attachments_storage_path'] || File.join(Rails.root, "files") + file = File.join(storage_path, @resource.disk_directory.to_s, @resource.disk_filename.to_s) + send_file file, :filename => filename_for_content_disposition(@resource.filename), + :type => detect_content_type(@resource), + :disposition => 'attachment' #inline can open in browser + @resource.increment!(:downloads) + end + + def download_resource + @resource = ResourceBank.find(params[:id]) + candown = resource_bank_candown @resource, params[:type] + if candown + if stale?(:etag => @resource.digest) + if params[:preview] == 'true' + storage_path = Redmine::Configuration['attachments_storage_path'] || File.join(Rails.root, "files") + convered_file = File.join(storage_path, @resource.disk_directory.to_s, @resource.disk_filename.to_s) + #如果本身不是pdf文件,则先寻找是不是已转换化,如果没有则转化 + unless pdf?(convered_file) + convered_file = File.join(Rails.root, "files", "convered_office", @attachment.disk_filename + ".pdf") + unless File.exist?(convered_file) + office = Trustie::Utils::Office.new(File.join(storage_path, @resource.disk_directory.to_s, @resource.disk_filename.to_s)) + office.conver(convered_file) + end + end + if File.exist?(convered_file) && pdf?(convered_file) + send_file convered_file, :type => 'application/pdf; charset=utf-8', :disposition => 'inline' + else + direct_download_resource + end + else + # 记录用户行为 + record_user_actions(params[:id]) + # 直接下载历史版本 + direct_download_resource + end + end + else + render_403 :message => :notice_not_authorized + end + rescue => e + redirect_to "http://" + (Setting.host_name.to_s) +"/file_not_found.html" + end + def direct_download_history @attachment_history = AttachmentHistory.find(params[:id]) @attachment_history.increment_download @@ -126,6 +171,8 @@ class AttachmentsController < ApplicationController UserActions.create(:action_id => id, :action_type => "AttachmentHistory", :user_id => User.current.id) unless id.nil? elsif params[:action] == "download" UserActions.create(:action_id => id, :action_type => "Attachment", :user_id => User.current.id) unless id.nil? + elsif params[:action] == "download_resource" + UserActions.create(:action_id => id, :action_type => "ResourceBank", :user_id => User.current.id) unless id.nil? end end diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index 760dfa3da..5a8dce761 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -598,6 +598,10 @@ class FilesController < ApplicationController end attachment.description = params[:description] attachment.save + resource_bank = ResourceBank.create(:course_id => @course.id, :attachment_id => attachment.id, :filename => attachment.filename, :disk_filename => attachment.disk_filename, :filesize => attachment.filesize, :digest => attachment.digest, :downloads => 0, + :user_id => attachment.author_id, :description => attachment.description, :disk_directory => attachment.disk_directory, :is_public => attachment.is_public, :copy_from => attachment.copy_from, + :quotes => 1, :applicable_syllabus => @course.syllabus.title, :major_level => @course.syllabus.major_level, :discipline_category_id => @course.syllabus.discipline_category_id, :first_level_discipline_id => @course.syllabus.first_level_discipline_id, :content_type => attachment.content_type) + attachment.update_column('resource_bank_id', resource_bank.id) end end if params[:course_attachment_type] && params[:course_attachment_type].is_a?(Array) diff --git a/app/controllers/syllabuses_controller.rb b/app/controllers/syllabuses_controller.rb index 5fb6baca7..350f1942c 100644 --- a/app/controllers/syllabuses_controller.rb +++ b/app/controllers/syllabuses_controller.rb @@ -1,4 +1,4 @@ -# encoding: utf-8 +#encoding: utf-8 class SyllabusesController < ApplicationController include ApplicationHelper helper :attachments @@ -7,7 +7,8 @@ class SyllabusesController < ApplicationController before_filter :is_logged, :only => [:index, :show, :edit, :new, :update, :destroy, :delete_syllabus, :syllabus_resources, :syllabus_homeworks] before_filter :find_syllabus, :only => [:show, :edit, :update, :destroy, :syllabus_courselist, :edit_syllabus_eng_name, :edit_syllabus_title, :update_base_info, :delete_syllabus, - :delete_des, :members, :update_des, :edit_ref, :update_ref, :add_sy_member_alert, :search_not_sy_member, :syllabus_resources, :syllabus_homeworks] + :delete_des, :members, :update_des, :edit_ref, :update_ref, :add_sy_member_alert, :search_not_sy_member, :syllabus_resources, :syllabus_homeworks, + :send_homeworks_to_course, :choose_user_course, :send_resources_to_course] def index user = User.current @syllabuses = user.syllabuses @@ -17,9 +18,8 @@ class SyllabusesController < ApplicationController @is_syllabus_member = User.current.admin? || @syllabus.syllabus_members.map{|sm| sm.user_id}.include?(User.current.id) @reference_materials = @syllabus.reference_materials @members = @syllabus.syllabus_members.includes(:user => {:user_extensions => []}).order("rank asc") - datetime = (Time.now + 6*30*24*60*60).strftime('%Y-%m-%d %H:%M:%S') - @courses = @syllabus.courses.where("is_delete = 0 and created_at >= '#{datetime}'").select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS ca_update").order("ca_update desc") - @end_courses = @syllabus.courses.where("is_delete = 0 and created_at < '#{datetime}'").select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS ca_update").order("ca_update desc") + @courses = @syllabus.courses.where("is_delete = 0 and is_end = 0").select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS ca_update").order("ca_update desc") + @end_courses = @syllabus.courses.where("is_delete = 0 and is_end = 1").select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS ca_update").order("ca_update desc") respond_to do |format| format.js format.html{render :layout => 'base_edu_syllabus'} @@ -158,21 +158,135 @@ class SyllabusesController < ApplicationController end def syllabus_resources - courses = @syllabus.courses - @resource_count == 0 - @public_resource_count = 0 - @private_resource_count = 0 - @resources = [] + @order, @r_sort = params[:order] || "created_at", params[:sort] || "asc" + @sort = @r_sort == "desc" ? "asc" : "desc" + courses = @syllabus.courses.not_deleted + attachments = Attachment.where(:container_type => 'Course', :container_id => courses.map(&:id)) + @resources = ResourceBank.where(:id => attachments.map(&:resource_bank_id)) + if @order == "created_at" + @resources = @resources.order("#{@order} #{@sort}") + else + @resources = @resources.select("resource_banks.*, (quotes+downloads) as heat").order("#{@order} #{@sort}, created_at desc") + end + @resource_count = @resources.count + @public_resource_count = @resources.where(:is_public => 1).count + @private_resource_count = @resources.where(:is_public => 0).count #分页 @limit = 10 @is_remote = true @resource_pages = Paginator.new @resource_count, @limit, params['page'] || 1 @offset ||= @resource_pages.offset @resources = paginateHelper @resources,@limit + respond_to do |format| + format.js + end end def syllabus_homeworks + @order, @r_sort = params[:order] || "created_at", params[:sort] || "asc" + @sort = @r_sort == "desc" ? "asc" : "desc" + courses = @syllabus.courses.not_deleted + homeworks = HomeworkCommon.where(:course_id => courses.map(&:id)) + @homeworks = HomeworkBank.where(:id => homeworks.map(&:homework_bank_id)).order("#{@order} #{@sort}") + @homework_count = @homeworks.count + @public_homework_count = @homeworks.where(:is_public => 1).count + @private_homework_count = @homeworks.where(:is_public => 0).count + @limit = 10 + @is_remote = true + @homework_pages = Paginator.new @homework_count, @limit, params['page'] || 1 + @offset ||= @homework_pages.offset + @homeworks = paginateHelper @homeworks, @limit + respond_to do |format| + format.js + end + end + + def choose_user_course + if !params[:search].nil? + search = "%#{params[:search].to_s.strip.downcase}%" + @courses = User.current.courses.where("is_delete = 0 and is_end = 0 and (#{Course.table_name}.id = #{params[:search].to_i } or #{Course.table_name}.name like :p)",:p=>search).select { |course| User.current.allowed_to?(:as_teacher,course)} + else + @courses = User.current.courses.where("is_delete = 0 and is_end = 0").select { |course| User.current.allowed_to?(:as_teacher,course)} + end + @resource_ids = params[:check_resource] if params[:check_resource] + @homework_ids = params[:check_homework] if params[:check_homework] + @search = params[:search] + #这里仅仅是传递需要发送的资源id + @type = params[:type] + respond_to do |format| + format.js + end + end + + def send_resources_to_course + course = Course.find params[:course_id] + if course + params[:resource_id].each do |resource_id| + resource = ResourceBank.find resource_id + atta = Attachment.new(:filename => resource.filename, :disk_filename => resource.disk_filename, :filesize => resource.filesize, :digest => resource.digest, :downloads => 0, + :author_id => User.current.id, :description => resource.description, :disk_directory => resource.disk_directory, :is_public => 0, :copy_from => resource.copy_from.nil? ? resource.id : resource.copy_from, + :quotes => 0, :resource_bank_id => resource.id, :created_on => Time.now, :content_type =>resource.content_type) + if course.attachments << atta + # 更新引用次数 + quotes = resource.quotes.to_i + 1 + resource.update_attribute(:quotes, quotes) + end + end + end + end + + def send_homeworks_to_course + course = Course.find params[:course_id] + if course + params[:homework_id].each do |homework_id| + homework = HomeworkBank.find homework_id + new_homework = HomeworkCommon.new(:name => homework.name, :user_id => User.current.id, :description => homework.description, :homework_type => homework.homework_type, :late_penalty => 0, + :course_id => course.id, :teacher_priority => 1, :anonymous_comment => 1, :quotes => 0, :is_open => 0, + :homework_bank_id => homework.id, :score_open => 1, :anonymous_appeal => 0) + + new_homework.homework_detail_manual = HomeworkDetailManual.new + new_homework_detail_manual = new_homework.homework_detail_manual + new_homework_detail_manual.te_proportion = 1.0 + new_homework_detail_manual.ta_proportion = 0 + new_homework_detail_manual.comment_status = 0 + new_homework_detail_manual.evaluation_num = 3 + new_homework_detail_manual.absence_penalty = 0 + + if new_homework.homework_type == 2 + new_homework.homework_detail_programing = HomeworkDetailPrograming.new + new_homework.homework_detail_programing.ta_proportion = 0 + new_homework.homework_detail_programing.language = homework.language + homework.homework_bank_tests.each_with_index do |homework_test| + if homework_test.test_type + new_homework.homework_tests << HomeworkTest.new( + input: homework_test.input, + output: homework_test.output + ) + else + new_homework.homework_samples << HomeworkSample.new( + input: homework_test.input, + output: homework_test.output + ) + end + end + end + + if new_homework.homework_type == 3 + new_homework.homework_detail_group = HomeworkDetailGroup.new + new_homework.homework_detail_group.min_num = homework.min_num + new_homework.homework_detail_group.max_num = homework.max_num + new_homework.homework_detail_group.base_on_project = homework.base_on_project + end + + if new_homework.save + new_homework_detail_manual.save if new_homework_detail_manual + new_homework.homework_detail_programing.save if new_homework.homework_detail_programing + new_homework.homework_detail_group.save if new_homework.homework_detail_group + homework.update_column(:quotes, homework.quotes+1) + end + end + end end def delete_syllabus diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 843f46df6..bf04f7acd 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -2694,6 +2694,15 @@ module ApplicationHelper end end + def resource_bank_candown resource,type + candown = false + if type == 'syllabus' + syllabus = resource.course.syllabus + candown = User.current.member_of_syl?(syllabus) || User.current.admin? + end + candown + end + def attachment_candown attachment candown = false if attachment.container diff --git a/app/models/homework_bank.rb b/app/models/homework_bank.rb index b1e908a1d..0f89c74d9 100644 --- a/app/models/homework_bank.rb +++ b/app/models/homework_bank.rb @@ -1,3 +1,4 @@ +#encoding: utf-8 class HomeworkBank < ActiveRecord::Base # attr_accessible :title, :body belongs_to :user @@ -7,4 +8,18 @@ class HomeworkBank < ActiveRecord::Base def language_name %W(C C++ Python Java).at(self.language.to_i - 1) end + + #作业类型 + def homework_type_ch + type = self.homework_type + case type + when 1 + type = "普通" + when 2 + type = "编程" + when 3 + type = "分组" + end + type + end end diff --git a/app/views/layouts/base_edu.html.erb b/app/views/layouts/base_edu.html.erb index 372743ab1..f84c62999 100644 --- a/app/views/layouts/base_edu.html.erb +++ b/app/views/layouts/base_edu.html.erb @@ -10,7 +10,7 @@ <%= javascript_heads %> <%= heads_for_theme %> <%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2','css/edu-common','css/edu-public', 'css/font-awesome', 'css/edu-class', 'css/edu-popup' %> - <%= javascript_include_tag "edu/application",'edu/syllabus' %> + <%= javascript_include_tag "edu/application",'edu/base_edu' %> <%= call_hook :view_layouts_base_html_head %> <%= yield :header_tags -%> diff --git a/app/views/syllabuses/_search_course_list.html.erb b/app/views/syllabuses/_search_course_list.html.erb new file mode 100644 index 000000000..d8fbfbec3 --- /dev/null +++ b/app/views/syllabuses/_search_course_list.html.erb @@ -0,0 +1,12 @@ +<% if @courses.count > 0 %> + <% @courses.each do |course| %> +
  • + +
  • + <% end %> +<% else %> + +<% end %> \ No newline at end of file diff --git a/app/views/syllabuses/_sy_send_homework.html.erb b/app/views/syllabuses/_sy_send_homework.html.erb new file mode 100644 index 000000000..9d538c1f8 --- /dev/null +++ b/app/views/syllabuses/_sy_send_homework.html.erb @@ -0,0 +1,35 @@ +
    +
    +

    发送题库

    + +
    +
    +
    +
    + + 选择的题将会发送到指定班级 +
    +
    + + + +
    + <%= form_tag(send_homeworks_to_course_syllabus_path(@syllabus), :id => 'send_homework_to_course_form', :remote => true, :method => 'post') do %> +
    + <% @homework_ids.each do |id| %> + + <% end %> +
      + <%= render :partial => 'search_course_list' %> +
    +
    + <% end %> +
    + + 确定 + 取消 +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/app/views/syllabuses/_sy_send_resource.html.erb b/app/views/syllabuses/_sy_send_resource.html.erb new file mode 100644 index 000000000..96118eee7 --- /dev/null +++ b/app/views/syllabuses/_sy_send_resource.html.erb @@ -0,0 +1,35 @@ +
    +
    +

    发送资源

    + +
    +
    +
    +
    + + 选择的资源将会发送到指定班级 +
    +
    + + + +
    + <%= form_tag(send_resources_to_course_syllabus_path(@syllabus), :id => 'send_resource_to_course_form', :remote => true, :method => 'post') do %> +
    + <% @resource_ids.each do |id| %> + + <% end %> +
      + <%= render :partial => 'search_course_list' %> +
    +
    + <% end %> +
    + + 确定 + 取消 +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/app/views/syllabuses/_syllabus_homeworks.html.erb b/app/views/syllabuses/_syllabus_homeworks.html.erb index 0bce797a9..81128678f 100644 --- a/app/views/syllabuses/_syllabus_homeworks.html.erb +++ b/app/views/syllabuses/_syllabus_homeworks.html.erb @@ -1,42 +1,55 @@
    -
    -

    共有题:6

    -

    公共题:6

    -

    私有题:6

    - 热度排序 - | - 时间排序 -
    - - + <% if @homework_count == 0 %> + +

    还没有添加课程题库 ~

    + <% else %> +
    +

    共有题:<%= @homework_count %>

    +

    公共题:<%= @public_homework_count %>

    +

    私有题:<%= @private_homework_count %>

    + + <%= link_to '热度排序', syllabus_homeworks_syllabus_path(@syllabus,:order => "quotes", :sort => @sort), :class => "fr mr15 #{@order == 'quotes' ? 'color-blue' : ''}", :remote => true %> + | + <%= link_to '时间排序', syllabus_homeworks_syllabus_path(@syllabus,:order => "created_at", :sort => @sort), :class => "fr #{@order == 'created_at' ? 'color-blue' : ''}", :remote => true %> +
    + + <%= form_tag(choose_user_course_syllabus_path(@syllabus), :id => 'sy_search_course_h_form', :remote => true, :method => 'post') do %> + + <% @homeworks.each do |homework| %> + + <% end %> + <% end %> + + <% end %>
    \ No newline at end of file diff --git a/app/views/syllabuses/_syllabus_resources.html.erb b/app/views/syllabuses/_syllabus_resources.html.erb index 465ea8020..41d571a7e 100644 --- a/app/views/syllabuses/_syllabus_resources.html.erb +++ b/app/views/syllabuses/_syllabus_resources.html.erb @@ -8,18 +8,20 @@

    公共资源:<%= @public_resource_count %>

    私有资源:<%= @private_resource_count %>

    - <%= link_to '热度排序', syllabus_resources_syllabus_path(@syllabus,:order => "heat", :sort => @r_sort), :class => "fr mr15 #{@order == 'heat' ? 'color-blue' : ''}", :remote => true %> + <%= link_to '热度排序', syllabus_resources_syllabus_path(@syllabus,:order => "heat", :sort => @sort), :class => "fr mr15 #{@order == 'heat' ? 'color-blue' : ''}", :remote => true %> | - <%= link_to '时间排序', syllabus_resources_syllabus_path(@syllabus,:order => "created_at", :sort => @r_sort), :class => "fr #{@order == 'created_at' ? 'color-blue' : ''}", :remote => true %> + <%= link_to '时间排序', syllabus_resources_syllabus_path(@syllabus,:order => "created_at", :sort => @sort), :class => "fr #{@order == 'created_at' ? 'color-blue' : ''}", :remote => true %> + <%= form_tag(choose_user_course_syllabus_path(@syllabus), :id => 'sy_search_course_form', :remote => true, :method => 'post') do %> + <% @resources.each do |resource| %> <% end %> + <% end %>