From 61e1f0fa528a72e636a2f1a768b5fdfc3d58f564 Mon Sep 17 00:00:00 2001 From: z9hang Date: Mon, 29 Dec 2014 17:44:39 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E5=AF=BC=E5=87=BA=E4=BD=9C=E5=93=81?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/homework_attach_controller.rb | 22 +++++++++++++++++++ app/views/bids/_homework_list.html.erb | 5 ----- .../homework_attach/_homeworks_list.html.erb | 6 +++++ 3 files changed, 28 insertions(+), 5 deletions(-) diff --git a/app/controllers/homework_attach_controller.rb b/app/controllers/homework_attach_controller.rb index 5c4542944..c2ba1654b 100644 --- a/app/controllers/homework_attach_controller.rb +++ b/app/controllers/homework_attach_controller.rb @@ -55,7 +55,29 @@ class HomeworkAttachController < ApplicationController @direction = direction == 'asc'? 'desc' : 'asc' respond_to do |format| format.js + format.csv { + send_data(homework_to_csv(all_homework_list), :type => 'text/csv; header=present', :filename => 'issues.csv') + } + end + end + + def homework_to_csv items + encoding = l(:general_csv_encoding) + columns = ["student_id","user_name","login","student_num","mail","work_name","teacher_score","ni_score","commit_time"] + + + export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv| + # csv header fields + csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(c, encoding) } + # csv lines + items.each do |homework| + csv << [homework.user.id,Redmine::CodesetUtil.from_utf8(homework.user.lastname.to_s + homework.user.firstname.to_s, encoding),Redmine::CodesetUtil.from_utf8(homework.user.login, encoding), + Redmine::CodesetUtil.from_utf8(homework.user.user_extensions.student_id, encoding),Redmine::CodesetUtil.from_utf8(homework.user.mail, encoding),Redmine::CodesetUtil.from_utf8(homework.name, encoding), + Redmine::CodesetUtil.from_utf8((homework.t_score.nil? || (homework.t_score && homework.t_score.to_i == 0)) ? l(:label_without_score) : format("%.2f",homework.t_score), encoding), + Redmine::CodesetUtil.from_utf8( homework.s_score.nil? ? l(:label_without_score) : format("%.2f",homework.s_score), encoding),Redmine::CodesetUtil.from_utf8(format_time(homework.created_at), encoding)] + end end + export end #获取所有作业列表 diff --git a/app/views/bids/_homework_list.html.erb b/app/views/bids/_homework_list.html.erb index ea1f9b770..202a2ee91 100644 --- a/app/views/bids/_homework_list.html.erb +++ b/app/views/bids/_homework_list.html.erb @@ -62,11 +62,6 @@ :is_student_batch_homework => @is_student_batch_homework}%> - <% if @is_teacher %> - - <% end %>
diff --git a/app/views/homework_attach/_homeworks_list.html.erb b/app/views/homework_attach/_homeworks_list.html.erb index 8ef696e0c..6ada00bb9 100644 --- a/app/views/homework_attach/_homeworks_list.html.erb +++ b/app/views/homework_attach/_homeworks_list.html.erb @@ -63,4 +63,10 @@ <%= anonymous_comment_notice(@bid, @bid.courses.first) %> + <% other_formats_links do |f| %> + <%= f.link_to 'CSV', :url => params %> + <% end %> + <% end %> From e39e801c617f58db31fea59379d8b361cc20e5d1 Mon Sep 17 00:00:00 2001 From: alan <547533434@qq.com> Date: Mon, 29 Dec 2014 20:46:27 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E3=80=8A=E5=AD=A6?= =?UTF-8?q?=E7=94=9F=E5=88=97=E8=A1=A8=E6=8C=89=E4=BD=9C=E4=B8=9A=E8=AF=84?= =?UTF-8?q?=E5=88=86=E6=8E=92=E5=BA=8F=E5=8A=9F=E8=83=BD=E3=80=8B=20Signed?= =?UTF-8?q?-off-by:=20alan=20<547533434@qq.com>?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/courses_controller.rb | 44 ++++++++++++++-------- app/views/courses/_member_list.html.erb | 10 +++-- app/views/courses/member_score_sort.js.erb | 2 +- 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 21199f6f9..49cc40f10 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -210,14 +210,15 @@ class CoursesController < ApplicationController @render_file = 'member_list' @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' @is_remote = true + @score_sort_by = "desc" q = "#{params[:name].strip}" #(redirect_to stores_url, :notice => l(:label_sumbit_empty);return) if params[:name].blank? if params[:incourse] - @results = searchmember_by_name(student_homework_score(0,0,0), q) + @results = searchmember_by_name(student_homework_score(0,0,0,"desc"), q) elsif params[:ingroup] @group = CourseGroup.find(params[:search_group_id]) - @results = searchmember_by_name(student_homework_score(@group.id,0,0), q) + @results = searchmember_by_name(student_homework_score(@group.id,0,0,"desc"), q) end @is_remote = true @result_count = @results.count @@ -307,16 +308,17 @@ class CoursesController < ApplicationController @render_file = 'member_list' @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' @is_remote = true + @score_sort_by = "desc" if params[:group_id] && params[:group_id] != "0" @group = CourseGroup.find(params[:group_id]) - @results = student_homework_score(@group.id,0, 0) + @results = student_homework_score(@group.id,0, 0,"desc") @results = paginateHelper @results, 10 else page_from = params[:page].nil? ? 0 : (params[:page].to_i - 1) - @results = student_homework_score(0,page_from, 10) + @results = student_homework_score(0,page_from, 10,"") @results = paginateHelper_for_members @results, 10 end @@ -329,7 +331,7 @@ class CoursesController < ApplicationController ## 有角色参数的才是课程,没有的就是项目 if (User.current.admin? || @course.is_public == 1 || (@course.is_public == 0 && User.current.member_of_course?(@course))) @render_file = 'member_list' - + @score_sort_by = "desc" @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' @role = params[:role].nil? ? '2':params[:role] @is_remote = true @@ -343,7 +345,7 @@ class CoursesController < ApplicationController when '2' @subPage_title = l :label_student_list page = params[:page].nil? ? 0 : (params['page'].to_i - 1) - @members = student_homework_score(0,page, 10) + @members = student_homework_score(0,page, 10,"desc") @members = paginateHelper_for_members @members, 10 @@ -367,18 +369,31 @@ class CoursesController < ApplicationController def member_score_sort # @teachers= searchTeacherAndAssistant(@course) - # @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' + @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' # @role = params[:role] # @course_groups = @course.course_groups if @course.course_groups # @show_serch = params[:role] == '2' - # @subPage_title = l :label_student_list - # @render_file = 'member_list' + @subPage_title = l :label_student_list + @render_file = 'member_list' # @results = params[:result] if params[:result] # unless @result.nil? # @results = @result.reverse # # end - # @results = paginateHelper @results + # @results = paginateHelper @results@score_sort_by = "desc" + @is_remote = true + @score_sort_by = params[:sort_by] if params[:sort_by] + group_id = params[:group_id] + if group_id == '0' + page = params[:page].nil? ? 0 : (params['page'].to_i - 1) + @results = student_homework_score(0,page, 10,@score_sort_by) + + @results = paginateHelper_for_members @results, 10 + else + @group = Group.find(group_id) + @results = student_homework_score(group_id, 0, 0,@score_sort_by) + @results = paginateHelper @results, 10 + end end # 显示每个学生的作业评分详情 def show_member_score @@ -882,12 +897,12 @@ class CoursesController < ApplicationController end end - def student_homework_score(groupid,start_from, nums) + def student_homework_score(groupid,start_from, nums, score_sort_by) #teachers = find_course_teachers(@course) start_from = start_from * nums sql = ActiveRecord::Base.connection() - homework_scores = Member.find_by_sql("call member_score(#{@course.id},#{groupid},#{start_from},#{nums})") + homework_scores = Member.find_by_sql("call member_score(#{@course.id},#{groupid},#{start_from},#{nums}, '#{score_sort_by}')") sql.close() homework_scores @@ -903,10 +918,9 @@ class CoursesController < ApplicationController @render_file = 'member_list' @canShowCode = isCourseTeacher(User.current.id,@course) && params[:role] != '1' @is_remote = true - - + @score_sort_by = "desc" page_from = params[:page].nil? ? 0 : (params[:page].to_i - 1) - @results = student_homework_score(group.id,0,0) + @results = student_homework_score(group.id,0,0, "desc") @results = paginateHelper @results, 10 end diff --git a/app/views/courses/_member_list.html.erb b/app/views/courses/_member_list.html.erb index 7e6407aa5..295db933a 100644 --- a/app/views/courses/_member_list.html.erb +++ b/app/views/courses/_member_list.html.erb @@ -1,13 +1,15 @@ +
@@ -36,7 +38,7 @@
    <% if @subPage_title == l(:label_student_list) %> -
  • <%= link_to '作业积分', member_score_sort_course_path ,:result => members,method: 'get', remote: true, :onclick => "change_pic('pic')"%> +
  • <%= link_to '作业积分', member_score_sort_course_path(:sort_by => (@score_sort_by == "desc" ? "asc" : "desc"), :group_id => (@group ? @group.id : 0)) ,:result => members,method: 'get', remote: true, :onclick => "change_pic('pic')"%>
  • diff --git a/app/views/courses/member_score_sort.js.erb b/app/views/courses/member_score_sort.js.erb index 30965f835..c6ff97164 100644 --- a/app/views/courses/member_score_sort.js.erb +++ b/app/views/courses/member_score_sort.js.erb @@ -1,4 +1,4 @@ /** * Created by Administrator on 2014/12/3. */ -$("#list_detail").html("<%= escape_javascript( render :partial => 'member_list_detail', :locals => {:members => @results})%>"); \ No newline at end of file +$("#member_content").html("<%= escape_javascript( render :partial => @render_file, :locals => {:members => @results})%>"); \ No newline at end of file From 5874450d14483822cd80819e1c76b102d2a1417c Mon Sep 17 00:00:00 2001 From: alan <547533434@qq.com> Date: Mon, 29 Dec 2014 22:20:21 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E3=80=8A=E5=AD=A6?= =?UTF-8?q?=E7=94=9F=E5=88=97=E8=A1=A8=E6=8E=92=E5=BA=8F=E7=94=A8=E7=9A=84?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E8=BF=87=E7=A8=8B=E3=80=8B=20Signed-off-by:?= =?UTF-8?q?=20alan=20<547533434@qq.com>?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...29141201_create_pro_select_member_score.rb | 108 ++++++++++++++++++ db/schema.rb | 2 +- 2 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20141229141201_create_pro_select_member_score.rb diff --git a/db/migrate/20141229141201_create_pro_select_member_score.rb b/db/migrate/20141229141201_create_pro_select_member_score.rb new file mode 100644 index 000000000..e7910a5ff --- /dev/null +++ b/db/migrate/20141229141201_create_pro_select_member_score.rb @@ -0,0 +1,108 @@ +class CreateProSelectMemberScore < ActiveRecord::Migration + def up + sql_delete = ("DROP PROCEDURE IF EXISTS `member_score`;") + sql = (" +CREATE PROCEDURE `member_score`(IN courseid INT, IN groupid INT,IN start_from INT, IN nums INT, IN sort_by VARCHAR(10)) +BEGIN + + CREATE TEMPORARY TABLE IF NOT EXISTS course_teachers ( + id INT + + ); + TRUNCATE TABLE course_teachers; + + CREATE TEMPORARY TABLE IF NOT EXISTS mems ( + id INT , + user_id INT, + course_id INT, + created_on DATETIME, + course_group_id INT, + score FLOAT DEFAULT 0 + ); + TRUNCATE TABLE mems; + + CREATE TEMPORARY TABLE IF NOT EXISTS mem_home ( + id INT, + user_id INT, + course_id INT, + created_on DATETIME, + course_group_id INT, + home_id INT, + score FLOAT DEFAULT 0 + ); + TRUNCATE TABLE mem_home; + + CREATE TEMPORARY TABLE IF NOT EXISTS t_scores ( + + home_id INT, + score FLOAT + ); + TRUNCATE TABLE t_scores; + + CREATE TEMPORARY TABLE IF NOT EXISTS s_scores ( + + home_id INT, + score FLOAT + ); + TRUNCATE TABLE s_scores; + + CREATE TEMPORARY TABLE IF NOT EXISTS scores ( + + user_id INT, + score FLOAT + ); + TRUNCATE TABLE scores; + + INSERT INTO course_teachers (SELECT members.user_id FROM members WHERE members.user_id NOT IN (SELECT student_id FROM students_for_courses WHERE course_id = courseid)); + + + + INSERT INTO mems (id, user_id, course_id, created_on, course_group_id) + (SELECT members.id, members.user_id, members.course_id, members.created_on, members.course_group_id + FROM members WHERE course_id = courseid AND members.user_id NOT IN (SELECT id FROM course_teachers)); + + INSERT INTO mem_home (id, user_id, course_id, created_on, course_group_id,home_id) + (SELECT members.id, members.user_id, members.course_id, members.created_on, members.course_group_id, homework_attaches.id + FROM members, homework_attaches WHERE course_id = courseid + AND members.user_id = homework_attaches.user_id AND members.user_id NOT IN (SELECT id FROM course_teachers) + AND homework_attaches.bid_id IN (SELECT bid_id FROM homework_for_courses WHERE course_id = courseid )); + + INSERT INTO t_scores (home_id, score) (SELECT rateable_id,AVG(seems_rateable_rates.stars) + FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id IN (SELECT mem_home.home_id FROM mem_home) + AND rater_id IN (SELECT id FROM course_teachers) + GROUP BY rateable_id); + + INSERT INTO s_scores (home_id, score) (SELECT rateable_id,AVG(seems_rateable_rates.stars) + FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id IN (SELECT mem_home.home_id FROM mem_home) + AND rater_id NOT IN (SELECT id FROM course_teachers) + GROUP BY rateable_id) ; + + UPDATE mem_home, t_scores SET mem_home.score = t_scores.score WHERE mem_home.home_id = t_scores.home_id ; + + UPDATE mem_home, s_scores SET mem_home.score = s_scores.score WHERE mem_home.home_id = s_scores.home_id AND mem_home.score = 0; + + INSERT INTO scores (user_id, score) (SELECT user_id, SUM(score) FROM mem_home GROUP BY user_id); + UPDATE mems, scores SET mems.score = scores.score WHERE mems.user_id = scores.user_id; + IF sort_by = '' OR sort_by = 'desc' THEN + IF groupid <> 0 THEN + SELECT * FROM mems WHERE course_group_id = groupid ORDER BY score DESC ; + ELSE + SELECT * FROM mems ORDER BY score DESC LIMIT start_from, nums; + END IF; + ELSE + IF groupid <> 0 THEN + SELECT * FROM mems WHERE course_group_id = groupid ORDER BY score ASC ; + ELSE + SELECT * FROM mems ORDER BY score ASC LIMIT start_from, nums; + END IF; + END IF; + END; + +") + execute(sql_delete) + execute(sql) + end + + def down + end +end diff --git a/db/schema.rb b/db/schema.rb index 5725d8221..39e0a7d1d 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20141229025925) do +ActiveRecord::Schema.define(:version => 20141229141201) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false From 4f5fe524851d311c13717d70f616f73ae102e1f9 Mon Sep 17 00:00:00 2001 From: alan <547533434@qq.com> Date: Tue, 30 Dec 2014 09:21:56 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E5=9F=BA=E4=BA=8E=E8=8B=8F=E7=A8=B3?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=9A=84=E5=AD=97=E6=AE=B5=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=AD=98=E5=82=A8=E8=BF=87=E7=A8=8B=20Signed-off-by:=20alan=20?= =?UTF-8?q?<547533434@qq.com>?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30011546_create_new_select_member_score.rb | 104 ++++++++++++++++++ db/schema.rb | 2 +- 2 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20141230011546_create_new_select_member_score.rb diff --git a/db/migrate/20141230011546_create_new_select_member_score.rb b/db/migrate/20141230011546_create_new_select_member_score.rb new file mode 100644 index 000000000..5d02a7465 --- /dev/null +++ b/db/migrate/20141230011546_create_new_select_member_score.rb @@ -0,0 +1,104 @@ +class CreateNewSelectMemberScore < ActiveRecord::Migration + def up + sql_delete = ("DROP PROCEDURE IF EXISTS `member_score`;") + sql = (" +CREATE PROCEDURE `member_score`(IN courseid INT, IN groupid INT,IN start_from INT, IN nums INT, IN sort_by VARCHAR(10)) +BEGIN + + + + CREATE TEMPORARY TABLE IF NOT EXISTS mems ( + id INT , + user_id INT, + course_id INT, + created_on DATETIME, + course_group_id INT, + score FLOAT DEFAULT 0 + ); + TRUNCATE TABLE mems; + + CREATE TEMPORARY TABLE IF NOT EXISTS mem_home ( + id INT, + user_id INT, + course_id INT, + created_on DATETIME, + course_group_id INT, + home_id INT, + score FLOAT DEFAULT 0 + ); + TRUNCATE TABLE mem_home; + + CREATE TEMPORARY TABLE IF NOT EXISTS t_scores ( + + home_id INT, + score FLOAT + ); + TRUNCATE TABLE t_scores; + + CREATE TEMPORARY TABLE IF NOT EXISTS s_scores ( + + home_id INT, + score FLOAT + ); + TRUNCATE TABLE s_scores; + + CREATE TEMPORARY TABLE IF NOT EXISTS scores ( + + user_id INT, + score FLOAT + ); + TRUNCATE TABLE scores; + + + + INSERT INTO mems (id, user_id, course_id, created_on, course_group_id) + (SELECT members.id, members.user_id, members.course_id, members.created_on, members.course_group_id + FROM members,students_for_courses WHERE members.course_id = courseid + AND members.course_id = students_for_courses.course_id AND members.user_id =students_for_courses.student_id); + + INSERT INTO mem_home (id, user_id, course_id, created_on, course_group_id,home_id) + (SELECT members.id, members.user_id, members.course_id, members.created_on, members.course_group_id, homework_attaches.id + FROM members, homework_attaches WHERE course_id = courseid + AND members.user_id = homework_attaches.user_id AND members.user_id IN (SELECT student_id FROM students_for_courses WHERE course_id = courseid) + AND homework_attaches.bid_id IN (SELECT bid_id FROM homework_for_courses WHERE course_id = courseid )); + + INSERT INTO t_scores (home_id, score) (SELECT rateable_id,AVG(seems_rateable_rates.stars) + FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id IN (SELECT mem_home.home_id FROM mem_home) + AND is_teacher_score = 1 + GROUP BY rateable_id); + + INSERT INTO s_scores (home_id, score) (SELECT rateable_id,AVG(seems_rateable_rates.stars) + FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id IN (SELECT mem_home.home_id FROM mem_home) + AND is_teacher_score = 0 + GROUP BY rateable_id) ; + + UPDATE mem_home, t_scores SET mem_home.score = t_scores.score WHERE mem_home.home_id = t_scores.home_id ; + + UPDATE mem_home, s_scores SET mem_home.score = s_scores.score WHERE mem_home.home_id = s_scores.home_id AND mem_home.score = 0; + + INSERT INTO scores (user_id, score) (SELECT user_id, SUM(score) FROM mem_home GROUP BY user_id); + UPDATE mems, scores SET mems.score = scores.score WHERE mems.user_id = scores.user_id; + IF sort_by = '' OR sort_by = 'desc' THEN + IF groupid <> 0 THEN + SELECT * FROM mems WHERE course_group_id = groupid ORDER BY score; + ELSE + SELECT * FROM mems ORDER BY score DESC ; + END IF; + ELSE + IF groupid <> 0 THEN + SELECT * FROM mems WHERE course_group_id = groupid ORDER BY score ASC LIMIT start_from, nums; + ELSE + SELECT * FROM mems ORDER BY score ASC; + END IF; + END IF; + END; + +") + execute(sql_delete) + execute(sql) + end + + + def down + end +end diff --git a/db/schema.rb b/db/schema.rb index 39e0a7d1d..053aa8304 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20141229141201) do +ActiveRecord::Schema.define(:version => 20141230011546) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false From 6a86e1c386a6b743e14de588069e1c88f8c8eaa4 Mon Sep 17 00:00:00 2001 From: alan <547533434@qq.com> Date: Tue, 30 Dec 2014 14:00:48 +0800 Subject: [PATCH 5/8] =?UTF-8?q?<=E5=88=86=E7=BB=84=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E4=B8=A4=E6=AC=A1>bug=20Signed-off-by:=20alan=20<547533434@qq.?= =?UTF-8?q?com>?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/courses/_member_list.html.erb | 23 ++-- ...141230034253_create_select_member_score.rb | 102 ++++++++++++++++++ db/schema.rb | 2 +- 3 files changed, 110 insertions(+), 17 deletions(-) create mode 100644 db/migrate/20141230034253_create_select_member_score.rb diff --git a/app/views/courses/_member_list.html.erb b/app/views/courses/_member_list.html.erb index 295db933a..e08697e9d 100644 --- a/app/views/courses/_member_list.html.erb +++ b/app/views/courses/_member_list.html.erb @@ -1,17 +1,4 @@ -
    <% if User.current.logged? && User.current.member_of_course?(@course) && @group %> <% if !@canShowCode %> @@ -38,9 +25,13 @@
      <% if @subPage_title == l(:label_student_list) %> -
    • <%= link_to '作业积分', member_score_sort_course_path(:sort_by => (@score_sort_by == "desc" ? "asc" : "desc"), :group_id => (@group ? @group.id : 0)) ,:result => members,method: 'get', remote: true, :onclick => "change_pic('pic')"%> - -
    • +
    • <%= link_to '作业积分', member_score_sort_course_path(:sort_by => (@score_sort_by == "desc" ? "asc" : "desc"), :group_id => (@group ? @group.id : 0)) ,:result => members,method: 'get', remote: true%> + <% if @score_sort_by == 'desc' %> + + <% else %> + + <% end %> +
    • 加入时间
    • diff --git a/db/migrate/20141230034253_create_select_member_score.rb b/db/migrate/20141230034253_create_select_member_score.rb new file mode 100644 index 000000000..f45f609e8 --- /dev/null +++ b/db/migrate/20141230034253_create_select_member_score.rb @@ -0,0 +1,102 @@ +class CreateSelectMemberScore < ActiveRecord::Migration + def up + sql_delete = ("DROP PROCEDURE IF EXISTS `member_score`;") + sql = ("CREATE PROCEDURE `member_score`(IN courseid INT, IN groupid INT,IN start_from INT, IN nums INT, IN sort_by VARCHAR(10)) +BEGIN + + + + CREATE TEMPORARY TABLE IF NOT EXISTS mems ( + id INT , + user_id INT, + course_id INT, + created_on DATETIME, + course_group_id INT, + score FLOAT DEFAULT 0 + ); + TRUNCATE TABLE mems; + + CREATE TEMPORARY TABLE IF NOT EXISTS mem_home ( + id INT, + user_id INT, + course_id INT, + created_on DATETIME, + course_group_id INT, + home_id INT, + score FLOAT DEFAULT 0 + ); + TRUNCATE TABLE mem_home; + + CREATE TEMPORARY TABLE IF NOT EXISTS t_scores ( + + home_id INT, + score FLOAT + ); + TRUNCATE TABLE t_scores; + + CREATE TEMPORARY TABLE IF NOT EXISTS s_scores ( + + home_id INT, + score FLOAT + ); + TRUNCATE TABLE s_scores; + + CREATE TEMPORARY TABLE IF NOT EXISTS scores ( + + user_id INT, + score FLOAT + ); + TRUNCATE TABLE scores; + + + + INSERT INTO mems (id, user_id, course_id, created_on, course_group_id) + (SELECT members.id, members.user_id, members.course_id, members.created_on, members.course_group_id + FROM members,students_for_courses WHERE members.course_id = courseid + AND members.course_id = students_for_courses.course_id AND members.user_id =students_for_courses.student_id); + + INSERT INTO mem_home (id, user_id, course_id, created_on, course_group_id,home_id) + (SELECT members.id, members.user_id, members.course_id, members.created_on, members.course_group_id, homework_attaches.id + FROM members, homework_attaches WHERE course_id = courseid + AND members.user_id = homework_attaches.user_id AND members.user_id IN (SELECT student_id FROM students_for_courses WHERE course_id = courseid) + AND homework_attaches.bid_id IN (SELECT bid_id FROM homework_for_courses WHERE course_id = courseid )); + + INSERT INTO t_scores (home_id, score) (SELECT rateable_id,AVG(seems_rateable_rates.stars) + FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id IN (SELECT mem_home.home_id FROM mem_home) + AND is_teacher_score = 1 + GROUP BY rateable_id); + + INSERT INTO s_scores (home_id, score) (SELECT rateable_id,AVG(seems_rateable_rates.stars) + FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id IN (SELECT mem_home.home_id FROM mem_home) + AND is_teacher_score = 0 + GROUP BY rateable_id) ; + + UPDATE mem_home, t_scores SET mem_home.score = t_scores.score WHERE mem_home.home_id = t_scores.home_id ; + + UPDATE mem_home, s_scores SET mem_home.score = s_scores.score WHERE mem_home.home_id = s_scores.home_id AND mem_home.score = 0; + + INSERT INTO scores (user_id, score) (SELECT user_id, SUM(score) FROM mem_home GROUP BY user_id); + UPDATE mems, scores SET mems.score = scores.score WHERE mems.user_id = scores.user_id; + IF sort_by = '' OR sort_by = 'desc' THEN + IF groupid <> 0 THEN + SELECT * FROM mems WHERE course_group_id = groupid ORDER BY score ; + ELSE + SELECT * FROM mems ORDER BY score DESC LIMIT start_from, nums ; + END IF; + ELSE + IF groupid <> 0 THEN + SELECT * FROM mems WHERE course_group_id = groupid ORDER BY score ASC ; + ELSE + SELECT * FROM mems ORDER BY score ASC LIMIT start_from, nums; + END IF; + END IF; + END; + +") + execute(sql_delete) + execute(sql) + end + + def down + end +end diff --git a/db/schema.rb b/db/schema.rb index 053aa8304..6ab3c5657 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20141230011546) do +ActiveRecord::Schema.define(:version => 20141230034253) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false From 899ac6f654c2ff98532a147cfc6165b12efe1bbb Mon Sep 17 00:00:00 2001 From: z9hang Date: Tue, 30 Dec 2014 14:29:30 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BD=9C=E5=93=81?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=AF=BC=E5=87=BAexcel=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 2 + Gemfile.lock | 5 ++ app/controllers/bids_controller.rb | 1 + app/controllers/homework_attach_controller.rb | 84 +++++++++++++----- app/views/bids/_homework_list.html.erb | 2 +- .../homework_attach/_homeworks_list.html.erb | 15 ++-- .../get_batch_homeworks.js.erb | 2 +- .../homework_attach/get_homeworks.js.erb | 2 +- .../get_not_batch_homework.js.erb | 2 +- config/initializers/20-mime_types.rb | 1 + config/locales/zh.yml | 12 ++- public/images/icon_excel.gif | Bin 0 -> 1072 bytes public/stylesheets/nyan.css | 8 ++ public/stylesheets/resource.css | 1 + 14 files changed, 103 insertions(+), 34 deletions(-) create mode 100644 public/images/icon_excel.gif diff --git a/Gemfile b/Gemfile index 91e72a745..f462133c3 100644 --- a/Gemfile +++ b/Gemfile @@ -16,6 +16,8 @@ gem "coderay", "~> 1.0.6" gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby] gem "builder", "3.0.0" gem 'acts-as-taggable-on', '2.4.1' +gem 'spreadsheet' +gem 'ruby-ole' group :development do gem 'better_errors', path: 'lib/better_errors' diff --git a/Gemfile.lock b/Gemfile.lock index 6916219a9..771928e40 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -192,6 +192,7 @@ GEM rails (>= 3.2.0) sass-rails rmagick (2.13.2) + ruby-ole (1.2.11.7) ruby-openid (2.1.8) rubyzip (1.1.6) sass (3.3.10) @@ -214,6 +215,8 @@ GEM spork (0.9.2) spork-testunit (0.0.8) spork (>= 0.6.0) + spreadsheet (1.0.0) + ruby-ole (>= 1.0) sprockets (2.2.2) hike (~> 1.2) multi_json (~> 1.0) @@ -272,11 +275,13 @@ DEPENDENCIES rails (= 3.2.13) rich (= 1.4.6) rmagick (>= 2.0.0) + ruby-ole ruby-openid (~> 2.1.4) sass-rails (~> 3.2.3) seems_rateable! selenium-webdriver (~> 2.42.0) shoulda (~> 3.5.0) spork-testunit (~> 0.0.8) + spreadsheet therubyracer uglifier (>= 1.0.3) diff --git a/app/controllers/bids_controller.rb b/app/controllers/bids_controller.rb index e3b8b9a66..ba6ceccc1 100644 --- a/app/controllers/bids_controller.rb +++ b/app/controllers/bids_controller.rb @@ -498,6 +498,7 @@ class BidsController < ApplicationController (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 0) AS s_score FROM homework_attaches WHERE bid_id = #{@bid.id} ORDER BY s_score DESC,created_at ASC) AS table1 WHERE table1.t_score IS NULL") + @not_batch_homework = true @cur_type = 1 else all_homework_list = HomeworkAttach.find_by_sql("SELECT homework_attaches.*, diff --git a/app/controllers/homework_attach_controller.rb b/app/controllers/homework_attach_controller.rb index a8e5cf352..fc07bb202 100644 --- a/app/controllers/homework_attach_controller.rb +++ b/app/controllers/homework_attach_controller.rb @@ -21,6 +21,7 @@ class HomeworkAttachController < ApplicationController #获取未批作业列表 def get_not_batch_homework + @not_batch_homework = true sort, direction = params[:sort] || "s_socre", params[:direction] || "desc" get_not_batch_homework_list sort,direction, @bid.id @cur_page = params[:page] || 1 @@ -28,12 +29,17 @@ class HomeworkAttachController < ApplicationController @direction = direction == 'asc'? 'desc' : 'asc' respond_to do |format| format.js + format.xls { + send_data(homework_to_xls(@all_homework_list), :type => "text/excel;charset=utf-8; header=present", + :filename => "not_rated_homework_#{Time.now.strftime("%Y%m%d")}.xls") + } end end #获取已评作业列表 def get_batch_homeworks sort, direction = params[:sort] || "s_socre", params[:direction] || "desc" + @is_batch_homeworks = true if sort == 't_socre' order_by = "t_score #{direction}" elsif sort == 's_socre' @@ -53,33 +59,18 @@ class HomeworkAttachController < ApplicationController @direction = direction == 'asc'? 'desc' : 'asc' respond_to do |format| format.js - format.csv { - send_data(homework_to_csv(all_homework_list), :type => 'text/csv; header=present', :filename => 'issues.csv') + format.xls { + send_data(homework_to_xls(all_homework_list), :type => "text/excel;charset=utf-8; header=present", + :filename => "been_rated_homework_#{Time.now.strftime("%Y%m%d")}.xls") } end end - def homework_to_csv items - encoding = l(:general_csv_encoding) - columns = ["student_id","user_name","login","student_num","mail","work_name","teacher_score","ni_score","commit_time"] - export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv| - # csv header fields - csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(c, encoding) } - # csv lines - items.each do |homework| - csv << [homework.user.id,Redmine::CodesetUtil.from_utf8(homework.user.lastname.to_s + homework.user.firstname.to_s, encoding),Redmine::CodesetUtil.from_utf8(homework.user.login, encoding), - Redmine::CodesetUtil.from_utf8(homework.user.user_extensions.student_id, encoding),Redmine::CodesetUtil.from_utf8(homework.user.mail, encoding),Redmine::CodesetUtil.from_utf8(homework.name, encoding), - Redmine::CodesetUtil.from_utf8((homework.t_score.nil? || (homework.t_score && homework.t_score.to_i == 0)) ? l(:label_without_score) : format("%.2f",homework.t_score), encoding), - Redmine::CodesetUtil.from_utf8( homework.s_score.nil? ? l(:label_without_score) : format("%.2f",homework.s_score), encoding),Redmine::CodesetUtil.from_utf8(format_time(homework.created_at), encoding)] - end - end - export - end - #获取所有作业列表 def get_homeworks + @is_all_homeworks = true sort, direction = params[:sort] || "s_socre", params[:direction] || "desc" if sort == 't_socre' order_by = "t_score #{direction}" @@ -99,6 +90,10 @@ class HomeworkAttachController < ApplicationController @direction = direction == 'asc'? 'desc' : 'asc' respond_to do |format| format.js + format.xls { + send_data(homework_to_xls(all_homework_list), :type => "text/excel;charset=utf-8; header=present", + :filename => "all_homework_#{Time.now.strftime("%Y%m%d")}.xls") + } end end @@ -582,18 +577,65 @@ class HomeworkAttachController < ApplicationController elsif sort == 'time' order_by = "created_at #{direction}" end - all_homework_list = HomeworkAttach.eager_load(:attachments,:user,:rate_averages).find_by_sql("SELECT * FROM (SELECT homework_attaches.*, + @all_homework_list = HomeworkAttach.eager_load(:attachments,:user,:rate_averages).find_by_sql("SELECT * FROM (SELECT homework_attaches.*, (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 1) AS t_score, (SELECT AVG(stars) FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 0) AS s_score FROM homework_attaches WHERE bid_id = #{bid_id} ORDER BY #{order_by}) AS table1 WHERE table1.t_score IS NULL") - @homework_list = paginateHelper all_homework_list,10 + @homework_list = paginateHelper @all_homework_list,10 end #获取指定作业的所有成员 def users_for_homework homework homework.nil? ? [] : (homework.users + [homework.user]) end + + def homework_to_csv items + encoding = l(:general_csv_encoding) + columns = ["student_id","user_name","login","student_num","mail","work_name","teacher_score","ni_score","commit_time"] + + + export = FCSV.generate(:col_sep => l(:general_csv_separator)) do |csv| + # csv header fields + csv << columns.collect {|c| Redmine::CodesetUtil.from_utf8(c, encoding) } + # csv lines + items.each do |homework| + csv << [homework.user.id,Redmine::CodesetUtil.from_utf8(homework.user.lastname.to_s + homework.user.firstname.to_s, encoding),Redmine::CodesetUtil.from_utf8(homework.user.login, encoding), + Redmine::CodesetUtil.from_utf8(homework.user.user_extensions.student_id, encoding),Redmine::CodesetUtil.from_utf8(homework.user.mail, encoding),Redmine::CodesetUtil.from_utf8(homework.name, encoding), + Redmine::CodesetUtil.from_utf8((homework.t_score.nil? || (homework.t_score && homework.t_score.to_i == 0)) ? l(:label_without_score) : format("%.2f",homework.t_score), encoding), + Redmine::CodesetUtil.from_utf8( homework.s_score.nil? ? l(:label_without_score) : format("%.2f",homework.s_score), encoding),Redmine::CodesetUtil.from_utf8(format_time(homework.created_at), encoding)] + end + end + export + end + + def homework_to_xls items + xls_report = StringIO.new + book = Spreadsheet::Workbook.new + sheet1 = book.create_worksheet :name => "homework" + + blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 + sheet1.row(0).default_format = blue + + sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name), + l(:excel_t_score),l(:excel_n_score),l(:excel_commit_time)]) + count_row = 1 + items.each do |homework| + sheet1[count_row,0]=homework.user.id + sheet1[count_row,1] = homework.user.lastname.to_s + homework.user.firstname.to_s + sheet1[count_row,2] = homework.user.login + sheet1[count_row,3] = homework.user.user_extensions.student_id + sheet1[count_row,4] = homework.user.mail + sheet1[count_row,5] = homework.name + sheet1[count_row,6] =(homework.t_score.nil? || (homework.t_score && homework.t_score.to_i == 0)) ? l(:label_without_score) : format("%.2f",homework.t_score) + sheet1[count_row,7] = homework.s_score.nil? ? l(:label_without_score) : format("%.2f",homework.s_score) + sheet1[count_row,8] = format_time(homework.created_at) + count_row += 1 + end + + book.write xls_report + xls_report.string + end end diff --git a/app/views/bids/_homework_list.html.erb b/app/views/bids/_homework_list.html.erb index 202a2ee91..6572ee2c9 100644 --- a/app/views/bids/_homework_list.html.erb +++ b/app/views/bids/_homework_list.html.erb @@ -59,7 +59,7 @@ :locals => {:homeworks => @homework_list, :homework_count => @obj_count, :remote => false, - :is_student_batch_homework => @is_student_batch_homework}%> + :not_batch_homework => @not_batch_homework,:is_student_batch_homework => @is_student_batch_homework}%>
diff --git a/app/views/homework_attach/_homeworks_list.html.erb b/app/views/homework_attach/_homeworks_list.html.erb index 6ada00bb9..9c960d8b8 100644 --- a/app/views/homework_attach/_homeworks_list.html.erb +++ b/app/views/homework_attach/_homeworks_list.html.erb @@ -1,7 +1,9 @@ <% is_teacher = is_course_teacher(User.current,@bid.courses.first) %> <% is_my_homework ||= false %> <% is_student_batch_homework ||= false %> - +<% is_batch_homeworks ||= false %> +<% not_batch_homework ||= false %> +<% is_all_homeworks ||= false %> <% unless is_my_homework || is_student_batch_homework %>
@@ -9,7 +11,10 @@ ( <%= homework_count%> ) - + <%= link_to l(:label_export_excel), get_batch_homeworks_homework_attach_index_path(:bid_id => @bid.id,:format => 'xls'),:class=>'xls' if is_batch_homeworks%> + <%= link_to l(:label_export_excel), get_not_batch_homework_homework_attach_index_path(:bid_id => @bid.id,:format => 'xls'),:class=>'xls' if not_batch_homework%> + <%= link_to l(:label_export_excel), get_homeworks_homework_attach_index_path(:bid_id => @bid.id,:format => 'xls'),:class=>'xls' if is_all_homeworks%> + 按  <%= link_to l(:label_anonymous_comments), sort_homework_path(@bid, 's_socre', @direction), {:remote => true}%> @@ -63,10 +68,4 @@ <%= anonymous_comment_notice(@bid, @bid.courses.first) %> - <% other_formats_links do |f| %> - <%= f.link_to 'CSV', :url => params %> - <% end %> - <% end %> diff --git a/app/views/homework_attach/get_batch_homeworks.js.erb b/app/views/homework_attach/get_batch_homeworks.js.erb index 8ca588aab..249e52164 100644 --- a/app/views/homework_attach/get_batch_homeworks.js.erb +++ b/app/views/homework_attach/get_batch_homeworks.js.erb @@ -1,4 +1,4 @@ $('#tbc_01').html('<%= escape_javascript(render(:partial => 'homeworks_list', - :locals => {:homeworks => @homework_list, :homework_count => @obj_count, :bid => @bid, :remote => true} )) %>'); + :locals => {:homeworks => @homework_list, :homework_count => @obj_count, :bid => @bid, :remote => true,:is_batch_homeworks => @is_batch_homeworks} )) %>'); for(var i=1;i<=4;i++){$("#tb_"+i).removeClass().addClass("normaltab");} $("#tb_2").removeClass().addClass("hovertab"); \ No newline at end of file diff --git a/app/views/homework_attach/get_homeworks.js.erb b/app/views/homework_attach/get_homeworks.js.erb index 9293af807..06a22924a 100644 --- a/app/views/homework_attach/get_homeworks.js.erb +++ b/app/views/homework_attach/get_homeworks.js.erb @@ -1,5 +1,5 @@ $('#tbc_01').html('<%= escape_javascript(render(:partial => 'homeworks_list', - :locals => {:homeworks => @homework_list, :homework_count => @obj_count, :bid => @bid, :remote => true} )) %>'); + :locals => {:homeworks => @homework_list, :homework_count => @obj_count, :bid => @bid, :remote => true,:is_all_homeworks => @is_all_homeworks} )) %>'); for(var i=1;i<=4;i++){$("#tb_"+i).removeClass().addClass("normaltab");} $("#tb_3").removeClass().addClass("hovertab"); diff --git a/app/views/homework_attach/get_not_batch_homework.js.erb b/app/views/homework_attach/get_not_batch_homework.js.erb index 1f8214821..314853d13 100644 --- a/app/views/homework_attach/get_not_batch_homework.js.erb +++ b/app/views/homework_attach/get_not_batch_homework.js.erb @@ -1,4 +1,4 @@ $('#tbc_01').html('<%= escape_javascript(render(:partial => 'homeworks_list', - :locals => {:homeworks => @homework_list, :homework_count => @obj_count, :bid => @bid, :remote => true} )) %>'); + :locals => {:homeworks => @homework_list, :homework_count => @obj_count, :bid => @bid, :remote => true,:not_batch_homework => @not_batch_homework} )) %>'); for(var i=1;i<=4;i++){$("#tb_"+i).removeClass().addClass("normaltab");} $("#tb_1").removeClass().addClass("hovertab"); \ No newline at end of file diff --git a/config/initializers/20-mime_types.rb b/config/initializers/20-mime_types.rb index cfd35a3e9..d84c2472d 100644 --- a/config/initializers/20-mime_types.rb +++ b/config/initializers/20-mime_types.rb @@ -1,4 +1,5 @@ # Add new mime types for use in respond_to blocks: Mime::SET << Mime::CSV unless Mime::SET.include?(Mime::CSV) +Mime::Type.register "text/excel", :xls diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 0ff27dad2..0620a8355 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -2090,7 +2090,17 @@ zh: label_contest_delete: 删除竞赛 label_noawards_current: 暂未评奖 - + excel_user_id: 学生id + excel_user_name: 用户名 + excel_nickname: 昵称 + excel_student_id: 学号 + excel_mail: 电子邮箱 + excel_homework_name: 作品名 + excel_t_score: 教师评分 + excel_n_score: 匿名评分 + excel_commit_time: 提交时间 + label_export_excel: 导出Excel + label_softapplication: 应用软件 label_attending_contest: 参加竞赛 label_new_attendingcontest_work: 新建参赛作品 diff --git a/public/images/icon_excel.gif b/public/images/icon_excel.gif new file mode 100644 index 0000000000000000000000000000000000000000..d2e309ef5f53b6ef16f08ce68b61038dd37271e9 GIT binary patch literal 1072 zcmZ?wbhEHb6k`xz_|5#E|g^>lwmEFV<(yGD3$LdQ|KaF;3`)HL~ioM?(#)$3MKCHg|702 zZVE;2iX|ROrJhE0VaE00CLk1H+7MyU6m8WUYuy4wadxc<_H79cZHZ1D$u6BK?%nBL zy;)v8nf?>=f+rP*OfE{B-ZtawY_0yU*%xK;) zqjl4)j;(WhwlC=2v2ea~8MeE@>+UIi|OA^@O^0Q|i`EZrU)tZS$=5&9j#r+r04{ z(4s?I&L7x*>F~}=NA_Ji`RMKQ>_yFOTV`!Kx9{E8k8i(xs9imQAylDh-Q?%*U%mhO zQ6|HtcGs%z_U>+GroO(STDMd1a`2^=l^3T|$C+Nj_d&t*BGctZbNhLt)j5hsgM zRb<(Ji%1%~cFi+pJYnNm;=x1yBEV?|KH!C3+vr`B94@f6hxVVT~-yMeWBl7>=Fz|1Qrr>xkX&#q@EbRd9- zU-`!mMa4|v2ge&{J}^A2#N1&jJHh7AmogE}6HE&gP8B6{Ok{DYOL1cDnyl`f_mD3o zfQ5OntFRi6MaZk*rEW=8GC7l$sGbg97{+B$V8GwY)*w>)@sX;4szLK1i3x=Q-Tjsp XxA Date: Tue, 30 Dec 2014 14:33:46 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E3=80=8A=E6=9F=A5?= =?UTF-8?q?=E6=89=BE=E5=AD=A6=E7=94=9F=E4=BF=A1=E6=81=AF=E3=80=8Bbug=20Sig?= =?UTF-8?q?ned-off-by:=20alan=20<547533434@qq.com>?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...1230062844_create_pro_for_search_member.rb | 110 ++++++++++++++++++ db/schema.rb | 2 +- 2 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 db/migrate/20141230062844_create_pro_for_search_member.rb diff --git a/db/migrate/20141230062844_create_pro_for_search_member.rb b/db/migrate/20141230062844_create_pro_for_search_member.rb new file mode 100644 index 000000000..403e9d05f --- /dev/null +++ b/db/migrate/20141230062844_create_pro_for_search_member.rb @@ -0,0 +1,110 @@ +class CreateProForSearchMember < ActiveRecord::Migration + def up + sql_delete = ("DROP PROCEDURE IF EXISTS `member_score`;") + sql = (" + CREATE PROCEDURE `member_score`(IN courseid INT, IN groupid INT,IN start_from INT, IN nums INT, IN sort_by VARCHAR(10)) +BEGIN + + + + CREATE TEMPORARY TABLE IF NOT EXISTS mems ( + id INT , + user_id INT, + course_id INT, + created_on DATETIME, + course_group_id INT, + score FLOAT DEFAULT 0 + ); + TRUNCATE TABLE mems; + + CREATE TEMPORARY TABLE IF NOT EXISTS mem_home ( + id INT, + user_id INT, + course_id INT, + created_on DATETIME, + course_group_id INT, + home_id INT, + score FLOAT DEFAULT 0 + ); + TRUNCATE TABLE mem_home; + + CREATE TEMPORARY TABLE IF NOT EXISTS t_scores ( + + home_id INT, + score FLOAT + ); + TRUNCATE TABLE t_scores; + + CREATE TEMPORARY TABLE IF NOT EXISTS s_scores ( + + home_id INT, + score FLOAT + ); + TRUNCATE TABLE s_scores; + + CREATE TEMPORARY TABLE IF NOT EXISTS scores ( + + user_id INT, + score FLOAT + ); + TRUNCATE TABLE scores; + + + + INSERT INTO mems (id, user_id, course_id, created_on, course_group_id) + (SELECT members.id, members.user_id, members.course_id, members.created_on, members.course_group_id + FROM members,students_for_courses WHERE members.course_id = courseid + AND members.course_id = students_for_courses.course_id AND members.user_id =students_for_courses.student_id); + + INSERT INTO mem_home (id, user_id, course_id, created_on, course_group_id,home_id) + (SELECT members.id, members.user_id, members.course_id, members.created_on, members.course_group_id, homework_attaches.id + FROM members, homework_attaches WHERE course_id = courseid + AND members.user_id = homework_attaches.user_id AND members.user_id IN (SELECT student_id FROM students_for_courses WHERE course_id = courseid) + AND homework_attaches.bid_id IN (SELECT bid_id FROM homework_for_courses WHERE course_id = courseid )); + + INSERT INTO t_scores (home_id, score) (SELECT rateable_id,AVG(seems_rateable_rates.stars) + FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id IN (SELECT mem_home.home_id FROM mem_home) + AND is_teacher_score = 1 + GROUP BY rateable_id); + + INSERT INTO s_scores (home_id, score) (SELECT rateable_id,AVG(seems_rateable_rates.stars) + FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id IN (SELECT mem_home.home_id FROM mem_home) + AND is_teacher_score = 0 + GROUP BY rateable_id) ; + + UPDATE mem_home, t_scores SET mem_home.score = t_scores.score WHERE mem_home.home_id = t_scores.home_id ; + + UPDATE mem_home, s_scores SET mem_home.score = s_scores.score WHERE mem_home.home_id = s_scores.home_id AND mem_home.score = 0; + + INSERT INTO scores (user_id, score) (SELECT user_id, SUM(score) FROM mem_home GROUP BY user_id); + UPDATE mems, scores SET mems.score = scores.score WHERE mems.user_id = scores.user_id; + IF sort_by = '' OR sort_by = 'desc' THEN + IF groupid <> 0 THEN + SELECT * FROM mems WHERE course_group_id = groupid ORDER BY score DESC; + ELSE + IF nums <> 0 THEN + SELECT * FROM mems ORDER BY score DESC LIMIT start_from, nums; + ELSE + SELECT * FROM mems ORDER BY score DESC; + end IF; + END if; + ELSE + IF groupid <> 0 THEN + SELECT * FROM mems WHERE course_group_id = groupid ORDER BY score ASC ; + ELSE + IF nums <> 0 THEN + SELECT * FROM mems ORDER BY score ASC LIMIT start_from, nums; + ELSE + SELECT * FROM mems ORDER BY score ASC; + end IF; + END IF; + END IF; + END; +") + execute(sql_delete) + execute(sql) + end + + def down + end +end diff --git a/db/schema.rb b/db/schema.rb index 6ab3c5657..eb84e19e6 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20141230034253) do +ActiveRecord::Schema.define(:version => 20141230062844) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false From 305cbae0089eabb11afc977d1a93629b8056dea4 Mon Sep 17 00:00:00 2001 From: = Date: Tue, 30 Dec 2014 14:35:35 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E7=BB=B4=E6=8A=A4=E6=B5=AE=E5=8A=A8?= =?UTF-8?q?=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/_base_ad.html.erb | 64 ++++++++++++++++++++++++++++ app/views/layouts/base.html.erb | 1 + public/images/f_notice.jpg | Bin 0 -> 22865 bytes 3 files changed, 65 insertions(+) create mode 100644 app/views/layouts/_base_ad.html.erb create mode 100644 public/images/f_notice.jpg diff --git a/app/views/layouts/_base_ad.html.erb b/app/views/layouts/_base_ad.html.erb new file mode 100644 index 000000000..fcb560239 --- /dev/null +++ b/app/views/layouts/_base_ad.html.erb @@ -0,0 +1,64 @@ + + + + +浮动倒计时公告 + + + + +
+
+ + 00: + 00: + 00 +
+
+ + + + + + diff --git a/app/views/layouts/base.html.erb b/app/views/layouts/base.html.erb index 92bc93c3e..498d4bed1 100644 --- a/app/views/layouts/base.html.erb +++ b/app/views/layouts/base.html.erb @@ -22,6 +22,7 @@
<%=render :partial => 'layouts/base_header'%> +<%= render :partial => 'layouts/base_ad' %>
<%= render_flash_messages %> diff --git a/public/images/f_notice.jpg b/public/images/f_notice.jpg new file mode 100644 index 0000000000000000000000000000000000000000..38cf0a3e0666ec86ebddc4e17b84d530fe299c68 GIT binary patch literal 22865 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 E05fy68UO$Q literal 0 HcmV?d00001