diff --git a/Gemfile b/Gemfile index 5a26ed6e0..eaaff1d01 100644 --- a/Gemfile +++ b/Gemfile @@ -27,6 +27,7 @@ gem 'spreadsheet' gem 'ruby-ole' gem 'rails_kindeditor',path:'lib/rails_kindeditor' #gem "rmagick", ">= 2.0.0" +gem 'binding_of_caller' group :development do gem 'grape-swagger' diff --git a/app/api/mobile/apis/auth.rb b/app/api/mobile/apis/auth.rb index 9e4cb1bc6..9f89d56dc 100644 --- a/app/api/mobile/apis/auth.rb +++ b/app/api/mobile/apis/auth.rb @@ -26,7 +26,8 @@ module Mobile present :data, {token: key.access_token, user: api_user}, using: Entities::Auth present :status, 0 else - raise "无效的用户名或密码" + present :message, "无效的用户名或密码" + present :status,1 end end diff --git a/app/api/mobile/apis/comments.rb b/app/api/mobile/apis/comments.rb index 86132a93a..7fa676161 100644 --- a/app/api/mobile/apis/comments.rb +++ b/app/api/mobile/apis/comments.rb @@ -113,6 +113,20 @@ module Mobile present :status, 0 end + desc '通知评论列表' + params do + requires :token, type: String + requires :notice_id,type:Integer,desc:'通知id' + optional :page,type:Integer,desc:'页码' + end + get ':notice_id/notice_comments' do + cs = CommentService.new + comments = cs.notice_comments params,current_user + present :data, comments, with: Mobile::Entities::Comment + present :status, 0 + end + + end end end diff --git a/app/api/mobile/apis/courses.rb b/app/api/mobile/apis/courses.rb index 73d1e357c..076e0b1c7 100644 --- a/app/api/mobile/apis/courses.rb +++ b/app/api/mobile/apis/courses.rb @@ -3,6 +3,9 @@ module Mobile module Apis class Courses < Grape::API resource :courses do + def self.get_service + CoursesService.new + end desc "获取所有课程" params do optional :school_id, type: Integer, desc: '传入学校id,返回该学校课程列表' @@ -247,7 +250,7 @@ module Mobile end get "course_dynamic/:id" do cs = CoursesService.new - count = cs.course_dynamic(params,current_user) + count = cs.all_course_dynamics(params,current_user) present :data, count, with: Mobile::Entities::CourseDynamic present :status, 0 end @@ -311,6 +314,83 @@ module Mobile present :data,news,with:Mobile::Entities::News present :status,0 end + + desc '总成绩 or 活跃度列表' + params do + requires :token,type:String + requires :course_id,type:Integer,desc:'课程id' + optional :page,type:Integer,desc:'页码' + optional :type,type:Integer,desc:'0是活跃度,1是成绩' + end + get ':course_id/students_score_list' do + cs = CoursesService.new + news = cs.students_score_list params,current_user + present :data,news[:user_list],with:Mobile::Entities::User + present :maxSize,news[:max_size] + present :status,0 + end + + desc '课程某次作业提交列表 并显示成绩' + params do + requires :token,type:String + requires :course_id,type:Integer,desc:'课程id' + requires :homework_id,type:Integer,desc:'作业id' + optional :page,type:Integer,desc:'页码' + end + get ':course_id/student_works_list' do + cs = CoursesService.new + student_works = cs.student_work_list params,current_user + present :data,student_works,with:Mobile::Entities::StudentWork + present :status,0 + end + + desc '讨论区信息' + params do + requires :token,type:String + requires :course_id,type:Integer,desc:'课程id' + optional :page,type:Integer,desc:'页码' + end + get ':course_id/board_message_list' do + cs = CoursesService.new + board_messages_list = cs.board_message_list params,current_user + present :data,board_messages_list.all,with:Mobile::Entities::Message + present :status,0 + end + + desc '讨论区某主题的回复列表' + params do + requires :token,type:String + requires :board_id,type:Integer,desc:'讨论区id' + requires :msg_id,type:Integer,desc:'讨论主题id' + optional :page,type:Integer,desc:'页码' + end + get ':board_id/board_message_reply_list' do + cs = Courses.get_service + board_messages_list = cs.board_message_reply_list params,current_user + present :data,board_messages_list.all,with:Mobile::Entities::Message + present :status,0 + end + + desc '讨论区回复' + params do + requires :token,type:String + requires :board_id,type:Integer,desc:'讨论区id' + requires :parent_id,type:Integer,desc:'本回复父id' + requires :subject,type:String,desc:'本回复主题' + requires :content,type:String,desc:'本回复内容' + requires :root_id,type:Integer,desc:'本回复根id' + requires :quote,type:String,desc:'本回复引用内容' + end + post ':board_id/board_message_reply' do + cs = Courses.get_service + board_messages = cs.board_message_reply params,current_user + present :data,board_messages,with:Mobile::Entities::Message + present :status,0 + end + + + + end end end diff --git a/app/api/mobile/apis/homeworks.rb b/app/api/mobile/apis/homeworks.rb index 5bf454e32..e9efcb1fa 100644 --- a/app/api/mobile/apis/homeworks.rb +++ b/app/api/mobile/apis/homeworks.rb @@ -31,33 +31,33 @@ module Mobile present :status, 0 end - desc "启动匿评" - params do - requires :token, type: String - end - post ':id/start_anonymous_comment' do - statue = Homeworks.get_service.start_anonymous_comment params,current_user.nil? ? User.find(2):current_user - messages = "" - case statue - when 1 - messages = "启动成功" - when 2 - messages = "启动失败,作业总数大于等于2份时才能启动匿评" - when 3 - messages = "已开启匿评,请务重复开启" - end - present :data,messages - present :status, statue - end - - desc "关闭匿评" - params do - requires :token, type: String - end - post ':id/stop_anonymous_comment' do - Homeworks.get_service.stop_anonymous_comment params,current_user.nil? ? User.find(2):current_user - present :status, 0 - end + # desc "启动匿评" + # params do + # requires :token, type: String + # end + # post ':id/start_anonymous_comment' do + # statue = Homeworks.get_service.start_anonymous_comment params,current_user.nil? ? User.find(2):current_user + # messages = "" + # case statue + # when 1 + # messages = "启动成功" + # when 2 + # messages = "启动失败,作业总数大于等于2份时才能启动匿评" + # when 3 + # messages = "已开启匿评,请务重复开启" + # end + # present :data,messages + # present :status, statue + # end + # + # desc "关闭匿评" + # params do + # requires :token, type: String + # end + # post ':id/stop_anonymous_comment' do + # Homeworks.get_service.stop_anonymous_comment params,current_user.nil? ? User.find(2):current_user + # present :status, 0 + # end desc "匿评作品详情" params do @@ -111,6 +111,45 @@ module Mobile present :status, 0 end + desc '开启匿评' + params do + requires :token,type:String + requires :course_id,type:Integer,desc:'课程id' + requires :homework_id,type:Integer,desc:'作业id' + end + post ':homework_id/start_anonymous_comment' do + hs = Homeworks.get_service + status = hs.start_anonymous_comment params,current_user + messages = "" + case status[:status] + when 1 + messages = "启动成功" + when 2 + messages = "启动失败,作业总数大于等于2份时才能启动匿评" + when 3 + messages = "已开启匿评,请务重复开启" + when 4 + messages = "没有开启匿评的权限" + when 5 + messages = "截止日期之前不可启动匿评" + end + present :data,messages + present :status,0 + end + + desc '关闭匿评' + params do + requires :token,type:String + requires :course_id,type:Integer,desc:'课程id' + requires :homework_id,type:Integer,desc:'作业id' + end + post ':homework_id/stop_anonymous_comment' do + hs = Homeworks.get_service + hs.stop_anonymous_comment params,current_user + message = "成功关闭" + present :data, message + present :status,0 + end end end diff --git a/app/api/mobile/entities/attachment.rb b/app/api/mobile/entities/attachment.rb index 080b24558..bb67b6d28 100644 --- a/app/api/mobile/entities/attachment.rb +++ b/app/api/mobile/entities/attachment.rb @@ -1,17 +1,23 @@ module Mobile module Entities class Attachment < Grape::Entity + include Redmine::I18n def self.attachment_expose(field) expose field do |f,opt| if f.is_a?(Hash) && f.key?(field) f[field] elsif f.is_a?(::Attachment) if f.respond_to?(field) - f.send(field) + if field == :created_on + format_time(f.send(field)) + else + f.send(field) + end else - #case field - # when "" - #end + case field + when :file_dir + "attachments/download/" << f.send(:id).to_s << '/' + end end end end @@ -21,6 +27,8 @@ module Mobile attachment_expose :description attachment_expose :downloads attachment_expose :quotes + attachment_expose :created_on + attachment_expose :file_dir end end end \ No newline at end of file diff --git a/app/api/mobile/entities/course_dynamic.rb b/app/api/mobile/entities/course_dynamic.rb index b6e4630e4..fe31668ff 100644 --- a/app/api/mobile/entities/course_dynamic.rb +++ b/app/api/mobile/entities/course_dynamic.rb @@ -6,6 +6,38 @@ module Mobile expose field do |c,opt| if field == :update_time (format_time(c[field]) if (c.is_a?(Hash) && c.key?(field))) + elsif field == :news_count + obj = nil + c[:dynamics].each do |d| + if d[:type] == 1 + obj = d[:count] + end + end + obj + elsif field == :document_count + obj = nil + c[:dynamics].each do |d| + if d[:type] == 3 + obj = d[:count] + end + end + obj + elsif field == :topic_count + obj = nil + c[:dynamics].each do |d| + if d[:type] == 2 + obj = d[:count] + end + end + obj + elsif field == :homework_count + obj = nil + c[:dynamics].each do |d| + if d[:type] == 4 + obj = d[:count] + end + end + obj else c[field] if (c.is_a?(Hash) && c.key?(field)) end @@ -21,6 +53,74 @@ module Mobile course_dynamic_expose :course_img_url course_dynamic_expose :message course_dynamic_expose :update_time + course_dynamic_expose :count + course_dynamic_expose :news_count + course_dynamic_expose :document_count + course_dynamic_expose :topic_count + course_dynamic_expose :homework_count + course_dynamic_expose :course_student_num + course_dynamic_expose :time_from_now + course_dynamic_expose :current_user_is_member + course_dynamic_expose :current_user_is_teacher + + expose :documents,using:Mobile::Entities::Attachment do |f,opt| + obj = nil + f[:dynamics].each do |d| + if d[:type] == 3 + obj = d[:documents] + end + end + obj + end + expose :topics,using:Mobile::Entities::Message do |f,opt| + obj = nil + f[:dynamics].each do |d| + if d[:type] == 2 + obj = d[:topics] + end + end + obj + end + expose :homeworks,using:Mobile::Entities::Homework do |f,opt| + obj = nil + f[:dynamics].each do |d| + if d[:type] == 4 + obj = d[:homeworks] + end + end + obj + end + + expose :news,using:Mobile::Entities::News do |f,opt| + obj = nil + f[:dynamics].each do |d| + if d[:type] == 1 + obj = d[:news] + end + end + obj + end + + expose :better_students,using:Mobile::Entities::User do |f,opt| + obj = nil + f[:dynamics].each do |d| + if d[:type] == 6 + obj = d[:better_students] + end + end + obj + end + + expose :active_students,using:Mobile::Entities::User do |f,opt| + obj = nil + f[:dynamics].each do |d| + if d[:type] == 7 + obj = d[:active_students] + end + end + obj + end + end end end \ No newline at end of file diff --git a/app/api/mobile/entities/homework.rb b/app/api/mobile/entities/homework.rb index ee623d9ff..db3e44119 100644 --- a/app/api/mobile/entities/homework.rb +++ b/app/api/mobile/entities/homework.rb @@ -1,7 +1,10 @@ +# 这个模块由于作业模块的改变,里边的注释以及属性不可信 module Mobile module Entities class Homework < Grape::Entity include Redmine::I18n + include ApplicationHelper + include ApiHelper def self.homework_expose(field) expose field do |f,opt| if f.is_a?(Hash) && f.key?(field) @@ -14,7 +17,27 @@ module Mobile if f.respond_to?(field) f.send(field) else - + case field + when :homework_name + f.send(:name) + when :homework_notsubmit_num + f.course.members.count - f.student_works.count + when :homework_submit_num + f.student_works.count + when :homework_status_student + get_homework_status f + when :homework_times + f.course.homework_commons.index(f) + 1 + when :homework_status_teacher + homework_status_desc f + when :student_evaluation_part + get_evaluation_part f ,3 + when :ta_evaluation_part + get_evaluation_part f , 2 + when :homework_anony_type + val = f.homework_type == 1 && !f.homework_detail_manual.nil? + val + end end end end @@ -60,6 +83,17 @@ module Mobile f[:homework_for_anonymous_comments] if f.is_a?(Hash) && f.key?(:homework_for_anonymous_comments) end + homework_expose :homework_submit_num + homework_expose :homework_notsubmit_num + + homework_expose :homework_status_student #学生看到的作业的状态 + homework_expose :homework_status_teacher #老师看到的状态 + + homework_expose :student_evaluation_part #学生匿评比率 + homework_expose :ta_evaluation_part #教辅评价比率 + + homework_expose :homework_anony_type #是否是匿评作业 + end end end \ No newline at end of file diff --git a/app/api/mobile/entities/message.rb b/app/api/mobile/entities/message.rb new file mode 100644 index 000000000..6a2ca1fb0 --- /dev/null +++ b/app/api/mobile/entities/message.rb @@ -0,0 +1,46 @@ +module Mobile + module Entities + class Message < Grape::Entity + include ApplicationHelper + include ApiHelper + def self.message_expose(f) + expose f do |u,opt| + if u.is_a?(Hash) && u.key?(f) + u[f] + elsif u.is_a?(::Message) + if u.respond_to?(f) + if f == :created_on + format_time( u.send(f)) + else + u.send(f) + end + else + # case f + # when :xx + # # + # end + end + end + + end + end + + expose :user, using: Mobile::Entities::User do |c, opt| + if c.is_a?(::Message) + c.author + end + end + message_expose :board_id + message_expose :subject + message_expose :content + message_expose :replies_count + message_expose :created_on + message_expose :id + expose :message_children,using:Mobile::Entities::Message do |c,opt| + if c.is_a? (::Message) + c.children + end + end + end + end +end \ No newline at end of file diff --git a/app/api/mobile/entities/news.rb b/app/api/mobile/entities/news.rb index f189771e3..36893d16f 100644 --- a/app/api/mobile/entities/news.rb +++ b/app/api/mobile/entities/news.rb @@ -6,6 +6,12 @@ module Mobile expose field do |f,opt| if f.is_a?(Hash) && f.key?(field) f[field] + elsif f.is_a?(::News) + if field == :created_on + format_time(f.send(field)) if f.respond_to?(field) + else + f.send(field) if f.respond_to?(field) + end elsif f.is_a?(Hash) && !f.key?(field) n = f[:news] comments = f[:comments] @@ -26,13 +32,20 @@ module Mobile news_expose :title expose :author,using: Mobile::Entities::User do |f, opt| - n = f[:news] - n.author if n.respond_to?(:author) + obj = nil + if f.is_a?(::News) && f.respond_to?(:author) + obj = f.send(:author) + elsif f.is_a?(Hash) && f.key?(:author) + obj = f[:author] + end + obj end #作者id news_expose :author_id #作者名 news_expose :author_name + #作者头像url + news_expose :author_img_url #新闻内容 news_expose :description #发布时间 @@ -43,6 +56,8 @@ module Mobile expose :comments, using: Mobile::Entities::Comment do |f, opt| if f.is_a?(Hash) && f.key?(:comments) f[:comments] + elsif f.is_a?(::News) && f.respond_to?(:comments) + f.send(:comments) end end diff --git a/app/api/mobile/entities/student_work.rb b/app/api/mobile/entities/student_work.rb new file mode 100644 index 000000000..6cf68c875 --- /dev/null +++ b/app/api/mobile/entities/student_work.rb @@ -0,0 +1,45 @@ +module Mobile + module Entities + class StudentWork < Grape::Entity + include ApplicationHelper + include ApiHelper + def self.student_work_expose(f) + expose f do |u,opt| + if u.is_a?(Hash) && u.key?(f) + u[f] + elsif u.is_a?(::StudentWork) + if u.respond_to?(f) + if f == :created_at + format_time(u.send(:created_at)) + else + u.send(f) + end + + else + case f + when :student_id + u.user.user_extensions.student_id + end + end + end + + end + end + + expose :user, using: Mobile::Entities::User do |c, opt| + if c.is_a?(::StudentWork) + c.user + end + end + student_work_expose :student_id + student_work_expose :id + student_work_expose :name + student_work_expose :description + student_work_expose :final_score + student_work_expose :teacher_score + student_work_expose :student_score + student_work_expose :teacher_asistant_score + student_work_expose :created_at + end + end +end \ No newline at end of file diff --git a/app/api/mobile/entities/user.rb b/app/api/mobile/entities/user.rb index aee687dc9..16048c61a 100644 --- a/app/api/mobile/entities/user.rb +++ b/app/api/mobile/entities/user.rb @@ -22,6 +22,8 @@ module Mobile get_user_location u unless u.user_extensions.nil? when :brief_introduction u.nil? || u.user_extensions.nil? ? "" : u.user_extensions.brief_introduction + when :student_num + u.nil? || u.user_extensions.nil? ? "" : u.user_extensions.student_id end end end @@ -47,6 +49,12 @@ module Mobile user_expose :location #签名 user_expose :brief_introduction + #总成绩 + user_expose :score + #学号 + user_expose :student_num + # 活跃值 + user_expose :active_count end end diff --git a/app/controllers/activity_notifys_controller.rb b/app/controllers/activity_notifys_controller.rb index 01e4260ea..06f3ff86d 100644 --- a/app/controllers/activity_notifys_controller.rb +++ b/app/controllers/activity_notifys_controller.rb @@ -6,6 +6,7 @@ class ActivityNotifysController < ApplicationController # accept_rss_auth :index, :show helper :activities + helper :attachments def index query = nil if @course @@ -21,6 +22,9 @@ class ActivityNotifysController < ApplicationController list = query.order('is_read,id desc').limit(limit).offset(@obj_pages.offset).all(); events=[]; for item in list + if item.activity.nil? + next + end event = item.activity; event.set_notify_id(item.id) event.set_notify_is_read(item.is_read) diff --git a/app/controllers/admin_controller.rb b/app/controllers/admin_controller.rb index 8e23041c6..086ecfb7f 100644 --- a/app/controllers/admin_controller.rb +++ b/app/controllers/admin_controller.rb @@ -34,13 +34,21 @@ class AdminController < ApplicationController def projects @status = params[:status] || 1 - scope = Project.status(@status).order('lft') + scope = Project.status(@status).order('id asc') scope = scope.like(params[:name]) if params[:name].present? @projects = scope.where(project_type: Project::ProjectType_project).all render :action => "projects", :layout => false if request.xhr? end + def courses + @name = params[:name] + @courses = Course.like(@name) + respond_to do |format| + format.html + end + end + def users sort_init 'login', 'asc' sort_update %w(login firstname lastname mail admin created_on last_login_on) diff --git a/app/controllers/attachments_controller.rb b/app/controllers/attachments_controller.rb index 09ca29178..ee953e913 100644 --- a/app/controllers/attachments_controller.rb +++ b/app/controllers/attachments_controller.rb @@ -388,7 +388,7 @@ class AttachmentsController < ApplicationController end rescue NoMethodError @save_flag = false - @save_message = [] << l(:label_course_empty_select) + @save_message = [] << l(:label_project_empty_select) respond_to do |format| format.js end @@ -514,6 +514,8 @@ private end def has_login - render_403 unless User.current.logged? + unless @attachment && @attachment.container_type == "PhoneAppVersion" + render_403 unless User.current.logged? + end end end diff --git a/app/controllers/comments_controller.rb b/app/controllers/comments_controller.rb index d226000c0..c10f8bc84 100644 --- a/app/controllers/comments_controller.rb +++ b/app/controllers/comments_controller.rb @@ -34,6 +34,20 @@ class CommentsController < ApplicationController ids = params[:asset_id].split(',') update_kindeditor_assets_owner ids,@comment.id,OwnerTypeHelper::COMMENT end + # ض̬ļ¼add start + if( @comment.id && @news.course ) + if(@news.author_id != User.current.id) + notify = ActivityNotify.new() + notify.activity_container_id = @news.course.id + notify.activity_container_type = 'Course' + notify.activity_id = @comment.id + notify.activity_type = 'Comment' + notify.notify_to = @news.author_id + notify.is_read = 0 + notify.save() + end + end + # ض̬ļ¼add end flash[:notice] = l(:label_comment_added) end diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 3b25438df..a0a61786c 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -298,7 +298,7 @@ class CoursesController < ApplicationController if params[:group_id] && params[:group_id] != "0" @group = CourseGroup.find(params[:group_id]) @results = student_homework_score(@group.id,0, 0,"desc") - @results = paginateHelper @results, 10 + # @results = paginateHelper @results, 10 else page_from = params[:page].nil? ? 0 : (params[:page].to_i - 1) @results = student_homework_score(0,page_from, 10,"desc") @@ -368,12 +368,12 @@ class CoursesController < ApplicationController page = params[:page].nil? ? 0 : (params['page'].to_i - 1) @results = searchmember_by_name(student_homework_score(0,0,0,@score_sort_by), @search_name) @result_count = @results.count - @results = paginateHelper @results, 10 + # @results = paginateHelper @results, 10 else @group = CourseGroup.find(group_id) @results = searchmember_by_name(student_homework_score(group_id, 0, 0,@score_sort_by),@search_name) @result_count = @results.count - @results = paginateHelper @results, 10 + # @results = paginateHelper @results, 10 end else if group_id == '0' @@ -443,26 +443,19 @@ class CoursesController < ApplicationController def create cs = CoursesService.new @course = cs.create_course(params,User.current)[:course] - if @course.new_record? + if @course respond_to do |format| - format.html { render :action => 'new', :layout => 'new_base' } #Added by young - format.api { render_validation_errors(@course) } + flash[:notice] = l(:notice_successful_create) + format.html {redirect_to settings_course_url(@course, :course_type => 1)} + format.api { render :action => 'show', :status => :created, :location => url_for(:controller => 'courses', :action => 'show', :id => @course.id) } end else respond_to do |format| - format.html { - # render :layout => 'base_courses' - flash[:notice] = l(:notice_successful_create) - if params[:continue] - redirect_to new_course_url(attrs, :course => '0') - elsif params[:course_continue] - redirect_to new_course_url(:course => '1') - else - redirect_to settings_course_url(@course, :course_type => 1) - end - } - format.api { render :action => 'show', :status => :created, :location => url_for(:controller => 'courses', :action => 'show', :id => @course.id) } - end + flash[:notice] = l(:notice_create_failed) + # @course = Course.new + format.html { redirect_to new_course_path } #Added by young + format.api { render_validation_errors(@course) } + end end end @@ -532,7 +525,7 @@ class CoursesController < ApplicationController @trackers = Tracker.sorted.all @course = Course.new @course.safe_attributes = params[:course] - month = Time.now.month + # month = Time.now.month render :layout => 'new_base' end @@ -845,7 +838,7 @@ class CoursesController < ApplicationController sql_select = "" if groupid == 0 sql_select = "SELECT members.*,( - SELECT AVG(student_works.final_score) + SELECT SUM(student_works.final_score) FROM student_works,homework_commons WHERE student_works.homework_common_id = homework_commons.id AND homework_commons.course_id = #{@course.id} @@ -857,7 +850,7 @@ class CoursesController < ApplicationController WHERE members.course_id = #{@course.id} ORDER BY score #{score_sort_by}" else sql_select = "SELECT members.*,( - SELECT AVG(student_works.final_score) + SELECT SUM(student_works.final_score) FROM student_works,homework_commons WHERE student_works.homework_common_id = homework_commons.id AND homework_commons.course_id = #{@course.id} diff --git a/app/controllers/files_controller.rb b/app/controllers/files_controller.rb index 0003f7586..19c1214e2 100644 --- a/app/controllers/files_controller.rb +++ b/app/controllers/files_controller.rb @@ -37,7 +37,7 @@ class FilesController < ApplicationController obj.each do |container| @attachments += container.attachments end - @all_attachments = visable_attachemnts(@attachments) + @all_attachments = User.current.admin? ? @attachments : visable_attachemnts(@attachments) @limit = 10 @feedback_count = @all_attachments.count @feedback_pages = Paginator.new @feedback_count, @limit, params['page'] diff --git a/app/controllers/forums_controller.rb b/app/controllers/forums_controller.rb index 253e1d28d..2b44d51de 100644 --- a/app/controllers/forums_controller.rb +++ b/app/controllers/forums_controller.rb @@ -86,7 +86,7 @@ class ForumsController < ApplicationController order(sort_clause). preload(:author, {:last_reply => :author}). all - + @memos flash.now[:error] = "#{l :label_memo_create_fail}: #{@memo.errors.full_messages[0]}" # back_error_page = @memo.parent_id.nil? ? forum_path(@forum) : forum_memo_path(@forum, @memo.parent_id) format.html { render action: :show, layout: 'base_forums' }#, error: "#{l :label_memo_create_fail}: #{@memo.errors.full_messages[0]}" } @@ -122,14 +122,14 @@ class ForumsController < ApplicationController @topic_count = @forum.topics.count @topic_pages = Paginator.new @topic_count, per_page_option, params['page'] @memos = @forum.topics. - reorder("#{Memo.table_name}.sticky DESC"). + # reorder("#{Memo.table_name}.sticky DESC"). includes(:last_reply). limit(@topic_pages.per_page). offset(@topic_pages.offset). order(sort_clause). preload(:author, {:last_reply => :author}). all - + @memos # @offset, @limit = api_offset_and_limit({:limit => 10}) # @forum = Forum.find(params[:id]) # @memos_all = @forum.topics diff --git a/app/controllers/git_usage_controller.rb b/app/controllers/git_usage_controller.rb index 4f9a96d6f..56aaa56f1 100644 --- a/app/controllers/git_usage_controller.rb +++ b/app/controllers/git_usage_controller.rb @@ -1,6 +1,6 @@ #added by baiyu class GitUsageController < ApplicationController - layout "project_base" + layout "new_base" def ch_usage end diff --git a/app/controllers/homework_common_controller.rb b/app/controllers/homework_common_controller.rb index d5e62127d..04a07e9a8 100644 --- a/app/controllers/homework_common_controller.rb +++ b/app/controllers/homework_common_controller.rb @@ -1,6 +1,8 @@ class HomeworkCommonController < ApplicationController + require 'net/http' + require 'json' layout "base_courses" - before_filter :find_course, :only => [:index,:new,:create] + before_filter :find_course, :only => [:index,:new,:create,:next_step] before_filter :find_homework, :only => [:edit,:update,:alert_anonymous_comment,:start_anonymous_comment,:stop_anonymous_comment,:destroy] before_filter :teacher_of_course, :only => [:new, :create, :edit, :update, :destroy, :start_anonymous_comment, :stop_anonymous_comment, :alert_anonymous_comment] before_filter :member_of_course, :only => [:index] @@ -16,20 +18,59 @@ class HomeworkCommonController < ApplicationController end def new + @homework_type = "1" + @homework = HomeworkCommon.new @homework.safe_attributes = params[:homework_common] @homework.late_penalty = 0 @homework.end_time = (Time.now + 3600 * 24).strftime('%Y-%m-%d') @homework.publish_time = Time.now.strftime('%Y-%m-%d') - #匿评作业相关属性 - @homework_detail_manual = HomeworkDetailManual.new - @homework_detail_manual.ta_proportion = 0.6 - @homework_detail_manual.absence_penalty = 0 - @homework_detail_manual.evaluation_num = 3 - @homework_detail_manual.evaluation_start = Time.now.strftime('%Y-%m-%d') - @homework_detail_manual.evaluation_end = (Time.now + 3600 * 24).strftime('%Y-%m-%d') - @homework.homework_detail_manual = @homework_detail_manual + if @homework_type == "1" + #匿评作业相关属性 + @homework_detail_manual = HomeworkDetailManual.new + @homework_detail_manual.ta_proportion = 0.6 + @homework_detail_manual.absence_penalty = 0 + @homework_detail_manual.evaluation_num = 3 + @homework_detail_manual.evaluation_start = Time.now.strftime('%Y-%m-%d') + @homework_detail_manual.evaluation_end = (Time.now + 3600 * 24).strftime('%Y-%m-%d') + @homework.homework_detail_manual = @homework_detail_manual + elsif @homework_type == "2" + #编程作业相关属性 + @homework_detail_programing = HomeworkDetailPrograming.new + @homework.homework_detail_programing = @homework_detail_programing + end + respond_to do |format| + format.html + end + end + + #新建作业下一步 + def next_step + @homework_type = params[:homework_common_type] + + @homework = HomeworkCommon.new + @homework.safe_attributes = params[:homework_common] + @homework.late_penalty = 0 + @homework.end_time = (Time.now + 3600 * 24).strftime('%Y-%m-%d') + @homework.publish_time = Time.now.strftime('%Y-%m-%d') + + if @homework_type == "1" + #匿评作业相关属性 + @homework_detail_manual = HomeworkDetailManual.new + @homework_detail_manual.ta_proportion = 0.6 + @homework_detail_manual.absence_penalty = 0 + @homework_detail_manual.evaluation_num = 3 + @homework_detail_manual.evaluation_start = Time.now.strftime('%Y-%m-%d') + @homework_detail_manual.evaluation_end = (Time.now + 3600 * 24).strftime('%Y-%m-%d') + @homework.homework_detail_manual = @homework_detail_manual + elsif @homework_type == "2" + #编程作业相关属性 + @homework_detail_programing = HomeworkDetailPrograming.new + @homework.homework_detail_programing = @homework_detail_programing + end + + respond_to do |format| format.html end @@ -50,15 +91,57 @@ class HomeworkCommonController < ApplicationController homework.save_attachments(params[:attachments]) render_attachment_warning_if_needed(homework) - #匿评作业相关属性 - homework_detail_manual = HomeworkDetailManual.new - homework_detail_manual.ta_proportion = params[:ta_proportion] || 0.6 - homework_detail_manual.comment_status = 1 - homework_detail_manual.evaluation_start = params[:evaluation_start] - homework_detail_manual.evaluation_end = params[:evaluation_end] - homework_detail_manual.evaluation_num = params[:evaluation_num] - homework_detail_manual.absence_penalty = params[:absence_penalty] - homework.homework_detail_manual = homework_detail_manual + if homework.homework_type == 2 + homework_detail_programing = HomeworkDetailPrograming.new + homework_detail_programing.language = params[:language] + homework_detail_programing.standard_code = params[:standard_code] + homework_detail_programing.ta_proportion = params[:ta_proportion] || 0.6 + question = {title:homework.name,content:homework.description} + question[:input] = [] + question[:output] = [] + if params[:input] && params[:output] + params[:input].each do |k,v| + if params[:output].include? k + homework_test = HomeworkTest.new + homework_test.input = v + homework_test.output = params[:output][k] + homework.homework_tests << homework_test + question[:input] << homework_test.input + question[:output] << homework_test.output + end + end + end + + # uri = URI('http://test.gitlab.trustie.net/api/questions.json') + # req = Net::HTTP::Post.new(uri, initheader = {'Content-Type' =>'application/json'}) + # req.body = question.to_json + # res = Net::HTTP.start(uri.hostname, uri.port) do |http| + # http.request(req) + # end + + uri = URI('http://192.168.80.21:8080/api/questions.json') + body = question.to_json + res = Net::HTTP.new(uri.host, uri.port).start do |client| + request = Net::HTTP::Post.new(uri.path) + request.body = body + request["Content-Type"] = "application/json" + client.request(request) + end + result = JSON.parse(res.body) + homework_detail_programing.question_id = result["id"] if result["status"] && result["status"] == 0 + + homework.homework_detail_programing = homework_detail_programing + else + #匿评作业相关属性 + homework_detail_manual = HomeworkDetailManual.new + homework_detail_manual.ta_proportion = params[:ta_proportion] || 0.6 + homework_detail_manual.comment_status = 1 + homework_detail_manual.evaluation_start = params[:evaluation_start] + homework_detail_manual.evaluation_end = params[:evaluation_end] + homework_detail_manual.evaluation_num = params[:evaluation_num] + homework_detail_manual.absence_penalty = params[:absence_penalty] + homework.homework_detail_manual = homework_detail_manual + end if homework.save respond_to do |format| @@ -90,22 +173,77 @@ class HomeworkCommonController < ApplicationController @homework.description = params[:homework_common][:description] @homework.end_time = params[:homework_common][:end_time] @homework.publish_time = params[:homework_common][:publish_time] - @homework.homework_type = params[:homework_common][:homework_type] - @homework.late_penalty = params[:late_penalty] - @homework.user_id = User.current.id - @homework.course_id = @course.id + @homework.homework_type = params[:homework_common][:homework_type] if params[:homework_common][:homework_type] + unless @homework.late_penalty == params[:late_penalty] + @homework.student_works.where("created_at > '#{@homework.end_time} 23:59:59'").each do |student_work| + student_work.late_penalty = params[:late_penalty] + student_work.save + end + @homework.late_penalty = params[:late_penalty] + end + # @homework.course_id = @course.id #匿评作业相关属性 - @homework_detail_manual.ta_proportion = params[:ta_proportion] || 0.6 - @homework_detail_manual.evaluation_start = params[:evaluation_start] - @homework_detail_manual.evaluation_end = params[:evaluation_end] - @homework_detail_manual.evaluation_num = params[:evaluation_num] - @homework_detail_manual.absence_penalty = params[:absence_penalty] + if @homework.homework_type == 1 && @homework_detail_manual + @homework_detail_manual.ta_proportion = params[:ta_proportion] || 0.6 + @homework_detail_manual.evaluation_start = params[:evaluation_start] + @homework_detail_manual.evaluation_end = params[:evaluation_end] + @homework_detail_manual.evaluation_num = params[:evaluation_num] + unless @homework_detail_manual.absence_penalty == params[:absence_penalty] + if @homework_detail_manual.comment_status == 3 #当前作业处于匿评结束状态,修改缺评扣分才会修改每个作品应扣分的值 + work_ids = "(" + @homework.student_works.map(&:id).join(",") + ")" + @homework.student_works.each do |student_work| + absence_penalty_count = student_work.user.student_works_evaluation_distributions.where("student_work_id IN #{work_ids}").count - student_work.user.student_works_scores.where("student_work_id IN #{work_ids}").count + student_work.absence_penalty = absence_penalty_count > 0 ? absence_penalty_count * @homework_detail_manual.absence_penalty : 0 + student_work.save + end + end + @homework_detail_manual.absence_penalty = params[:absence_penalty] + end + elsif @homework.homework_type == 0 #普通作业,缺评扣分为0分,每个作品的缺评扣分改为0分,防止某些作业在结束匿评之后改为普通作业 + @homework.student_works.where("absence_penalty != 0").each do |student_work| + student_work.late_penalty = 0 + student_work.save + end + @homework_detail_manual.absence_penalty = 0 if @homework_detail_manual + end + + if @homework.homework_type == 2 && @homework_detail_programing #编程作业 + @homework_detail_programing.language = "C++" + @homework_detail_programing.standard_code = params[:standard_code] + @homework_detail_programing.ta_proportion = params[:ta_proportion] || 0.6 + homework_tests = @homework.homework_tests + #需要删除的测试 + ids = homework_tests.map(&:id) - params[:input].keys.map(&:to_i) + ids.each do |id| + homework_test = HomeworkTest.find id + homework_test.destroy if homework_test + end + if params[:input] && params[:output] + params[:input].each do |k,v| + if params[:output].include? k + homework_test = HomeworkTest.find_by_id k + if homework_test #已存在的测试,修改 + homework_test.input = v + homework_test.output = params[:output][k] + else #不存在的测试,增加 + homework_test = HomeworkTest.new + homework_test.input = v + homework_test.output = params[:output][k] + homework_test.homework_common = @homework + end + homework_test.save + end + end + end + end @homework.save_attachments(params[:attachments]) render_attachment_warning_if_needed(@homework) - if @homework.save && @homework_detail_manual.save + if @homework.save + @homework_detail_manual.save if @homework_detail_manual + @homework_detail_programing.save if @homework_detail_programing respond_to do |format| format.html { flash[:notice] = l(:notice_successful_edit) @@ -135,6 +273,7 @@ class HomeworkCommonController < ApplicationController #statue 1:启动成功,2:启动失败,作业总数大于等于2份时才能启动匿评,3:已开启匿评,请务重复开启,4:没有开启匿评的权限 def start_anonymous_comment @statue =4 and return unless User.current.admin? || User.current.allowed_to?(:as_teacher,@course) + @statue = 5 and return if Time.parse(@homework.end_time.to_s).strftime("%Y-%m-%d") >= Time.now.strftime("%Y-%m-%d") if @homework_detail_manual.comment_status == 1 student_works = @homework.student_works if student_works && student_works.size >=2 @@ -161,6 +300,14 @@ class HomeworkCommonController < ApplicationController #关闭匿评 def stop_anonymous_comment @homework_detail_manual.update_column('comment_status', 3) + + work_ids = "(" + @homework.student_works.map(&:id).join(",") + ")" + @homework.student_works.each do |student_work| + absence_penalty_count = student_work.user.student_works_evaluation_distributions.where("student_work_id IN #{work_ids}").count - student_work.user.student_works_scores.where("student_work_id IN #{work_ids}").count + student_work.absence_penalty = absence_penalty_count > 0 ? absence_penalty_count * @homework_detail_manual.absence_penalty : 0 + student_work.save + end + respond_to do |format| format.js end @@ -195,6 +342,7 @@ class HomeworkCommonController < ApplicationController def find_homework @homework = HomeworkCommon.find params[:id] @homework_detail_manual = @homework.homework_detail_manual + @homework_detail_programing = @homework.homework_detail_programing @course = @homework.course rescue render_404 @@ -206,7 +354,7 @@ class HomeworkCommonController < ApplicationController #当前用户是不是课程的成员 def member_of_course - render_403 unless User.current.member_of_course?(@course) || User.current.admin? + render_403 unless @course.is_public || User.current.member_of_course?(@course) || User.current.admin? end def get_assigned_homeworks(student_works, n, index) diff --git a/app/controllers/issue_categories_controller.rb b/app/controllers/issue_categories_controller.rb index fb62821d8..68713aa43 100644 --- a/app/controllers/issue_categories_controller.rb +++ b/app/controllers/issue_categories_controller.rb @@ -16,7 +16,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class IssueCategoriesController < ApplicationController - layout "project_base" + layout "base_projects" menu_item :settings model_object IssueCategory before_filter :find_model_object, :except => [:index, :new, :create] diff --git a/app/controllers/journals_controller.rb b/app/controllers/journals_controller.rb index aa3a7e0ea..6cebfef7a 100644 --- a/app/controllers/journals_controller.rb +++ b/app/controllers/journals_controller.rb @@ -74,6 +74,7 @@ class JournalsController < ApplicationController text = text.to_s.strip.gsub(%r{
((.|\s)*?)
}m, '[...]') @content = "> #{ll(Setting.default_language, :text_user_wrote, user)}\n> " @content << text.gsub(/(\r?\n|\r\n?)/, "\n> ") + "\n\n" + # @content = "
" << @content @id = user.id rescue ActiveRecord::RecordNotFound render_404 diff --git a/app/controllers/my_controller.rb b/app/controllers/my_controller.rb index 69d8bc3a6..103030d51 100644 --- a/app/controllers/my_controller.rb +++ b/app/controllers/my_controller.rb @@ -25,6 +25,7 @@ class MyController < ApplicationController helper :issues helper :users helper :custom_fields + helper :user_score BLOCKS = { 'issuesassignedtome' => :label_assigned_to_me_issues, 'issuesreportedbyme' => :label_reported_issues, @@ -88,6 +89,23 @@ class MyController < ApplicationController end end + def clear_user_avatar_temp + @user = User.current + diskfile = disk_filename('User', @user.id) + diskfile1 = diskfile + 'temp' + File.delete(diskfile1) if File.exist?(diskfile1) + end + def save_user_avatar + @user = User.current + diskfile = disk_filename('User', @user.id) + diskfile1 = diskfile + 'temp' + begin + FileUtils.mv diskfile1, diskfile, force: true if File.exist? diskfile1 + ensure + File.delete(diskfile1) if File.exist?(diskfile1) + end + end + # Edit user's account def account @user = User.current @@ -119,6 +137,8 @@ class MyController < ApplicationController @se.identity = params[:identity].to_i if params[:identity] @se.technical_title = params[:technical_title] if params[:technical_title] @se.student_id = params[:no] if params[:no] + @se.brief_introduction = params[:brief_introduction] + @se.description = params[:description] if @user.save && @se.save # 头像保存 @@ -137,6 +157,7 @@ class MyController < ApplicationController File.delete(diskfile1) if File.exist?(diskfile1) end + render :layout=>'base_users_new' end # Destroys user's account @@ -159,6 +180,8 @@ class MyController < ApplicationController # Manage user's password def password + begin + @act='password' @user = User.current unless @user.change_password_allowed? flash.now[:error] = l(:notice_can_t_change_password) @@ -174,16 +197,20 @@ class MyController < ApplicationController Token.delete_user_all_tokens(@user) logout_user redirect_to signin_url(back_url: my_account_path) + return else - flash.now[:error] = l(:notice_account_wrong_password) + #flash.now[:error] = l(:notice_account_wrong_password) end end rescue Exception => e if e.message == 'wrong password' - flash.now[:error] = l(:notice_account_wrong_password) + # flash.now[:error] = l(:notice_account_wrong_password) else - flash.now[:error] = e.message + # flash.now[:error] = e.message end + flash.now[:error] = l(:notice_account_old_wrong_password) + end + render :template => 'my/account',:layout=>'base_users_new' end # Create a new feeds key diff --git a/app/controllers/news_controller.rb b/app/controllers/news_controller.rb index f71a77ca7..56b4a30fc 100644 --- a/app/controllers/news_controller.rb +++ b/app/controllers/news_controller.rb @@ -141,6 +141,21 @@ class NewsController < ApplicationController ids = params[:asset_id].split(',') update_kindeditor_assets_owner ids,@news.id,OwnerTypeHelper::NEWS end + # ض̬ļ¼add start + teachers = searchTeacherAndAssistant(@course) + for teacher in teachers + if(teacher.user_id != User.current.id) + notify = ActivityNotify.new() + notify.activity_container_id = @course.id + notify.activity_container_type = 'Course' + notify.activity_id = @news.id + notify.activity_type = 'News' + notify.notify_to = teacher.user_id + notify.is_read = 0 + notify.save() + end + end + # ض̬ļ¼add end render_attachment_warning_if_needed(@news) flash[:notice] = l(:notice_successful_create) redirect_to course_news_index_url(@course) diff --git a/app/controllers/organization_controller.rb b/app/controllers/organization_controller.rb index db8295e44..748fc1732 100644 --- a/app/controllers/organization_controller.rb +++ b/app/controllers/organization_controller.rb @@ -1,5 +1,5 @@ class OrganizationController < ApplicationController - layout 'project_base' + # layout 'base_projects' before_filter :require_admin, :except => [:index] def index diff --git a/app/controllers/poll_controller.rb b/app/controllers/poll_controller.rb index d8a9d88c3..758747e02 100644 --- a/app/controllers/poll_controller.rb +++ b/app/controllers/poll_controller.rb @@ -23,7 +23,7 @@ class PollController < ApplicationController def show @poll = Poll.find params[:id] - if @poll.polls_status != 2 && !User.current.allowed_to?(:as_teacher,@course) + if @poll.polls_status != 2 && (!User.current.allowed_to?(:as_teacher,@course) || User.current.admin?) render_403 return end @@ -393,7 +393,7 @@ class PollController < ApplicationController end def is_member_of_course - render_403 unless(@course && User.current.member_of_course?(@course)) + render_403 unless(@course && (User.current.member_of_course?(@course) || User.current.admin?)) end def is_course_teacher diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 6ad450315..2efaf591a 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -361,6 +361,37 @@ class ProjectsController < ApplicationController end end + # dts测试工具 + def dts_dep + render_403 unless User.current.admin? + @dts = Dts.all + end + + # dts云部署 + def yun_dep + render_403 unless User.current.admin? + end + + # 软件知识库 + def soft_knowledge + render_403 unless User.current.admin? + end + + # 在线开发平台 + def online_dev + render_403 unless User.current.admin? + end + + # 软件资源库 + def soft_file + render_403 unless User.current.admin? + end + + # 软件服务 + def soft_service + render_403 unless User.current.admin? + end + #发送邮件邀请新用户 def invite_members_by_mail if User.current.member_of?(@project) || User.current.admin? @@ -438,9 +469,9 @@ class ProjectsController < ApplicationController case params[:role] when '1' @subPage_title = l :label_teacher_list - @members = searchTeacherAndAssistant(@project) + @members = searchTeacherAndAssistant(@project) when '2' - @subPage_title = l :label_student_list + @subPage_title = l :label_student_list @members = searchStudent(@project) else @subPage_title = '' @@ -578,7 +609,7 @@ class ProjectsController < ApplicationController format.api { render_api_ok } end else - render :layout => "project_base" + render :layout => "base_projects" end # hide project in layout @project = nil @@ -586,7 +617,7 @@ class ProjectsController < ApplicationController def show_projects_score respond_to do |format| - format.html { render :layout => "project_base"} + format.html { render :layout => "base_projects"} format.js end end @@ -674,10 +705,10 @@ class ProjectsController < ApplicationController private def memberAccess - # 是课程,则判断当前用户是否参加了课程 - # return 0 if @project.project_type == Project::ProjectType_project - # currentUser = User.current - render_403 unless User.current.member_of?(@project) + # 如果是私有项目,项目成员不对外公开,公开项目成员列表对外公开。 + unless @project.is_public? + render_403 unless User.current.member_of?(@project) + end end def toggleCourse diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index e80fc4a9a..272ae1d37 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -548,11 +548,12 @@ update :stack => :side, :scale_integers => true, :step_x_labels => 2, - :show_data_values => false, + :show_data_values => true, :graph_title => l(:label_commits_per_month), :show_graph_title => true ) + # 具状图 graph.add_data( :data => commits_by_month[0..11].reverse, :title => l(:label_revision_plural) @@ -568,7 +569,7 @@ update def graph_commits_per_author(repository) commits_by_author = Changeset.count(:all, :group => :committer, :conditions => ["repository_id = ?", repository.id]) - commits_by_author.to_a.sort! {|x, y| x.last <=> y.last} + commits_by_author = commits_by_author.to_a.sort! {|x, y| x.last <=> y.last}.last(25) changes_by_author = Change.count(:all, :group => :committer, :include => :changeset, :conditions => ["#{Changeset.table_name}.repository_id = ?", repository.id]) h = changes_by_author.inject({}) {|o, i| o[i.first] = i.last; o} @@ -590,7 +591,7 @@ update :fields => fields, :stack => :side, :scale_integers => true, - :show_data_values => false, + :show_data_values => true, :rotate_y_labels => false, :graph_title => l(:label_commits_per_author), :show_graph_title => true diff --git a/app/controllers/stores_controller.rb b/app/controllers/stores_controller.rb index b1705c826..85ea85241 100644 --- a/app/controllers/stores_controller.rb +++ b/app/controllers/stores_controller.rb @@ -72,6 +72,22 @@ class StoresController < ApplicationController l(:label_borad_project), #l(:label_contest_innovate), l(:label_forum) ] end + + #缺失文件列表 + def lost_file + attachments = [] + Attachment.where("container_id is not null and container_type is not null and container_type <> 'Bid' and container_type <> 'HomeworkAttach'").each do |attachment| + unless File.exist?(attachment.diskfile) + attachments << attachment + end + end + respond_to do |format| + format.xls { + send_data(homework_to_xls(attachments), :type => "text/excel;charset=utf-8; header=present", + :filename => "#{l(:label_file_lost_list)}.xls") + } + end + end private @@ -117,4 +133,27 @@ class StoresController < ApplicationController else end end + + #作品列表转换为excel + def homework_to_xls attachments + 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(["文件ID","文件名","硬盘路径","上传时间","是否公开","所属对象","所属对象Id"]) + count_row = 1 + attachments.each do |attachment| + sheet1[count_row,0] = attachment.id + sheet1[count_row,1] = attachment.filename + sheet1[count_row,2] = attachment.diskfile + sheet1[count_row,3] = format_time(attachment.created_on) + sheet1[count_row,4] = (attachment.is_public == 1 || attachment.is_public) ? "是" :"否" + sheet1[count_row,5] = attachment.container_type + sheet1[count_row,6] = attachment.container_id + count_row += 1 + end + book.write xls_report + xls_report.string + end end diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb index 3ca836773..209fa7269 100644 --- a/app/controllers/student_work_controller.rb +++ b/app/controllers/student_work_controller.rb @@ -2,42 +2,85 @@ class StudentWorkController < ApplicationController layout "base_courses" include StudentWorkHelper require 'bigdecimal' - before_filter :find_homework, :only => [:new, :index, :create, :student_work_absence_penalty] + require "base64" + before_filter :find_homework, :only => [:new, :index, :create, :student_work_absence_penalty, :absence_penalty_list, :evaluation_list] before_filter :find_work, :only => [:edit, :update, :show, :destroy, :add_score, :praise_student_work] before_filter :member_of_course, :only => [:index, :new, :create, :show, :add_score, :praise_student_work] before_filter :author_of_work, :only => [:edit, :update, :destroy] + before_filter :teacher_of_course, :only => [:student_work_absence_penalty, :absence_penalty_list, :evaluation_list] + protect_from_forgery :except => :set_program_score def index - @order,@b_sort,@name = params[:order] || "final_score",params[:sort] || "desc",params[:name] || "" + @order,@b_sort,@name,@group = params[:order] || "score",params[:sort] || "desc",params[:name] || "",params[:group] @is_teacher = User.current.allowed_to?(:as_teacher,@course) - #老师 || 非匿评作业 || 匿评结束 显示所有的作品 - @show_all = @is_teacher || @homework.homework_type != 1 || @homework.homework_detail_manual.comment_status == 3 - if @show_all - if @homework.homework_type == 1 || @is_teacher || User.current.admin? - if @order == "name" - @stundet_works = search_homework_member @homework.student_works.joins(:user).order("users.lastname #{@b_sort}, users.firstname #{@b_sort}"),@name - else - @stundet_works = search_homework_member @homework.student_works.order("#{@order} #{@b_sort}"),@name - end + course_group = CourseGroup.find_by_id(@group) if @group + if course_group + group_students = course_group.users + if group_students.empty? + student_in_group = '(0)' else - my_work = @homework.student_works.where(:user_id => User.current.id) - if my_work.empty? - @stundet_works = [] - else + student_in_group = '(' + group_students.map{|user| user.id}.join(',') + ')' + end + #老师 || 非匿评作业 || 匿评结束 显示所有的作品 + @show_all = @is_teacher || @homework.homework_type != 1 || @homework.homework_detail_manual.comment_status == 3 || User.current.admin? + if @show_all + if @homework.homework_type == 1 || @is_teacher || User.current.admin? #超级管理员 || 老师 || 匿评结束 显示所有的作品 if @order == "name" - @stundet_works = search_homework_member @homework.student_works.joins(:user).order("users.lastname #{@b_sort}, users.firstname #{@b_sort}"),@name + @stundet_works = search_homework_member @homework.student_works.select("student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score").joins(:user).where("users.id in #{student_in_group}").order("users.lastname #{@b_sort}, users.firstname #{@b_sort}"),@name else - @stundet_works = search_homework_member @homework.student_works.order("#{@order} #{@b_sort}"),@name + @stundet_works = search_homework_member @homework.student_works.select("student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score").joins(:user).where("users.id in #{student_in_group}").order("#{@order} #{@b_sort}"),@name end + else #剩余情况: 学生 && 非匿评作业 如果未提交作品,只能看到自己的,提交了作品,能看到所有作品 + my_work = @homework.student_works.select("student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score").where(:user_id => User.current.id) + if my_work.empty? + @stundet_works = [] + else + if @order == "name" + @stundet_works = search_homework_member @homework.student_works.select("student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score").joins(:user).where("users.id in #{student_in_group}").order("users.lastname #{@b_sort}, users.firstname #{@b_sort}"),@name + else + @stundet_works = search_homework_member @homework.student_works.select("student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score").joins(:user).where("users.id in #{student_in_group}").order("#{@order} #{@b_sort}"),@name + end + end + end + else #学生 + if @homework.homework_detail_manual.comment_status == 1 #未开启匿评,只显示我的作品 + @stundet_works = @homework.student_works.select("student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score").where(:user_id => User.current.id) + elsif @homework.homework_detail_manual.comment_status == 2 #匿评列表,显示匿评作品和我的作品 + @is_evaluation = true + my_work = @homework.student_works.where(:user_id => User.current.id) + @stundet_works = my_work + User.current.student_works_evaluation_distributions.map(&:student_work).select { |work| work.homework_common_id == @homework.id} end end - else #学生 - if @homework.homework_detail_manual.comment_status == 1 #未开启匿评,只显示我的作品 - @stundet_works = @homework.student_works.where(:user_id => User.current.id) - elsif @homework.homework_detail_manual.comment_status == 2 #匿评列表,显示匿评作品和我的作品 - @is_evaluation = true - my_work = @homework.student_works.where(:user_id => User.current.id) - @stundet_works = my_work + User.current.student_works_evaluation_distributions.map(&:student_work).select { |work| work.homework_common_id == @homework.id} + else + #老师 || 非匿评作业 || 匿评结束 显示所有的作品 + @show_all = @is_teacher || @homework.homework_type != 1 || @homework.homework_detail_manual.comment_status == 3 || User.current.admin? + if @show_all + if @homework.homework_type == 1 || @is_teacher || User.current.admin? #超级管理员 || 老师 || 匿评结束 显示所有的作品 + if @order == "name" + @stundet_works = search_homework_member @homework.student_works.select("student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score").joins(:user).order("users.lastname #{@b_sort}, users.firstname #{@b_sort}"),@name + else + @stundet_works = search_homework_member @homework.student_works.select("student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score").order("#{@order} #{@b_sort}"),@name + end + else #剩余情况: 学生 && 非匿评作业 如果未提交作品,只能看到自己的,提交了作品,能看到所有作品 + my_work = @homework.student_works.select("student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score").where(:user_id => User.current.id) + if my_work.empty? + @stundet_works = [] + else + if @order == "name" + @stundet_works = search_homework_member @homework.student_works.select("student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score").joins(:user).order("users.lastname #{@b_sort}, users.firstname #{@b_sort}"),@name + else + @stundet_works = search_homework_member @homework.student_works.select("student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score").order("#{@order} #{@b_sort}"),@name + end + end + end + else #学生 + if @homework.homework_detail_manual.comment_status == 1 #未开启匿评,只显示我的作品 + @stundet_works = @homework.student_works.select("student_works.*,IF(final_score is null,null,final_score - absence_penalty - late_penalty) as score").where(:user_id => User.current.id) + elsif @homework.homework_detail_manual.comment_status == 2 #匿评列表,显示匿评作品和我的作品 + @is_evaluation = true + my_work = @homework.student_works.where(:user_id => User.current.id) + @stundet_works = my_work + User.current.student_works_evaluation_distributions.map(&:student_work).select { |work| work.homework_common_id == @homework.id} + end end end @homework_commons = @course.homework_commons.order("created_at desc") @@ -72,8 +115,30 @@ class StudentWorkController < ApplicationController stundet_work.homework_common_id = @homework.id stundet_work.user_id = User.current.id stundet_work.save_attachments(params[:attachments]) + if Time.parse(@homework.end_time.to_s).strftime("%Y-%m-%d") < Time.parse(Time.now.to_s).strftime("%Y-%m-%d") + stundet_work.late_penalty = @homework.late_penalty + else + stundet_work.late_penalty = 0 + end render_attachment_warning_if_needed(stundet_work) + if stundet_work.save + if @homework.homework_type == 2 && @homework.homework_detail_programing #编程作业,学生提交作品后计算系统得分 + url = "http://192.168.80.21:8080/api/questions/#{@homework.homework_detail_programing.question_id}/solutions.json" + solutions = { + student_work_id:stundet_work.id, + src:Base64.encode64(stundet_work.description), + language:@homework.homework_detail_programing.language + } + uri = URI(url) + body = solutions.to_json + res = Net::HTTP.new(uri.host, uri.port).start do |client| + request = Net::HTTP::Post.new(uri.path) + request.body = body + request["Content-Type"] = "application/json" + client.request(request) + end + end respond_to do |format| format.html { flash[:notice] = l(:notice_successful_create) @@ -92,8 +157,12 @@ class StudentWorkController < ApplicationController end def edit - respond_to do |format| - format.html + if @homework.homework_type == 2 #编程作业不能修改作业 + render_403 + else + respond_to do |format| + format.html + end end end @@ -128,7 +197,9 @@ class StudentWorkController < ApplicationController end def destroy - if @work.destroy + if @homework.homework_type == 2 #编程作业,作品提交后不可以删除 + render_403 + elsif @work.destroy respond_to do |format| format.html { redirect_to student_work_index_url(:homework => @homework.id) @@ -147,6 +218,12 @@ class StudentWorkController < ApplicationController if @score @score.comment = params[:new_form][:user_message] if params[:new_form] && params[:new_form][:user_message] && params[:new_form][:user_message] != "" @score.score = params[:score] if params[:score] + if User.current.admin? + @score.reviewer_role = 1 + else + role = User.current.members.where("course_id = ?",@course.id).first.roles.first.name + @score.reviewer_role = get_role_by_name(role) + end @is_new = false else @score = StudentWorksScore.new @@ -154,8 +231,12 @@ class StudentWorkController < ApplicationController @score.comment = params[:new_form][:user_message] if params[:new_form] && params[:new_form][:user_message] && params[:new_form][:user_message] != "" @score.user_id = User.current.id @score.student_work_id = @work.id - role = User.current.members.where("course_id = ?",@course.id).first.roles.first.name - User.current.admin? ? @score.reviewer_role = 1 : @score.reviewer_role = get_role_by_name(role) + if User.current.admin? + @score.reviewer_role = 1 + else + role = User.current.members.where("course_id = ?",@course.id).first.roles.first.name + @score.reviewer_role = get_role_by_name(role) + end @is_new = true end @@ -173,8 +254,10 @@ class StudentWorkController < ApplicationController if @work.student_score.nil? @work.final_score = @work.teaching_asistant_score else - final_ta_score = BigDecimal.new("#{@work.teaching_asistant_score}") * BigDecimal.new("#{@homework.homework_detail_manual.ta_proportion}") - final_s_score = BigDecimal.new("#{@work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{@homework.homework_detail_manual.ta_proportion}")) + ta_proportion = @homework.homework_detail_manual.ta_proportion if @homework.homework_detail_manual + ta_proportion = @homework.homework_detail_programing.ta_proportion if @homework.homework_detail_programing + final_ta_score = BigDecimal.new("#{@work.teaching_asistant_score}") * BigDecimal.new("#{ta_proportion}") + final_s_score = BigDecimal.new("#{@work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{ta_proportion}")) final_score = final_ta_score + final_s_score @work.final_score = format("%.2f",final_score.to_f) end @@ -241,25 +324,100 @@ class StudentWorkController < ApplicationController end end - #评价列表显示 + #缺评列表显示 def student_work_absence_penalty - render_403 unless User.current.allowed_to?(:as_teacher,@course) order = params[:order] || "desc" - work_ids = "(" + @homework.student_works.map(&:id).join(",") + ")" - @stundet_works = StudentWork.find_by_sql("SELECT *,(all_count - has_count) AS absence FROM( + if @homework.student_works.empty? + @stundet_works = [] + else + work_ids = "(" + @homework.student_works.map(&:id).join(",") + ")" + @stundet_works = StudentWork.find_by_sql("SELECT *,(all_count - has_count) AS absence FROM( SELECT * , (SELECT COUNT(*) FROM `student_works_evaluation_distributions` WHERE user_id = student_works.user_id AND student_work_id IN #{work_ids}) AS all_count, (SELECT COUNT(*) FROM `student_works_scores` WHERE user_id = student_works.user_id AND student_work_id IN #{work_ids}) AS has_count FROM `student_works` WHERE homework_common_id = #{@homework.id} - ) AS table_1 - ORDER BY absence #{order}") + ) AS table_1 + ORDER BY absence #{order}") + end @order = order == "desc" ? "asc" : "desc" respond_to do |format| format.html end end + #导出缺评列表 + def absence_penalty_list + if @homework.student_works.empty? + @stundet_works = [] + else + work_ids = "(" + @homework.student_works.map(&:id).join(",") + ")" + @stundet_works = StudentWork.find_by_sql("SELECT * FROM (SELECT *,(all_count - has_count) AS absence FROM( + SELECT * , + (SELECT COUNT(*) FROM `student_works_evaluation_distributions` WHERE user_id = student_works.user_id AND student_work_id IN #{work_ids}) AS all_count, + (SELECT COUNT(*) FROM `student_works_scores` WHERE user_id = student_works.user_id AND student_work_id IN #{work_ids}) AS has_count + FROM `student_works` + WHERE homework_common_id = #{@homework.id} + ) AS table_1) AS table_2 + where absence > 0 order by absence") + end + respond_to do |format| + format.xls { + send_data(absence_penalty_list_xls(@stundet_works), :type => "text/excel;charset=utf-8; header=present", + :filename => "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@homework.name}#{l(:excel_absence_list)}.xls") + } + end + end + + #导出匿评列表 + def evaluation_list + respond_to do |format| + format.xls { + send_data(evaluation_list_xls(@homework.student_works), :type => "text/excel;charset=utf-8; header=present", + :filename => "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@homework.name}#{l(:excel_evaluation_list)}.xls") + } + end + end + + #设置编程作业得分 + def set_program_score + stundet_work = StudentWork.find_by_id params[:student_work_id] + @course = stundet_work.homework_common.course + student_score_count = 0 + if stundet_work && params[:results] && params[:results].class.to_s == "Array" + homework_common = stundet_work.homework_common + params[:results].each do |result| + homework_test = homework_common.homework_tests.where("input = '#{result[:input]}' AND output = '#{result[:output]}'").first + if homework_test + student_work_test = StudentWorkTest.new + student_work_test.student_work = stundet_work + student_work_test.homework_test = homework_test + student_work_test.result = result[:status] + if student_work_test.result == 0 + student_score_count += 1 + end + student_work_test.save! + end + end + unless homework_common.homework_tests.empty? + stundet_work.student_score = student_score_count * 100.0 / homework_common.homework_tests.count + + if stundet_work.teacher_score.nil? + if stundet_work.teaching_asistant_score.nil? + stundet_work.final_score = stundet_work.student_score + else + final_ta_score = BigDecimal.new("#{stundet_work.teaching_asistant_score}") * BigDecimal.new("#{homework_common.homework_detail_programing.ta_proportion}") + final_s_score = BigDecimal.new("#{stundet_work.student_score}") * (BigDecimal.new('1.0') - BigDecimal.new("#{homework_common.homework_detail_programing.ta_proportion}")) + final_score = final_ta_score + final_s_score + stundet_work.final_score = format("%.1f",final_score.to_f) + end + end + + stundet_work.save! + end + end + end + private #获取作业 def find_homework @@ -280,7 +438,7 @@ class StudentWorkController < ApplicationController #是不是当前课程的成员 #当前课程成员才可以看到作品列表 def member_of_course - render_403 unless User.current.member_of_course? @course || User.current.admin? + render_403 unless User.current.member_of_course?(@course) || User.current.admin? end #判断是不是当前作品的提交者 @@ -289,6 +447,10 @@ class StudentWorkController < ApplicationController render_403 unless (User.current.id == @work.user_id || User.current.admin?) && (@homework.homework_type != 1 || @homework.homework_detail_manual.comment_status == 1 ) end + def teacher_of_course + render_403 unless User.current.allowed_to?(:as_teacher,@course) + end + #根据条件过滤作业结果 def search_homework_member homeworks,name name = name.downcase @@ -298,6 +460,7 @@ class StudentWorkController < ApplicationController select_homework end + #作品列表转换为excel def homework_to_xls items xls_report = StringIO.new book = Spreadsheet::Workbook.new @@ -317,11 +480,62 @@ class StudentWorkController < ApplicationController sheet1[count_row,6] = homework.teacher_score.nil? ? l(:label_without_score) : format("%.2f",homework.teacher_score) sheet1[count_row,7] = homework.teaching_asistant_score.nil? ? l(:label_without_score) : format("%.2f",homework.teaching_asistant_score) sheet1[count_row,8] = homework.student_score.nil? ? l(:label_without_score) : format("%.2f",homework.student_score) - sheet1[count_row,9] = homework.final_score.nil? ? l(:label_without_score) : format("%.2f",homework.final_score) + sheet1[count_row,9] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : format("%.2f",homework.score) : l(:label_without_score) sheet1[count_row,10] = format_time(homework.created_at) count_row += 1 end book.write xls_report xls_report.string end + + #缺评列表转换为excel + def absence_penalty_list_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_student_id),l(:excel_nickname),l(:excel_user_name),l(:lable_all_penalty),l(:lable_has_penalty),l(:lable_absence_penalty)]) + count_row = 1 + items.each do |homework| + sheet1[count_row,0] = homework.user.user_extensions.student_id + sheet1[count_row,1] = homework.user.login + sheet1[count_row,2] = homework.user.lastname.to_s + homework.user.firstname.to_s + sheet1[count_row,3] = homework.all_count + sheet1[count_row,4] = homework.has_count + sheet1[count_row,5] = homework.absence + count_row += 1 + end + book.write xls_report + xls_report.string + end + + #匿评列表转换为excel + def evaluation_list_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(:label_work_name),l(:label_work_id),l(:label_work_autor),l(:label_evaluation_id),l(:label_evaluation_name), + l(:label_evaluation_score),l(:label_evaluation_common),l(:label_evaluation_time)]) + count_row = 1 + items.each do |homework| + homework.student_works_scores.where(:reviewer_role => 3).each do |score| + sheet1[count_row,0] = homework.name + sheet1[count_row,1] = homework.user.user_extensions.student_id + sheet1[count_row,2] = homework.user.show_name + sheet1[count_row,3] = score.user.user_extensions.student_id + sheet1[count_row,4] = score.user.show_name + sheet1[count_row,5] = score.score + sheet1[count_row,6] = score.comment + sheet1[count_row,7] = format_time(score.created_at) + count_row += 1 + end + end + book.write xls_report + xls_report.string + end end \ No newline at end of file diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 23053a48e..d6597f3da 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -26,10 +26,10 @@ class UsersController < ApplicationController menu_item :user_homework, :only => :user_homeworks menu_item :user_project, :only => [:user_projects, :watch_projects] # menu_item :requirement_focus, :only => :watch_bids - menu_item :requirement_focus, :only => :watch_contests + menu_item :requirement_focus, :only => :watch_contests menu_item :user_newfeedback, :only => :user_newfeedback - - + + #Ended by young # edit @@ -39,23 +39,28 @@ class UsersController < ApplicationController before_filter :require_admin, :except => [:show, :index, :search, :tag_save, :tag_saveEx,:user_projects, :user_newfeedback, :user_comments, :watch_contests, :info, :user_watchlist, :user_fanslist,:update, :user_courses, :user_homeworks, :watch_projects, :show_score, :topic_score_index, :project_score_index, :activity_score_index, :influence_score_index, :score_index,:show_new_score, :topic_new_score_index, :project_new_score_index, - :activity_new_score_index, :influence_new_score_index, :score_new_index,:update_score,:user_activities,:user_projects_index] + :activity_new_score_index, :influence_new_score_index, :score_new_index,:update_score,:user_activities,:user_projects_index, + :user_courses4show,:user_projects4show,:user_course_activities,:user_project_activities,:user_feedback4show,:user_visitorlist] #edit has been deleted by huang, 2013-9-23 - before_filter :find_user, :only => [:user_fanslist, :user_watchlist, :show, :edit, :update, :destroy, :edit_membership, :user_courses, - :user_homeworks, :destroy_membership, :user_activities, :user_projects, :user_newfeedback, :user_comments, + before_filter :find_user, :only => [:user_fanslist, :user_watchlist, :show, :edit, :update, :destroy, :edit_membership, :user_courses, + :user_homeworks, :destroy_membership, :user_activities, :user_projects, :user_newfeedback, :user_comments, :watch_contests, :info, :watch_projects, :show_score, :topic_score_index, :project_score_index, :activity_score_index, :influence_score_index, :score_index,:show_new_score, :topic_new_score_index, :project_new_score_index, - :activity_new_score_index, :influence_new_score_index, :score_new_index,:user_projects_index] + :activity_new_score_index, :influence_new_score_index, :score_new_index,:user_projects_index, + :user_courses4show,:user_projects4show,:user_course_activities,:user_project_activities,:user_feedback4show,:user_visitorlist] before_filter :auth_user_extension, only: :show #before_filter :rest_user_score, only: :show #before_filter :select_entry, only: :user_projects accept_api_auth :index, :show, :create, :update, :destroy,:tag_save , :tag_saveEx - + #william before_filter :require_login, :only => [:tag_save,:tag_saveEx] #before_filter :refresh_changests, :only =>[:user_activities,:user_courses,:user_projects,:user_newfeedback] + #visitor + before_filter :recorded_visitor, :only => [:show,:user_fanslist,:user_watchlist,:user_visitorlist] + helper :sort include SortHelper helper :custom_fields @@ -76,6 +81,9 @@ class UsersController < ApplicationController # fq helper :words + helper :project_score + helper :issues + include UsersHelper def refresh_changests if !(@user.nil?) && !(@user.memberships.nil?) @@ -104,27 +112,41 @@ class UsersController < ApplicationController #added by young def user_projects - - if User.current.admin? - @memberships = @user.memberships.all(conditions: "projects.project_type = #{Project::ProjectType_project}") - else - cond = Project.visible_condition(User.current) + " AND projects.project_type <> 1" - @memberships = @user.memberships.all(:conditions => cond) - end - #events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 20) - #@events_by_day = events.group_by(&:event_date) - @state = 0 - #add by huang + + #add by huang unless User.current.admin? if !@user.active? #|| (@user != User.current && @memberships.empty? && events.empty?) render_404 - return + return end end - #end - + #end + # if User.current.admin? + # @memberships = @user.memberships.all(conditions: "projects.project_type = #{Project::ProjectType_project}") + # else + # cond = Project.visible_condition(User.current) + " AND projects.project_type <> 1" + # @memberships = @user.memberships.all(:conditions => cond) + # end + #events = Redmine::Activity::Fetcher.new(User.current, :author => @user).events(nil, nil, :limit => 20) + #@events_by_day = events.group_by(&:event_date) + # @state = 0 + + limit = 10; + query = Project.joins("join members m on #{Project.table_name}.id=m.project_id") + query = query.where("m.user_id = ? and #{Project.table_name}.project_type=?",@user.id,Project::ProjectType_project) + if(params[:status] == '1') + query = query.where("#{Project.table_name}.user_id = ?",@user.id); + elsif(params[:status] == '2') + query = query.where("#{Project.table_name}.user_id <> ?",@user.id); + end + @obj_count = query.count(); + + @obj_pages = Paginator.new @obj_count,limit,params['page'] + @list = query.order("#{Project.table_name}.updated_on desc,#{Project.table_name}.id desc").limit(limit).offset(@obj_pages.offset).all(); + @params = params + respond_to do |format| - format.html + format.html{render :layout=>'base_users_new'} format.api end end @@ -161,21 +183,21 @@ class UsersController < ApplicationController # format.api # end end - + #new add by linchun - def watch_contests - @bids = Contest.watched_by(@user) + def watch_contests + @bids = Contest.watched_by(@user) @offset, @limit = api_offset_and_limit({:limit => 10}) @contest_count = @contests.count @contest_pages = Paginator.new @contest_count, @limit, params['page'] - @offset ||= @contest_pages.reverse_offset + @offset ||= @contest_pages.reverse_offset unless @offset == 0 @contest = @contests.offset(@offset).limit(@limit).all.reverse else limit = @bid_count % @limit @contest = @contests.offset(@offset).limit(limit).all.reverse end - + respond_to do |format| format.html { render :layout => 'base_users' @@ -212,9 +234,9 @@ class UsersController < ApplicationController end end # end - + # added by huang - def user_homeworks + def user_homeworks # @membership = @user.memberships.all(:conditions => Project.visible_condition(User.current)) # @memberships = [] # @membership.each do |membership| @@ -233,48 +255,63 @@ class UsersController < ApplicationController # return # end # end - end - - + end + + include CoursesHelper - def user_courses + def user_courses unless User.current.admin? if !@user.active? #|| (@user != User.current && @memberships.empty? && events.empty?) render_404 - return + return end end - + #@user.coursememberships.all(:conditions => Course.visible_condition(User.current)) - if User.current == @user || User.current.admin? - membership = @user.coursememberships.all - else - membership = @user.coursememberships.all(:conditions => Course.visible_condition(User.current)) - end - - membership.sort! {|older, newer| newer.created_on <=> older.created_on } - @memberships = [] - membership.collect { |e| - @memberships.push(e) - } - ## 判断课程是否过期 [需封装] - @memberships_doing = [] - @memberships_done = [] - #now_time = Time.now.year - @memberships.map { |e| - #end_time = e.course.get_time.year - isDone = course_endTime_timeout?(e.course) - if isDone - @memberships_done.push e - else - @memberships_doing.push e - end - } + limit = 10; + query = Course.joins("join members m on #{Course.table_name}.id=m.course_id") + query = query.where("m.user_id = ?",@user.id) + if(params[:status] == '1') + query = query.where("endup_time >= ? or endup_time is null or endup_time=''",Time.now); + elsif(params[:status] == '2') + query = query.where("endup_time < ?",Time.now); + end + @obj_count = query.count(); + + @obj_pages = Paginator.new @obj_count,limit,params['page'] + @list = query.order("#{Course.table_name}.updated_at desc,#{Course.table_name}.id desc").limit(limit).offset(@obj_pages.offset).all(); + @params = params + render :layout=>'base_users_new' + + # if User.current == @user || User.current.admin? + # membership = @user.coursememberships.all + # else + # membership = @user.coursememberships.all(:conditions => Course.visible_condition(User.current)) + # end + # + # membership.sort! {|older, newer| newer.created_on <=> older.created_on } + # @memberships = [] + # membership.collect { |e| + # @memberships.push(e) + # } + # ## 判断课程是否过期 [需封装] + # @memberships_doing = [] + # @memberships_done = [] + # #now_time = Time.now.year + # @memberships.map { |e| + # #end_time = e.course.get_time.year + # isDone = course_endTime_timeout?(e.course) + # if isDone + # @memberships_done.push e + # else + # @memberships_doing.push e + # end + # } # respond_to do |format| - # format.html - # format.api + # format.html + # format.api # end end @@ -301,7 +338,7 @@ class UsersController < ApplicationController #end def index - + @status = params[:status] || 1 sort_init 'login', 'asc' sort_update %w(login firstname lastname mail admin created_on last_login_on) @@ -317,7 +354,7 @@ class UsersController < ApplicationController # 先内连一下statuses 保证排序之后数量一致 scope = User.visible. joins("INNER JOIN user_statuses ON users.id = user_statuses.user_id") - + # unknow scope = scope.in_group(params[:group_id]) if params[:group_id].present? @@ -354,7 +391,7 @@ class UsersController < ApplicationController # limit and offset @users = @users.limit(@user_pages.per_page).offset(@user_pages.offset) - + @user_base_tag = params[:id] ? 'base_users':'users_base' respond_to do |format| format.html { @@ -364,7 +401,7 @@ class UsersController < ApplicationController format.api end end - + def search sort_init 'login', 'asc' sort_update %w(login firstname lastname mail admin created_on last_login_on) @@ -408,8 +445,212 @@ class UsersController < ApplicationController format.api end end - + + def user_courses4show + query = Course.joins("join members m on #{Course.table_name}.id=m.course_id") + query = query.where("m.user_id = ?",@user.id) + if User.current == @user #看自己 + else + if @user.user_extensions!=nil && @user.user_extensions.identity == 0 #看老师 + query = query.joins("join member_roles r on m.id = r.member_id") + query = query.where("r.role_id in(3,7,9)") + end + query = query.where(Course.table_name+".is_public = 1") + # or exists (select 1 from courses c2,members m2 where c2.id=m2.course_id and c2.id=#{Course.table_name}.id and m2.user_id= User.current.id) + end + + if params[:lastid]!=nil && !params[:lastid].empty? + query = query.where("( (#{Course.table_name}.updated_at=? and #{Course.table_name}.id < ?) or #{Course.table_name}.updated_atnil + end + def user_projects4show + query = Project.joins("join members m on #{Project.table_name}.id=m.project_id") + query = query.where("m.user_id = ? and #{Project.table_name}.project_type=?",@user.id,Project::ProjectType_project) + if User.current == @user #看自己 + else + query = query.where(Project.table_name+".is_public = 1") + # TODO or exists (select 1 from project c2,members m2 where c2.id=m2.course_id and c2.id=#{Project.table_name}.id and m2.user_id= User.current.id) + end + + if params[:lastid]!=nil && !params[:lastid].empty? + query = query.where("( (#{Project.table_name}.updated_on=? and #{Project.table_name}.id < ?) or #{Project.table_name}.updated_onnil + end + + # def user_course_activities + # @list = [] + # lastid = nil + # if params[:lastid]!=nil && !params[:lastid].empty? + # lastid = params[:lastid]; + # end + # + # user_ids = [] + # if @user == User.current + # watcher = User.watched_by(@user) + # watcher.push(User.current) + # user_ids = watcher.map{|x| x.id} + # else + # user_ids << @user.id + # end + # + # query_rec_count = 8 + # query_times = 10 #query_times次没查到query_rec_count条记录就不查了 + # query_i = 0; + # while( true ) + # query_i = query_i+1 + # if(query_i>query_times) + # break + # end + # query = Activity.where(user_id: user_ids) + # if(lastid != nil) + # query = query.where("id < ?",lastid) + # end + # lastid,item_list = query_activities(query,'course'); + # for item in item_list + # @list << item + # if @list.count() >= query_rec_count + # break + # end + # end + # if @list.count() >= query_rec_count + # break + # end + # if lastid == nil + # break + # end + # end + # render :layout=>nil + # end + # + # def user_project_activities + # @list = [] + # lastid = nil + # if params[:lastid]!=nil && !params[:lastid].empty? + # lastid = params[:lastid]; + # end + # + # user_ids = [] + # if @user == User.current + # watcher = User.watched_by(@user) + # watcher.push(User.current) + # user_ids = watcher.map{|x| x.id} + # else + # user_ids << @user.id + # end + # + # query_rec_count = 8 + # query_times = 10 #query_times次没查到query_rec_count条记录就不查了 + # query_i = 0; + # while( true ) + # query_i = query_i+1 + # if(query_i>query_times) + # break + # end + # query = Activity.where(user_id: user_ids) + # if(lastid != nil) + # query = query.where("id < ?",lastid) + # end + # lastid,item_list = query_activities(query,'project'); + # for item in item_list + # @list << item + # if @list.count() >= query_rec_count + # break + # end + # end + # if @list.count() >= query_rec_count + # break + # end + # if lastid == nil + # break + # end + # end + # render :action=>'user_course_activities',:layout=>nil + # end + def user_course_activities + lastid = nil + if params[:lastid]!=nil && !params[:lastid].empty? + lastid = params[:lastid]; + end + + user_ids = [] + if @user == User.current + watcher = User.watched_by(@user) + watcher.push(User.current) + user_ids = watcher.map{|x| x.id} + else + user_ids << @user.id + end + + query = Activity.joins("join courses c on c.id=#{Activity.table_name}.activity_container_id and #{Activity.table_name}.activity_container_type='Course'") + query = query.where("#{Activity.table_name}.user_id in (?)", user_ids) + if User.current != @user #看别人 + if @user.user_extensions!=nil && @user.user_extensions.identity == 0 #看老师 + query = query.joins("join members m on c.id=m.course_id and m.user_id = #{@user.id}") + query = query.joins("join member_roles r on m.id = r.member_id") + query = query.where("r.role_id in(3,7,9)") + end + query = query.where("c.is_public=1") + end + if(lastid != nil) + query = query.where("#{Activity.table_name}.id < ?",lastid) + end + query = query.order("#{Activity.table_name}.id desc") + @list = query_activities(query) + + render :layout=>nil + end + + def user_project_activities + lastid = nil + if params[:lastid]!=nil && !params[:lastid].empty? + lastid = params[:lastid]; + end + + user_ids = [] + if @user == User.current + watcher = User.watched_by(@user) + watcher.push(User.current) + user_ids = watcher.map{|x| x.id} + else + user_ids << @user.id + end + + query = Activity.joins("join projects c on c.id=#{Activity.table_name}.activity_container_id and #{Activity.table_name}.activity_container_type='Project'") + query = query.where(user_id: user_ids) + if User.current != @user #看别人 + query = query.where("c.is_public=1") + end + if(lastid != nil) + query = query.where("#{Activity.table_name}.id < ?",lastid) + end + query = query.order("#{Activity.table_name}.id desc") + @list = query_activities(query); + + render :action=>'user_course_activities',:layout=>nil + end + + def user_feedback4show + query = @user.journals_for_messages + if params[:lastid]!=nil && !params[:lastid].empty? + query = query.where("#{JournalsForMessage.table_name}.id < ?",params[:lastid]) + end + logger.info('xxoo') + @list = query.order("#{JournalsForMessage.table_name}.id desc").limit(3).all + logger.info('aavv') + render :layout=>nil,:locals => {:feed_list=>@list} + end + def show + render :layout=>'base_users_new' + end + + def show_old pre_count = 10 #limit # Time 2015-02-04 11:46:34 # Author lizanle @@ -425,9 +666,9 @@ class UsersController < ApplicationController end when "2" message = [] - if @user == User.current + if @user == User.current message = JournalsForMessage.reference_message(@user.id) - message += Journal.reference_message(@user.id) + message += Journal.reference_message(@user.id) end @activity_count = message.size @info_pages = Paginator.new @activity_count, pre_count, params['page'] @@ -458,7 +699,7 @@ class UsersController < ApplicationController p_ids = [] Project.where(id: project_ids).each do |x| p_ids << x.id unless x.visible?(User.current) - end + end ids = [] ids << Issue.where(id: act_ids, project_id: p_ids).map{|x| x.id} @@ -477,7 +718,7 @@ class UsersController < ApplicationController p_ids = [] Project.where(id: project_ids).each do |x| p_ids << x.id unless x.visible?(User.current) - end + end ids << Journal.where(id: act_ids, journalized_id: p_ids, journalized_type: 'Project').map{|x| x.id} #News @@ -486,16 +727,16 @@ class UsersController < ApplicationController p_ids = [] Project.where(id: project_ids).each do |x| p_ids << x.id unless x.visible?(User.current) - end + end ids << News.where(id: act_ids, project_id: p_ids).map{|x| x.id} project_ids = News.where(id: act_ids).select('distinct course_id').map{|x| x.course_id} c_ids = [] Course.where(id: project_ids).each do |x| c_ids << x.id unless x.is_public !=0 && User.current.member_of_course?(x) - end + end ids << News.where(id: act_ids, course_id: p_ids).map{|x| x.id} - + #Message act_ids = activity.where(act_type: 'Message').select('act_id').map{|x| x.act_id} board_ids = Message.where(id: act_ids).select('distinct board_id').map{|x| x.board_id} @@ -503,14 +744,14 @@ class UsersController < ApplicationController p_ids = [] Project.where(id: project_ids).each do |x| p_ids << x.id unless x.visible?(User.current) - end + end ids << Message.where(id: act_ids, board_id: p_ids).map{|x| x.id} - + project_ids = Board.where(id: board_ids).select('distinct course_id').map{|x| x.course_id} c_ids = [] Course.where(id: project_ids).each do |x| c_ids << x.id unless x.is_public !=0 && User.current.member_of_course?(x) - end + end ids << Message.where(id: act_ids, board_id: c_ids).map{|x| x.id} logger.debug "filter ids #{ids}" @@ -528,33 +769,33 @@ class UsersController < ApplicationController # (e.act_type == "Message" && !e.act.board.nil? && ((!e.act.board.project.nil? && !e.act.board.project.visible?(User.current)) || (!e.act.board.course.nil? && e.act.board.course.is_public == 0 && !User.current.member_of_course?(e.act.board.course)))))) # } # - + @activity_count = activity.count @activity_pages = Paginator.new @activity_count, pre_count, params['page'] @activity = activity.slice(@activity_pages.offset,@activity_pages.per_page) @state = 0 end - + if params[:user].present? - + user_temp = User.find_by_sql("select id from users where concat(lastname,firstname) like '%#{params[:user]}%' or lastname like '%#{params[:user]}%'") - + if user_temp.size > 1 - activity = Activity.where('user_id in (?)', user_temp).where('user_id in (?)', watcher).order('id desc') + activity = Activity.where('user_id in (?)', user_temp).where('user_id in (?)', watcher).order('id desc') elsif user_temp.size == 1 - activity = Activity.where('user_id = ?', user_temp).where('user_id in (?)', watcher).order('id desc') + activity = Activity.where('user_id = ?', user_temp).where('user_id in (?)', watcher).order('id desc') else activity = Activity.where("1 = 0") end @offset, @limit = api_offset_and_limit({:limit => 10}) - @activity_count = activity.count + @activity_count = activity.count @activity_pages = Paginator.new @activity_count, @limit, params['page'] @offset ||= @activity_pages.offset - @activity = activity.offset(@offset).limit(@limit) + @activity = activity.offset(@offset).limit(@limit) @state = 0 end - - + + #Modified by nie unless User.current.admin? if !@user.active? #|| (@user != User.current && @memberships.empty? && events.empty?) @@ -576,17 +817,17 @@ class UsersController < ApplicationController def info message = [] - if @user == User.current + if @user == User.current message = JournalsForMessage.reference_message(@user.id) - message += Journal.reference_message(@user.id) + message += Journal.reference_message(@user.id) end @offset, @limit = api_offset_and_limit({:limit => 10}) @info_count = message.size @info_pages = Paginator.new @info_count, @limit, params['page'] @offset ||= @info_pages.offset - + messages = message.sort {|x,y| y.created_on <=> x.created_on } - + @message = messages[@offset, @limit] unless User.current.admin? @@ -602,7 +843,7 @@ class UsersController < ApplicationController end end #### end - + def new @user = User.new(:language => Setting.default_language, :mail_notification => Setting.default_notification_option) @@ -660,7 +901,7 @@ class UsersController < ApplicationController @auth_sources = AuthSource.all @membership ||= Member.new end - + def watch_projects @watch_projects = Project.joins(:watchers).where("project_type <>? and watchable_type = ? and `watchers`.user_id = ?", '1','Project', @user.id) @state = 1 @@ -830,42 +1071,66 @@ class UsersController < ApplicationController end end ###add by huang - def user_watchlist + def user_watchlist + limit = 10; + query = User.watched_by(@user.id); + @obj_count = query.count(); + @obj_pages = Paginator.new @obj_count,limit,params['page'] + @list = query.order("#{Watcher.table_name}.id desc").limit(limit).offset(@obj_pages.offset).all(); + + render :template=>'users/user_fanslist',:layout=>'base_users_new' end ###add by huang - def user_fanslist - + def user_fanslist + limit = 10; + query = @user.watcher_users; + @obj_count = query.count(); + @obj_pages = Paginator.new @obj_count,limit,params['page'] + @list = query.order("#{Watcher.table_name}.id desc").limit(limit).offset(@obj_pages.offset).all(); + @action = 'fans' + render :layout=>'base_users_new' + end + def user_visitorlist + limit = 10; + #query = @user.watcher_users; + query = User.joins("join visitors v on #{User.table_name}.id=v.user_id") + query = query.where("v.master_id=?",@user.id) + @obj_count = query.count(); + @obj_pages = Paginator.new @obj_count,limit,params['page'] + @list = query.order("v.updated_on desc").limit(limit).offset(@obj_pages.offset).all(); + @action = 'visitor' + render :template=>'users/user_fanslist',:layout=>'base_users_new' end - + #william def update_extensions(user_extensions) user_extensions = params[:user_extensions] unless user_extensions.nil? user_extensions = UserExtensions.find_by_id(user_extensions.user_id) - + # user_extensions. end end # added by bai def topic_score_index - + end - + def project_score_index - + end - + def activity_score_index - + end - + def influence_score_index - + end - + def score_index - + end # end def topic_new_score_index @@ -911,7 +1176,7 @@ class UsersController < ApplicationController # 必填自己的工作单位,其实就是学校 def auth_user_extension - if @user == User.current && @user.user_extensions.nil? + if @user == User.current && @user.user_extensions.nil? flash[:error] = l(:error_complete_occupation) redirect_to my_account_url end @@ -939,4 +1204,20 @@ class UsersController < ApplicationController render_404 end end + + def recorded_visitor + if(User.current.logged? && User.current != @user) + #impl = Visitor.where('user_id=? and master_id=?',User.current.id,@user.id).find; + # impl = Visitor.find_by_sql('user_id=? and master_id=?',[User.current.id,@user.id]); + impl = Visitor.find_by_user_id_and_master_id(User.current.id,@user.id); + if(impl.nil?) + impl = Visitor.new + impl.user_id = User.current.id + impl.master_id = @user.id + else + impl.updated_on = Time.now + end + impl.save + end + end end diff --git a/app/controllers/watchers_controller.rb b/app/controllers/watchers_controller.rb index f6d01a03d..35e1d5ba4 100644 --- a/app/controllers/watchers_controller.rb +++ b/app/controllers/watchers_controller.rb @@ -16,12 +16,15 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class WatchersController < ApplicationController before_filter :require_login#, :find_watchables, :only => [:watch, :unwatch] + + helper :users + def watch s = WatchesService.new watchables = s.watch params.merge(:current_user_id => User.current.id) respond_to do |format| format.html { redirect_to_referer_or {render :text => (true ? 'Watcher added.' : 'Watcher removed.'), :layout => true}} - format.js { render :partial => 'set_watcher', :locals => {:user => User.current, :watched => watchables} } + format.js { render :partial => 'set_watcher', :locals => {:user => User.current, :watched => watchables,:params=>params,:opt=>'add'} } end rescue Exception => e if e.message == "404" @@ -37,7 +40,7 @@ class WatchersController < ApplicationController watchables = s.unwatch params.merge(:current_user_id => User.current.id) respond_to do |format| format.html { redirect_to_referer_or {render :text => (false ? 'Watcher added.' : 'Watcher removed.'), :layout => true}} - format.js { render :partial => 'set_watcher', :locals => {:user => User.current, :watched => watchables} } + format.js { render :partial => 'set_watcher', :locals => {:user => User.current, :watched => watchables,:params=>params,:opt=>'delete'} } end rescue Exception => e if e.message == "404" diff --git a/app/controllers/words_controller.rb b/app/controllers/words_controller.rb index cc6c4f47e..161791954 100644 --- a/app/controllers/words_controller.rb +++ b/app/controllers/words_controller.rb @@ -13,11 +13,12 @@ class WordsController < ApplicationController end refer_user_id = params[:new_form][:reference_user_id].to_i - @user.add_jour(User.current, message, refer_user_id) + list = @user.add_jour(User.current, message, refer_user_id) unless refer_user_id == 0 || refer_user_id == User.current.id - User.find(refer_user_id).add_jour(User.current, message, refer_user_id) + list = User.find(refer_user_id).add_jour(User.current, message, refer_user_id) end - @user.count_new_jour + @jour = list.last + # @user.count_new_jour # if a_message.size > 5 # @message = a_message[-5, 5] # else @@ -26,8 +27,8 @@ class WordsController < ApplicationController # @message_count = a_message.count end end - @jours = @user.journals_for_messages.where('m_parent_id IS NULL').reverse - @jour = paginateHelper @jours,10 + # @jours = @user.journals_for_messages.where('m_parent_id IS NULL').reverse + # @jour = paginateHelper @jours,10 respond_to do |format| # format.html { redirect_to_referer_or {render :text => 'Watcher added.', :layout => true}} @@ -88,6 +89,7 @@ class WordsController < ApplicationController elsif @journal_destroyed.jour_type == "Principal" @user = User.find(@journal_destroyed.jour_id) @jours_count = @user.journals_for_messages.where('m_parent_id IS NULL').count + @is_user = true end respond_to do |format| format.js diff --git a/app/helpers/activities_helper.rb b/app/helpers/activities_helper.rb index ede2ed78a..c8cb20ba9 100644 --- a/app/helpers/activities_helper.rb +++ b/app/helpers/activities_helper.rb @@ -42,4 +42,33 @@ module ActivitiesHelper end sorted_events end + + def get_container_type(activity) + if activity.act.nil? + return ['Unknow',0] + end + #问卷 + if activity.act_type == 'Poll' + return ['Course',activity.act.polls_group_id] + end + #注册 + if activity.act_type == 'Principal' + return ['Principal',activity.act.id] + end + #留言 + if activity.act_type == 'JournalsForMessage' + return [activity.act.jour_type,activity.act.jour_id,activity.act.user_id] + end + + # HomeworkCommon Issue Journal Message News + if activity.act.respond_to?('course') && activity.act.course + return ['Course',activity.act.course.id] + end + if activity.act.respond_to?('project') && activity.act.project + return ['Project',activity.act.project.id] + end + + # Contest Contestnotification + return ['Unknow',0] + end end diff --git a/app/helpers/api_helper.rb b/app/helpers/api_helper.rb index afdc306a4..1f34112ad 100644 --- a/app/helpers/api_helper.rb +++ b/app/helpers/api_helper.rb @@ -1,3 +1,4 @@ +# encoding: utf-8 module ApiHelper #获取用户的工作单位 def get_user_work_unit user @@ -64,4 +65,103 @@ module ApiHelper def get_user_language user (user.language.nil? || user.language == "") ? 'zh':user.language end + + # 学生获取课程作业的状态 + def get_homework_status homework + homework_status = "" + if !homework.nil? + if homework.homework_type == 1 && homework.homework_detail_manual + case homework.homework_detail_manual.comment_status + when 1 + homework_status = show_homework_deadline homework + when 2 + homework_status = "正在匿评" + when 3 + homework_status = "匿评结束" + end + elsif homework.homework_type == 0 + homework_status = "未启用匿评" + elsif homework.homework_type == 2 + homework_status = "编程作业" + else + end + end + homework_status + end + + #获取作业的是否可以匿评的描述 + def homework_status_desc homework + if homework.homework_type == 1 && homework.homework_detail_manual #匿评作业 + if Time.parse(homework.end_time.to_s).strftime("%Y-%m-%d") >= Time.now.strftime("%Y-%m-%d") + link = show_homework_deadline homework + elsif homework.student_works.count >= 2 #作业份数大于2 + case homework.homework_detail_manual.comment_status + when 1 + link = '启动匿评' + when 2 + link = '关闭匿评' + when 3 + link = " 匿评结束" + end + else + link = "提交作业数过少" + end + else + link = "未开启匿评作业" + end + link + end + + #获取 + def get_submit_sutdent_list homework + studentlist = [] + if homework.is_a?(Hash) && homework.key?(:studentlist) + studentlist = homework[:studentlist] + else + homework.student_works.order("created_at desc").page(1).per(6).each do |work| + studentlist << work.user + end + end + studentlist + end + + #计算作业的截止日期,剩余日期 + def show_homework_deadline homework + day = 0 + if (day = (Date.parse(homework.end_time.to_s) - Date.parse(Time.now.to_s)).to_i) > 0 + "距作业截止还有" << day.to_s << "天" + else + "已截止,但可补交" + end + end + + #获取作业中学生的匿评比率 + # 匿评比率 = 学生总共评价的作业的作业份数 / 作业份数 * 分配数 * 100% + # 教辅匿评比率 = 教辅已经评价的作业份数 / 总的作业份数 * 100% + def get_evaluation_part homework,role + homework_eva_completed_task_num = 0 + homework_eva_task_num = 0 + #匿评作业 # 且匿评状态不是还没有开启匿评 + if homework.homework_type == 1 && homework.homework_detail_manual && homework.homework_detail_manual.comment_status != 1 + # 总共需要评价的任务数 + homework_eva_task_num = homework.homework_detail_manual.evaluation_num * homework.student_works.count + unless homework_eva_task_num == 0 #总任务数不为0 的情况下 + #获取已经评价了多少的份作业 student_work_score里记录了评价情况,每条记录有提交作业的id + #先求出提交作业的id集合 + work_ids = "(" + homework.student_works.map(&:id).join(",") + ")" + #只要 student_work_score 中的 student_work_id在work_ids集合中,那么久说明这个任务被完成了 + + sql = "select count(1) from student_works_scores where reviewer_role = #{role} and student_work_id in #{work_ids} " + homework_eva_completed_task_num = ActiveRecord::Base.connection().select_value(sql) + end + end + if homework_eva_task_num == 0 + 0 + else + ( homework_eva_completed_task_num / homework_eva_task_num.to_f * 100 ) .round(1) + end + + end + + end \ No newline at end of file diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 5af4e2038..165e22071 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1824,7 +1824,9 @@ module ApplicationHelper def attachment_candown attachment candown = false if attachment.container - if attachment.container.class.to_s != "HomeworkAttach" && attachment.container.class.to_s != "StudentWork" && (attachment.container.has_attribute?(:project) || attachment.container.has_attribute?(:project_id)) && attachment.container.project + if attachment.container.class.to_s=="PhoneAppVersion" + candown = true + elsif attachment.container.class.to_s != "HomeworkAttach" && attachment.container.class.to_s != "StudentWork" && (attachment.container.has_attribute?(:project) || attachment.container.has_attribute?(:project_id)) && attachment.container.project project = attachment.container.project candown= User.current.member_of?(project) || (project.is_public && attachment.is_public == 1) elsif attachment.container.is_a?(Project) @@ -1850,6 +1852,7 @@ module ApplicationHelper candown = true elsif attachment.container.class.to_s=="StudentWork" candown = true + elsif attachment.container_type == "Bid" && attachment.container && attachment.container.courses course = attachment.container.courses.first candown = User.current.member_of_course?(attachment.container.courses.first) || (course.is_public == 1 && attachment.is_public == 1) @@ -2278,7 +2281,9 @@ module ApplicationHelper #获取匿评相关连接代码 def homework_anonymous_comment homework if homework.homework_type == 1 && homework.homework_detail_manual #匿评作业 - if homework.student_works.count >= 2 #作业份数大于2 + if Time.parse(homework.end_time.to_s).strftime("%Y-%m-%d") >= Time.now.strftime("%Y-%m-%d") + link = "启动匿评".html_safe + elsif homework.student_works.count >= 2 #作业份数大于2 case homework.homework_detail_manual.comment_status when 1 link = link_to '启动匿评', alert_anonymous_comment_homework_common_path(homework), id: "#{homework.id}_start_anonymous_comment", remote: true, disable_with: '加载中...',:class => 'fr mr10 work_edit' @@ -2290,6 +2295,8 @@ module ApplicationHelper else link = "启动匿评".html_safe end + elsif homework.homework_type == 2 && homework.homework_detail_programing #编程作业作业 + link = "编程作业".html_safe else link = "启动匿评".html_safe end @@ -2303,6 +2310,8 @@ module ApplicationHelper else if homework.homework_type == 1 && homework.homework_detail_manual && homework.homework_detail_manual.comment_status != 1 #匿评作业,且作业状态不是在开启匿评之前 "#{l(:label_edit_homework)}".html_safe + elsif homework.homework_type == 2 #编程作业不能修改作品 + "作品已交".html_safe else link_to l(:label_edit_homework), edit_student_work_path(work.id),:class => 'fr mr10 work_edit' end @@ -2322,7 +2331,7 @@ module ApplicationHelper elsif homework.homework_type == 0 "未启用匿评".html_safe elsif homework.homework_type == 2 - "编程作业".html_safe + " 编程作业  ".html_safe end end @@ -2337,4 +2346,36 @@ module ApplicationHelper end end + #将文本内的/n转换为
+ def text_format text + text.gsub("&","&").gsub("<","<").gsub(">",">").gsub("\n","
").html_safe + end + + #评分规则显示 + def scoring_rules late_penalty,homework_id,is_teacher,absence_penalty=nil + if absence_penalty + if late_penalty.to_i == 0 && absence_penalty.to_i == 0 + notice = "尚未设置评分规则" + if is_teacher + notice += ",请 " + link_to("设置",edit_homework_common_path(homework_id),:class => "c_green") + end + elsif late_penalty.to_i != 0 && absence_penalty.to_i == 0 + notice = "迟交扣#{late_penalty}分,缺评扣分未设置" + elsif late_penalty.to_i == 0 && absence_penalty.to_i != 0 + notice = "迟交扣分未设置,缺评一个作品扣#{absence_penalty}分" + elsif late_penalty.to_i != 0 && absence_penalty.to_i != 0 + notice = "迟交扣#{late_penalty}分,缺评一个作品扣#{absence_penalty}分" + end + else + if late_penalty.to_i == 0 + notice = "尚未设置评分规则" + if is_teacher + notice += ",请 " + link_to("设置",edit_homework_common_path(homework_id),:class => "c_green") + end + else + notice = "迟交扣#{late_penalty}分" + end + end + notice.html_safe + end end diff --git a/app/helpers/courses_helper.rb b/app/helpers/courses_helper.rb index 13012a70c..597d5749c 100644 --- a/app/helpers/courses_helper.rb +++ b/app/helpers/courses_helper.rb @@ -35,7 +35,7 @@ module CoursesHelper #生成课程老师成员链接 def course_teacher_link teacher_num - if User.current.member_of_course?(@course) + if User.current.member_of_course?(@course) || User.current.admin? link_to "#{teacher_num}", course_member_path(@course, :role => 1), :class => 'info_foot_num c_blue' else content_tag 'span',teacher_num, :class => 'info_foot_num c_blue' @@ -44,7 +44,7 @@ module CoursesHelper #生成课程学生列表连接 def course_student_link student_num - if (User.current.logged? && @course.open_student == 1) || (User.current.member_of_course?(@course)) + if (User.current.logged? && @course.open_student == 1) || (User.current.member_of_course?(@course)) || User.current.admin? link_to "#{student_num}", course_member_path(@course, :role => 2), :class => 'info_foot_num c_blue' else content_tag 'span',student_num, :class => 'info_foot_num c_blue' @@ -520,10 +520,14 @@ module CoursesHelper option1 << l(:label_spring) option1 << l(:label_spring) option2 = [] - option2 << l(:label_autumn) - option2 << l(:label_autumn) + option2 << l(:label_summer) + option2 << l(:label_summer) + option3 = [] + option3 << l(:label_autumn) + option3 << l(:label_autumn) type << option1 type << option2 + type << option3 type end @@ -546,8 +550,9 @@ module CoursesHelper end if cur_course_term == "秋季学期" && course.time == (year_now + 1) && course.term == "春季学期" is_next_term = true - elsif cur_course_term == "春季学期" && course.time == year_now && course.term == "秋季学期" + elsif cur_course_term == "春季学期" && course.time == year_now && course.term == "夏季学期" is_next_term = true + elsif cur_course_term == "夏季学期" && course.time == year_now && course.term == "秋季学期" end is_current_term || is_next_term end diff --git a/app/helpers/homework_attach_helper.rb b/app/helpers/homework_attach_helper.rb index 72d381b28..bd2bec80c 100644 --- a/app/helpers/homework_attach_helper.rb +++ b/app/helpers/homework_attach_helper.rb @@ -1,149 +1,149 @@ module HomeworkAttachHelper - #判断是否具有删除的权限 - def attach_delete(project) - if User.current.logged? && (User.current.admin? || (!Member.where('user_id = ? and project_id = ?', User.current.id, project.bid.courses.first.id).first.nil? && (Member.where('user_id = ? and project_id = ?', User.current.id, project.bid.courses.first.id).first.roles&Role.where('id = ? or id = ?', 3, 7)).size >0) || project.user_id == User.current.id) - true - else - false - end - end - #作业添加、编辑界面的tab页 - def homework_settings_tabs f - @f = f - tabs = [{:name => 'info', :partial => 'homework_attach/edit_homework', :label => :label_information_plural}, - {:name => 'members', :partial => 'homework_attach/homework_member', :label => :label_member_plural} - ] - end - - #作业可选成员列表分页 - def render_new_members_for_homework members - #scope = Principal.active.sorted.not_member_of(project).like(params[:q]) - #scope = project.members - #principals = paginateHelper members,10 - #principals = members - #principal_count = members.count - #limit = 10 - #principal_pages = Redmine::Pagination::Paginator.new principal_count, limit, params['page'] #by young - #offset ||= principal_pages.offset - #principals = members[offset, limit] - users = members.map(&:user) - s = content_tag('div', member_check_box_tags_ex('membership[user_ids][]', users), :id => 'principals') - links = pagination_links_full(@obj_pages, @obj_count, :per_page_links => false) {|text, parameters, options| - link_to text, get_homework_member_list_homework_attach_index_path( parameters.merge(:q => params[:q], bid_id: params[:id]||@homework)), :remote => true } - return s + content_tag('div', content_tag('ul', links), :class => 'pagination_new') - end - - #扩展的checkbox生成 - def member_check_box_tags_ex(name, principals) - s = '' - principals.each do |member| - s << "
" - end - s.html_safe - end - - def paginateHelper obj, pre_size=20 - @obj_count = obj.count - @obj_pages = Redmine::Pagination::Paginator.new @obj_count, pre_size, params['page'] - if obj.kind_of? ActiveRecord::Base or obj.kind_of? ActiveRecord::Relation - obj.limit(@obj_pages.per_page).offset(@obj_pages.offset) - elsif obj.kind_of? Array - obj[@obj_pages.offset, @obj_pages.per_page] - else - logger.error "[ApplicationController] Error : application_controller#paginateHelper ===> unknow category: #{obj.class}" - raise RuntimeError, 'unknow type, Please input you type into this helper.' - end - end - - def user_projects_option - cond = Project.visible_condition(User.current) + " AND projects.project_type <> 1" - memberships = User.current.memberships.all(:conditions => cond) - projects = memberships.map(&:project) - not_have_project = [] - not_have_project << Setting.please_chose - not_have_project << 0 - type = [] - type << not_have_project - projects.each do |project| - if project != nil - option = [] - option << project.name - option << project.id - type << option - end - end - type - end - - #判断指定用户是不是已经赞过该作业 - def is_praise_homework user_id, obj_id - PraiseTread.where("user_id = #{user_id} AND praise_tread_object_id = #{obj_id} AND praise_tread_object_type = 'HomeworkAttach'").empty? - end - - #获取赞的总数 - def praise_homework_count obj_id - PraiseTread.where("praise_tread_object_id = #{obj_id} AND praise_tread_object_type = 'HomeworkAttach'").count - end - - #获取用户对作业的评分 - def get_homework_score user, homework - temp = HomeworkAttach.find_by_sql("SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = #{homework.id} AND rater_id = #{user.id}").first - @m_score = temp.nil? ? 0:temp.stars.to_i - end - - #获取评分对应的评论 - def get_homework_review homework,is_teacher,user - homework.journals_for_messages.where("is_comprehensive_evaluation = #{is_teacher ? 1 : 2} and user_id = #{user.id}").order("created_on DESC").first - end - - def convert_array array - ary = "(" - if array.nil? || array.count == 0 - return "()" - end - array.length.times do |i| - if i == array.length - 1 - ary += array[i].id.to_s + ")" - else - if !(array[i].nil? || array[i].id.nil? || array[i].id.to_s == "") - ary += array[i].id.to_s + "," - end - end - end - #array.each do |member| - # if member == array.last - # ary += member.id.to_s + ")" - # else - # ary += member.id.to_s + "," - # end - #end - ary - end - - def get_student_batch_homework_list bid,user - student_batch_homework_list = HomeworkAttach.eager_load(:attachments,:user,:rate_averages).find_by_sql("SELECT homework_attaches.*, - (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 1 AND stars IS NOT NULL ORDER BY updated_at DESC limit 0,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, - (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id = #{User.current.id} AND is_teacher_score = 0) AS m_score - FROM homework_attaches - INNER JOIN homework_evaluations ON homework_evaluations.homework_attach_id = homework_attaches.id - WHERE homework_attaches.bid_id = #{bid.id} AND homework_evaluations.user_id = #{user.id} ORDER BY m_score DESC") - student_batch_homework_list - end - - ######################################################### - #sw - #获取学生未进行匿评的数量 - #param: bid => 作业 user => 用户 - #return 指定用户未进行匿评的作业的数量 - #user必须是学生用户 - ####################################################### - def get_student_not_batch_homework_list bid,user - HomeworkAttach.find_by_sql("SELECT * FROM(SELECT homework_attaches.*, - (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id = #{user.id} AND is_teacher_score = 0) AS m_score - FROM homework_attaches - INNER JOIN homework_evaluations ON homework_evaluations.homework_attach_id = homework_attaches.id - WHERE homework_attaches.bid_id = #{bid.id} AND homework_evaluations.user_id = #{user.id}) AS table1 - WHERE table1.m_score IS NULL").count - end +# #判断是否具有删除的权限 +# def attach_delete(project) +# if User.current.logged? && (User.current.admin? || (!Member.where('user_id = ? and project_id = ?', User.current.id, project.bid.courses.first.id).first.nil? && (Member.where('user_id = ? and project_id = ?', User.current.id, project.bid.courses.first.id).first.roles&Role.where('id = ? or id = ?', 3, 7)).size >0) || project.user_id == User.current.id) +# true +# else +# false +# end +# end +# #作业添加、编辑界面的tab页 +# def homework_settings_tabs f +# @f = f +# tabs = [{:name => 'info', :partial => 'homework_attach/edit_homework', :label => :label_information_plural}, +# {:name => 'members', :partial => 'homework_attach/homework_member', :label => :label_member_plural} +# ] +# end +# +# #作业可选成员列表分页 +# def render_new_members_for_homework members +# #scope = Principal.active.sorted.not_member_of(project).like(params[:q]) +# #scope = project.members +# #principals = paginateHelper members,10 +# #principals = members +# #principal_count = members.count +# #limit = 10 +# #principal_pages = Redmine::Pagination::Paginator.new principal_count, limit, params['page'] #by young +# #offset ||= principal_pages.offset +# #principals = members[offset, limit] +# users = members.map(&:user) +# s = content_tag('div', member_check_box_tags_ex('membership[user_ids][]', users), :id => 'principals') +# links = pagination_links_full(@obj_pages, @obj_count, :per_page_links => false) {|text, parameters, options| +# link_to text, get_homework_member_list_homework_attach_index_path( parameters.merge(:q => params[:q], bid_id: params[:id]||@homework)), :remote => true } +# return s + content_tag('div', content_tag('ul', links), :class => 'pagination_new') +# end +# +# #扩展的checkbox生成 +# def member_check_box_tags_ex(name, principals) +# s = '' +# principals.each do |member| +# s << "
" +# end +# s.html_safe +# end +# +# def paginateHelper obj, pre_size=20 +# @obj_count = obj.count +# @obj_pages = Redmine::Pagination::Paginator.new @obj_count, pre_size, params['page'] +# if obj.kind_of? ActiveRecord::Base or obj.kind_of? ActiveRecord::Relation +# obj.limit(@obj_pages.per_page).offset(@obj_pages.offset) +# elsif obj.kind_of? Array +# obj[@obj_pages.offset, @obj_pages.per_page] +# else +# logger.error "[ApplicationController] Error : application_controller#paginateHelper ===> unknow category: #{obj.class}" +# raise RuntimeError, 'unknow type, Please input you type into this helper.' +# end +# end +# +# def user_projects_option +# cond = Project.visible_condition(User.current) + " AND projects.project_type <> 1" +# memberships = User.current.memberships.all(:conditions => cond) +# projects = memberships.map(&:project) +# not_have_project = [] +# not_have_project << Setting.please_chose +# not_have_project << 0 +# type = [] +# type << not_have_project +# projects.each do |project| +# if project != nil +# option = [] +# option << project.name +# option << project.id +# type << option +# end +# end +# type +# end +# +# #判断指定用户是不是已经赞过该作业 +# def is_praise_homework user_id, obj_id +# PraiseTread.where("user_id = #{user_id} AND praise_tread_object_id = #{obj_id} AND praise_tread_object_type = 'HomeworkAttach'").empty? +# end +# +# #获取赞的总数 +# def praise_homework_count obj_id +# PraiseTread.where("praise_tread_object_id = #{obj_id} AND praise_tread_object_type = 'HomeworkAttach'").count +# end +# +# #获取用户对作业的评分 +# def get_homework_score user, homework +# temp = HomeworkAttach.find_by_sql("SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = #{homework.id} AND rater_id = #{user.id}").first +# @m_score = temp.nil? ? 0:temp.stars.to_i +# end +# +# #获取评分对应的评论 +# def get_homework_review homework,is_teacher,user +# homework.journals_for_messages.where("is_comprehensive_evaluation = #{is_teacher ? 1 : 2} and user_id = #{user.id}").order("created_on DESC").first +# end +# +# def convert_array array +# ary = "(" +# if array.nil? || array.count == 0 +# return "()" +# end +# array.length.times do |i| +# if i == array.length - 1 +# ary += array[i].id.to_s + ")" +# else +# if !(array[i].nil? || array[i].id.nil? || array[i].id.to_s == "") +# ary += array[i].id.to_s + "," +# end +# end +# end +# #array.each do |member| +# # if member == array.last +# # ary += member.id.to_s + ")" +# # else +# # ary += member.id.to_s + "," +# # end +# #end +# ary +# end +# +# def get_student_batch_homework_list bid,user +# student_batch_homework_list = HomeworkAttach.eager_load(:attachments,:user,:rate_averages).find_by_sql("SELECT homework_attaches.*, +# (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND is_teacher_score = 1 AND stars IS NOT NULL ORDER BY updated_at DESC limit 0,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, +# (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id = #{User.current.id} AND is_teacher_score = 0) AS m_score +# FROM homework_attaches +# INNER JOIN homework_evaluations ON homework_evaluations.homework_attach_id = homework_attaches.id +# WHERE homework_attaches.bid_id = #{bid.id} AND homework_evaluations.user_id = #{user.id} ORDER BY m_score DESC") +# student_batch_homework_list +# end +# +# ######################################################### +# #sw +# #获取学生未进行匿评的数量 +# #param: bid => 作业 user => 用户 +# #return 指定用户未进行匿评的作业的数量 +# #user必须是学生用户 +# ####################################################### +# def get_student_not_batch_homework_list bid,user +# HomeworkAttach.find_by_sql("SELECT * FROM(SELECT homework_attaches.*, +# (SELECT stars FROM seems_rateable_rates WHERE rateable_type = 'HomeworkAttach' AND rateable_id = homework_attaches.id AND rater_id = #{user.id} AND is_teacher_score = 0) AS m_score +# FROM homework_attaches +# INNER JOIN homework_evaluations ON homework_evaluations.homework_attach_id = homework_attaches.id +# WHERE homework_attaches.bid_id = #{bid.id} AND homework_evaluations.user_id = #{user.id}) AS table1 +# WHERE table1.m_score IS NULL").count +# end end \ No newline at end of file diff --git a/app/helpers/homework_common_helper.rb b/app/helpers/homework_common_helper.rb index b9940f4be..49384cca4 100644 --- a/app/helpers/homework_common_helper.rb +++ b/app/helpers/homework_common_helper.rb @@ -3,7 +3,8 @@ module HomeworkCommonHelper #迟交扣分下拉框 def late_penalty_option type = [] - for i in (0..5) + type << l(:lable_unset) + for i in (1..5) option = [] option << i option << i @@ -15,7 +16,7 @@ module HomeworkCommonHelper #教辅评分比例下拉框 def ta_proportion_option type = [] - i = 10 + i = 0 while i <= 100 option = [] option << i.to_s + "%" @@ -26,10 +27,24 @@ module HomeworkCommonHelper type end + def programing_languages_options + type = [] + option = [] + option << "C" + option << 1 + type << option + option_1 = [] + option_1 << "C++" + option_1 << 2 + type << option_1 + type + end + #缺评扣分 def absence_penalty_option type = [] - i = 0 + i = 1 + type << l(:lable_unset) while i <= 5 option = [] option << i @@ -50,4 +65,5 @@ module HomeworkCommonHelper end link end + end \ No newline at end of file diff --git a/app/helpers/issues_helper.rb b/app/helpers/issues_helper.rb index e4f9a7a81..a26d2661a 100644 --- a/app/helpers/issues_helper.rb +++ b/app/helpers/issues_helper.rb @@ -68,24 +68,44 @@ module IssuesHelper end #获取跟踪类型及样式 - #REDO:时间紧可以优化. def get_issue_type(value) issuetype = [] if value == "缺陷" || value == 1 - issuetype << "red_btn_cir ml10" + issuetype << "issues fl" issuetype << "缺陷" + elsif value == "任务" || value == 4 + issuetype << "duty fl" + issuetype << "任务" + elsif value == "支持" || value == 3 + issuetype << "support fl" + issuetype << "支持" elsif value == "功能" || value == 2 - issuetype << "blue_btn_cir ml10" + issuetype << "function fl" issuetype << "功能" - elsif value == "支持" || value == 3 + else + issuetype << "weekly fl" + issuetype << "周报" + end + end + + # 获取优先级样式 value值1 2 低 + def get_issue_priority(value) + issuetype = [] + if value == "紧急" || value == 4 + issuetype << "red_btn_cir ml10" + issuetype << "紧急" + elsif value == "正常" || value == 2 issuetype << "green_btn_cir ml10" - issuetype << "支持" - elsif value == "任务" || value == 4 + issuetype << "正常" + elsif value == "高" || value == 3 issuetype << "orange_btn_cir ml10" - issuetype << "任务" - else + issuetype << "高" + elsif value == "低" || value == 1 issuetype << "bgreen_btn_cir ml10" - issuetype << "周报" + issuetype << "低" + else + issuetype << "red_btn_cir ml10" + issuetype << "立刻" end end @@ -361,16 +381,15 @@ module IssuesHelper end end - # 之所以注释是因为该功能冗余了 if detail.property == 'attr' && detail.prop_key == 'description' s = l(:text_journal_changed_no_detail, :label => label) - # unless no_html - # diff_link = link_to l(:label_diff), - # {:controller => 'journals', :action => 'diff', :id => detail.journal_id, - # :detail_id => detail.id, :only_path => options[:only_path]}, - # :title => l(:label_view_diff) - # s << " (#{ diff_link })" - # end + unless no_html + diff_link = link_to l(:label_diff), + {:controller => 'journals', :action => 'diff', :id => detail.journal_id, + :detail_id => detail.id, :only_path => options[:only_path]}, + :title => l(:label_view_diff) + s << " (#{ diff_link })" + end s.html_safe elsif detail.value.present? case detail.property diff --git a/app/helpers/student_work_helper.rb b/app/helpers/student_work_helper.rb index f88b1ff21..f24d5078f 100644 --- a/app/helpers/student_work_helper.rb +++ b/app/helpers/student_work_helper.rb @@ -80,4 +80,22 @@ module StudentWorkHelper end color end + + #获取分班信息 + def course_group_list course + result = [] + if course.course_groups && !course.course_groups.empty? + base = [] + base << l(:label_chose_group) + base << 0 + result << base + course.course_groups.each do |group| + option = [] + option << group.name + option << group.id + result << option + end + end + result + end end \ No newline at end of file diff --git a/app/helpers/user_score_helper.rb b/app/helpers/user_score_helper.rb index c94763e31..41f76a792 100644 --- a/app/helpers/user_score_helper.rb +++ b/app/helpers/user_score_helper.rb @@ -433,7 +433,7 @@ module UserScoreHelper #协同得分 def collaboration(option_number) - option_number.memo * 2 + option_number.messages_for_issues + option_number.issues_status + option_number.replay_for_message + option_number.replay_for_memo + option_number.messages_for_issues + option_number.issues_status + option_number.replay_for_message + option_number.replay_for_memo end #影响力得分 def influence(option_number) @@ -445,7 +445,7 @@ module UserScoreHelper end #项目贡献得分 def active(option_number) - option_number.changeset * 4 + option_number.document * 4 + option_number.attachment * 4 + option_number.issue_done_ratio * 2 + option_number.post_issue * 4 + option_number.changeset * 4 + option_number.document * 4 + option_number.attachment * 4 + option_number.issue_done_ratio * 2 + option_number.post_issue * 4 + option_number.memo * 2 end #更新发帖数 diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index af2d5abc4..d4f9e4eb8 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -303,4 +303,243 @@ module UsersHelper end end end + + def get_watcher_users(obj) + count = User.watched_by(obj.id).count + if count == 0 + return [0,[]] + end + list = User.watched_by(obj.id).order("#{Watcher.table_name}.id desc").limit(10).all + return [count,list]; + end + + def get_fans_users(obj) + count = obj.watcher_users.count + if count == 0 + return [0,[]] + end + list = obj.watcher_users.order("#{Watcher.table_name}.id desc").limit(10).all + return [count,list]; + end + def get_visitor_users(obj) + query = Visitor.where("master_id=?",obj.id) + count = query.count + if count == 0 + return [0,[]] + end + list = query.order("updated_on desc").limit(10).all + return [count,list]; + end + + def get_create_course_count(user) + return Course.where("tea_id = ?",user.id).count() + end + def get_join_course_count(user) + return user.coursememberships.count() - get_create_course_count(user) + end + def get_homework_commons_count(user) + return HomeworkCommon.where("user_id = ?",user.id).count() + end + def get_projectandcourse_attachment_count(user) + return Attachment.where("author_id = ? and container_type in ('Project','Course')",user.id).count() + end + def get_create_project_count(user) + return Project.where("user_id = ? and project_type = ?",user.id,Project::ProjectType_project).count() + end + def get_join_project_count(user) + return user.memberships.count(conditions: "projects.project_type = #{Project::ProjectType_project}") - get_create_project_count(user) + end + def get_create_issue_count(user) + return Issue.where("author_id = ?",user.id).count() + end + def get_resolve_issue_count(user) + return Issue.where("assigned_to_id = ? and status_id=3",user.id).count() + end + def get_anonymous_evaluation_count(user) + return StudentWorksScore.where("user_id = ? and reviewer_role=3",user.id).count() + end + + + # def query_activities(query,type) + # query_rec_count = 8 + # # query = query.where("act_type='JournalsForMessage'") + # #query = query.where("act_type not in (?)", ['JournalsForMessage','Message','HomeworkCommon','News','Issue','Journal','Poll']) + # list = query.order("id desc").limit(query_rec_count).all + # + # result = []; + # for item in list + # container = get_activity_container(item,type) + # if( activity_is_show(item,container) ) + # result << { :item=>item,:e=>container } + # end + # end + # return [lastid,result] + # end + # def get_activity_container activity,type + # e = nil; + # if type == 'Project' + # if activity.act_type == 'Poll' + # # 项目没有问卷 + # # e = Project.find_by_id(activity.act.polls_group_id) + # else + # e = activity.act.project if activity.act.respond_to?('project') + # end + # end + # if type == 'Course' + # if activity.act_type == 'Poll' + # e = Course.find_by_id(activity.act.polls_group_id) + # else + # e = activity.act.course if activity.act.respond_to?('course') + # end + # end + # + # return e; + # end + def query_activities(query) + list = query.limit(8).all + result = []; + for item in list + container = get_activity_container(item) + result << { :item=>item,:e=>container } + end + return result + end + def get_activity_container activity + return activity.activity_container + # if type == 'Project' + # return activity.act.project if activity.act.respond_to?('project') + # end + # if type == 'Course' + # if activity.act_type == 'Poll' + # return Course.find_by_id(activity.act.polls_group_id) + # end + # return activity.act.course if activity.act.respond_to?('course') + # end + # return nil; + end + + # def activity_is_show(activity,e) + # if(!e) + # return false + # end + # + # if activity.user_id == User.current.id + # return true + # end + # if( e.visible? ) + # return true + # end + # return false + # end + def get_activity_act_showname_htmlclear(activity) + str = get_activity_act_showname(activity) + str = str.gsub(/<.*>/,'') + str = str.gsub(/\r/,'') + str = str.gsub(/\n/,'') + str = str.lstrip.rstrip + if str == '' + str = 'RE:' + end + return str.html_safe + end + def get_activity_act_showname(activity) + case activity.act_type + when "HomeworkCommon" + return activity.act.name + when "Issue" + return activity.act.subject + when "Journal" + arr = details_to_strings(activity.act.details,true) + arr << activity.act.notes + str = '' + arr.each { |item| str = str+item } + return str + when "JournalsForMessage" + return activity.act.notes + when "Message" + return activity.act.subject + when "News" + return activity.act.title + when "Poll" + return activity.act.polls_name + when "Contest" + return '' + when "Contestnotification" + return '' + when "Principal" + return '' + else + return activity.act_type + end + end + def get_activity_act_createtime(activity) + case activity.act_type + when "HomeworkCommon" + return activity.act.created_at + when "Poll" + return activity.act.created_at + else + return activity.act.created_on + end + end + def get_activity_container_url e + if !e.visible? + return "javascript:;" + end + + if e.class.to_s == 'Course' + return url_for(:controller => 'courses', :action=>"show", :id=>e.id, :host=>Setting.host_course) + end + return url_for(:controller => 'projects', :action=>"show", :id=>e.id, :host=>Setting.host_name) + end + def get_activity_url(activity,e) + if !e.visible? + return "javascript:;" + end + + case activity.act_type + # when "Contest" + # when "Contestnotification" + # when "Principal" + when "HomeworkCommon" + return homework_common_index_path( :course=>e.id ) + when "Issue" + return issue_path(activity.act.id) + when "Journal" + return issue_path( activity.act.journalized_id ) + when "JournalsForMessage" + return e.class.to_s == 'Course' ? course_feedback_path(e) : project_feedback_path(e) + when "Message" + return e.class.to_s == 'Course' ? course_boards_path(e) : project_boards_path(e) + when "News" + return news_path(activity.act) + #return e.class.to_s == 'Course' ? course_news_index_path(e) : project_news_index_path(e) + when "Poll" + return poll_index_path( :polls_group_id=>activity.act.polls_group_id, :polls_type=>e.class.to_s ) + else + return 'javascript:;' + end + end + def get_activity_opt(activity,e) + case activity.act_type + when "HomeworkCommon" + return '创建了作业' + when "News" + return e.class.to_s == 'Course' ? '发布了通知' : '添加了新闻' + when "Issue" + return '发表了问题' + when "Journal" + return '回复了问题' + when "JournalsForMessage" + return e.class.to_s == 'Course' ? '发表了留言' : '提交了反馈' + #return ( activity.act.reply_id == nil || activity.act.reply_id == 0 ) ? '' : '' + when "Message" + return ( activity.act.parent_id == nil || activity.act.parent_id == '' ) ? '发布了帖子' : '回复了帖子' + when "Poll" + return '发布了问卷' + else + return '有了新动态' + end + end + end diff --git a/app/helpers/watchers_helper.rb b/app/helpers/watchers_helper.rb index d3b2a49b1..52f2ea119 100644 --- a/app/helpers/watchers_helper.rb +++ b/app/helpers/watchers_helper.rb @@ -169,14 +169,14 @@ module WatchersHelper if joined link_to text, {:controller => "courses", :action => "join_group", :object_id => "#{group.id}"}, :remote => true, :method => 'delete', - :id => "#{group.id}", :style => "padding: 8px 8px 4px; ", + :id => "#{group.id}", :style => "padding: 2px 8px 2px; background-color:#15bccf; color:#fff; ", :confirm => l(:text_are_you_sure_out_group), :class => 'group_in' end else text = l(:label_new_join_group) form_tag({:controller => "courses", :action => "join_group", :object_id => "#{group.id}"}, :remote => true, :method => 'post') do - submit_tag text, class: "group_in", style: "width: 90px;height: 21px;" + submit_tag text, class: "group_in", style: "width: 90px;height: 21px; background-color:#15bccf; color:#fff;" end end end diff --git a/app/models/activity.rb b/app/models/activity.rb index 5ec778641..63081be6f 100644 --- a/app/models/activity.rb +++ b/app/models/activity.rb @@ -2,9 +2,23 @@ class Activity < ActiveRecord::Base attr_accessible :act_id, :act_type, :user_id belongs_to :act, :polymorphic => true belongs_to :user + belongs_to :activity_container, polymorphic: true validates :act_id, presence: true validates :act_type, presence: true validates :user_id, presence: true include Trustie::Cache::ClearCourseEvent + + before_create :set_container_type_val + + #helper :activities + include ActivitiesHelper + def set_container_type_val + params =get_container_type(self) + self.activity_container_type = params[0] + self.activity_container_id = params[1] + if(self.act_type == 'JournalsForMessage') + self.user_id = params[2] + end + end end diff --git a/app/models/comment.rb b/app/models/comment.rb index bdb642d3c..a4842a23f 100644 --- a/app/models/comment.rb +++ b/app/models/comment.rb @@ -19,6 +19,14 @@ class Comment < ActiveRecord::Base include Redmine::SafeAttributes include ApplicationHelper has_many_kindeditor_assets :assets, :dependent => :destroy + + has_many :ActivityNotifies,:as => :activity, :dependent => :destroy + acts_as_event :datetime => :updated_on, + :description => :comments, + :type => 'news', + :title=>Proc.new {|o| "RE: #{o.commented.title}" }, + :url => Proc.new {|o| {:controller => 'news', :action => 'show', :id => o.commented.id} } + belongs_to :commented, :polymorphic => true, :counter_cache => true belongs_to :author, :class_name => 'User', :foreign_key => 'author_id' validates_presence_of :commented, :author, :comments @@ -38,4 +46,17 @@ class Comment < ActiveRecord::Base def delete_kindeditor_assets delete_kindeditor_assets_from_disk self.id,OwnerTypeHelper::COMMENT end + + def set_notify_id(notify_id) + @notify_id= notify_id + end + def get_notify_id() + return @notify_id + end + def set_notify_is_read(notify_is_read) + @notify_is_read = notify_is_read + end + def get_notify_is_read() + return @notify_is_read + end end diff --git a/app/models/dts.rb b/app/models/dts.rb new file mode 100644 index 000000000..3a9dcbcfb --- /dev/null +++ b/app/models/dts.rb @@ -0,0 +1,5 @@ +class Dts < ActiveRecord::Base + attr_accessible :Category, :Defect, :Description, :File, :IPLine, :IPLineCode, :Method, :Num, :PreConditions, :Review, :StartLine, :TraceInfo, :Variable, :project_id + + belongs_to :project +end diff --git a/app/models/homework_test.rb b/app/models/homework_test.rb index f7d9b20bc..7c477bfaf 100644 --- a/app/models/homework_test.rb +++ b/app/models/homework_test.rb @@ -2,4 +2,5 @@ class HomeworkTest < ActiveRecord::Base attr_accessible :input, :output, :homework_common_id belongs_to :homework_common + has_one :student_work_test end diff --git a/app/models/mailer.rb b/app/models/mailer.rb index d0ee99421..5ae9df001 100644 --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -104,13 +104,13 @@ class Mailer < ActionMailer::Base # 查询user的缺陷,项目中成员都能收到 sql = "select DISTINCT * from members m, issues i where i.project_id = m.project_id and m.user_id='#{user.id}' - and (i.updated_on between '#{date_from}' and '#{date_to}') order by i.updated_on desc" + and (i.updated_on between '#{date_from}' and '#{date_to}') order by i.project_id, i.updated_on desc" @issues = Issue.find_by_sql(sql) # issue回复 @issues_journals = Journal.find_by_sql("select j.* from journals j, members m, projects p, issues i where m.user_id = '#{user.id}' and p.id = m.project_id and i.project_id = p.id and j.journalized_id = i.id - and j.journalized_type='Issue' and (j.created_on between '#{date_from}' and '#{date_to}') order by created_on desc") + and j.journalized_type='Issue' and (j.created_on between '#{date_from}' and '#{date_to}') order by i.project_id, created_on desc") # @bids 查询课程作业,包括老师发布的作业,以及user提交作业 # @attachments查询课程课件更新 @@ -121,16 +121,16 @@ class Mailer < ActionMailer::Base count = count - 1 for i in 0..count do bids = courses[i].homework_commons.where("homework_commons.created_at between '#{date_from}' and '#{date_to}'").order("homework_commons.created_at desc") - attachments = courses[i].attachments.where("attachments.created_on between '#{date_from}' and '#{date_to}'").order('attachments.created_on DESC') + attachments = courses[i].attachments.where("attachments.created_on between '#{date_from}' and '#{date_to}'") @bids += bids if bids.count > 0 @attachments += attachments if attachments.count > 0 - end + # @bids = @bids.sort_by { |obj| obj.created_at } end # 项目附件 @project_attachments = Attachment.find_by_sql("select DISTINCT a.* from members m, attachments a - where a.container_id = m.project_id and m.user_id='#{user.id}' and container_type = 'Project' and (a.created_on between '#{date_from}' and '#{date_to}') order by a.created_on desc") + where a.container_id = m.project_id and m.user_id='#{user.id}' and container_type = 'Project' and (a.created_on between '#{date_from}' and '#{date_to}') order by m.project_id, a.created_on desc") # user 提交的作业 # @homeworks = HomeworkAttach.where("user_id=#{user.id} and (created_at between '#{date_from}' and '#{date_to}')").order("created_at desc") @@ -138,18 +138,18 @@ class Mailer < ActionMailer::Base # 查询user所在项目添加wiki @wiki_contents = WikiContent.find_by_sql("select DISTINCT wc.* from wikis w, members m, projects p, wiki_pages wp, wiki_contents wc where m.user_id = '#{user.id}' and m.project_id = p.id and w.project_id = p.id and w.id = wp.wiki_id and wc.page_id = wp.id and w.project_id>0 - and (wc.updated_on between '#{date_from}' and '#{date_to}') order by updated_on desc") + and (wc.updated_on between '#{date_from}' and '#{date_to}') order by m.project_id, updated_on desc") # 查询user在课程中发布的讨论帖子 course_mesages = Message.find_by_sql("select DISTINCT me.* from messages me, boards b, members m where b.id = me.board_id and b.course_id = m.course_id and b.course_id is not Null and m.user_id = '#{user.id}' - and (me.created_on between '#{date_from}' and '#{date_to}') order by created_on desc") + and (me.created_on between '#{date_from}' and '#{date_to}') order by m.course_id, created_on desc") # 查询user在项目中发布的讨论帖子 project_messages = Message.find_by_sql("select DISTINCT me.* from messages me, boards b, members m where b.id = me.board_id and b.project_id = m.project_id - and b.project_id != '-1' and m.user_id = '#{user.id}' and (me.created_on between '#{date_from}' and '#{date_to}') order by created_on desc") + and b.project_id != '-1' and m.user_id = '#{user.id}' and (me.created_on between '#{date_from}' and '#{date_to}') order by m.project_id, created_on desc") # messages = Message.find_by_sql("select DISTINCT * from messages where author_id = #{user.id} and (created_on between '#{date_from}' and '#{date_to}') order by created_on desc") @course_messages ||= [] @project_messages ||= [] @@ -168,31 +168,31 @@ class Mailer < ActionMailer::Base # 查询user在课程中发布的通知和回复通知 @course_news = (course_ids && !course_ids.empty?) ? News.find_by_sql("select DISTINCT n.* from news n where n.course_id in (#{course_ids}) - and (created_on between '#{date_from}' and '#{date_to}') order by created_on desc") : [] + and (created_on between '#{date_from}' and '#{date_to}') order by n.course_id, created_on desc") : [] @course_news_comments = Comment.find_by_sql("select cm.* from comments cm, members m, courses c, news n where m.user_id = '#{user.id}' and c.id = m.course_id and n.course_id = c.id and cm.commented_id = n.id - and cm.commented_type ='News' and (cm.created_on between '#{date_from}' and '#{date_to}') order by created_on desc") + and cm.commented_type ='News' and (cm.created_on between '#{date_from}' and '#{date_to}') order by m.course_id, created_on desc") # 查询user在项目中添加新闻和回复新闻 @project_news = (project_ids && !project_ids.empty?) ? News.find_by_sql("select DISTINCT n.* from news n where n.project_id in (#{project_ids}) - and (created_on between '#{date_from}' and '#{date_to}') order by created_on desc") : [] + and (created_on between '#{date_from}' and '#{date_to}') order by n.project_id, created_on desc") : [] @project_news_comments = Comment.find_by_sql("select c.* from comments c, members m, projects p, news n where m.user_id = '#{user.id}' and p.id = m.project_id and n.project_id = p.id and c.commented_id = n.id - and c.commented_type ='News' and (c.created_on between '#{date_from}' and '#{date_to}') order by created_on desc") + and c.commented_type ='News' and (c.created_on between '#{date_from}' and '#{date_to}') order by m.project_id, created_on desc") # 查询user在课程及个人中留言 @course_journal_messages = JournalsForMessage.find_by_sql("select DISTINCT jfm.* from journals_for_messages jfm, members m, courses c where m.user_id = '#{user.id}' and c.id = m.course_id and jfm.jour_id = c.id - and jfm.jour_type='Course' and (jfm.created_on between '#{date_from}' and '#{date_to}') order by created_on desc") + and jfm.jour_type='Course' and (jfm.created_on between '#{date_from}' and '#{date_to}') order by m.course_id, created_on desc") @user_journal_messages = user.journals_for_messages.where("jour_type='Principal' and (created_on between '#{date_from}' and '#{date_to}')").order('created_on DESC') # 查询user在项目中留言(用户反馈) @project_journal_messages = JournalsForMessage.find_by_sql("select DISTINCT jfm.* from journals_for_messages jfm, members m, projects p where m.user_id = '#{user.id}' and p.id = m.project_id and jfm.jour_id = p.id - and jfm.jour_type='Project' and (jfm.created_on between '#{date_from}' and '#{date_to}') order by created_on desc") + and jfm.jour_type='Project' and (jfm.created_on between '#{date_from}' and '#{date_to}') order by m.project_id, created_on desc") # 查询user新建贴吧或发布帖子 @forums = Forum.find_by_sql("select DISTINCT * from forums where creator_id = #{user.id} and (created_at between '#{date_from}' and '#{date_to}') order by created_at desc") diff --git a/app/models/member.rb b/app/models/member.rb index 057ea9570..292dd2034 100644 --- a/app/models/member.rb +++ b/app/models/member.rb @@ -143,6 +143,10 @@ class Member < ActiveRecord::Base StudentWork.joins(:homework_common).where("student_works.user_id = #{self.user_id} and homework_commons.course_id = #{self.course_id}").average(:final_score).try(:round, 2).to_f end + def student_work_score_sum + StudentWork.joins(:homework_common).where("student_works.user_id = #{self.user_id} and homework_commons.course_id = #{self.course_id}").sum(:final_score).try(:round, 2).to_f + end + protected def validate_role diff --git a/app/models/memo.rb b/app/models/memo.rb index 2831effe3..e0abaa19f 100644 --- a/app/models/memo.rb +++ b/app/models/memo.rb @@ -9,7 +9,7 @@ class Memo < ActiveRecord::Base # 若是主题帖,则内容可以是空 #validates :content, presence: true, if: Proc.new{|o| !o.parent_id.nil? } validates_length_of :subject, maximum: 50 - #validates_length_of :content, maximum: 3072 + validates_length_of :content, maximum: 5000 validate :cannot_reply_to_locked_topic, :on => :create acts_as_tree :counter_cache => :replies_count, :order => "#{Memo.table_name}.created_at ASC" diff --git a/app/models/news.rb b/app/models/news.rb index 7e809cbfd..7d33d760e 100644 --- a/app/models/news.rb +++ b/app/models/news.rb @@ -30,6 +30,8 @@ class News < ActiveRecord::Base has_many :forge_acts, :class_name => 'ForgeActivity',:as =>:forge_act ,:dependent => :destroy # end + has_many :ActivityNotifies,:as => :activity, :dependent => :destroy + validates_presence_of :title, :description validates_length_of :title, :maximum => 60 validates_length_of :summary, :maximum => 255 @@ -85,6 +87,19 @@ class News < ActiveRecord::Base #description end + def set_notify_id(notify_id) + @notify_id= notify_id + end + def get_notify_id() + return @notify_id + end + def set_notify_is_read(notify_is_read) + @notify_is_read = notify_is_read + end + def get_notify_is_read() + return @notify_is_read + end + private def add_author_as_watcher diff --git a/app/models/option_number.rb b/app/models/option_number.rb index 0ddea1bff..b4a3caac4 100644 --- a/app/models/option_number.rb +++ b/app/models/option_number.rb @@ -1,5 +1,6 @@ class OptionNumber < ActiveRecord::Base - attr_accessible :attachment, :changeset, :document, :follow, :issue_done_ratio, :issues_status, :memo, :messages_for_issues, :post_issue, :praise_by_one, :praise_by_three, :praise_by_two, :replay_for_memo, :replay_for_message, :score_type, :total_score, :tread, :tread_by_one, :tread_by_three, :tread_by_two, :user_id + attr_accessible :attachment, :changeset, :document, :follow, :issue_done_ratio, :issues_status, :memo, :messages_for_issues, :post_issue, + :praise_by_one, :praise_by_three, :praise_by_two, :replay_for_memo, :replay_for_message, :score_type, :total_score, :tread, :tread_by_one, :tread_by_three, :tread_by_two, :user_id def self.get_user_option_number user_id result = nil diff --git a/app/models/project.rb b/app/models/project.rb index 49d46a93a..df32bfcbd 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -68,6 +68,7 @@ class Project < ActiveRecord::Base has_one :course_extra, :class_name => 'Course', :foreign_key => :extra,:primary_key => :identifier, :dependent => :destroy has_many :applied_projects has_many :invite_lists + has_one :dts # end #ADDED BY NIE @@ -839,7 +840,7 @@ class Project < ActiveRecord::Base # Yields the given block for each project with its level in the tree def self.project_tree(projects, &block) ancestors = [] - projects.sort_by(&:lft).each do |project| + projects.sort_by(&:id).each do |project| while (ancestors.any? && !project.is_descendant_of?(ancestors.last)) ancestors.pop end diff --git a/app/models/student_work.rb b/app/models/student_work.rb index e2be18423..b95c11c11 100644 --- a/app/models/student_work.rb +++ b/app/models/student_work.rb @@ -7,6 +7,13 @@ class StudentWork < ActiveRecord::Base has_many :student_works_evaluation_distributions, :dependent => :destroy has_many :student_works_scores, :dependent => :destroy belongs_to :project + has_many :student_work_test + + before_destroy :delete_praise acts_as_attachable + + def delete_praise + PraiseTread.where("praise_tread_object_id = #{self.id} AND praise_tread_object_type = 'StudentWork'").destroy_all + end end diff --git a/app/models/student_work_test.rb b/app/models/student_work_test.rb new file mode 100644 index 000000000..2e6efdf0a --- /dev/null +++ b/app/models/student_work_test.rb @@ -0,0 +1,42 @@ +# encoding: utf-8 +class StudentWorkTest < ActiveRecord::Base + attr_accessible :student_work_id, :homework_test_id, :result + + belongs_to :homework_test + belongs_to :student_work + + def status_to_s + case self.result.to_i + when -1 + '编译出错' + when -2 + '答题错误' + when -3 + '答案错误' + when 1 + '运行出错' + when 2 + '超时' + when 3 + '内存超出' + when 4 + '输出超出' + when 5 + '禁用函数' + when 6 + '其他错误' + when 0 + '成功' + else + '未知错误' + end + end + + def test_score + if self.result.to_i == 0 + format("%.1f",100.0 / self.student_work.homework_common.homework_tests.count) + else + 0 + end + end +end diff --git a/app/models/user.rb b/app/models/user.rb index 5605ea038..11dc5e953 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -66,9 +66,9 @@ class User < Principal #每日一报、一事一报、不报 MAIL_NOTIFICATION_OPTIONS = [ - ['all', :label_user_mail_option_all], #['week', :label_user_mail_option_week], ['day', :label_user_mail_option_day], + ['all', :label_user_mail_option_all], ['none', :label_user_mail_option_none] ] diff --git a/app/models/user_extensions.rb b/app/models/user_extensions.rb index d9a0f520a..726918729 100644 --- a/app/models/user_extensions.rb +++ b/app/models/user_extensions.rb @@ -12,6 +12,8 @@ class UserExtensions < ActiveRecord::Base belongs_to :user belongs_to :school, :class_name => 'School', :foreign_key => :school_id attr_accessible :user_id,:birthday,:brief_introduction,:gender,:location,:occupation,:work_experience,:zip_code,:identity, :technical_title,:student_id + validates_length_of :description, :maximum => 255 + validates_length_of :brief_introduction, :maximum => 255 TEACHER = 0 STUDENT = 1 ENTERPRISE = 2 diff --git a/app/models/visitor.rb b/app/models/visitor.rb new file mode 100644 index 000000000..6563fde16 --- /dev/null +++ b/app/models/visitor.rb @@ -0,0 +1,3 @@ +class Visitor < ActiveRecord::Base + belongs_to :user +end \ No newline at end of file diff --git a/app/services/comment_service.rb b/app/services/comment_service.rb index 2464297da..62955905b 100644 --- a/app/services/comment_service.rb +++ b/app/services/comment_service.rb @@ -112,6 +112,9 @@ class CommentService end end - + # 获取课程里的某个通知的所有回复 + def notice_comments params,current_user + News.find(params[:notice_id]).comments.page(params[:page] || 1).per(10) + end end \ No newline at end of file diff --git a/app/services/courses_service.rb b/app/services/courses_service.rb index d4a197aff..185f448ce 100644 --- a/app/services/courses_service.rb +++ b/app/services/courses_service.rb @@ -4,6 +4,7 @@ class CoursesService include CoursesHelper include HomeworkAttachHelper include ApiHelper + include ActionView::Helpers::DateHelper #参数school_id为0或不传时返回所有课程,否则返回对应学校的课程 #参数per_page_count分页功能,每页显示的课程数 @@ -120,10 +121,10 @@ class CoursesService if current_user.nil? || !(current_user.admin? || @course.is_public == 1 || (@course.is_public == 0 && current_user.member_of_course?(@course))) raise '403' end - scope = @course ? @course.news.course_visible(current_user) : News.course_visible(current_user) + scope = @course ? @course.news.order("news.created_on desc").course_visible(current_user) : News.order("news.created_on desc").course_visible(current_user) news = [] scope.each do |n| - news << {:id => n.id,:title => n.title,:author_name => n.author.name,:author_id => n.author.id, :description => n.description,:created_on => format_time(n.created_on),:comments_count => n.comments_count} + news << {:id => n.id,:title => n.title,:author_name => n.author.name,:author_id => n.author.id, :author=>n.author, :description => n.description,:created_on => format_time(n.created_on),:comments_count => n.comments_count} end news end @@ -201,12 +202,14 @@ class CoursesService @course.class_period = params[:class_period].to_i params[:course][:is_public] ? @course.is_public = 1 : @course.is_public = 0 params[:course][:open_student] ? @course.open_student = 1 : @course.open_student = 0 + else + end @issue_custom_fields = IssueCustomField.sorted.all @trackers = Tracker.sorted.all - if @course.save + if @course && @course.save #unless User.current.admin? r = Role.givable.find_by_id(Setting.new_project_user_role_id.to_i) || Role.givable.first m = Member.new(:user => current_user, :roles => [r]) @@ -330,13 +333,13 @@ class CoursesService def homework_list params,current_user course = Course.find(params[:id]) if course.is_public != 0 || current_user.member_of_course?(course) - bids = course.homework_commons.order('end_time DESC') + bids = course.homework_commons.page(params[:page] || 1).per(20).order('created_at DESC') bids = bids.like(params[:name]) if params[:name].present? - homeworks = [] - bids.each do |bid| - homeworks << show_homework_info(course,bid,current_user,is_course_teacher(current_user,course)) - end - homeworks + homeworks = [] + bids.each do |bid| + homeworks << show_homework_info(course,bid,current_user,is_course_teacher(current_user,course)) + end + homeworks else raise '403' end @@ -432,24 +435,15 @@ class CoursesService # 课程课件 def course_attachments params result = [] - @course = Course.find(params[:course_id]) - @attachments = @course.attachments.order("created_on desc") + course = Course.find(params[:course_id]) + attachments = course.attachments.order("created_on ") if !params[:name].nil? && params[:name] != "" - @attachments.each do |atta| - result << {:filename => atta.filename, - :description => atta.description, - :downloads => atta.downloads, - :quotes => atta.quotes.nil? ? 0 :atta.quotes } if atta.filename.include?(params[:name]) + attachments.each do |atta| + result << atta if atta.filename.include?(params[:name]) end else - @attachments.each do |atta| - result << {:filename => atta.filename, - :description => atta.description, - :downloads => atta.downloads, - :quotes => atta.quotes.nil? ? 0 :atta.quotes } - - end + result = attachments end result end @@ -540,14 +534,46 @@ class CoursesService #student_questions_count = bid.journals_for_messages.where('m_parent_id IS NULL').count description = bid.description #if is_course_teacher(User.current, course) && @bid.open_anonymous_evaluation == 1 && @bid.homeworks.count >= 2 - state = bid.homework_detail_manual.comment_status - unless is_course_teacher - homework_for_anonymous_comments = get_student_batch_homework_list bid,current_user + #state = bid.homework_detail_manual.comment_status + if !bid.nil? + if bid.homework_type == 1 && bid.homework_detail_manual + case bid.homework_detail_manual.comment_status + when 1 + state = show_homework_deadline bid + when 2 + state = "正在匿评中" + when 3 + state = "匿评已结束" + end + elsif bid.homework_type == 0 + state = "未启用匿评" + elsif bid.homework_type == 2 + state = "编程作业" + else + end end + # studentlist = [] + # bid.student_works.order("created_at desc").page(1).per(6).each do |work| + # studentlist << work.user + # end + # unless is_course_teacher + # homework_for_anonymous_comments = get_student_batch_homework_list bid,current_user + # end #end open_anonymous_evaluation = bid.homework_detail_manual.comment_status - {:course_name => course.name,:course_id => course.id,:id => bid.id, :author => bid.user,:author_real_name => author_real_name, :homework_times => many_times, :homework_name => name, :homework_count => homework_count,:student_questions_count => 0, - :description => description, :homework_state => state,:open_anonymous_evaluation => open_anonymous_evaluation,:homework_for_anonymous_comments => homework_for_anonymous_comments,:created_on => bid.created_at,:deadline => bid.end_time} + {:course_name => course.name,:course_id => course.id,:id => bid.id, + :author => bid.user,:author_real_name => author_real_name, + :homework_times => many_times, :homework_name => name, + :homework_count => homework_count,:student_questions_count => 0, + :description => description, :homework_state => state, + :open_anonymous_evaluation => open_anonymous_evaluation, + #:homework_for_anonymous_comments => homework_for_anonymous_comments, + :created_on => bid.created_at,:deadline => bid.end_time, + :homework_notsubmit_num => bid.course.members.count - bid.student_works.count, + :homework_submit_num => bid.student_works.count, + :homework_status_student => get_homework_status( bid),:homework_status_teacher => homework_status_desc( bid), + :student_evaluation_part => get_evaluation_part( bid ,3), + :ta_evaluation_part => get_evaluation_part( bid ,2),:homework_anony_type => bid.homework_type == 1 && !bid.homework_detail_manual.nil?} end @@ -615,9 +641,226 @@ class CoursesService homework_scores end + #app新版api + # + # + #课程动态 + public + def all_course_dynamics params, current_user + #获取当前用户的所有课程 + @user = User.find(params[:id]) + if current_user.nil? && !current_user.admin? && !@user.active? + raise '404' + return + end + if current_user == @user || current_user.admin? + membership = @user.coursememberships.page(1).per(15) + else + membership = @user.coursememberships.page(1).per(15).all(:conditions => Course.visible_condition(current_user)) + end + if membership.nil? || membership.count == 0 + raise l(:label_no_courses, :locale => get_user_language(current_user)) + end + membership.sort! { |older, newer| newer.created_on <=> older.created_on } + + #定义一个数组集合,存放hash数组,该hash数组包括课程的信息,并包含课程的最新发布的资源,最新的讨论区留言,最新的作业,最新的通知 + result = [] + #对用户所有的课程进行循环,找到每个课程最新发布的资源,最新的讨论区留言,最新的作业,最新的通知,并存进数组 + membership.each do |mp| + course = mp.course + latest_course_dynamics = [] + # 课程通知 + latest_news = course.news.page(1).per(2).order("created_on desc") + unless latest_news.first.nil? + latest_course_dynamics << {:type => 1, :time => latest_news.first.created_on,:count=>course.news.count, + :news => latest_news.all} + end + # 课程讨论区 + latest_message = course.boards.first.topics.page(1).per(2) + unless latest_message.first.nil? + latest_course_dynamics << {:type => 2, :time => latest_message.first.created_on, :count =>course.boards.nil? ? 0 : course.boards.first.topics.count, + :topics => latest_message.all} + end + + # 课程资源 + # latest_attachment = course.attachments.order("created_on desc").page(1).per(2) + # unless latest_attachment.first.nil? + # latest_course_dynamics << {:type => 3, :time => latest_attachment.first.created_on,:count =>course.attachments.count , :documents=>latest_attachment} + # dynamics_count += 1 + # end + #课程作业 已经交的学生列表(暂定显示6人),未交的学生列表,作业的状态 + homeworks = course.homework_commons.page(1).per(2).order('created_at desc') + unless homeworks.first.nil? + latest_course_dynamics << {:type => 4, :time => homeworks.first.updated_at, :count=>course.homework_commons.count , :homeworks => homeworks} + end + latest_course_dynamics.sort! { |order, newer| newer[:time] <=> order[:time] } + # 课程学霸 学生总分数排名靠前的5个人 + homework_count = course.homework_commons.count + sql = "select users.*,ROUND(sum(student_works.final_score),2) score from student_works left outer join users on student_works.user_id = users.id" << + " where homework_common_id in ( select id from homework_commons where homework_commons.course_id = #{course.id}) GROUP BY student_works.user_id ORDER BY score desc limit 0,4" + better_students = User.find_by_sql(sql) + # 找出在课程讨论区发帖回帖数最多的 + active_students = [] + sql1 = " select users.*,count(author_id)*2 active_count from messages " << + " LEFT JOIN users on messages.author_id = users.id " << + " where messages.board_id in (select id from boards where boards.course_id = #{course.id} ) " << + " GROUP BY messages.author_id ORDER BY count(author_id) desc " << + " limit 0,4" + active_students = User.find_by_sql(sql1) + if homework_count != 0 && !better_students.empty? + latest_course_dynamics <<{:type=> 6,:time=>"1970-01-01 0:0:0 +0800",:count=> 4,:better_students=> better_students} + end + unless active_students.empty? + latest_course_dynamics <<{:type=> 7,:time=>"1970-01-01 0:0:0 +0800",:count=> 4,:active_students=>active_students} + end + latest_course_dynamic = latest_course_dynamics.first + unless latest_course_dynamic.nil? + result << {:course_name => course.name,:current_user_is_member => current_user.member_of_course?(course),:current_user_is_teacher => is_course_teacher(current_user,course), :course_id => course.id, :course_img_url => url_to_avatar(course), :course_time => course.time, :course_term => course.term,:message => "", :dynamics => latest_course_dynamics, + :course_student_num=>course ? course.members.count : 0,:time_from_now=> distance_of_time_in_words(Time.now, latest_course_dynamic[:time].to_time) << "前",:time=>latest_course_dynamic[:time].to_time} + end + end + #返回数组集合 + result.sort! { |order, newer| newer[:time] <=> order[:time] } + result + end + + # 获取课程历次作业的学生总成绩 + def students_score_list params,current_user + page = (params[:page] || 1) - 1 + user_list = [] + max_size = 0 + if params[:type] == 1 + + sql = "select users.*,ROUND(sum(student_works.final_score),2) score from student_works left outer join users on student_works.user_id = users.id" << + " where homework_common_id in ( select id from homework_commons where homework_commons.course_id = #{params[:course_id]}) GROUP BY student_works.user_id ORDER BY score desc limit #{page*10},10" + sql_count = " select count(distinct(student_works.user_id) ) " << + " from student_works left outer join users on student_works.user_id = users.id " << + " where homework_common_id in " << + " ( select id from homework_commons where homework_commons.course_id = #{params[:course_id]}) " + max_size = ActiveRecord::Base.connection().select_value(sql_count) + user_list = User.find_by_sql(sql) + else + sql1 = " select users.*,count(author_id)*2 active_count from messages " << + " LEFT JOIN users on messages.author_id = users.id " << + " where messages.board_id in (select id from boards where boards.course_id = #{params[:course_id]} ) " << + " GROUP BY messages.author_id ORDER BY count(author_id) desc " << + " limit #{page*10},10" + sql1_count = " select count(DISTINCT(messages.author_id))" << + " from messages LEFT JOIN users on messages.author_id = users.id " << + " where messages.board_id in (select id from boards where boards.course_id = #{params[:course_id]} )" + max_size = ActiveRecord::Base.connection().select_value(sql1_count) + user_list = User.find_by_sql(sql1) + end + {:user_list=>user_list,:max_size=>max_size} + end + + # 获取某次作业的所有作业列表 + def student_work_list params,current_user + is_teacher = current_user.allowed_to?(:as_teacher,Course.find(params[:course_id])) + homework = HomeworkCommon.find(params[:homework_id]) + student_works = [] + #老师 || 非匿评作业 || 匿评结束 显示所有的作品 + show_all = is_teacher || homework.homework_type != 1 || homework.homework_detail_manual.comment_status == 3 + if show_all + if homework.homework_type == 1 || is_teacher || current_user.admin? + student_works = homework.student_works.page(params[:page] || 1).per(10).order("final_score desc ") + else + my_work = homework.student_works.where(:user_id => current_user.id) + if my_work.empty? + student_works = [] + else + student_works = homework.student_works.page(params[:page] || 1).per(10).order("final_score desc") + end + end + else #学生 + if homework.homework_detail_manual.comment_status == 1 #未开启匿评,只显示我的作品 + student_works = homework.student_works.where(:user_id => current_user.id).page(params[:page] || 1).per(10) + elsif homework.homework_detail_manual.comment_status == 2 #匿评列表,显示匿评作品和我的作品 + #is_evaluation = true + my_work = homework.student_works.where(:user_id => current_user.id).page(params[:page] || 1).per(10) + student_works = my_work + current_user.student_works_evaluation_distributions.map(&:student_work).select { |work| work.homework_common_id == homework.id} + end + end + student_works + end + + # 获取课程的讨论区信息 + def board_message_list params,current_user + # 课程讨论区 + course = Course.find(params[:course_id]) + latest_message = course.boards.first.topics.page(params[:page] || 1).per(10) + end + + #获取回复列表 + def board_message_reply_list params,current_user + board = Board.find(params[:board_id]) + reply_list = board.topics.where("id = #{params[:msg_id]}").first.children.order("created_on desc").page(params[:page] || 1).per(10) + end + + #回复讨论区 + def board_message_reply params,current_user + author = Message.find(params[:parent_id]).author + quote = "
" << author.realname << "(" << author.nickname << ")写到:
" << params[:quote] <<"
" + reply = Message.new + reply.author = current_user + reply.board = Board.find(params[:board_id]) + params[:reply] = {} + params[:reply][:subject] = params[:subject] #本回复标题 + params[:reply][:content] = params[:content] #本回复内容 + params[:reply][:quote] = {} + params[:reply][:quote][:quote] = params[:quote] #本回复引用的内容,也是父id内容 + params[:reply][:parent_topic] = params[:parent_id] # 父id + params[:reply][:board_id] = params[:board_id] #讨论区id + params[:reply][:id] = params[:root_id] #根id + reply.safe_attributes = params[:reply] + if params[:root_id] == params[:parent_id] + reply.content = reply.content + else + reply.content = quote + reply.content + end + + Message.find(params[:root_id]).children << reply + reply + end + # # 开启匿评 + # #statue 1:启动成功,2:启动失败,作业总数大于等于2份时才能启动匿评,3:已开启匿评,请务重复开启,4:没有开启匿评的权限 + # def start_anonymous_comment params,current_user + # homework = HomeworkCommon.find(params[:homework_id]) + # return {:status=>4} unless current_user.admin? || current_user.allowed_to?(:as_teacher,Course.find(params[:course_id])) + # return {:status=>5} if Time.parse(homework.end_time.to_s).strftime("%Y-%m-%d") >= Time.now.strftime("%Y-%m-%d") + # homework_detail_manual = homework.homework_detail_manual + # if homework_detail_manual.comment_status == 1 + # student_works = homework.student_works + # if student_works && student_works.size >=2 + # student_works.each_with_index do |work, index| + # user = work.user + # n = homework_detail_manual.evaluation_num + # n = n < student_works.size ? n : student_works.size - 1 + # assigned_homeworks = get_assigned_homeworks(student_works, n, index) + # assigned_homeworks.each do |h| + # student_works_evaluation_distributions = StudentWorksEvaluationDistribution.new(user_id: user.id, student_work_id: h.id) + # student_works_evaluation_distributions.save + # end + # end + # homework_detail_manual.update_column('comment_status', 2) + # statue = 1 + # else + # statue = 2 + # end + # else + # statue = 3 + # end + # {:status => statue} + # end + # + # def get_assigned_homeworks(student_works, n, index) + # student_works += student_works + # student_works[index + 1 .. index + n] + # end + +end -end \ No newline at end of file diff --git a/app/services/homework_service.rb b/app/services/homework_service.rb index 2a2c6613c..dd42795b1 100644 --- a/app/services/homework_service.rb +++ b/app/services/homework_service.rb @@ -57,47 +57,97 @@ class HomeworkService [@bid,@totle_size,@cur_size,@percent] end - #启动匿评 - #statue 1:启动成功,2:启动失败,作业总数大于等于2份时才能启动匿评,3:已开启匿评,请务重复开启 - def start_anonymous_comment params,current_user - @bid = Bid.find(params[:id]) - @course = @bid.courses.first - unless is_course_teacher(current_user,@course) || current_user.admin? - @statue = 4 - raise '403' - end - if(@bid.comment_status == 0) - homeworks = @bid.homeworks - if(homeworks && homeworks.size >= 2) - homeworks.each_with_index do |homework, index| - user = homework.user - n = @bid.evaluation_num - n = n < homeworks.size ? n : homeworks.size - 1 - assigned_homeworks = get_assigned_homeworks(homeworks, n, index) - assigned_homeworks.each do |h| - @homework_evaluation = HomeworkEvaluation.new(user_id: user.id, homework_attach_id: h.id) - @homework_evaluation.save - end - end - @bid.update_column('comment_status', 1) - @statue = 1 - else - @statue = 2 - end - else - @statue = 3 - end - @statue - end - #关闭匿评 - def stop_anonymous_comment params,current_user - @bid = Bid.find(params[:id]) - @course = @bid.courses.first - unless is_course_teacher(current_user,@course) || current_user.admin? - raise '403' - end - @bid.update_column('comment_status', 2) - end + # 启动匿评 操作 逻辑改变,暂不删除 + # #启动匿评 + # #statue 1:启动成功,2:启动失败,作业总数大于等于2份时才能启动匿评,3:已开启匿评,请务重复开启 + # def start_anonymous_comment params,current_user + # @bid = Bid.find(params[:id]) + # @course = @bid.courses.first + # unless is_course_teacher(current_user,@course) || current_user.admin? + # @statue = 4 + # raise '403' + # end + # if(@bid.comment_status == 0) + # homeworks = @bid.homeworks + # if(homeworks && homeworks.size >= 2) + # homeworks.each_with_index do |homework, index| + # user = homework.user + # n = @bid.evaluation_num + # n = n < homeworks.size ? n : homeworks.size - 1 + # assigned_homeworks = get_assigned_homeworks(homeworks, n, index) + # assigned_homeworks.each do |h| + # @homework_evaluation = HomeworkEvaluation.new(user_id: user.id, homework_attach_id: h.id) + # @homework_evaluation.save + # end + # end + # @bid.update_column('comment_status', 1) + # @statue = 1 + # else + # @statue = 2 + # end + # else + # @statue = 3 + # end + # @statue + # end + # #关闭匿评 + # def stop_anonymous_comment params,current_user + # @bid = Bid.find(params[:id]) + # @course = @bid.courses.first + # unless is_course_teacher(current_user,@course) || current_user.admin? + # raise '403' + # end + # @bid.update_column('comment_status', 2) + # end + + # 开启匿评 + #statue 1:启动成功,2:启动失败,作业总数大于等于2份时才能启动匿评,3:已开启匿评,请务重复开启,4:没有开启匿评的权限 + def start_anonymous_comment params,current_user + homework = HomeworkCommon.find(params[:homework_id]) + return {:status=> 4} unless current_user.admin? || current_user.allowed_to?(:as_teacher,Course.find(params[:course_id])) + return {:status=>5} if Time.parse(homework.end_time.to_s).strftime("%Y-%m-%d") >= Time.now.strftime("%Y-%m-%d") + homework_detail_manual = homework.homework_detail_manual + if homework_detail_manual.comment_status == 1 + student_works = homework.student_works + if student_works && student_works.size >=2 + student_works.each_with_index do |work, index| + user = work.user + n = homework_detail_manual.evaluation_num + n = n < student_works.size ? n : student_works.size - 1 + assigned_homeworks = get_assigned_homeworks(student_works, n, index) + assigned_homeworks.each do |h| + student_works_evaluation_distributions = StudentWorksEvaluationDistribution.new(user_id: user.id, student_work_id: h.id) + student_works_evaluation_distributions.save + end + end + homework_detail_manual.update_column('comment_status', 2) + statue = 1 + else + statue = 2 + end + else + statue = 3 + end + {:status => statue} + end + + def get_assigned_homeworks(student_works, n, index) + student_works += student_works + student_works[index + 1 .. index + n] + end + + def stop_anonymous_comment params,current_user + homework = HomeworkCommon.find(params[:homework_id]) + homework_detail_manual = homework.homework_detail_manual + homework_detail_manual.update_column('comment_status', 3) + + work_ids = "(" << homework.student_works.map(&:id).join(",") << ")" + homework.student_works.each do |student_work| + absence_penalty_count = student_work.user.student_works_evaluation_distributions.where("student_work_id IN #{work_ids}").count - student_work.user.student_works_scores.where("student_work_id IN #{work_ids}").count + student_work.absence_penalty = absence_penalty_count > 0 ? absence_penalty_count * homework_detail_manual.absence_penalty : 0 + student_work.save + end + end # 匿评作品详情 # attachs 该作品的所有附件 diff --git a/app/views/admin/courses.html.erb b/app/views/admin/courses.html.erb new file mode 100644 index 000000000..1615bccbc --- /dev/null +++ b/app/views/admin/courses.html.erb @@ -0,0 +1,76 @@ +
+ <%= link_to l(:label_course_new), {:controller => 'courses', :action => 'new'}, :class => 'icon icon-add' %> +
+ +

+ <%=l(:label_course_all)%> +

+ +<%= form_tag({}, :method => :get) do %> +
+ + <%= text_field_tag 'name', params[:name], :size => 30, :placeholder => '课程名称' %> + <%= submit_tag l(:button_apply), :class => "small", :name => nil %> + + <%= l(:button_clear)%> + +
+<% end %> +  + +
+ + + + + + + + + + + + + <% @courses.each do |course| %> + "> + + + + + + + + <% end %> + +
+ 序号 + + 课程 + + 主讲老师 + + 学时 + + <%=l(:field_is_public)%> + + <%=l(:field_created_on)%> +
+ <%= course.id %> + + + <%= link_to(course.name, course_path(course.id)) %> + + + <%= link_to(course.try(:teacher).try(:realname).truncate(6, omission: '...'), user_path(course.teacher)) %> + + <%= course.class_period %> + + <%= checked_image course.is_public? %> + + <%= format_date(course.created_at) %> +
+
+ +<% html_title(l(:label_course_all)) -%> diff --git a/app/views/admin/projects.html.erb b/app/views/admin/projects.html.erb index 4c9479a6d..f5b7955bf 100644 --- a/app/views/admin/projects.html.erb +++ b/app/views/admin/projects.html.erb @@ -1,5 +1,5 @@
-<%= link_to l(:label_project_new), {:controller => 'projects', :action => 'new'}, :class => 'icon icon-add' %> + <%= link_to l(:label_project_new), {:controller => 'projects', :action => 'new'}, :class => 'icon icon-add' %>

@@ -7,62 +7,70 @@

<%= form_tag({}, :method => :get) do %> -
- +
+ <%= l(:label_filter_plural) %> - - - <%= select_tag 'status', project_status_options_for_select(@status), :class => "small", :onchange => "this.form.submit(); return false;" %> - - <%= text_field_tag 'name', params[:name], :size => 30 %> - <%= submit_tag l(:button_apply), :class => "small", :name => nil %> - <%= link_to l(:button_clear), {:controller => 'admin', :action => 'projects'}, :class => 'icon icon-reload' %> -
+
+ + <%= select_tag 'status', project_status_options_for_select(@status), :class => "small", :onchange => "this.form.submit(); return false;" %> + + <%= text_field_tag 'name', params[:name], :size => 30 %> + <%= submit_tag l(:button_apply), :class => "small", :name => nil %> + <%= link_to l(:button_clear), {:controller => 'admin', :action => 'projects'}, :class => 'icon icon-reload' %> +
<% end %>  
- - - - - - - - -<% project_tree(@projects) do |project, level| %> - <%= project.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>"> - - - - - -<% end %> - -
- <%=l(:label_project)%> - - <%=l(:field_is_public)%> - - <%=l(:field_created_on)%> -
- - <%= link_to_project_settings(project, {}) %> - - - <%= checked_image project.is_public? %> - - <%= format_date(project.created_on) %> - - <%= link_to(l(:button_archive), { :controller => 'projects', :action => 'archive', :id => project, :status => params[:status] }, :data => {:confirm => l(:text_are_you_sure)}, :method => :post, :class => 'icon icon-lock') unless project.archived? %> - <%= link_to(l(:button_unarchive), { :controller => 'projects', :action => 'unarchive', :id => project, :status => params[:status] }, :method => :post, :class => 'icon icon-unlock') if project.archived? && (project.parent.nil? || !project.parent.archived?) %> - <%= link_to(l(:button_copy), { :controller => 'projects', :action => 'copy', :id => project }, :class => 'icon icon-copy') %> - <%= link_to(l(:button_delete), project_path(project), :method => :delete, :class => 'icon icon-del') %> -
+ + + + + + + + + + + + <% project_tree(@projects) do |project, level| %> + <%= project.css_classes %> <%= level > 0 ? "idnt idnt-#{level}" : nil %>"> + + + + + + + <% end %> + +
+ 序号 + + <%=l(:label_project)%> + + <%=l(:field_is_public)%> + + <%=l(:field_created_on)%> +
+ <%= project.id %> + + + <%= link_to_project_settings(project, {}) %> + + + <%= checked_image project.is_public? %> + + <%= format_date(project.created_on) %> + + <%= link_to(l(:button_archive), { :controller => 'projects', :action => 'archive', :id => project, :status => params[:status] }, :data => {:confirm => l(:text_are_you_sure)}, :method => :post, :class => 'icon icon-lock') unless project.archived? %> + <%= link_to(l(:button_unarchive), { :controller => 'projects', :action => 'unarchive', :id => project, :status => params[:status] }, :method => :post, :class => 'icon icon-unlock') if project.archived? && (project.parent.nil? || !project.parent.archived?) %> + <%= link_to(l(:button_copy), { :controller => 'projects', :action => 'copy', :id => project }, :class => 'icon icon-copy') %> + <%= link_to(l(:button_delete), project_path(project), :method => :delete, :class => 'icon icon-del') %> +
<% html_title(l(:label_project_plural)) -%> diff --git a/app/views/avatar/upload.js.erb b/app/views/avatar/upload.js.erb index 1fa90c5a3..41cf3ab77 100644 --- a/app/views/avatar/upload.js.erb +++ b/app/views/avatar/upload.js.erb @@ -1,4 +1,8 @@ +<% if @source_type=='User' %> +var imgSpan = $("img[nhname='avatar_image']"); +imgSpan.attr({"src":'<%= "#{@urlfile.to_s}?#{Time.now.to_i}" %>'}); +<% else %> var imgSpan = jQuery('#avatar_image'); imgSpan.attr({"src":'<%= "#{@urlfile.to_s}?#{Time.now.to_i}" %>'}); - +<% end %> \ No newline at end of file diff --git a/app/views/bids/new_contest.html.erb b/app/views/bids/new_contest.html.erb index 216816bd1..899aea1e7 100644 --- a/app/views/bids/new_contest.html.erb +++ b/app/views/bids/new_contest.html.erb @@ -1,10 +1,10 @@ - -

<%=l(:label_newtype_contest)%>

+ + -<%= labelled_form_for @bid, :url => {:controller => 'bids', :action => 'create_contest'} do |f| %> -
- <%= render :partial => 'form_contest', :locals => { :f => f } %> - <%= submit_tag l(:button_create) %> - <%= javascript_tag "$('#bid_name').focus();" %> - <% end %> -
\ No newline at end of file + + + + + + + \ No newline at end of file diff --git a/app/views/boards/_course_show.html.erb b/app/views/boards/_course_show.html.erb index 7eed593d9..b8bbf3d63 100644 --- a/app/views/boards/_course_show.html.erb +++ b/app/views/boards/_course_show.html.erb @@ -32,33 +32,31 @@
<% end %> -

讨论区共有<%= @topic_count %>个帖子

+

讨论区共有<%= @topic_count %>个帖子

<% if @topics.any? %> <% @topics.each do |topic| %>
<%= link_to image_tag(url_to_avatar(topic.author), :width=>"42",:height=>"42"), user_path(topic.author),:class =>'talkmain_pic fl' %> -
+
<% author = topic.author.to_s %> -
- <%= link_to author, user_path(topic.author), :class =>"talkmain_name fl ",:title=>author, - :style=>'max-width:60px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;' %> +
+ <%= link_to User.current.member_of_course?(@board.course) ? "#{topic.author.show_name}(#{topic.author.login})" : "#{topic.author}" , user_path(topic.author), + :class =>"talkmain_name fl f14",:title=>author, + :style=>'max-width:120px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;' %>

  :

-

  <%= h(topic.subject) %>

+

  <%= h(topic.subject) %>

<% if topic.course_editable_by?(User.current) %> <%= l(:button_edit) %> <% end %> - <%= link_to( - l(:button_delete), - {:controller =>'messages',:action => 'destroy', :id => topic.id, :board_id => topic.board_id, :is_board=>'true'}, - :method => :post, - :data => {:confirm => l(:text_are_you_sure)}, - :class => 'talk_edit fr', - :style => ' margin-right: 10px;' - ) if topic.destroyable_by?(User.current) %> + <%= link_to(l(:button_delete), {:controller =>'messages',:action => 'destroy', :id => topic.id, :board_id => topic.board_id, :is_board=>'true'}, + :method => :post, + :data => {:confirm => l(:text_are_you_sure)}, + :class => 'talk_edit fr', + :style => ' margin-right: 10px;') if topic.destroyable_by?(User.current) %> <% if topic.sticky? %> <%= l(:label_board_sticky)%> @@ -70,31 +68,41 @@ //解决由于图片加载慢造成div高度不够 以至于展开按钮不显示的bug $(function(){ function nh_show_btn(){ - if($("#contentmessage<%=topic.id %>").height()>182){ - $("#project_show_<%= topic.id%>").show(); + if($("#project_show_<%= topic.id%>").is(':hidden')){ + if($("#contentmessage<%=topic.id %>").height()>182){ + $("#project_show_<%= topic.id%>").show(); + } } } var div = $("#contentmessage<%=topic.id %>"); var imgs = $('img',div); var lens = imgs.length; function nh_load_img_end(){ - lens--; - if(lens <= 0){ - nh_show_btn(); - } - } - if(lens <= 0){ nh_show_btn(); - }else{ +// lens--; +// if(lens <= 0){ +// nh_show_btn(); +// } + } + if(lens > 0){ $('img',div).load(function(){ nh_load_img_end(); }); } + nh_show_btn(); +// if(lens <= 0){ +// nh_show_btn(); +// }else{ +// $('img',div).load(function(){ +// nh_load_img_end(); +// }); +// } }); -
+
<%= topic.content.html_safe %> +
@@ -112,7 +120,7 @@ <%= l(:label_activity_time)%>:  <%= format_time topic.created_on %>
- <%= l(:button_reply) %> + <%= l(:button_reply) %>
@@ -153,14 +161,17 @@ <% replies_all.each do |message| %> <% replies_all_i=replies_all_i+1 %>
  • - <%= link_to image_tag(url_to_avatar(message.author), :width => '34',:height => '34'), user_path(message.author), :class =>'Msg_pic' %> + <%= link_to image_tag(url_to_avatar(message.author), :width => '34',:height => '34'), user_path(message.author), :class => 'Msg_pic' %>
    - <%= link_to_user_header message.author,false,:class => 'fl c_orange ' %> + <%= link_to User.current.member_of_course?(@board.course) ? "#{message.author.show_name}(#{message.author.login})" : "#{message.author}", user_path(message.author),:class => 'fl c_orange f14 ' %>
    -
    <%= textAreailizable message,:content,:attachments => message.attachments %>
    +
    + <%= textAreailizable message,:content,:attachments => message.attachments %> + +

    - <%= format_time(message.created_on) %> + <%= format_time(message.created_on) %> <%= link_to( l(:button_delete), @@ -168,13 +179,13 @@ :method => :post, :data => {:confirm => l(:text_are_you_sure)}, :title => l(:button_delete), - :class => ' c_dblue fr' + :class => ' c_dblue fr f14' ) if message.course_destroyable_by?(User.current) %> <%= link_to( l(:button_reply), 'javascript:;', :nhname =>'showbtn_child_reply', - :class => ' c_dblue fr', + :class => ' c_dblue fr f14', :style => 'margin-right: 10px;', 'data-topic-id' =>message.id, :title => l(:button_reply)) if !topic.locked? && authorize_for('messages', 'reply') %> diff --git a/app/views/boards/_project_show.html.erb b/app/views/boards/_project_show.html.erb index bb36c6f19..bc69e2666 100644 --- a/app/views/boards/_project_show.html.erb +++ b/app/views/boards/_project_show.html.erb @@ -13,10 +13,10 @@
    <% if !User.current.logged? %> -
    - <%= l(:label_user_login_project_board) %> - <%= link_to l(:label_user_login_new), signin_path, :class => "c_blue ml5" %> -
    +
    + <%= l(:label_user_login_project_board) %> + <%= link_to l(:label_user_login_new), signin_path, :class => "c_blue ml5" %> +
    <% end %>
    @@ -28,157 +28,160 @@
  • -

    讨论区共有<%= @topic_count %>个帖子

    +

    讨论区共有<%= @topic_count %>个帖子

    <% if @topics.any? %> - <% @topics.each do |topic| %> -
    - <%= link_to image_tag(url_to_avatar(topic.author), :width=>"42",:height=>"42"), user_path(topic.author),:class =>'talkmain_pic fl' %> -
    - <% author = topic.author.to_s %> -
    - <%= link_to author, user_path(topic.author), :class =>"talkmain_name fl ",:title=>author, - :style=>'max-width:60px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;' %> -
    -

      :

    + <% @topics.each do |topic| %> +
    + <%= link_to image_tag(url_to_avatar(topic.author), :width=>"42",:height=>"42"), user_path(topic.author),:class =>'talkmain_pic fl' %> +
    + <% author = topic.author.to_s %> +
    + <%= link_to author, user_path(topic.author), :class =>"talkmain_name fl f14",:title=>author, + :style=>'max-width:80px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;' %> +
    +

      :

    -

      <%= h(topic.subject) %>

    -
    - <% if topic.editable_by?(User.current) %> - <%= l(:button_edit) %> - <% end %> - <%= link_to( - l(:button_delete), - {:controller =>'messages',:action => 'destroy', :id => topic.id, :board_id => topic.board_id, :is_board=>'true'}, - :method => :post, - :data => {:confirm => l(:text_are_you_sure)}, - :class => 'talk_edit fr', - :style => ' margin-right: 10px;' - ) if topic.destroyable_by?(User.current) %> - <% if topic.sticky? %> - <%= l(:label_board_sticky)%> - <% end %> - -
    -
    -
    -
    - <%= topic.content.html_safe %> + + +
    +
    +
    + <%= topic.content.html_safe %> + +
    +
    + + <%= link_to_attachments_course topic, :author => false %> + <%= l(:label_activity_time)%>:  <%= format_time topic.created_on %>
    -
    - - <%= link_to_attachments_course topic, :author => false %> - <%= l(:label_activity_time)%>:  <%= format_time topic.created_on %> -
    - <% if User.current.logged? %> - <%= l(:button_reply) %> - <% end %> -
    - -
    -
    - <% reply = Message.new(:subject => "RE: #{topic.subject}")%> - <% if !topic.locked? && authorize_for('messages', 'reply') %> - -
    - <% end %> +
    + <% end %> <% else %>

    <%= l(:label_no_data) %>

    <% end %> @@ -198,78 +201,78 @@
    \ No newline at end of file diff --git a/app/views/contestnotifications/_form.html.erb b/app/views/contestnotifications/_form.html.erb index dc651501b..680ab93d1 100644 --- a/app/views/contestnotifications/_form.html.erb +++ b/app/views/contestnotifications/_form.html.erb @@ -50,9 +50,6 @@ } } -
    - <%= l(:bale_news_notice) %> -

    <%= f.text_field :title, diff --git a/app/views/courses/_history.html.erb b/app/views/courses/_history.html.erb index e5f5fc0ec..864509546 100644 --- a/app/views/courses/_history.html.erb +++ b/app/views/courses/_history.html.erb @@ -1,55 +1,56 @@ <% reply_allow = JournalsForMessage.create_by_user? User.current %> - <% if journals.size > 0 %> - <% for journal in journals %> -

    -
    - <%= link_to image_tag(url_to_avatar(journal.user),:width => '46',:height => '46'), user_path(journal.user) %> -
    -
    -
    - +<% if journals.size > 0 %> + <% for journal in journals %> +
    +
    + <%= link_to image_tag(url_to_avatar(journal.user),:width => '46',:height => '46'), user_path(journal.user) %> +
    +
    +
    + - <%= link_to journal.user, user_path(journal.user),:class => 'c_blue fb fl mb10', :target => "_blank"%> + <%= link_to "#{journal.user.show_name}(#{journal.user.login})", user_path(journal.user),:class => 'c_blue fb fl mb10 f14', :target => "_blank"%> - + <%= format_time(journal.created_on) %> -
    -

    - <%= journal.notes.html_safe %> -

    -
    -
    - <% ids = 'project_respond_form_'+ journal.id.to_s%> - - <% if journal.user == User.current|| User.current.admin? || (@course && User.current.allowed_to?(:as_teacher,@course)) %> - <%= link_to(l(:label_bid_respond_delete), - {:controller => 'words', :action => 'destroy', :object_id => journal, :user_id => @user}, - :remote => true, :confirm => l(:text_are_you_sure), :method => 'delete', - :class => "delete", :title => l(:button_delete)) %> - <% end %> - <% if reply_allow %> - <%#= link_to l(:label_bid_respond_quote),'', - {:focus => 'project_respond',:nhname=>"reply_btn", :onclick => "toggleAndSettingWordsVal($('##{ids}'), $('##{ids} textarea')); $('##{ids} textarea') ;return false;"} %> - <%= link_to l(:label_bid_respond_quote),'javascript:;',{:nhname=>"reply_btn"} %> - <% end %> -
    -
    - <% ids = 'project_respond_form_'+ journal.id.to_s%> - <% if reply_allow %> -
    - <%= render :partial => 'words/new_respond_course', :locals => {:journal => journal, :m_reply_id => journal,:show_name => true} %> -
    - <% end %> -
    - - <%= render :partial => "words/journal_reply", :locals => {:journal => journal, :show_name => true, :allow_delete => @course && User.current.allowed_to?(:as_teacher,@course)} %> - -
    +
    +

    + <%= journal.notes.html_safe %> +

    - <% end %> +
    + <% ids = 'project_respond_form_'+ journal.id.to_s%> + + <% if journal.user == User.current|| User.current.admin? || (@course && User.current.allowed_to?(:as_teacher,@course)) %> + <%= link_to(l(:label_bid_respond_delete), + {:controller => 'words', :action => 'destroy', :object_id => journal, :user_id => @user}, + :remote => true, :confirm => l(:text_are_you_sure), :method => 'delete', + :class => "delete", :title => l(:button_delete)) %> + <% end %> + <% if reply_allow %> + <%#= link_to l(:label_bid_respond_quote),'', + {:focus => 'project_respond',:nhname=>"reply_btn", :onclick => "toggleAndSettingWordsVal($('##{ids}'), $('##{ids} textarea')); $('##{ids} textarea') ;return false;"} %> + <%= link_to l(:label_bid_respond_quote),'javascript:;',{:nhname=>"reply_btn"} %> + <% end %> +
    +
    + <% ids = 'project_respond_form_'+ journal.id.to_s%> + <% if reply_allow %> +
    + <%= render :partial => 'words/new_respond_course', :locals => {:journal => journal, :m_reply_id => journal,:show_name => true} %> +
    + <% end %> +
    + + <%= render :partial => "words/journal_reply", :locals => {:journal => journal, :show_name => true, :allow_delete => @course && User.current.allowed_to?(:as_teacher,@course)} %> + +
    +
    +
    <% end %> +<% end %> diff --git a/app/views/courses/_new_groups_name.html.erb b/app/views/courses/_new_groups_name.html.erb index da599ef5a..39fa33677 100644 --- a/app/views/courses/_new_groups_name.html.erb +++ b/app/views/courses/_new_groups_name.html.erb @@ -21,7 +21,7 @@ 删除班级 <% end%> - + 编辑班级 <% end %> @@ -42,7 +42,7 @@ <% if @canShowCode %>
  • - +添加分班 + +添加分班
  • 作业名称得分
  • <% @member_score.homework_common_list.each do |homework_common| %>
  • - + <%= homework_common.name %> @@ -28,7 +28,7 @@
  • <% end %> -
  • 作业积分(平均分)<%= @member_score.student_work_score_avg %>
  • +
  • 作业积分(总分)<%= @member_score.student_work_score_sum %>
  • diff --git a/app/views/courses/finishcourse.js.erb b/app/views/courses/finishcourse.js.erb index 2399062fd..0ca89aa19 100644 --- a/app/views/courses/finishcourse.js.erb +++ b/app/views/courses/finishcourse.js.erb @@ -1,8 +1,8 @@ <% if @save_flag %> - $('#finish_course_<%=@course.id%>').replaceWith("<%= escape_javascript(set_course_time(@course_prefs))%>"); +$('#finish_course_<%=@course.id%>').replaceWith("<%= escape_javascript(set_course_time(@course_prefs))%>"); +var html = "<%= escape_javascript( render( :partial => 'users/course_form', :locals => {:item => @course_prefs} ) )%>"; +$('#nh_course_<%=@course.id%>').replaceWith(html); // alert("关闭成功"); <% else %> - alert('权限不足,设置失败,请在论坛提交问题,等待管理员处理。'); -<% end %> - - +alert('权限不足,设置失败,请在论坛提交问题,等待管理员处理。'); +<% end %> \ No newline at end of file diff --git a/app/views/courses/join_private_courses.js.erb b/app/views/courses/join_private_courses.js.erb index 23dc551f7..d1bce7d86 100644 --- a/app/views/courses/join_private_courses.js.erb +++ b/app/views/courses/join_private_courses.js.erb @@ -1,7 +1,8 @@ $('#ajax-modal').html('<%= escape_javascript(render :partial => 'join_private_course') %>'); -showModal('ajax-modal', '510px'); +showModal('ajax-modal', '540px'); $('#ajax-modal').css('height','330px'); -$('#ajax-modal').siblings().remove(); +//$('#ajax-modal').siblings().remove(); +$('#ajax-modal').siblings().hide(); $('#ajax-modal').before("" + ""); $('#ajax-modal').parent().removeClass("alert_praise"); diff --git a/app/views/files/_course_list.html.erb b/app/views/files/_course_list.html.erb index 8bb6f8970..353d19dab 100644 --- a/app/views/files/_course_list.html.erb +++ b/app/views/files/_course_list.html.erb @@ -22,10 +22,10 @@
    <% curse_attachments.each do |file| %> - <% if file.is_public? || User.current.member_of_course?(course) %> + <% if file.is_public? || User.current.member_of_course?(course) || User.current.admin? %>
    - <%= link_to truncate(file.filename,length: 35, omission: '...'), + <%= link_to truncate(file.filename,length: 35, omission: '...'), download_named_attachment_path(file.id, file.filename), :title => file.filename+"\n"+file.description.to_s, :style => "overflow: hidden; white-space: nowrap;text-overflow: ellipsis;",:class => "c_dblue f_14 f_b f_l" %> <% if User.current.logged? %> diff --git a/app/views/files/_project_file_new.html.erb b/app/views/files/_project_file_new.html.erb index 878e6a75e..4ee1ccede 100644 --- a/app/views/files/_project_file_new.html.erb +++ b/app/views/files/_project_file_new.html.erb @@ -41,7 +41,7 @@
    <%= form_tag( search_project_project_files_path(@project), method: 'get',:class => "re_search f_l",:remote=>true) do %> <%= text_field_tag 'name', params[:name], name: "name", :class => 're_schbox',:style=>"padding: 0px"%> - <%= submit_tag "站内搜索", :class => "re_schbtn b_lblue",:name => "incourse",:id => "incourse", :onmouseover => "presscss('incourse')",:onmouseout =>"buttoncss()" %> + <%= submit_tag "项目内搜索", :class => "re_schbtn b_lblue",:name => "incourse",:id => "incourse", :onmouseover => "presscss('incourse')",:onmouseout =>"buttoncss()", :style =>"width:72px;" %> <%= submit_tag "全站搜索", :class => "re_schbtn b_lblue",:name => "insite",:id => "insite",:onmouseover => "presscss('insite')",:onmouseout =>"buttoncss()" %> <% end %> <% manage_allowed = User.current.allowed_to?(:manage_files, @project) %> diff --git a/app/views/files/create.js.erb b/app/views/files/create.js.erb index 87bf5b864..a1c278a7a 100644 --- a/app/views/files/create.js.erb +++ b/app/views/files/create.js.erb @@ -21,14 +21,26 @@ $("#attachments_fields").children().remove(); $("#upload_file_count").text("未上传文件"); $('#upload_file_div').slideToggle('slow'); - <% if @project%> + <% if @project %> closeModal(); $("#resource_list").html('<%= j(render partial: "project_file_new" ,locals: {project: @project}) %>'); +// 添加文件上传成功提示 + <% unless params[:attachments].nil? %> + var div = $('
    文件上传成功!
    '); + $("#course_list").prepend(div); + setTimeout( function(){div.remove();},3000) + <% end %> <%elsif @course%> closeModal(); $("#resource_list").html('<%= j(render partial: "course_file" ,locals: {course: @course}) %>'); $("#courses_files_count_info").html("<%= @all_attachments.count%>"); $("#courses_files_count_nav").html("(<%= @all_attachments.count%>)") + // 添加文件上传成功提示, + <% unless params[:attachments].nil? %> + var div = $('
    文件上传成功!
    '); + $("#course_list").prepend(div); + setTimeout( function(){div.remove();},3000) + <% end %> <% end %> <% end %> $(document).ready(img_thumbnails); diff --git a/app/views/files/searchone4reload.html.erb b/app/views/files/searchone4reload.html.erb index 4512e52dd..75dd7bcab 100644 --- a/app/views/files/searchone4reload.html.erb +++ b/app/views/files/searchone4reload.html.erb @@ -2,26 +2,29 @@ <% if file.is_public? || User.current.member_of_course?(course) %>
    - <%= link_to_attachment file, :download => true,:text => truncate(file.filename,length: 35, omission: '...'), :title => file.filename+"\n"+file.description.to_s,:class => "c_dblue f_14 f_b f_l hiddent" %> + <%= link_to truncate(file.filename,length: 35, omission: '...'), + download_named_attachment_path(file.id, file.filename), + :title => file.filename+"\n"+file.description.to_s, :style => "overflow: hidden; white-space: nowrap;text-overflow: ellipsis;",:class => "c_dblue f_14 f_b f_l" %> <% if User.current.logged? %> <% if (is_course_teacher(User.current,@course) || file.author_id == User.current.id) && course_contains_attachment?(@course,file) %> <%= link_to("选入我的其他课程",quote_resource_show_course_file_path(@course,file),:class => "f_l re_select c_lorange",:remote => true) if has_course?(User.current,file) %> <% if delete_allowed && file.container_id == @course.id && file.container_type == "Course" %> - - <%= link_to (file.is_public? ? "公开":"私有"), update_file_dense_attachments_path(:attachmentid=>file.id,:newtype=>(file.is_public? ? 0:1)),:remote=>true,:class=>"f_l re_open c_blue",:method => :post %> - + + <%= link_to (file.is_public? ? "公开":"私有"), update_file_dense_attachments_path(:attachmentid=>file.id,:newtype=>(file.is_public? ? 0:1)),:remote=>true,:class=>"f_l re_open c_blue",:method => :post %> + <% else %> <% end %> <% else %> <%= link_to("选入我的课程",quote_resource_show_course_file_path(@course,file),:class => "f_l re_select c_lorange",:remote => true) if has_course?(User.current,file) %> <% end %> + <%= file_preview_tag(file, class: 'f_l re_open') %> <% else %> <% end %>
    -
    +

    文件大小:<%= number_to_human_size(file.filesize) %>

    <%= link_to( l(:button_delete), attachment_path(file), :data => {:confirm => l(:text_are_you_sure)}, :method => :delete,:class => "f_r re_de") if delete_allowed && file.container_id == @course.id && file.container_type == "Course"%> diff --git a/app/views/forums/_show_topics.html.erb b/app/views/forums/_show_topics.html.erb index 9af8538ed..f8679cefa 100644 --- a/app/views/forums/_show_topics.html.erb +++ b/app/views/forums/_show_topics.html.erb @@ -1,44 +1,48 @@
    共有 <%=link_to @forum.memos.count %> 个贴子
    -<% if memos.any? %> - <% memos.each do |topic| %> - - - - -
    <%= link_to image_tag(url_to_avatar(topic.author), :class => "avatar"), user_path(topic.author) if topic.author%> - - - - - - - - - - - -
    <%= link_to h(topic.subject), forum_memo_path(topic.forum, topic) %> - - - - - - - -
    <%= link_to (topic.replies_count), forum_memo_path(topic.forum, topic) %>
    回答
    <%= authoring topic.created_at, topic.author %> - - <% author = topic.last_reply.try(:author)%> - <% if author%> - 最后回复:<%=link_to_user author %> - <% end%> - -
    -
    - <% end %> - -<% else %> -

    <%= l(:label_no_data) %>

    -<% end %> + <% if memos.any? %> + <% memos.each do |topic| %> + + + + + +
    + <%= link_to image_tag(url_to_avatar(topic.author), :class => "avatar"), user_path(topic.author) if topic.author%> + + + + + + + + + + + + +
    <%= link_to h(topic.subject), forum_memo_path(topic.forum, topic) %> + + + + + + + +
    <%= link_to (topic.replies_count), forum_memo_path(topic.forum, topic) %>
    回答
    <%= authoring topic.created_at, topic.author %> + + <% author = topic.last_reply.try(:author)%> + <% if author%> + 最后回复:<%=link_to_user author %> + <% end%> + +
    +
    +
    + <% end %> + + <% else %> +

    <%= l(:label_no_data) %>

    + <% end %>
    \ No newline at end of file diff --git a/app/views/forums/show.html.erb b/app/views/forums/show.html.erb index c105dc2b8..24aa74c23 100644 --- a/app/views/forums/show.html.erb +++ b/app/views/forums/show.html.erb @@ -1,54 +1,42 @@
    -

    - <%=l(:label_memo_new)%> -

    - <% if User.current.logged? %> - <%= labelled_form_for(@memo, :url => create_memo_forum_path(@forum), :html => {:multipart => true} ) do |f| %> -
    - <%= hidden_field_tag :asset_id,params[:asset_id],:required => false,:style => 'display:none' %> -

    - <%= f.text_field :subject, :required => true, :maxlength => 50%> -

    -

    - <%= f.kindeditor :content, :required => true %> -

    - -

    - (<%= l(:label_memos_max_length) %>) -

    -

    - <%= l(:label_attachment_plural) %> -
    - <%= render :partial => 'attachments/form', :locals => {:container => @memo} %> -

    -
    - <%= f.submit :value => l(:label_memo_create) %> - <%= link_to l(:button_cancel), "#", :onclick => '$("#add-memo").hide(); return false;' %> -
    - <% end %> -<% end %> +

    + <%=l(:label_memo_new)%> +

    + <% if User.current.logged? %> + <%= labelled_form_for(@memo, :url => create_memo_forum_path(@forum), :html => {:multipart => true} ) do |f| %> +
    + <%= hidden_field_tag :asset_id,params[:asset_id],:required => false,:style => 'display:none' %> +

    + <%= f.text_field :subject, :required => true, :maxlength => 50%> +

    +

    + <%= f.kindeditor :content, :required => true %> +

    + +

    + (<%= l(:label_memos_max_length) %>) +

    +

    + <%= l(:label_attachment_plural) %> +
    + <%= render :partial => 'attachments/form', :locals => {:container => @memo} %> +

    +
    + <%= f.submit :value => l(:label_memo_create) %> + <%= link_to l(:button_cancel), "#", :onclick => '$("#add-memo").hide(); return false;' %> +
    + <% end %> + <% end %>
    -<% #= link_to '发布帖子', new_forum_memo_path(@forum), :class => 'icon icon-add' %> - <%= link_to( - image_tag('edit.png')+l(:label_forum_edit), - {:action => 'edit', :id => @forum}, - :method => 'get', - :title => l(:button_edit) - ) if @forum.editable_by?(User.current) %> - <%= link_to( - image_tag('delete.png')+'删除讨论区', - {:action => 'destroy', :id => @forum}, - :method => :delete, - :data => {:confirm => l(:text_are_you_sure)}, - :title => l(:button_delete) + <%= link_to(image_tag('edit.png')+l(:label_forum_edit),{:action => 'edit', :id => @forum}, :method => 'get', :title => l(:button_edit)) if @forum.editable_by?(User.current) %> + <%= link_to(image_tag('delete.png')+'删除讨论区', {:action => 'destroy', :id => @forum}, :method => :delete, :data => {:confirm => l(:text_are_you_sure)}, :title => l(:button_delete) ) if @forum.destroyable_by?(User.current) %> <%= link_to l(:label_memo_new_from_forum), new_forum_memo_path(@forum), :class => 'icon icon-add', - :onclick => 'showAndScrollTo("add-memo", "memo_subject"); return false;' if User.current.logged? %> + :onclick => 'showAndScrollTo("add-memo", "memo_subject"); return false;' if User.current.logged? %> - <%= render :partial => 'forums/show_topics', :locals => {:memos => @memos} %> diff --git a/app/views/homework_attach/new.html.erb b/app/views/homework_attach/new.html.erb index cf182716e..b32eb8c8d 100644 --- a/app/views/homework_attach/new.html.erb +++ b/app/views/homework_attach/new.html.erb @@ -1,42 +1,4 @@ <%= stylesheet_link_tag 'css', :media => 'all' %> -
    @@ -69,7 +31,7 @@   作品名称    : - <%= f.text_field "name", :required => true, :size => 60, :class => "w430 bo", :maxlength => 254, :placeholder => "作品名称", :onkeyup => "regexName();" %> + <%= f.text_field "name", :required => true, :size => 60, :class => "w430 bo", :maxlength => 254, :placeholder => "作品名称", :onkeyup => "regexHomeworkCommonName();" %>

    @@ -79,7 +41,7 @@   作品描述    :  - <%= f.text_area "description", :class => "w620", :maxlength => 3000, :style => "width:430px", :placeholder => "最多3000个汉字", :onkeyup => "regexDescription();"%> + <%= f.text_area "description", :class => "w620", :maxlength => 3000, :style => "width:430px", :placeholder => "最多3000个汉字", :onkeyup => "regexHomeworkCommonDescription();"%>

    diff --git a/app/views/homework_common/_alert_anonyoms.html.erb b/app/views/homework_common/_alert_anonyoms.html.erb index 3b199e0d8..73f240b02 100644 --- a/app/views/homework_common/_alert_anonyoms.html.erb +++ b/app/views/homework_common/_alert_anonyoms.html.erb @@ -5,7 +5,11 @@

    开启匿评后学生将不能对作品进行 修改、删除 - 等操作,目前有 + 等操作,开启匿评后的提交作品,将 + 不能参与匿评, + 匿评评分将被记为 + 0分 + 。目前有 <%= @totle_size%>个 学生,共提交了 <%= @cur_size %> diff --git a/app/views/homework_common/_homework_common_form.html.erb b/app/views/homework_common/_homework_detail_manual_form.html.erb similarity index 94% rename from app/views/homework_common/_homework_common_form.html.erb rename to app/views/homework_common/_homework_detail_manual_form.html.erb index fa45397f0..ffec93e73 100644 --- a/app/views/homework_common/_homework_common_form.html.erb +++ b/app/views/homework_common/_homework_detail_manual_form.html.erb @@ -10,7 +10,6 @@

  • -
    <% if edit_mode %> <%= f.kindeditor :description,:editor_id => 'homework_description_editor',:owner_id => homework.id,:owner_type =>OwnerTypeHelper::HOMEWORKCOMMON %> @@ -47,7 +46,7 @@

    基本规则设置(总分为100分)

      -
    • +
    • <%= select_tag :late_penalty,options_for_select(late_penalty_option,homework.late_penalty), {:class => "fl mb10 h26 w70"} %>  分 @@ -99,11 +98,11 @@
    • -
    • +
    • <%= select_tag :absence_penalty,options_for_select(absence_penalty_option,homework.homework_detail_manual.absence_penalty), {:class => "fl mb10 h26 w70"} %>  分 -

      学生漏评1个作品将扣 2 

      +

      学生漏评1个作品将扣 <%= homework.homework_detail_manual.absence_penalty%> 

    diff --git a/app/views/homework_common/_homework_detail_programing_form.html.erb b/app/views/homework_common/_homework_detail_programing_form.html.erb new file mode 100644 index 000000000..5d1d5ce88 --- /dev/null +++ b/app/views/homework_common/_homework_detail_programing_form.html.erb @@ -0,0 +1,123 @@ +
      +
    • + + +

      +
    • +
      +
    • + +
      + <% if edit_mode %> + <%= f.kindeditor :description,:editor_id => 'homework_description_editor',:owner_id => homework.id,:owner_type =>OwnerTypeHelper::HOMEWORKCOMMON %> + <% else %> + <%= hidden_field_tag :asset_id,params[:asset_id],:required => false,:style => 'display:none' %> + <%= f.kindeditor :description,:editor_id => 'homework_description_editor' %> + <% end %> +
      +
    • +
      +
    • + + <%= render :partial => 'attachments/new_form', :locals => {:container => homework} %> +
    • +
      +
    • + + + <%= calendar_for('homework_end_time')%> +
      +
    • + + +
    • + + <%= select_tag :late_penalty,options_for_select(late_penalty_option,homework.late_penalty), {:class => "fl mb10 h26 w70"} %> +  分 +
      +
    • +
    + +
    +
    +

    编程评测设置

    +
    +
      +
    • + + <%= select_tag :language,options_for_select(programing_languages_options,homework.homework_detail_programing.language), {:class => "fl mb10 h26 w70"} %> +
      +
    • + +
    • + + <%= select_tag :ta_proportion,options_for_select(ta_proportion_option,homework.homework_detail_programing.ta_proportion), {:class => "fl mb10 h26 w70"} %> + × 教辅评分 +   +   + + × 系统评分 + = 学生得分 +
      +
    • +
    • + + 如果教师对学生作品进行了评分,则教师评分为学生最终得分。 +
      +
    • + +
    • + + +
      +
    • + + <% if edit_mode %> + <% homework.homework_tests.each do |homework_test|%> +
      +
    • + + +
    • +
    • + + +
    • +
    • + + + +
    • +
      +
      + <% end%> + <% else %> +
      +
    • + + +
    • +
    • + + +
    • +
    • + + + +
    • +
      +
      + <% end %> +
    +
    \ No newline at end of file diff --git a/app/views/homework_common/edit.html.erb b/app/views/homework_common/edit.html.erb index 50feca946..5b65b5982 100644 --- a/app/views/homework_common/edit.html.erb +++ b/app/views/homework_common/edit.html.erb @@ -7,10 +7,18 @@
    - <%= form_for @homework do |f| %> - <%= render :partial => 'homework_common/homework_common_form', :locals => { :homework => @homework,:f => f,:edit_mode => true } %> - 提交 - <%= link_to '取消',homework_common_index_path(:course => @course.id),:class => 'grey_btn fl'%> + <%if @homework.homework_type == 2%> + <%= form_for @homework do |f| %> + <%= render :partial => 'homework_common/homework_detail_programing_form', :locals => { :homework => @homework,:f => f,:edit_mode => true } %> + 提交 + <%= link_to '取消',homework_common_index_path(:course => @course.id),:class => 'grey_btn fl'%> + <% end%> + <% else %> + <%= form_for @homework do |f| %> + <%= render :partial => 'homework_common/homework_detail_manual_form', :locals => { :homework => @homework,:f => f,:edit_mode => true } %> + 提交 + <%= link_to '取消',homework_common_index_path(:course => @course.id),:class => 'grey_btn fl'%> + <% end%> <% end%>
    diff --git a/app/views/homework_common/index.html.erb b/app/views/homework_common/index.html.erb index 3208bb969..2de96bca1 100644 --- a/app/views/homework_common/index.html.erb +++ b/app/views/homework_common/index.html.erb @@ -41,12 +41,39 @@ <%= homework.description.html_safe %>
  • +
    - +
    +
    + 扣分标准: +
    + <% if homework.homework_type == 1%> + <%= scoring_rules homework.late_penalty,homework.id,@is_teacher,homework.homework_detail_manual.absence_penalty%> + <% else%> + <%= scoring_rules homework.late_penalty,homework.id,@is_teacher%> + <% end%> +
    +
    <%= l(:label_end_time)%>:<%= homework.end_time%> diff --git a/app/views/homework_common/new.html.erb b/app/views/homework_common/new.html.erb index dc67b5079..cdc2ceca0 100644 --- a/app/views/homework_common/new.html.erb +++ b/app/views/homework_common/new.html.erb @@ -1,17 +1,27 @@ -<%= javascript_include_tag "/assets/kindeditor/kindeditor",'/assets/kindeditor/pasteimg' %> -<%= error_messages_for 'homework_common' %> -

    <%= l(:label_course_homework_new)%>

    -
    - <%= labelled_form_for @homework,:url => {:controller => 'homework_common',:action => 'create'} do |f| %> - <%= hidden_field_tag "course",@course.id%> - <%= render :partial => 'homework_common/homework_common_form', :locals => { :homework => @homework,:f => f,:edit_mode => false } %> - 提交 - <%= link_to '取消',homework_common_index_path(:course => @course.id),:class => 'grey_btn fl'%> +
    + <%= form_for("new_homework_common",:url => next_step_homework_common_index_path) do |f|%> + +

    + 请选择将要发布的作业类型 +

    + + + 人工评分的作业(支持匿名互评、灵活设置评分比例) + +
    + + + 自动评测的编程作业(支持C/C++程序的自动评分) + +
    + + 下一步 + <% end%>
    diff --git a/app/views/homework_common/next_step.html.erb b/app/views/homework_common/next_step.html.erb new file mode 100644 index 000000000..75e9f4c0a --- /dev/null +++ b/app/views/homework_common/next_step.html.erb @@ -0,0 +1,30 @@ +<%= javascript_include_tag "/assets/kindeditor/kindeditor" %> +<%= error_messages_for 'homework_common' %> +
    +

    + <%= l(:label_course_homework_new)%> +

    +
    +<% if @homework_type == "1"%> +
    + <%= labelled_form_for @homework,:url => {:controller => 'homework_common',:action => 'create'} do |f| %> + <%= hidden_field_tag "course",@course.id%> + <%= render :partial => 'homework_common/homework_detail_manual_form', :locals => { :homework => @homework,:f => f,:edit_mode => false } %> + 提交 + <%= link_to "上一步", new_homework_common_path(:course => @course.id), :class => "orange_btn_homework fl"%> + <%= link_to '取消',homework_common_index_path(:course => @course.id),:class => 'grey_btn fl'%> + <% end%> +
    +<% elsif @homework_type == "2"%> +
    + <%= labelled_form_for @homework,:url => {:controller => 'homework_common',:action => 'create'} do |f| %> + <%= hidden_field_tag "course",@course.id%> + <%= hidden_field_tag "homework_common[homework_type]","2"%> + <%= render :partial => 'homework_common/homework_detail_programing_form', :locals => { :homework => @homework,:f => f,:edit_mode => false } %> + 提交 + <%= link_to "上一步", new_homework_common_path(:course => @course.id), :class => "orange_btn_homework fl"%> + <%= link_to '取消',homework_common_index_path(:course => @course.id),:class => 'grey_btn fl'%> + <% end%> +
    +
    +<% end%> \ No newline at end of file diff --git a/app/views/homework_common/start_anonymous_comment.js.erb b/app/views/homework_common/start_anonymous_comment.js.erb index cd4dafde8..5f27a5b82 100644 --- a/app/views/homework_common/start_anonymous_comment.js.erb +++ b/app/views/homework_common/start_anonymous_comment.js.erb @@ -5,6 +5,8 @@ $("#<%= @homework.id %>_start_anonymous_comment").replaceWith('<%= escape_javasc alert('启动失败\n作业总数大于等于2份时才能启动匿评'); <% elsif @statue == 3%> alert("已开启匿评,请务重复开启"); -<% elsif @statue == 3%> +<% elsif @statue == 4%> alert("您没有权限开启匿评"); +<% elsif @statue == 5%> +alert("作业提交截止之后才能启动匿评"); <% end %> \ No newline at end of file diff --git a/app/views/issues/_edit.html.erb b/app/views/issues/_edit.html.erb index e4c1290aa..1f3f984b4 100644 --- a/app/views/issues/_edit.html.erb +++ b/app/views/issues/_edit.html.erb @@ -5,7 +5,7 @@ <% if @edit_allowed || !@allowed_statuses.empty? %> <% end %> +
    +
    回复 <%= f.text_area :notes, :style => "width:99%;", :rows => "5", :no_label => true %>
    diff --git a/app/views/issues/_history.html.erb b/app/views/issues/_history.html.erb index b0f1ad38d..68e991594 100644 --- a/app/views/issues/_history.html.erb +++ b/app/views/issues/_history.html.erb @@ -1,31 +1,31 @@ <% reply_links = authorize_for('issues', 'edit') -%> <% journals.reverse.each do |journal| %> - -
    - -
    - -
    -
    - <%= journal.user %><%= format_time journal.created_on %> + +
    + +
    + +
    +
    + <%= journal.user %><%= format_time journal.created_on %> +
    +

    + <% if journal.details.any? %> + <% details_to_strings(journal.details).each do |string| %> +

    <%= string %>

    + <% end %> + <% end %> +

    +
    + +
    <%= render_links_easy(issue, journal, :reply_links => reply_links) unless journal.notes.blank? %>
    + +

    <%= render_notes_issue(issue, journal, :reply_links => reply_links) unless journal.notes.blank? %>

    +
    +
    -

    - <% if journal.details.any? %> - <% details_to_strings(journal.details).each do |string| %> -

    <%= string %>

    - <% end %> - <% end %> -

    - -
    <%= render_links_easy(issue, journal, :reply_links => reply_links) unless journal.notes.blank? %>
    - -

    <%= render_notes_issue(issue, journal, :reply_links => reply_links) unless journal.notes.blank? %>

    -
    -
    -
    -
    <%= call_hook(:view_issues_history_journal_bottom, { :journal => journal }) %> <% end %> diff --git a/app/views/issues/_list.html.erb b/app/views/issues/_list.html.erb index 616e205c4..e182fbd19 100644 --- a/app/views/issues/_list.html.erb +++ b/app/views/issues/_list.html.erb @@ -7,12 +7,12 @@
    <% column_content = ( query.inline_columns.map {|column| "#{column_content_new(column, issue)}"}) %> <% unless issue.author.nil? || issue.author.name == "Anonymous" %> - +
    <%= link_to issue.author.name, user_path(issue.author), :class => "problem_name c_orange fl" %> <%= l(:label_post_on_issue) %>(<%= "#{raw column_content[2]}" %>): -
    - <%=link_to "#{column_content[4]}#{get_issue_type(column_content[1])[1]}".html_safe, issue_path(issue.id), :class => "problem_tit_a break_word",:target => "_blank" %> +
    + <%=link_to "#{column_content[4]}#{get_issue_priority(column_content[3])[1]}".html_safe, issue_path(issue.id), :class => "problem_tit_a break_word",:target => "_blank" %>

    diff --git a/app/views/issues/show.html.erb b/app/views/issues/show.html.erb index 1bd956074..8c12d62e0 100644 --- a/app/views/issues/show.html.erb +++ b/app/views/issues/show.html.erb @@ -14,8 +14,9 @@

    - <%= @issue.subject %> - <%= get_issue_type(@issue.tracker_id)[1] %> + + <%= @issue.subject %> + <%= get_issue_priority(@issue.priority_id)[1] %>


    @@ -109,6 +110,9 @@ <%= render :partial => 'edit' %>

    + + + <%= l(:button_submit) %> diff --git a/app/views/journals/diff.html.erb b/app/views/journals/diff.html.erb index 5bc823c76..190459b71 100644 --- a/app/views/journals/diff.html.erb +++ b/app/views/journals/diff.html.erb @@ -1,5 +1,5 @@

    <%=h @issue.tracker %> #<%= @issue.id %>

    -

    <%= authoring @journal.created_on, @journal.user, :label => :label_updated_time_by %>

    +

    由<%= @journal.user %> 更新于 <%= format_time @journal.created_on %>

    <%= simple_format_without_paragraph @diff.to_html %> diff --git a/app/views/layouts/_base_footer_new.html.erb b/app/views/layouts/_base_footer_new.html.erb new file mode 100644 index 000000000..b4856d2af --- /dev/null +++ b/app/views/layouts/_base_footer_new.html.erb @@ -0,0 +1,13 @@ + \ No newline at end of file diff --git a/app/views/layouts/_base_header.html.erb b/app/views/layouts/_base_header.html.erb index fa8787122..16fa44c73 100644 --- a/app/views/layouts/_base_header.html.erb +++ b/app/views/layouts/_base_header.html.erb @@ -17,15 +17,14 @@ visiable = hidden_non_project && hidden_non_project.value == "0"%>
    - - - - - - - -
    <%= labelled_form_for @work,:html => { :multipart => true } do |f|%> diff --git a/app/views/student_work/index.html.erb b/app/views/student_work/index.html.erb index 6325abc09..781277b57 100644 --- a/app/views/student_work/index.html.erb +++ b/app/views/student_work/index.html.erb @@ -1,3 +1,17 @@ + +
    -
      - <% if @is_evaluation.nil?%> - <%= render :partial => 'student_work_title'%> - <% else%> - <%= render :partial => 'evaluation_work_title'%> - <% end%> -
    - <% @stundet_works.each do |student_work|%> - <%= render :partial => (@is_evaluation ? 'evaluation_work' :'student_work'),:locals => {:student_work => student_work}%> -
    + <% if @is_evaluation%> +
      + <%= render :partial => 'evaluation_work_title'%> +
    +
    + <% @stundet_works.each do |student_work|%> + <%= render :partial => "evaluation_work",:locals => {:student_work => student_work}%> +
    + <% end%> + <% else %> + <% if @homework.homework_type == 1 || @homework.homework_type == 2%> +
      + <%= render :partial => 'evaluation_student_work_title'%> +
    +
    + <% @stundet_works.each do |student_work|%> + <%= render :partial => "evaluation_student_work",:locals => {:student_work => student_work}%> +
    + <% end%> + <% else%> +
      + <%= render :partial => 'student_work_title'%> +
    +
    + <% @stundet_works.each do |student_work|%> + <%= render :partial => "student_work",:locals => {:student_work => student_work}%> +
    + <% end%> + <% end%> <% end%> -
    @@ -84,13 +127,31 @@ <%= student_anonymous_comment @homework %> <%= student_new_homework @homework %> <% end %> -
    +
    <%= @homework.description.html_safe %>
    +
    + <% if @homework.homework_type == 2 && @homework.homework_detail_programing%> + + + <% @homework.homework_tests.each do |test|%> + "> + + + + <% end%> + +
    + <%=test.input%> + + <%= test.output%> +
    + <% end%>
    +
    <% unless @homework.attachments.empty?%> 附件: @@ -99,6 +160,18 @@
    <% end%>
    +
    + +
    + 扣分标准: +
    + <% if @homework.homework_type == 1%> + <%= scoring_rules @homework.late_penalty,@homework.id,@is_teacher,@homework.homework_detail_manual.absence_penalty%> + <% else%> + <%= scoring_rules @homework.late_penalty,@homework.id,@is_teacher%> + <% end%> +
    +
    截止时间:<%= @homework.end_time%> diff --git a/app/views/student_work/new.html.erb b/app/views/student_work/new.html.erb index 7d685131f..eda09114e 100644 --- a/app/views/student_work/new.html.erb +++ b/app/views/student_work/new.html.erb @@ -1,3 +1,17 @@ +

    创建作品

    @@ -11,12 +25,20 @@ :homework => @homework.id }) do |f|%>
    + <% if @homework.homework_type == 1%> +
    + 提示:匿评作业提交的作品,作品名称和描述中不能出现真实的姓名信息 +
    + <% end%>

    <%= f.text_field "name", :required => true, :size => 60, :class => "bo fl", :maxlength => 200, :placeholder => "作品名称", :onkeyup => "regexStudentWorkName();" %> - 项目信息 - - + <% if @homework.homework_type != 2%> + + 项目信息 + + + <% end%>

    @@ -27,17 +49,23 @@

    - - <%= f.text_area "description", :class => "w620 hwork_txt ", :maxlength => 3000, :placeholder => "最多3000个汉字", :onkeyup => "regexStudentWorkDescription();"%> + + <%= f.text_area "description", :class => "w620 hwork_txt ", :placeholder => "作品描述不能为空", :onkeyup => "regexStudentWorkDescription();"%>

    -

    - - <%= render :partial => 'attachments/new_form' %> -

    -
    + <% if @homework.homework_type != 2%> +

    + + <%= render :partial => 'attachments/new_form' %> +

    +
    + <% end%>

    提交作品 <%= link_to "返  回".html_safe, student_work_index_path(:homework => @homework), :class => "blue_btn grey_btn fl c_white"%> diff --git a/app/views/student_work/set_program_score.html.erb b/app/views/student_work/set_program_score.html.erb new file mode 100644 index 000000000..6ea169c64 --- /dev/null +++ b/app/views/student_work/set_program_score.html.erb @@ -0,0 +1 @@ +成功 \ No newline at end of file diff --git a/app/views/student_work/show.js.erb b/app/views/student_work/show.js.erb index fa12e097d..1c8874c2f 100644 --- a/app/views/student_work/show.js.erb +++ b/app/views/student_work/show.js.erb @@ -2,6 +2,10 @@ if($("#about_hwork_<%= @work.id%>").children().length > 0) {$("#about_hwork_<%= @work.id%>").html("");} else { - $("#about_hwork_<%= @work.id%>").html("<%= escape_javascript(render :partial => 'show') %>"); + <% if @homework.homework_type == 2%> + $("#about_hwork_<%= @work.id%>").html("<%= escape_javascript(render :partial => 'programing_work_show') %>"); + <% else%> + $("#about_hwork_<%= @work.id%>").html("<%= escape_javascript(render :partial => 'show') %>"); + <% end%> $('#score_<%= @work.id%>').peSlider({range: 'min'}); } \ No newline at end of file diff --git a/app/views/student_work/student_work_absence_penalty.html.erb b/app/views/student_work/student_work_absence_penalty.html.erb index e9054561f..967480552 100644 --- a/app/views/student_work/student_work_absence_penalty.html.erb +++ b/app/views/student_work/student_work_absence_penalty.html.erb @@ -14,13 +14,13 @@ 姓名

  • - 应评 + <%= l(:lable_all_penalty)%>
  • - 实评 + <%= l(:lable_has_penalty)%>
  • - <%= link_to "缺评",student_work_absence_penalty_student_work_index_path(:homework => @homework.id,:order => @order)%> + <%= link_to l(:lable_absence_penalty),student_work_absence_penalty_student_work_index_path(:homework => @homework.id,:order => @order)%>
  • diff --git a/app/views/users/_course_form.html.erb b/app/views/users/_course_form.html.erb index 82b69ab63..3a6b317f0 100644 --- a/app/views/users/_course_form.html.erb +++ b/app/views/users/_course_form.html.erb @@ -1,74 +1,46 @@ -
    -
      - <% for membership in memberships %> -
    • - - - - - -
      - <%= image_tag(url_to_avatar(membership.course), :class => 'avatar') %> - - - - - - - - - - - -
      - - <%= link_to_course(membership.course) %> - - - <%= render :partial => 'courses/set_course_time', :locals => {:course => membership.course} %> - <% if (User.current == @user && (!@user.allowed_to?(:as_teacher,membership.course)))%> - <%= join_in_course(membership.course, User.current) %> - <% end %> - -      - <%= l(:label_x_base_courses_member, :count => membership.course.members.count) %> - (<%= "#{membership.course.members.count}" %>) -    - <%= l(:label_homework) %> - ( - - <%= link_to (membership.course.homework_commons.count), homework_common_index_path(:course => membership.course.id) %> - - ) -    - <%= l(:label_course_news) %> - ( - - <%= link_to (membership.course.news.count), {:controller => 'news', :action => 'index', :course_id => membership.course.id} %> - ) - -
      -

      - <%= textilizable membership.course.short_description %> -

      -
      - - <% @course = Course.find_by_extra(membership.course.extra) %> - <% unless (@course.nil? || @course.teacher.nil? || @course.teacher.name.nil?) %> - - <%= l(:label_main_teacher) %> - : <%= link_to(@course.teacher.realname, user_path(@course.teacher)) %> - - - <%= l(:label_course_term) %> - : <%= @course.time %><%= get_course_term_locales @course %> - - <% end %> -
      -
      -
    • - +<% can_edit_flag = User.current.allowed_to?(:as_teacher,item) || User.current.admin? %> +<% course_end_flag = course_endTime_timeout?(item) %> +
    -
    -<%= call_hook :view_account_left_bottom, :user => @user %> \ No newline at end of file +
    +
    + + + + + + + + + + + + + +
    主讲老师: + <%= item.teacher.show_name %> + 课程作业:<%= item.homework_commons.count %>
    学生人数:item.id,:role=>2, :host=>Setting.host_course) %>"><%= studentCount(item) %>开课学期:<%= item.time %><%= get_course_term_locales item %>
    +
    +
    + <% if(course_end_flag) %> + 课程结束 + <% elsif(can_edit_flag) %> + 发布作业 + <% else %> + 提交作品 + <% end %> +
    +
    \ No newline at end of file diff --git a/app/views/users/_history.html.erb b/app/views/users/_history.html.erb index d69b6b25b..a87c2d8e4 100644 --- a/app/views/users/_history.html.erb +++ b/app/views/users/_history.html.erb @@ -9,7 +9,7 @@
    - <%= link_to journal.user, user_path(journal.user),:style => " font-weight:bold; color:#15bccf; margin-right:30px; background:none;", :target => "_blank"%><%= format_time(journal.created_on) %> + <%= link_to "#{journal.user.show_name}(#{journal.user.login})", user_path(journal.user),:style => " font-weight:bold; color:#15bccf; margin-right:30px; background:none;", :target => "_blank"%><%= format_time(journal.created_on) %>

    <%=journal.notes.html_safe%>

    diff --git a/app/views/users/_influence_new_score_index.html.erb b/app/views/users/_influence_new_score_index.html.erb index c0a89536a..505785351 100644 --- a/app/views/users/_influence_new_score_index.html.erb +++ b/app/views/users/_influence_new_score_index.html.erb @@ -4,4 +4,5 @@
        <%= l('userscore.active.commit.attachments')%> * 4 = <%= option_num.attachment %> * 4 = <%= option_num.attachment * 4 %>
        <%= l('userscore.active.update_issues')%> * 2 = <%= option_num.issue_done_ratio %> * 2 = <%= option_num.issue_done_ratio * 2 %>
        <%= l('userscore.active.release_issues')%> * 4 = <%= option_num.post_issue %> * 4 = <%= option_num.post_issue * 4 %>
    -
        <%= l(:label_user_score_of_active)%> = <%= option_num.changeset * 4 %> + <%= option_num.document * 4 %> + <%= option_num.attachment * 4 %> + <%= option_num.issue_done_ratio * 2 %> + <%= option_num.post_issue * 4 %> = <%= active(option_num) %>
    \ No newline at end of file +
        <%= l('userscore.active.release_messages')%> * 1 = <%= option_num.memo %> * 2 = <%= option_num.memo * 2 %>
    +
        <%= l(:label_user_score_of_active)%> = <%= option_num.changeset * 4 %> + <%= option_num.document * 4 %> + <%= option_num.attachment * 4 %> + <%= option_num.issue_done_ratio * 2 %> + <%= option_num.post_issue * 4 %> + <%= option_num.memo * 2 %> = <%= active(option_num) %>
    \ No newline at end of file diff --git a/app/views/users/_show_new_score.html.erb b/app/views/users/_show_new_score.html.erb index c0e731a65..2081c38d6 100644 --- a/app/views/users/_show_new_score.html.erb +++ b/app/views/users/_show_new_score.html.erb @@ -4,7 +4,7 @@
    - +
    <%= image_tag(url_to_avatar(@user), :class => 'avatar2') %><%= image_tag(url_to_avatar(@user), :class => 'avatar2',:style=>'max-width:150px;max-height:150px;') %> diff --git a/app/views/users/_topic_new_score_index.html.erb b/app/views/users/_topic_new_score_index.html.erb index af2ff0da3..86dc1f80f 100644 --- a/app/views/users/_topic_new_score_index.html.erb +++ b/app/views/users/_topic_new_score_index.html.erb @@ -1,7 +1,5 @@ - -
        <%= l('userscore.collaboration.memos')%> * 2 = <%= option_num.memo %> * 2 = <%= option_num.memo * 2 %>
        <%= l('userscore.collaboration.message_for_issues')%> * 1 = <%= option_num.messages_for_issues %> * 1 = <%= option_num.messages_for_issues * 1 %>
        <%= l('userscore.collaboration.issue_status')%> * 1 = <%= option_num.issues_status %> * 1= <%= option_num.issues_status * 1 %>
        <%= l('userscore.collaboration.reply_for_messages')%> * 1 = <%= option_num.replay_for_message %> * 1 = <%= option_num.replay_for_message * 1 %>
        <%= l('userscore.collaboration.reply_for_memos')%> * 1 = <%= option_num.replay_for_memo %> * 1 = <%= option_num.replay_for_memo * 1 %>
    -
        <%= l(:label_user_score_of_collaboration)%> = <%= option_num.memo * 2 %> + <%= option_num.messages_for_issues * 1 %> + <%= option_num.issues_status * 1 %> + <%= option_num.replay_for_message * 1 %> + <%= option_num.replay_for_memo * 1 %> = <%= collaboration(option_num) %>  
    +
        <%= l(:label_user_score_of_collaboration)%> = <%= option_num.messages_for_issues * 1 %> + <%= option_num.issues_status * 1 %> + <%= option_num.replay_for_message * 1 %> + <%= option_num.replay_for_memo * 1 %> = <%= collaboration(option_num) %>  
    diff --git a/app/views/users/_user_fans_item.html.erb b/app/views/users/_user_fans_item.html.erb new file mode 100644 index 000000000..66181d23b --- /dev/null +++ b/app/views/users/_user_fans_item.html.erb @@ -0,0 +1,50 @@ +
    + +
    + <%= item.show_name %> +
    +
    + <% if item.user_extensions && !item.user_extensions.brief_introduction.nil? && !item.user_extensions.brief_introduction.empty? %> +

    个性签名:<%= item.user_extensions.brief_introduction %>

    + <% end %> +
    <%= h @user.name %>
    + + + <% if (item.user_extensions.identity == 0 || item.user_extensions.identity == 1) && !item.user_extensions.school.nil? %> + + + <% elsif item.user_extensions.identity == 3 && !item.user_extensions.occupation.nil? && !item.user_extensions.occupation.empty? %> + + + <% elsif item.user_extensions.identity == 2 %> + + + <% end %> +
    加入时间:<%= format_date(item.created_on) %>工作单位: +
  • + <%= item.user_extensions.school.name %> +
  • +
    工作单位: +
  • + <%= item.user_extensions.occupation %> +
  • +
    工作单位: +
  • + <%= item.show_name %> +
  • +
    + + + <% if(User.current.logged? && User.current != item )%> + <%if(item.watched_by?(User.current))%> + 取消关注 + <% else %> + 添加关注 + <% end %> + <% end %> +
    + diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb index 40122fba7..efe5d0539 100644 --- a/app/views/users/show.html.erb +++ b/app/views/users/show.html.erb @@ -1,661 +1,348 @@ -<% if User.current.id == @user.id %> - -
    - <%= form_tag(:controller => 'users', :action => "show") do %> - + +<%= javascript_include_tag "/assets/kindeditor/kindeditor",'/assets/kindeditor/pasteimg' %> +<% @center_flag = (User.current == @user) %> +<% if @center_flag %> +
    + + <% if @user.allowed_to?(:add_project, nil, :global => true) %> + 新建项目 + <% else %> + 加入项目 <% end %> -<% end %> - -<%= render_flash_messages %> -<% unless @state == 2 %> - <% unless @activity.empty? %> -
    - <% @activity.each do |e| %> - <%# 以下一行代码解决有未知的活动无法转换成Model报错%> - <% (Rails.logger.error "[Error] =========================================================> NameError: uninitialized constant " + e.act_type.to_s; next;) if e.act_type.safe_constantize.nil? %> - <% act = e.act %> - <% unless act.nil? %> - <% if e.act_type == 'JournalsForMessage' || e.act_type == 'HomeworkCommon' || e.act_type == 'Journal'|| e.act_type == 'Changeset' || e.act_type == 'Message' || e.act_type == 'Principal' || e.act_type == 'News' || e.act_type == 'Issue' || e.act_type == 'Contest' %> - - - - - -
    - <%= image_tag(url_to_avatar(e.user), :class => "avatar") %> - - - <% case e.act_type %> - <% when 'JournalsForMessage' %> - - - - - - - - - - <% when 'HomeworkCommon' %> - - <% if e.user == User.current %> - - <% else %> - - <% end %> - - - - - - - - <% when 'Journal' %> - - <% if e.user == User.current %> - - <% else %> - - <% end %> - - - <% if act.notes.nil? %> - <% desStr = '' %> - <% else %> - <% desStr= textAreailizable(act, :notes) %> - <% end %> - - - - - - <% when 'Changeset' %> - - <% if e.user == User.current %> - - <% else %> - - <% end %> - - - - - - - - <% when 'Message' %> - - <% if e.user == User.current %> - - <% else %> - - <% end %> - - - - - - - - <% when 'Principal' %> - - <% if e.user == User.current %> - - <% else %> - - <% end %> - - - - - - - - <% when 'News' %> - - <% if e.user == User.current %> - - <% else %> - - <% end %> - - - - - - - - <% when 'Issue' %> - <% if e.user == User.current %> - + <% if @user.user_extensions.identity == 0 && @user.allowed_to?(:add_course, nil, :global => true) %> + 新建课程 + <% else %> + + 加入课程 + <% end %> +
    + +<% end %> - - - - - - - - - <% else %> - - - - - - - - +
    +
    +
    +
    + +

    +
    + 取消 + 留言 + +
    +
    - <% end %> + +
    - <% when 'Contest' %> -
    - <% if e.user == User.current && @show_contest == 1 %> - - <% else %> - - <% end %> - - - - - - - <% else %> - <% end %> -
    - <% if User.current.login == e.user.try(:login) %> - - <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> - -   - <% if User.current.language == "zh" %> - - <%= l(:label_i_have_feedback) %> - <%= link_to("#{e.act.user.name}", user_path(e.act.user.id)) %> - <%= l(:label_of_feedback) + l(:label_layouts_feedback) %> - - <% else %> - - <%= l(:label_i_have_feedback) %> - <%= l(:label_layouts_feedback) + l(:label_of_feedback) %> - <%= link_to("#{e.act.user.name}", user_path(e.act.user.id)) %> - - <% end %> - <% else %> - - <%= link_to("#{e.user.name}", user_path(e.user_id)) %> - - <% if User.current.language == "zh" %> - - <%= l(:label_have_feedback) %> - <%= link_to("#{e.act.user.name}", user_path(e.act.user.id)) %> - <%= l(:label_of_feedback) + l(:label_layouts_feedback) %> - - <% else %> - - <%= l(:label_have_feedback) %> - <%= l(:label_layouts_feedback) + l(:label_of_feedback) %> - <%= link_to("#{e.act.user.name}", user_path(e.act.user.id)) %> - - <% end %> - <% end %> -
    -

    - <%= textAreailizable act.notes %> -

    - -
    - - <%= user_jour_feed_back_url e %> - -
    -
    -
    - - <%= (l(:label_update_time).to_s << ': ' << format_time(e.act.created_on)).to_s %> - -
    -
    -
    - - <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> - - - <%= l(:label_i_new_activity) %> - - <%= link_to format_activity_title("#{l(:label_active_homework)}##{act.id}:#{act.name}"), student_work_index_path(:homework => e.act_id) %> - - - <%= link_to(h(e.user), user_path(e.user_id)) %> -   - - <%= l(:label_new_activity) %> -   - <%= link_to format_activity_title("#{l(:label_active_homework)}##{act.id}:#{act.name}"), student_work_index_path(:homework => e.act_id) %> -
    -

    - <%= textAreailizable act, :description %> -

    -
    - - <%= (l(:label_update_time).to_s << ': ' << format_time(e.act.created_at)).to_s %> - -
    - - - - - - - - -
    - - <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> - -   - - <%= l(:label_i_new_activity) %> - -   - <%= link_to(l(:label_activity_project)+":"+act.issue.project.name, project_path(act.issue.project.id)) %> - <%= link_to format_activity_title("#{act.issue.tracker} ##{act.issue.id}: #{act.issue.subject}"), - {:controller => 'issues', :action => 'show', :id => act.issue.id, :anchor => "change-#{act.id}"} %> - - - <%= link_to(h(e.user), user_path(e.user_id)) %> - -   - - <%= l(:label_new_activity) %> - -   - <%= link_to(l(:label_activity_project)+":"+act.issue.project.name, project_path(act.issue.project.id)) %> - <%= link_to format_activity_title("#{act.issue.tracker} ##{act.issue.id}: #{act.issue.subject}"), - {:controller => 'issues', :action => 'show', :id => act.issue.id, :anchor => "change-#{act.id}"} %> -
    -

    - <%= desStr %> -

    -
    -
    - - <%= (l(:label_update_time).to_s << ': ' << format_time(e.act.created_on)).to_s %> - -
    -
    -
    - - <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> - -   - - <%= l(:label_i_new_activity) %> - -   - <%= link_to format_activity_title(act.title), - {:controller => 'repositories', - :action => 'revision', - :id => act.repository.project, - :repository_id => act.repository.identifier_param, - :rev => act.identifier} %> - - - <%= link_to(h(e.user), user_path(e.user_id)) %> - -   - - <%= l(:label_new_activity) %> - -   - <%= link_to format_activity_title(act.title), - {:controller => 'repositories', - :action => 'revision', - :id => act.repository.project, - :repository_id => act.repository.identifier_param, - :rev => act.identifier} %> -
    -

    - <%= textAreailizable act, :long_comments %> -

    -
    -
    - - <%= format_time(e.act.committed_on) %> - -
    -
    - <%= link_to l(:label_find_all_comments), - {:controller => 'repositories', - :action => 'revision', - :id => act.repository.project, - :repository_id => act.repository.identifier_param, - :rev => act.identifier} if e.act.count!= 0 %> - - - <%= l(:label_comments_count, :count => e.act.count) %> - -
    -
    - - <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> - -   - - <%= l(:label_i_new_activity) %> - -   - <%= link_to format_activity_title("#{act.board.name}: #{act.subject}"), - act.board.project ? project_boards_path(act.board.project,:topic_id => act.id) : course_boards_path(act.board.course,:topic_id => act.id), - :class => "problem_tit fl fb " %> - - - <%= link_to(h(e.user), user_path(e.user_id)) %> - -   - - <%= l(:label_new_activity) %> - -   - <%= link_to format_activity_title("#{act.board.name}: #{act.subject}"), - {:controller => 'messages', - :action => 'show', - :board_id => act.board_id}.merge(act.parent_id.nil? ? {:id => act.id} : {:id => act.parent_id, :r => act.id, :anchor => "message-#{act.id}"}) %> -
    -

    - <%= textAreailizable(act, :content) %> -

    -
    -
    - - <%= (l(:label_update_time).to_s << ': ' << format_time(e.act.created_on)).to_s %> - -
    -
    -
    - - <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> - -   - - <%= l(:label_new_user) %> - - - - <%= link_to(h(e.user), user_path(e.user_id)) %> - -   - - <%= l(:label_new_user) %> - -
    -

    -
    -
    - - <%= (l(:label_update_time).to_s << ': ' << format_time(e.act.created_on)).to_s %> - -
    -
    -
    - - <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> - -   - - <%= l(:label_i_new_activity) %> - -   - <%= link_to format_activity_title("#{l(:label_news)}: #{act.title}"), {:controller => 'news', :action => 'show', :id => act.id} %> - - - <%= link_to(h(e.user), user_path(e.user_id)) %> - -   - - <%= l(:label_new_activity) %> - -   - <%= link_to format_activity_title("#{l(:label_news)}: #{act.title}"), {:controller => 'news', :action => 'show', :id => act.id} %> -
    -

    - <%= textAreailizable act, :description %> -

    -
    -
    - - <%= (l(:label_update_time).to_s << ': ' << format_time(e.act.created_on)).to_s %> - -
    -
    - - <%= link_to l(:label_find_all_comments), {:controller => 'news', :action => 'show', :id => act.id} if e.act.comments_count!= 0 %> - - - <%= l(:label_comments_count, :count => e.act.comments_count) %> - -
    -
    - - <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> - -   - - <%= l(:label_i_new_activity) %> -   - <%= link_to format_activity_title("#{act.source_from} (#{act.status}): #{act.tracker.name} #{act.subject}"), - {:controller => 'issues', - :action => 'show', - :id => act.id} %> -
    - <%= textAreailizable act, :description %> -
    -
    - - <%= (l(:label_update_time).to_s << ': ' << format_time(e.act.created_on)).to_s %> - -
    -
    - - <%= link_to l(:label_find_all_comments), {:controller => 'issues', :action => 'show', :id => act.id} if e.act.journals.count!= 0 %> - - - <%= l(:label_comments_count, :count => e.act.journals.count) %> - -
    -
    - - <%= link_to(h(e.user), user_path(e.user_id)) %> -   - - <%= l(:label_new_activity) %> -   - <%= link_to format_activity_title("#{act.source_from} (#{act.status}): #{act.tracker.name} #{act.subject}"), - {:controller => 'issues', - :action => 'show', - :id => act.id} %> -
    - <%= textAreailizable act, :description %> -
    -
    - - <%= (l(:label_update_time).to_s << ': ' << format_time(e.act.created_on)).to_s %> - -
    -
    - - <%= link_to l(:label_find_all_comments), {:controller => 'issues', :action => 'show', :id => act.id} if e.act.journals.count!= 0 %> - - - <%= l(:label_comments_count, :count => e.act.journals.count) %> - -
    -
    - - <%= link_to("#{l(:label_i)}", user_path(e.user_id)) %> - -   - - <%= l(:label_i_new_activity) %> - -   - <%= link_to format_activity_title("#{l(:label_contest)}: #{act.name}"), {:controller => 'contests', :action => 'show_contest', :id => act.id} %> - - - <%= link_to(h(e.user), user_path(e.user_id)) %> - -   - - <%= l(:label_new_activity) %> - -   - <%= link_to format_activity_title("#{l(:label_contest)}: #{act.name}"), {:controller => 'contests', :action => 'show_contest', :id => act.id} %> -
    -

    - <%= textAreailizable act, :description %> -

    -
    -
    - - <%= (l(:label_update_time).to_s << ': ' << format_time(e.act.created_on)).to_s %> - -
    -
    -
    + <% if !@center_flag %> + + <% end %> + - <% end %> - <% end %> - <% end %> -
    - - <% else %> - <% if @user == User.current %> - <%= l(:label_user_activities_no) %> + <% if !@center_flag %> + + <% end %> -<% else %> - <% unless @message.empty? %> -
    - <% @message.each do |e| -%> - - - - - -
    <%= image_tag(url_to_avatar(e.user), :class => "avatar") %> - - - - - - - - - - - -
    - <%= link_to(h(e.user), user_path(e.user)) %> - <% if e.instance_of?(JournalsForMessage) %> - <% if e.reply_id == User.current.id %> - <% if e.jour_type == 'Bid' %> - <%= l(:label_in_bids) %><%= link_to(e.jour.name, respond_path(e.jour)) %> <%= l(:label_quote_my_words) %> - <% elsif e.jour_type == 'User' %> - <%= l(:label_in_users) %><%= link_to(e.jour.firstname, feedback_path(e.jour)) %> <%= l(:label_quote_my_words) %> - <% elsif e.jour_type == 'Project' %> - <%= l(:label_in_projects) %><%= link_to(e.jour.name, feedback_path(e.jour)) %> <%= l(:label_reply_plural) %> - <% end %> - <% else %> - <%= l(:label_about_requirement) %><%= link_to(e.jour.name, respond_path(e.jour_id)) %> <%= l(:label_have_respond) %> - <% end %> - <% else %> - <% if e.journal_reply.nil? || e.journal_reply.reply_id != User.current.id %> - <%= l(:label_about_issue) %><%= link_to(e.issue.subject, issue_path(e.journalized_id)) %><%= l(:label_have_respond) %> + - <% else %> - <%= l(:label_in_issues) %><%= link_to(e.issue.subject, issue_path(e.issue)) %><%= l(:label_quote_my_words) %> - <% end %> - <% end %> -
    -

    - <%= textAreailizable e.notes %> -

    -
    - - <%= format_time e.created_on %> - -
    -
    - <% end %> -
    +
    + + -<% html_title(l(:label_activity)) -%> diff --git a/app/views/users/show_new_score.js.erb b/app/views/users/show_new_score.js.erb index 4baee5c04..40ef7d5c5 100644 --- a/app/views/users/show_new_score.js.erb +++ b/app/views/users/show_new_score.js.erb @@ -1,3 +1,4 @@ $('#ajax-modal').html('<%= escape_javascript(render :partial => 'users/show_new_score') %>'); showModal('ajax-modal', '400px'); +$('#ajax-modal').siblings().show(); $('#ajax-modal').addClass('new-watcher'); diff --git a/app/views/users/user_activities.html.erb b/app/views/users/user_activities.html.erb index 9165e6f2e..32915245f 100644 --- a/app/views/users/user_activities.html.erb +++ b/app/views/users/user_activities.html.erb @@ -28,7 +28,7 @@
    -
    <%= content_tag('span', h(e.project), :class => 'project') %> <%= l(:label_new_activity) %> + <%= content_tag('span', h(e.project), :class => 'project') %> <% if e.event_type.eql?("message") || e.event_type.eql?("reply") %> <%= link_to format_activity_title(e.event_title), e.board.project ? project_boards_path(e.board.project,:topic_id => e.id):course_boards_path(e.board.course,:topic_id => e.id) %> <%else %> diff --git a/app/views/users/user_course_activities.html.erb b/app/views/users/user_course_activities.html.erb new file mode 100644 index 000000000..bdebee6a5 --- /dev/null +++ b/app/views/users/user_course_activities.html.erb @@ -0,0 +1,19 @@ +<% for rec in @list %> +
    + + + <%= rec[:e].name %> + + <%# if( rec[:e].is_public == false || rec[:e].is_public == 0 ) %> + + <%# end %> + + <%= rec[:item].user.show_name %> + <%= get_activity_opt(rec[:item],rec[:e]) %> + + <%= get_activity_act_showname_htmlclear(rec[:item]) %> + + <%= time_tag(get_activity_act_createtime(rec[:item])).html_safe %> +
    +<% end %> \ No newline at end of file diff --git a/app/views/users/user_courses.html.erb b/app/views/users/user_courses.html.erb index 6e0a1ca17..36e061efa 100644 --- a/app/views/users/user_courses.html.erb +++ b/app/views/users/user_courses.html.erb @@ -1,33 +1,31 @@ -<% if @user.user_extensions.identity == UserExtensions::TEACHER %> - <%= render :partial => 'my_course' %> -<% else %> - <%= render :partial => 'my_joinedcourse' %> -<% end %> - +
    + + <% if @user.user_extensions.identity == 0 && @user.allowed_to?(:add_course, nil, :global => true) %> + 新建课程 + <% else %> + 加入课程 + <% end %> +
    +
    - -<% html_title(l(:label_user_course)) -%> \ No newline at end of file +
    +
    +
    +

    所有课程

    + +
    +
    + <% for item in @list %> + <%= render :partial => 'course_form', :locals => {:item => item} %> + <% end %> +

    <%= l(:label_no_data) %>

    +
    +
      + <%= pagination_links_full @obj_pages, @obj_count, :per_page_links => false, :remote => false, :flag => true%> +
    +
    +
    \ No newline at end of file diff --git a/app/views/users/user_courses4show.html.erb b/app/views/users/user_courses4show.html.erb new file mode 100644 index 000000000..7aab1b2a5 --- /dev/null +++ b/app/views/users/user_courses4show.html.erb @@ -0,0 +1,16 @@ +<% for item in @list %> + + +<% end %> diff --git a/app/views/users/user_fanslist.html.erb b/app/views/users/user_fanslist.html.erb index 92cc1cfb7..0b42da9f8 100644 --- a/app/views/users/user_fanslist.html.erb +++ b/app/views/users/user_fanslist.html.erb @@ -1,52 +1,25 @@ - -

    <%= l(:label_x_user_fans, :count => User.current.watcher_users(User.current.id).count) %>

    -
    - <% for user in @user.watcher_users %> -
      -
    • - - - - - -
      - <%= link_to image_tag(url_to_avatar(user), :class => "avatar"),user_path(user),:title => "#{user.name}" %> - - - - - - - - - - - - - - -
      - <%= content_tag "div", link_to(user.name, user_path(user)), :class => "project_avatar_name" %> -

      - <% cond = Project.visible_condition(User.current) + " AND projects.project_type <> 1" %> - <% memberships = user.memberships.all(:conditions => cond) %> - <%= l(:label_x_contribute_to, :count => memberships.count) %> - <% for member in memberships %> - <%= link_to_project(member.project) %><%= (user.memberships.last == member) ? '' : ',' %> - <% end %> - -

      - <% user_courses = user_courses_list(user) %> - <%= l(:label_x_course_contribute_to, :count => user_courses.count) %> - <%= ":" unless user_courses.empty? %> - <% for course in user_courses %> - <%= link_to course.name,{:controller => 'courses',:action => 'show',id:course.id, host: Setting.host_course} %><%= (user_courses.last == course) ? '' : ',' %> - <% end %> -

      -
      <%= l(:label_user_joinin) %><%= format_date(user.created_on) %> -
      -
      -
    • -
    - <% end %> -
    \ No newline at end of file +
    +
    +
    + <% if @action == 'fans' %> +

    粉丝

    +
    共有<%=@obj_count%>名粉丝
    + <% elsif @action == 'visitor' %> +

    访客

    +
    共有<%=@obj_count%>访客
    + <% else %> +

    关注

    +
    一共关注<%=@obj_count%>
    + <% end %> +
    +
    + <% for item in @list %> + <%= render :partial => 'users/user_fans_item', :locals => {:item => item,:target=>@user} %> + <% end %> +

    <%= l(:label_no_data) %>

    +
    +
      + <%= pagination_links_full @obj_pages, @obj_count, :per_page_links => false, :remote => false, :flag => true%> +
    +
    +
    diff --git a/app/views/users/user_feedback4show.html.erb b/app/views/users/user_feedback4show.html.erb new file mode 100644 index 000000000..0a1fc8af2 --- /dev/null +++ b/app/views/users/user_feedback4show.html.erb @@ -0,0 +1,36 @@ +<% for item in feed_list %> +
    + + <%= image_tag url_to_avatar(item.user),:width => '27',:height => '27' %> + + <%= item.user.show_name %> + <% if item.at_user %> +  回复 + <%= item.at_user.show_name %> + <% end %> +  :  +
    <%=item.notes.html_safe%>
    + <% if JournalsForMessage.create_by_user? User.current %> + 回复 + <% end %> + <% if User.current.admin? || item.user.id == User.current.id %> + item.id,:user_id=>item.user.id) %>" data-confirm="您确定要删除吗?" data-remote="true" data-method="delete" class="fl mt5 c_purple ml5">删除 + <% end %> + <%= time_tag(item.created_on).html_safe %> +
    + +
    +<% end %> diff --git a/app/views/users/user_projects.html.erb b/app/views/users/user_projects.html.erb index 69dda693e..e7eeedb29 100644 --- a/app/views/users/user_projects.html.erb +++ b/app/views/users/user_projects.html.erb @@ -1,66 +1,56 @@ - - - - -
    +
    <% id = 'project_respond_form_'+ reply.id.to_s %> - <%= link_to reply.user.name, user_path(reply.user) %> + <%= link_to "#{reply.user.show_name}(#{reply.user.login})", user_path(reply.user) %> <%= l(:label_reply_to)%> <% if show_name %> - <%= link_to parent_jour.user.name, user_path(parent_jour.user) %> + <%= link_to "#{parent_jour.user.show_name}(#{parent_jour.user.login})", user_path(parent_jour.user) %> <% else %> <%= l(:label_anonymous) %> <% end %> @@ -24,20 +24,21 @@

    <%= reply.notes.html_safe %>

    +
    <%= format_time reply.created_on %> -
    <% if reply_allow %> diff --git a/app/views/words/create.js.erb b/app/views/words/create.js.erb index 16f26d5f7..046bc7d1d 100644 --- a/app/views/words/create.js.erb +++ b/app/views/words/create.js.erb @@ -1,9 +1,15 @@ -//$('#message').html('<#%= escape_javascript(render(:partial => 'words/message', :locals => {:jour => @jour, :state => false, :user => @user, :feedback_pages => @feedback_pages,:show_name => true})) %>'); +//$('#message').html('<%#= escape_javascript(render(:partial => 'words/message', :locals => {:jour => @jour, :state => false, :user => @user, :feedback_pages => @feedback_pages,:show_name => true})) %>'); +<% if !@jour.nil? && @jour.jour_type == 'Principal' %> + var html = $("
    "+"<%= escape_javascript( render(:template => 'users/user_feedback4show',:locals => {:feed_list=>[@jour]} )) %>"+"
    "); + $("div[nhname='container']",$("#nh_messages")).prepend(html.html()); + $('#new_message_cancel_btn').click(); + var params = init_list_more_div_params($("#nh_messages")); + change_status_4_list_more_div(params); + +<% else %> $('#history').html('<%= escape_javascript(render(:partial => 'users/history',:locals => { :journals => @jour, :state => false})) %>') $('#jour_count').html('<%= @obj_count%>') $('#pre_show').html('<%= escape_javascript(render(:partial => 'pre_show', :locals => {:content => nil})) %>'); $('#new_form_user_message').val(""); -if($('#new_message_cancel_btn') != undefined && $('#new_message_cancel_btn').length!=0){ - $('#new_message_cancel_btn').click(); -} -$('#new_form_reference_user_id').val(""); \ No newline at end of file +$('#new_form_reference_user_id').val(""); +<% end %> diff --git a/app/views/words/create_reply.js.erb b/app/views/words/create_reply.js.erb index eeb4e3ef6..8e57d7b0e 100644 --- a/app/views/words/create_reply.js.erb +++ b/app/views/words/create_reply.js.erb @@ -1,5 +1,14 @@ <% if @save_succ %> - var pre_append = $('<%= j( + <% if !@jfm.nil? && @jfm.jour_type == 'Principal' %> + var html = $("
    "+"<%= escape_javascript( render(:template => 'users/user_feedback4show',:locals => {:feed_list=>[@jfm]} )) %>"+"
    "); + $("div[nhname='container']",$("#nh_messages")).prepend(html.html()); +// $('#new_message_cancel_btn').click(); + $("a[nhname='reply_btn']",$("#nh_jours_<%= @jfm.m_reply_id %>")).click(); + var params = init_list_more_div_params($("#nh_messages")); + change_status_4_list_more_div(params); + <% else %> + + var pre_append = $('<%= j( render :partial => "words/journal_reply_items", :locals => {:reply => @jfm, :journal => @jfm.parent, :m_reply_id => @jfm,:show_name => @show_name} ) %>').hide(); @@ -12,6 +21,8 @@ textarea1.val(''); $('#course_respond_form_<%=@jfm.m_reply_id.to_s%>').hide(); setMaxLengthItem(pre_append.find('textarea')[0]); + <% end %> + <% else %> alert("<%= l(:label_feedback_fail) %>"); <% end %> \ No newline at end of file diff --git a/app/views/words/destroy.js.erb b/app/views/words/destroy.js.erb index dabd3a8c7..92e15ab93 100644 --- a/app/views/words/destroy.js.erb +++ b/app/views/words/destroy.js.erb @@ -1,18 +1,26 @@ <% if @journal_destroyed.nil? %> alert('<%=l(:notice_failed_delete)%>'); <% elsif (['Principal','Project','Course', 'Bid', 'Contest', 'Softapplication'].include? @journal_destroyed.jour_type)%> - <% if @bid && @jours_count %> - $('#jours_count').html("<%= @jours_count %>"); - <% elsif @course && @jours_count%> - $('#course_jour_count').html("(<%= @jours_count %>)"); - <% elsif @user && @jours_count%> - $('#jour_count').html("<%= @jours_count %>"); + <% if @is_user%> + $("#nh_jours_<%= @journal_destroyed.id %>",$("div[nhname='container']",$("#nh_messages"))).remove(); + var params = init_list_more_div_params($("#nh_messages")); + change_status_4_list_more_div(params); + <% else %> + <% if @bid && @jours_count %> + $('#jours_count').html("<%= @jours_count %>"); + <% elsif @course && @jours_count%> + $('#course_jour_count').html("(<%= @jours_count %>)"); + <% elsif @user && @jours_count%> + $('#jour_count').html("<%= @jours_count %>"); + <% end %> + var destroyedItem = $('#word_li_<%=@journal_destroyed.id%>') + destroyedItem.fadeOut(600,function(){ + destroyedItem.remove(); + }); + <% end %> - var destroyedItem = $('#word_li_<%=@journal_destroyed.id%>') - destroyedItem.fadeOut(600,function(){ - destroyedItem.remove(); - }); <% else %> $('#message').html('<%= escape_javascript(render(:partial => 'words/message', :locals => {:jour => @jour, :state => false, :user => @user, :feedback_pages => @feedback_pages})) %>'); $('#new_form_reference_user_id').val(""); <% end %> + diff --git a/config/locales/commons/zh.yml b/config/locales/commons/zh.yml index f83d3810c..457d56dad 100644 --- a/config/locales/commons/zh.yml +++ b/config/locales/commons/zh.yml @@ -263,7 +263,7 @@ zh: label_tags_numbers: "Tag统计" label_issue_plural: 问题跟踪 - label_project_plural: 项目列表 +# label_project_plural: 项目列表 label_user_plural: 用户列表 label_tags_call: 需求 field_filename: 文件 @@ -337,7 +337,7 @@ zh: # # 贴吧动态栏 # - lable_bar_active: 问题和反馈动态 + lable_bar_active: 贴吧动态 label_my_question: 我要提问 label_my_feedback: 我要反馈 diff --git a/config/locales/courses/zh.yml b/config/locales/courses/zh.yml index 772d6bb52..498388cfc 100644 --- a/config/locales/courses/zh.yml +++ b/config/locales/courses/zh.yml @@ -20,7 +20,7 @@ zh: label_course_mail_news_reply: 课程通知回复 label_main_teacher: 主讲教师 label_course_term: 开课学期 - label_isuue_mail_status: 更新了issue状态 + label_isuue_mail_status: 更新了issue状态! label_join_course: 加入 label_exit_course: 退出 diff --git a/config/locales/en.yml b/config/locales/en.yml index 8419ae188..f532f5cbc 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -183,10 +183,10 @@ en: setting_bcc_recipients: Blind carbon copy recipients (bcc) setting_plain_text_mail: Plain text mail (no HTML) setting_host_name: Host name and path - setting_host_course: Host course and path - setting_host_contest: Host contest and path - setting_host_user: Host user and path - setting_host_repository: Host repository and path + setting_host_course: Host course and path + setting_host_contest: Host contest and path + setting_host_user: Host user and path + setting_host_repository: Host repository and path setting_text_formatting: Text formatting setting_wiki_compression: Wiki history compression setting_feeds_limit: Maximum number of items in Atom feeds @@ -961,6 +961,8 @@ en: label_overview: "Overview" label_project_tool: "Tool" label_project_issues: "Issues" + label_project_issue: "Created the Issue:" + label_project_issue_update: "Upadated the Issue:" label_project_newother: "See other comments" label_project_newshare: "has shared" label_project_newadd: "added" @@ -1469,6 +1471,7 @@ en: label_borad_course: Course-borad label_project_notice: release the notice + label_project_notice_reply: reply the notice label_forum_new: New forum label_memo_new_from_forum: Release memo @@ -1524,7 +1527,7 @@ en: label_recently_updated_courseware: Recently updated the courseware label_no_courses: You do not participate in any course, please search the curriculum, course, or create a course! label_commit_failed: commit failed - #api end - error_upload_avatar_to_large: "too big (%{max_size})" - not_valid_image_file: not a valid image file - + #api end + error_upload_avatar_to_large: "too big (%{max_size})" + not_valid_image_file: not a valid image file + diff --git a/config/locales/my/zh.yml b/config/locales/my/zh.yml index 35fd4e48a..4220aceca 100644 --- a/config/locales/my/zh.yml +++ b/config/locales/my/zh.yml @@ -31,9 +31,11 @@ zh: label_account_identity_developer: 开发者 label_account_identity_enterprise: 组织 label_account_identity_studentID: 请输入学号 - + + field_brief_introduction_my: 个人签名 + field_description: 个人简介 field_is_required: 必填 - field_firstname: 名字 + field_firstname: 名字或组织名 firstname_empty: 名字不能为空 field_firstname_eg: '(例:张三丰,请填写[三丰])' field_lastname: 姓氏 diff --git a/config/locales/projects/zh.yml b/config/locales/projects/zh.yml index 5bf8957bf..e1971cfb9 100644 --- a/config/locales/projects/zh.yml +++ b/config/locales/projects/zh.yml @@ -90,6 +90,14 @@ zh: label_project_tool_response: 用户反馈 label_project_news: 项目新闻 + label_project_dts_new: DTS缺陷测试 + label_project_dts_statics: DTS缺陷报告 + label_project_dts_yun: 云化部署 + label_project_soft_knowledge: 软件知识库 + label_project_soft_file: 软件资源库 + label_project_online_dev: 在线开发平台 + label_project_soft_service: 软工服务平台 + label_project_overview: "项目简介" label_expend_information: 展开更多信息 label_project_create: "新建了项目" @@ -399,6 +407,7 @@ zh: label_issue_number: issue的数量 label_issue_journal_number: issue的留言数量 label_project_mail_feedback: 项目留言 + label_project_issue_feedback: 留言 label_news_score: 新闻得分 label_new_number: 新闻的数量 diff --git a/config/locales/users/zh.yml b/config/locales/users/zh.yml index 4c792ef82..d90d8c537 100644 --- a/config/locales/users/zh.yml +++ b/config/locales/users/zh.yml @@ -67,7 +67,8 @@ zh: documents: 提交文档次数 attachments: 提交附件次数 update_issues: 更新缺陷完成度次数 - release_issues: 发布缺陷数量 + release_issues: 发布缺陷数量 + release_messages: 发布帖子数量 label_score_less_than_zero: 得分小于0,修正为0 label_user_info: "个人简介" diff --git a/config/locales/zh.yml b/config/locales/zh.yml index b327b1d5f..b2faa6319 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -7,11 +7,33 @@ zh: direction: ltr jquery: locale: "zh-CN" + date: + formats: + # Use the strftime parameters for formats. + # When no format has been given, it uses default. + # You can provide other formats here if you like! + default: "%Y-%m-%d" + short: "%b%d日" + long: "%Y年%b%d日" + + day_names: [星期天, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六] + abbr_day_names: [日, 一, 二, 三, 四, 五, 六] + + # Don't forget the nil at the beginning; there's no such thing as a 0th month + month_names: [~, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月] + abbr_month_names: [~, 1月, 2月, 3月, 4月, 5月, 6月, 7月, 8月, 9月, 10月, 11月, 12月] + # Used in date_select and datime_select. + order: + - :year + - :month + - :day notice_account_updated: 帐号更新成功 + notice_account_old_wrong_password: 原始密码错误 notice_account_wrong_password: 密码错误 name_can_be_empty: 可以不填写真实姓名[保密所需] notice_successful_create: 创建成功 + notice_create_failed: 创建失败,请先完善个人信息 notice_failed_create: 创建失败 notice_successful_update: 更新成功 notice_successful_edit: 修改成功 @@ -264,9 +286,9 @@ zh: permission_view_gantt: 查看甘特图 permission_view_calendar: 查看日历 permission_view_issue_watchers: 查看跟踪者列表 - - - + + + permission_add_issue_watchers: 添加跟踪者 permission_delete_issue_watchers: 删除跟踪者 permission_log_time: 登记工时 @@ -635,7 +657,7 @@ zh: label_comment_add: 添加评论 label_comment_added: 评论已添加 label_comment_delete: 删除评论 - + @@ -736,7 +758,7 @@ zh: label_date_to: 到 label_language_based: 根据用户的语言 - label_mail_policy: 邮件策略 + label_mail_policy: 您可以修改邮件通知策略 label_send_test_email: 发送测试邮件 label_feeds_access_key: RSS存取键 label_missing_feeds_access_key: 缺少RSS存取键 @@ -783,8 +805,13 @@ zh: label_project_newother: "查看其他评论" label_project_newshare: "分享了" label_project_notice: "发布了通知:" + label_project_notice_reply: "回复了通知:" + label_course_notice_point: "通知有了新的回复!" + lable_project_notice_point: "新闻有了新的回复!" label_project_mail_notice: "发布了新闻:" - label_project_issue: "发布了问题:" + lable_project_mail_notice_reply: "回复了新闻:" + label_project_issue: "发布了问题:" + label_project_issue_update: "更新了问题:" label_project_newadd: "添加了" label_project_unadd: "暂无项目,赶快去创建吧!" label_project_un: "该用户暂未参与任何项目!" @@ -1194,9 +1221,9 @@ zh: label_post_on: 发表了 label_post_on_issue: 发表了问题 - - + + label_updated_time_on: " 更新于 %{value} " label_call_list: 需求列表 @@ -1507,9 +1534,9 @@ zh: label_news_number: 新闻的数量 label_wiki_number: wiki的数量 label_wiki_mail_notification: 发布了wiki - - - + + + # redmine活跃度评分 label_message_number: 留言的数量 # delete label_activity_number: 个人动态数量 # delete @@ -1519,14 +1546,14 @@ zh: label_wiki_number: wiki的数量 # delete - + label_activities: 个人动态 label_issue_message_number: 对issue的留言数量 label_code_submit_number: 代码提交次数 label_topic_number: 讨论区发言数量 - + label_join_contest: 加入竞赛 label_exit_contest: 退出竞赛 label_participator: 参与者 @@ -1621,7 +1648,7 @@ zh: label_bid_contest_show_course_name: 课程名称 label_bid_contest_show_teacher_name: 教师 label_contest_list: 竞赛列表 - + label_bids_task_list: 作业列表 @@ -1815,6 +1842,8 @@ zh: excel_member_with_out_class: "未加入班级的学生" excel_member_list: 成员列表 excel_homework_list: 作品列表 + excel_absence_list: 缺评列表 + excel_evaluation_list: 匿评列表 excel_been_rated: 已评 excel_not_rated: 未评 label_export_excel: 导出列表 @@ -1845,6 +1874,7 @@ zh: label_attendingcontestwork_adaptive_system: 系统支持 label_attendingcontestwork_download: 作品下载 label_course_attendingcontestwork_download: 课件下载 + label_course_mail_files: 课程资源 label_attendingcontestwork_developers: 开发人员 label_attendingcontestwork_average_scores: 平均评分 label_attendingcontestwork_release_time: 发布时间 @@ -1894,9 +1924,9 @@ zh: lable_teacher_evaluation: 作业综评 lable_course_teacher: 主讲老师 lable_course_end: 课程学期已结束 - label_no_contest_news_description: 竞赛描述不能为空 + label_no_contest_news_description: 竞赛通知描述不能为空 label_contest_news_condition: 竞赛描述超过5000个汉字 - label_no_contest_news_title: 竞赛标题不能为空 + label_no_contest_news_title: 竞赛通知标题不能为空 label_contest_news_title_condition: 竞赛标题超过255个汉字 label_course_organizers: 开设单位 @@ -1919,6 +1949,7 @@ zh: label_my_score: 我的评分 field_open_anonymous_evaluation: 是否使用匿评 label_course_empty_select: 尚未选择课程! + label_project_empty_select: 尚未选择项目! label_course_prompt: 课程: label_project_prompt: 项目: label_contain_resource: 已包含资源: @@ -1948,9 +1979,9 @@ zh: label_poll_republish_success: 取消成功 label_answer_total: 总计: label_join_project: 加入项目 - - - + + + # # # 项目企业模块 @@ -2000,3 +2031,23 @@ zh: error_upload_avatar_to_large: "超过大小限制 (%{max_size})" not_valid_image_file: 不是有效的图片文件 + + lable_all_penalty: 应评 + lable_has_penalty: 实评 + lable_absence_penalty: 缺评 + + label_work_name: 作品名称 + label_work_autor: 作品提交者 + label_work_id: 提交者学号 + label_evaluation_id: 匿评者学号 + label_evaluation_name: 匿评者 + label_evaluation_score: 匿评分数 + label_evaluation_common: 匿评评语 + label_evaluation_time: 匿评时间 + + label_file_lost_list: 缺失文件列表 + lable_unset: 未设置 + label_chose_group: 请选择分班 + + + diff --git a/config/routes.rb b/config/routes.rb index b5a244345..1ae607eb7 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -85,7 +85,7 @@ RedmineApp::Application.routes.draw do get 'alert_anonymous_comment' end collection do - + post 'next_step' end end @@ -98,6 +98,9 @@ RedmineApp::Application.routes.draw do post 'add_score_reply' get 'destroy_score_reply' get 'student_work_absence_penalty' + get 'absence_penalty_list' + get 'evaluation_list' + post 'set_program_score' end end @@ -190,6 +193,7 @@ RedmineApp::Application.routes.draw do resources :stores do collection do match 'search', :via => [:get, :post] + get 'lost_file' end end @@ -294,6 +298,12 @@ RedmineApp::Application.routes.draw do match 'user_watchlist', :to => 'users#user_watchlist', :via => :get, :as => "user_watchlist" #add by huang match 'user_fanslist', :to => 'users#user_fanslist', :via => :get, :as => "user_fanslist" #add by huang match 'user_courses', :to => 'users#user_courses', :via => :get + match 'user_courses4show', :to => 'users#user_courses4show', :via => :get + match 'user_projects4show', :to => 'users#user_projects4show', :via => :get + match 'user_course_activities', :to => 'users#user_course_activities', :via => :get + match 'user_project_activities', :to => 'users#user_project_activities', :via => :get + match 'user_feedback4show', :to => 'users#user_feedback4show', :via => :get + match 'user_visitorlist', :to => 'users#user_visitorlist', :via => :get match 'user_homeworks', :to => 'users#user_homeworks', :via => :get match 'watch_projects', :to => 'users#watch_projects', :via => :get # added by bai @@ -337,6 +347,8 @@ RedmineApp::Application.routes.draw do match 'my/remove_block', :via => :post match 'my/order_blocks', :via => :post match 'my/change_mail_notification', via: :get + match 'my/save_user_avatar', :to => 'my#save_user_avatar', :via => [:get, :post] + match 'my/clear_user_avatar_temp', :to => 'my#clear_user_avatar_temp', :via => [:get, :post] get 'my/page2', :to => 'my#page2', :as => "my_page2" @@ -373,10 +385,20 @@ RedmineApp::Application.routes.draw do get 'feedback', :action => 'feedback', :as => 'project_feedback' get 'watcherlist', :action=> 'watcherlist' + + # 添加dts测试工具 + get 'dts_dep', :action=> 'dts_dep' + get 'yun_dep', :action=> 'yun_dep' + get 'soft_knowledge', :action=> 'soft_knowledge' + get 'soft_file', :action=> 'soft_file' + get 'online_dev', :action=> 'online_dev' + get 'soft_service', :action=> 'soft_service' + get 'invite_members', :action=> 'invite_members' get 'invite_members_by_mail', :action=> 'invite_members_by_mail' + # get 'dts_repos', :aciton => 'dts_repos' get 'send_mail_to_member', :action => 'send_mail_to_member' - match 'user_watcherlist', :to => 'projects#watcherlist', :via => :get, :as => "watcherlist" #add by huang + match 'user_watcherlist', :to => 'projects#watcherlist', :via => :get, :as => "watcherlist" #end post 'modules' post 'archive' @@ -633,6 +655,7 @@ RedmineApp::Application.routes.draw do match 'admin', :to => 'admin#index', :via => :get match 'admin/projects', :via => :get + get 'admin/courses' match 'admin/users', :via => :get match 'admin/first_page_made', as: :first_page_made match 'admin/course_page_made', as: :course_page_made diff --git a/db/migrate/20150630031857_delete_same_score.rb b/db/migrate/20150630031857_delete_same_score.rb new file mode 100644 index 000000000..261a54552 --- /dev/null +++ b/db/migrate/20150630031857_delete_same_score.rb @@ -0,0 +1,13 @@ +class DeleteSameScore < ActiveRecord::Migration + def up + student_work_scores = StudentWorksScore.find_by_sql("SELECT * FROM student_works_scores AS a + WHERE (a.student_work_id,a.user_id) IN (SELECT student_work_id,user_id FROM student_works_scores GROUP BY student_work_id,user_id HAVING COUNT(*) > 1) + AND id NOT IN (SELECT MIN(id) FROM student_works_scores GROUP BY student_work_id,user_id HAVING COUNT(*)>1)") + student_work_scores.each do |score| + score.destroy + end + end + + def down + end +end diff --git a/db/migrate/20150702073245_add_late_penalty_to_studnet_work.rb b/db/migrate/20150702073245_add_late_penalty_to_studnet_work.rb new file mode 100644 index 000000000..e8dcf12b7 --- /dev/null +++ b/db/migrate/20150702073245_add_late_penalty_to_studnet_work.rb @@ -0,0 +1,9 @@ +class AddLatePenaltyToStudnetWork < ActiveRecord::Migration + def up + add_column :student_works, :late_penalty, :integer, default: 0 + end + + def down + remove_column :student_works, :late_penalty + end +end diff --git a/db/migrate/20150702073308_add_absence_penalty_to_studnet_work.rb b/db/migrate/20150702073308_add_absence_penalty_to_studnet_work.rb new file mode 100644 index 000000000..401de3d34 --- /dev/null +++ b/db/migrate/20150702073308_add_absence_penalty_to_studnet_work.rb @@ -0,0 +1,9 @@ +class AddAbsencePenaltyToStudnetWork < ActiveRecord::Migration + def up + add_column :student_works, :absence_penalty, :integer, default: 0 + end + + def down + remove_column :student_works, :absence_penalty + end +end diff --git a/db/migrate/20150708025533_add_proportion_to_programing.rb b/db/migrate/20150708025533_add_proportion_to_programing.rb new file mode 100644 index 000000000..b3da59c25 --- /dev/null +++ b/db/migrate/20150708025533_add_proportion_to_programing.rb @@ -0,0 +1,9 @@ +class AddProportionToPrograming < ActiveRecord::Migration + def up + add_column :homework_detail_programings, :ta_proportion, :float, :default => 0.1 + end + + def down + remove_column :homework_detail_programings, :ta_proportion + end +end diff --git a/db/migrate/20150708085629_change_studen_work_desc.rb b/db/migrate/20150708085629_change_studen_work_desc.rb new file mode 100644 index 000000000..af3c25671 --- /dev/null +++ b/db/migrate/20150708085629_change_studen_work_desc.rb @@ -0,0 +1,9 @@ +class ChangeStudenWorkDesc < ActiveRecord::Migration + def up + change_column :student_works,:description,:text,:limit => 4294967295 + end + + def down + change_column :student_works,:description,:text + end +end diff --git a/db/migrate/20150709071731_add_question_id_to_homework.rb b/db/migrate/20150709071731_add_question_id_to_homework.rb new file mode 100644 index 000000000..d1be59431 --- /dev/null +++ b/db/migrate/20150709071731_add_question_id_to_homework.rb @@ -0,0 +1,9 @@ +class AddQuestionIdToHomework < ActiveRecord::Migration + def up + add_column :homework_detail_programings, :question_id, :integer + end + + def down + remove_column :homework_detail_programings, :question_id + end +end diff --git a/db/migrate/20150713161100_add_description_to_user_extensions.rb b/db/migrate/20150713161100_add_description_to_user_extensions.rb new file mode 100644 index 000000000..97cca4222 --- /dev/null +++ b/db/migrate/20150713161100_add_description_to_user_extensions.rb @@ -0,0 +1,9 @@ +class AddDescriptionToUserExtensions < ActiveRecord::Migration + def up + add_column :user_extensions, :description, :string, default: '' + end + + def down + remove_column :user_extensions, :description + end +end \ No newline at end of file diff --git a/db/migrate/20150714161100_create_visitors.rb b/db/migrate/20150714161100_create_visitors.rb new file mode 100644 index 000000000..2430b6002 --- /dev/null +++ b/db/migrate/20150714161100_create_visitors.rb @@ -0,0 +1,14 @@ +class CreateVisitors < ActiveRecord::Migration + def change + create_table :visitors do |t| + t.integer :user_id + t.integer :master_id + t.datetime :updated_on + t.datetime :created_on + + end + add_index "visitors", ["user_id"], :name => "index_visitors_user_id" + add_index "visitors", ["master_id"], :name => "index_visitors_master_id" + add_index "visitors", ["updated_on"], :name => "index_visitors_updated_on" + end +end \ No newline at end of file diff --git a/db/migrate/20150714162200_add_activity_container_type_to_activities.rb b/db/migrate/20150714162200_add_activity_container_type_to_activities.rb new file mode 100644 index 000000000..9effc48a2 --- /dev/null +++ b/db/migrate/20150714162200_add_activity_container_type_to_activities.rb @@ -0,0 +1,11 @@ +class AddActivityContainerTypeToActivities < ActiveRecord::Migration + def up + add_column :activities, :activity_container_id, :int + add_column :activities, :activity_container_type, :string, default: '' + end + + def down + remove_column :activities, :activity_container_type + remove_column :activities, :activity_container_id + end +end \ No newline at end of file diff --git a/db/migrate/20150715070534_create_test_result.rb b/db/migrate/20150715070534_create_test_result.rb new file mode 100644 index 000000000..4816fbcb8 --- /dev/null +++ b/db/migrate/20150715070534_create_test_result.rb @@ -0,0 +1,14 @@ +class CreateTestResult < ActiveRecord::Migration + def up + create_table :student_work_tests do |t| + t.integer :student_work_id + t.integer :homework_test_id + t.integer :result + t.timestamps + end + end + + def down + drop_table :student_work_tests + end +end diff --git a/db/migrate/20150715162300_change_activities_container_type.rb b/db/migrate/20150715162300_change_activities_container_type.rb new file mode 100644 index 000000000..0adffd66a --- /dev/null +++ b/db/migrate/20150715162300_change_activities_container_type.rb @@ -0,0 +1,13 @@ +class ChangeActivitiesContainerType < ActiveRecord::Migration + def up + activities = Activity.where("activity_container_type = ''") + activities.each do |activity| + activity.set_container_type_val + activity.save + end + end + + def down + Activity.where("activity_container_type <> ''").update_all(activity_container_type: '',activity_container_id:nil) + end +end \ No newline at end of file diff --git a/db/migrate/20150719092427_create_dts.rb b/db/migrate/20150719092427_create_dts.rb new file mode 100644 index 000000000..36ff24756 --- /dev/null +++ b/db/migrate/20150719092427_create_dts.rb @@ -0,0 +1,22 @@ +class CreateDts < ActiveRecord::Migration + def change + create_table :dts do |t| + t.string :IPLineCode + t.string :Description + t.string :Num + t.string :Variable + t.string :TraceInfo + t.string :Method + t.string :File + t.string :IPLine + t.string :Review + t.string :Category + t.string :Defect + t.string :PreConditions + t.string :StartLine + t.integer :project_id + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index bc2f2abfe..6754a30b7 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,12 +11,14 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20150712063406) do +ActiveRecord::Schema.define(:version => 20150719092427) do create_table "activities", :force => true do |t| - t.integer "act_id", :null => false - t.string "act_type", :null => false - t.integer "user_id", :null => false + t.integer "act_id", :null => false + t.string "act_type", :null => false + t.integer "user_id", :null => false + t.integer "activity_container_id" + t.string "activity_container_type", :default => "" end add_index "activities", ["act_id", "act_type"], :name => "index_activities_on_act_id_and_act_type" @@ -473,6 +475,25 @@ ActiveRecord::Schema.define(:version => 20150712063406) do add_index "documents", ["created_on"], :name => "index_documents_on_created_on" add_index "documents", ["project_id"], :name => "documents_project_id" + create_table "dts", :force => true do |t| + t.string "IPLineCode" + t.string "Description" + t.string "Num" + t.string "Variable" + t.string "TraceInfo" + t.string "Method" + t.string "File" + t.string "IPLine" + t.string "Review" + t.string "Category" + t.string "Defect" + t.string "PreConditions" + t.string "StartLine" + t.integer "project_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + create_table "enabled_modules", :force => true do |t| t.integer "project_id" t.string "name", :null => false @@ -586,8 +607,10 @@ ActiveRecord::Schema.define(:version => 20150712063406) do t.string "language" t.text "standard_code", :limit => 2147483647 t.integer "homework_common_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.float "ta_proportion", :default => 0.1 + t.integer "question_id" end create_table "homework_evaluations", :force => true do |t| @@ -1219,18 +1242,28 @@ ActiveRecord::Schema.define(:version => 20150712063406) do t.integer "project_id" end + create_table "student_work_tests", :force => true do |t| + t.integer "student_work_id" + t.integer "homework_test_id" + t.integer "result" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + create_table "student_works", :force => true do |t| t.string "name" - t.text "description" + t.text "description", :limit => 2147483647 t.integer "homework_common_id" t.integer "user_id" t.float "final_score" t.float "teacher_score" t.float "student_score" t.float "teaching_asistant_score" - t.integer "project_id", :default => 0 - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.integer "project_id", :default => 0 + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "late_penalty", :default => 0 + t.integer "absence_penalty", :default => 0 end create_table "student_works_evaluation_distributions", :force => true do |t| @@ -1328,7 +1361,7 @@ ActiveRecord::Schema.define(:version => 20150712063406) do end create_table "user_extensions", :force => true do |t| - t.integer "user_id", :null => false + t.integer "user_id", :null => false t.date "birthday" t.string "brief_introduction" t.integer "gender" @@ -1336,8 +1369,8 @@ ActiveRecord::Schema.define(:version => 20150712063406) do t.string "occupation" t.integer "work_experience" t.integer "zip_code" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.string "technical_title" t.integer "identity" t.string "student_id" @@ -1345,6 +1378,7 @@ ActiveRecord::Schema.define(:version => 20150712063406) do t.string "student_realname" t.string "location_city" t.integer "school_id" + t.string "description", :default => "" end create_table "user_grades", :force => true do |t| @@ -1451,6 +1485,17 @@ ActiveRecord::Schema.define(:version => 20150712063406) do add_index "versions", ["project_id"], :name => "versions_project_id" add_index "versions", ["sharing"], :name => "index_versions_on_sharing" + create_table "visitors", :force => true do |t| + t.integer "user_id" + t.integer "master_id" + t.datetime "updated_on" + t.datetime "created_on" + end + + add_index "visitors", ["master_id"], :name => "index_visitors_master_id" + add_index "visitors", ["updated_on"], :name => "index_visitors_updated_on" + add_index "visitors", ["user_id"], :name => "index_visitors_user_id" + create_table "watchers", :force => true do |t| t.string "watchable_type", :default => "", :null => false t.integer "watchable_id", :default => 0, :null => false diff --git a/lib/redmine.rb b/lib/redmine.rb index ba0fd0cee..3043cfe5d 100644 --- a/lib/redmine.rb +++ b/lib/redmine.rb @@ -367,6 +367,7 @@ end Redmine::MenuManager.map :admin_menu do |menu| menu.push :organization, {:controller => 'admin', :action => 'organization'}, :caption => :label_organization_list menu.push :projects, {:controller => 'admin', :action => 'projects'}, :caption => :label_project_plural + menu.push :courses, {:controller => 'admin', :action => 'courses'}, :caption => :label_course_all menu.push :users, {:controller => 'admin', :action => 'users'}, :caption => :label_user_plural menu.push :first_page_made, {:controller => 'admin',:action => 'first_page_made'},:caption => :label_first_page_made menu.push :mobile_version, {:controller => 'admin',:action => 'mobile_version'},:caption => :label_mobile_version diff --git a/plugins/redmine_code_review/app/controllers/code_review_controller.rb b/plugins/redmine_code_review/app/controllers/code_review_controller.rb index 14c702e1e..421599525 100644 --- a/plugins/redmine_code_review/app/controllers/code_review_controller.rb +++ b/plugins/redmine_code_review/app/controllers/code_review_controller.rb @@ -16,7 +16,7 @@ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. class CodeReviewController < ApplicationController - layout "project_base" + layout "base_projects" unloadable before_filter :find_project, :authorize, :find_user, :find_setting, :find_repository diff --git a/public/assets/kindeditor/themes/default/default.css b/public/assets/kindeditor/themes/default/default.css index c5a84c186..986263903 100644 --- a/public/assets/kindeditor/themes/default/default.css +++ b/public/assets/kindeditor/themes/default/default.css @@ -522,8 +522,7 @@ /* statusbar */ .ke-statusbar { position: relative; - background-color: #F0F0EE; - border-top: 1px solid #CCCCCC; + font-size: 0; line-height: 0; *height: 12px; diff --git a/public/images/pic_uersall.png b/public/images/pic_uersall.png new file mode 100644 index 000000000..6f94640e3 Binary files /dev/null and b/public/images/pic_uersall.png differ diff --git a/public/images/public_icon.png b/public/images/public_icon.png index 1fa463e4e..4dffad183 100644 Binary files a/public/images/public_icon.png and b/public/images/public_icon.png differ diff --git a/public/javascripts/course.js b/public/javascripts/course.js index 8f87767ed..b2736993b 100644 --- a/public/javascripts/course.js +++ b/public/javascripts/course.js @@ -394,6 +394,7 @@ function show_bid_dead_line(year,month,day,divname) + "" + "

    作品提交还剩:

    "); } + //验证新建作业的名字 function regex_homework_name() { @@ -414,6 +415,7 @@ function regex_homework_name() //验证匿评数量 function regex_evaluation_num() { + if($("#evaluation_num").length == 0){ return true;} var evaluation_num = $.trim($("#evaluation_num").val()); var regex = /^\d+$/; if(evaluation_num=="") @@ -471,15 +473,18 @@ $(function(){ }); //第一次加载时,如果未开启匿评作业,隐藏显示匿评配置信息 $(function(){ - if($("#homework_common_homework_type").attr("checked") == "checked") - { - $("#evaluation_setting").show(); - $("#ta_proportion").removeAttr("disabled"); - } - else + if($("#homework_common_homework_type").attr("id") != null && $("#homework_common_homework_type").val() != 2) { - $("#evaluation_setting").hide(); - $("#ta_proportion").attr("disabled","disabled"); + if($("#homework_common_homework_type").attr("checked") == "checked") + { + $("#evaluation_setting").show(); + $("#ta_proportion").removeAttr("disabled"); + } + else + { + $("#evaluation_setting").hide(); + $("#ta_proportion").attr("disabled","disabled"); + } } }); @@ -501,6 +506,62 @@ function submit_homework(id) } } +function regexHomeworkCommonName() +{ + var name = $.trim($("#homework_attach_name").val()); + + if(name=="") + { + $("#homework_attach_name_span").text("作品名称不能为空"); + $("#homework_attach_name_span").css('color','#ff0000'); + return false; + } + else + { + $("#homework_attach_name_span").text("填写正确"); + $("#homework_attach_name_span").css('color','#008000'); + return true; + } +} +function regexHomeworkCommonDescription() +{ + var name = $.trim($("#homework_attach_description").val()); + + if(name=="") + { + $("#homework_attach_description_span").text("作品描述不能为空"); + $("#homework_attach_description_span").css('color','#ff0000'); + return false; + } + else + { + $("#homework_attach_description_span").text("填写正确"); + $("#homework_attach_description_span").css('color','#008000'); + return true; + } +} + +function submit_homework_form(){if(regexHomeworkCommonName()&®exHomeworkCommonDescription()){$('#new_homework_attach').submit();}} + +//增加测试结果 +function add_programing_test(obj) { + var now = new Date().getTime(); + obj.after("
  • " + + "
  • " + + "
  • " + + "" + + "
  • "); +} +//删除测试结果 +function remove_programing_test(obj) { + if(obj.siblings("div").length == 0){ + alert("至少需要一组测试"); + } + else{ + obj.remove(); + } +} + function show_window (id1,id2,top,left) { $('#'+ id1).css('top',top); $('#'+ id1).css('left',left); @@ -671,6 +732,8 @@ function edit_student_work(id) {$("#edit_student_work_" + id).submit();} } +// + //滑动打分 $.fn.peSlider = function(settings){ //configurable options (none so far) @@ -786,15 +849,38 @@ $(function(){ $(".student_score_info").bind("mouseover",function(e){ //alert($(this).html()); $(this).find("div").show(); - $(this).find("div").css("top",e.pageY); - $(this).find("div").css("left",e.pageX); + //$(this).find("div").css("top",e.pageY); + //$(this).find("div").css("left",e.pageX); }); $(".student_score_info").bind("mouseout",function(e){ //alert($(this).html()); $(this).find("div").hide(); }); + //最终成绩提示 + $(".student_final_scor_info").bind("mouseover",function(e){ + //alert($(this).html()); + $(this).find("div").show(); + //$(this).find("div").css("top",e.pageY); + //$(this).find("div").css("left",e.pageX); + }); + $(".student_final_scor_info").bind("mouseout",function(e){ + //alert($(this).html()); + $(this).find("div").hide(); + }); $("#about_project label").eq(1).remove(); + + //附件下载提示 + $(".zip_download_alert").bind("mouseover",function(e){ + //alert($(this).html()); + $(this).next("div").show(); + //$(this).next("div").css("top",e.pageY); + //$(this).next("div").css("left",e.pageX); + }); + $(".zip_download_alert").bind("mouseout",function(e){ + //alert($(this).html()); + $(this).next("div").hide(); + }); }); //匿评弹框取消按钮 @@ -812,14 +898,19 @@ function clickOK(path) }); } //查询 -function SearchByName(obj,url,event) +function SearchByName(url,event) { var keycode = (event.keyCode ? event.keyCode : event.which); if(keycode == '13'){ - location.href = url + "&name=" + obj.val(); + location.href = url + "&name=" + $("#course_student_name").val() + "&group=" + $("#late_penalty").val(); } } -function SearchByName_1(obj,url) +function SearchByName_1(url) { - location.href = url + "&name=" + obj.val(); + if($("#late_penalty").val() == null){ + location.href = url + "&name=" + $("#course_student_name").val() + } + else{ + location.href = url + "&name=" + $("#course_student_name").val() + "&group=" + $("#late_penalty").val(); + } } diff --git a/public/javascripts/header.js b/public/javascripts/header.js index e27f758d3..06748d726 100644 --- a/public/javascripts/header.js +++ b/public/javascripts/header.js @@ -1,11 +1,15 @@ function addSlipMenu () { - var loggedas = $('#current_user_li:first'); + var loggedas = $('#current_user_li a:first'); var sub_menu = $('#user_sub_menu'); - loggedas.mouseenter(function(event) { + loggedas.mouseenter(function() { sub_menu.show(); + $('#my_projects_ul').hide(); + $('#my_courses_ul').hide(); }); - sub_menu.mouseleave(function(event) { + sub_menu.mouseleave(function() { sub_menu.hide(); + $('#my_projects_ul').hide(); + $('#my_courses_ul').hide(); }); } @@ -13,24 +17,26 @@ function addProjectSlipMenu () { var loggedas = $('#my_projects_li'); var project_sub_menu = $('#my_projects_ul'); var course_sub_menu = $('#my_courses_ul'); - loggedas.mouseenter(function(event) { + loggedas.mouseenter(function() { course_sub_menu.hide(); project_sub_menu.show(); }); - loggedas.mouseleave(function(event) { + loggedas.mouseleave(function() { project_sub_menu.hide(); + course_sub_menu.hide(); }); } function addCourseSlipMenu () { var loggedas = $('#my_courses_li'); var project_sub_menu = $('#my_projects_ul'); var course_sub_menu = $('#my_courses_ul'); - loggedas.mouseenter(function(event) { + loggedas.mouseenter(function() { project_sub_menu.hide(); course_sub_menu.show(); }); - loggedas.mouseleave(function(event) { + loggedas.mouseleave(function() { course_sub_menu.hide(); + project_sub_menu.hide(); }); } diff --git a/public/stylesheets/application.css b/public/stylesheets/application.css index 67d67d69b..d4d309181 100644 --- a/public/stylesheets/application.css +++ b/public/stylesheets/application.css @@ -2795,3 +2795,5 @@ div.repos_explain{ } .upload_img img{max-width: 100%;} #activity .upload_img img{max-width: 580px;} + +img,embed{max-width: 100%;} \ No newline at end of file diff --git a/public/stylesheets/courses.css b/public/stylesheets/courses.css index bb5baedd6..5a7bb001a 100644 --- a/public/stylesheets/courses.css +++ b/public/stylesheets/courses.css @@ -30,6 +30,10 @@ a:hover.news_foot{ color:#787b7e; border:1px solid #d4d4d4;} .box_h3{ color:#15bccf; text-align:center; font-size:16px;} .box_p{ color:#404040; margin-bottom:5px;} .fb_item{ color:#919191; border:1px solid #919191; height:28px; margin-bottom:10px; padding-left:5px; width:290px;} +a.icon_addm{ background:url(../images/img_floatbox.png) 0 -33px no-repeat; width:16px; height:16px; display:block; margin:5px 0 0 5px;} +a:hover.icon_addm{background:url(../images/img_floatbox.png) 0 -61px no-repeat; } +a.icon_removem{ background:url(../images/img_floatbox.png) -22px -33px no-repeat;width:16px; height:16px; display:block; margin:5px 0 0 5px} +a:hover.icon_removem{background:url(../images/img_floatbox.png) -22px -61px no-repeat;} a.btn_free{ background:#ff5722; display:block; width:80px; text-align:center; color:#fff; height:26px; padding-top:3px; margin-bottom:10px;} a:hover.btn_free{ background:#d63502;} /*成员邀请*/ @@ -52,6 +56,7 @@ a:hover.problem_pic{border:1px solid #64bdd9;} a.problem_name{ color:#ff5722;max-width:60px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;} a:hover.problem_name{ color:#d33503;} a.problem_tit{ color:#0781b4; max-width:410px; display:block; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} +a.pro_mes_w{ height:20px; float:right;display:block; color:#999999;} a:hover.problem_tit{ color:#09658c; } .problem_main{ border-bottom:1px dashed #d4d4d4; padding-bottom:10px; margin-bottom:10px;} /****翻页***/ @@ -278,14 +283,11 @@ a:hover.member_btn{ background:#329cbd;} /* 匿名评分弹框 */ /*.popbox02{width:480px;height:200px;position:absolute;z-index:100;left:50%;top:50%;margin:-215px 0 0 -300px; background:#fff; -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; box-shadow:0px 0px 8px #194a81; overflow:auto;}*/ .alert .close02{width:26px;height:26px;overflow:hidden;position:absolute;top:-10px;right:-490px;background:url(images/close.png) no-repeat;cursor:pointer;} -.ni_con { width:425px; margin:25px 30px;} -.ni_con h2{ display:block; height:40px; width:188px; margin:0 auto;} -.ni_con p{ color:#808181;} -.ni_con a:hover{ text-decoration:none;} a.xls{ margin-left:5px; color:#136b3b;} /* 开启匿评弹框 */ .anonymos{width:480px;height:180px;position:fixed !important;z-index:100;left:50%;top:50%;margin:-215px 0 0 -300px; background:#fff; -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; box-shadow:0px 0px 8px #194a81; overflow:auto;} +.anonymos_work {position:fixed !important;left:60%;top:60%;margin:-215px 0 0 -300px; box-shadow:0px 0px 8px #194a81; overflow:auto;} .ni_con { width:425px; margin:25px 30px;} .ni_con h2{ display:block; height:40px; width:425px; text-align:center; color:#3a3a3a;} .ni_con p{ color:#808181; } @@ -294,6 +296,8 @@ a.xls{ margin-left:5px; color:#136b3b;} a.tijiao{ height:28px; display:block; width:80px; color:#fff; background:#15bccf; text-align:center; padding-top:4px; float:left; margin-right:15px;} a:hover.tijiao{ background:#0f99a9;} .c_pink{ color:#e65d5e;} +.ni_con_work { width:300px; margin:25px 20px;} +.ni_con_work p{ color:#808181; } /* 学生列表*/ .st_list{ width:670px;} @@ -338,7 +342,6 @@ a:hover.st_add{ color:#ff8e15;} .upbtn{ margin:40px 0 0 15px; display:block; padding:2px 5px; border:1px solid #eaeaea;} .upbtn:hover{border:1px solid #64bdd9; color:#64bdd9;cursor: pointer;} .upload_file{margin-left: -60px;margin-top: 40px;width: 50px;position: absolute;height: 24px;opacity: 0;cursor: pointer} - /* 功能倒计时*/ .w_img{ float:left; margin:10px 10px 15px 0px;} .w_p{ float:left; color:#15bccf; font-size:16px; font-weight:bold; margin-top:70px; } @@ -349,7 +352,9 @@ a:hover.st_add{ color:#ff8e15;} .upload_con h2{ display:block; background:#eaeaea; font-size:14px; color:#343333; height:31px; width: auto; margin-top:25px; padding-left:20px; padding-top:5px;} .upload_box{ width:430px; margin:15px auto;} +a.link_file{ background:url(../images/pic_file.png) 0 2px no-repeat; padding-left:20px; } a:hover.link_file{ background:url(../images/pic_file.png) 0 -25px no-repeat; color:#3ca5c6;} +.r_txt_tit{width:510px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;color:#15bccf; float:left; color:#09658c; font-size:14px;} blockquote {background: #eeeeee;padding: 10px;margin-bottom: 10px;word-break: break-all;word-wrap: break-word;} .respond-form{display: none;margin: auto;clear: both;} @@ -561,8 +566,8 @@ a.files_tag_select{ background:#64bdd9; color:#fff; border:1px solid #64bdd9; pa .hwork_new_left{ width:220px; float:left; } .hwork_new_right{ width:350px; float:left; margin-left:40px;} .w305{ width:305px;} -.icon_add{ background:url(images/icons.png) 0px -310px no-repeat; width:16px; height:27px; display:block;float:left; margin-right:5px;} -a:hover.icon_add{background:url(images/icons.png) -20px -310px no-repeat;} +.icon_add{ background:url(../stylesheets/images/icons.png) 0px -310px no-repeat; width:16px; height:27px; display:block;float:left; margin-right:5px;} +a:hover.icon_add{background:url(../stylesheets/images/icons.png) -20px -310px no-repeat;} /* 20150505讨论区*/ .w664{ width:664px;} @@ -598,10 +603,13 @@ a:hover.Reply_pic{border:1px solid #64bdd9;} /*.talk_new{ border-bottom:1px dashed #d9d9d9; padding-bottom:10px;}*/ #about_newtalk{ display:none;} +/* 20150423作业评分*/ .ml14{ margin-left:14px;} .w548{ width:552px;} .w547{ width:544px;} .w196{ width:196px;} +.w186{ width:186px;} +.w200{width: 200px;} .w459{ width:459px;} .hwork_new_set{border:1px dashed #CCC; background:#f5f5f5; text-align:center; padding:10px 0; margin-bottom:10px;} .hwork_new_grey{background:#dbdbdb; width:610px; padding:10px 20px; margin:0 auto; text-align:left; margin-bottom:5px;} @@ -610,6 +618,8 @@ a:hover.Reply_pic{border:1px solid #64bdd9;} .w305{ width:305px;} .icon_add{background:url(images/icons.png) 0px -310px no-repeat; width:16px; height:27px; display:block;float:left; margin-right:5px;} a:hover.icon_add{background:url(images/icons.png) -20px -310px no-repeat;} +.icon_remove{background:url(images/icons.png) 0px -338px no-repeat; width:16px; height:27px; display:block;float:left;} +a:hover.icon_remove{background:url(images/icons.png) -20px -338px no-repeat;} /* 20150506上传头像*/ .uppicBox{ width:265px; height:265px; background:#f2f2f5; float:left; color:#666; text-align:center;} @@ -626,6 +636,8 @@ a:hover.icon_add{background:url(images/icons.png) -20px -310px no-repeat;} .hwork_tit{ width:210px; float:left; } .hwork_tit a{ width:205px; display:block; overflow:hidden; white-space: nowrap; text-overflow:ellipsis; } +.hwork_tit_une{ width:270px; float:left; } +.hwork_tit_une a{ width:265px; display:block; overflow:hidden; white-space: nowrap; text-overflow:ellipsis; } .hwork_code{ width:56px; text-align:center; } .hwork_code02{ width:60px; text-align:center; } .hwork_tit_e{ width:420px; float:left; } @@ -654,8 +666,10 @@ a:hover.ping_pic{border:1px solid #64bdd9;} a.down_btn{ border:1px solid #CCC; color:#999; padding:0px 5px; font-size:12px; text-align:center; display:block;} a:hover.down_btn{ background:#14ad5a; color:#fff; border:1px solid #14ad5a;} .fr{ float:right;} +.min_search{ width:140px; height:20px; border:1px solid #d0d0d0; color:#666; background:url(../images/public_icon.png) 185px -193px no-repeat; } .li_min_search{ float:right; margin-right:-10px;} -.info_ni{ width:100px; padding:5px;position: absolute;display:none;-moz-border-radius:3px; -webkit-border-radius:3px; border-radius:3px; box-shadow:0px 0px 5px #194a81; color:#666; background:#fff; text-align:left;} +.info_ni_download{ width:100px; padding:5px;position: absolute;display:none;-moz-border-radius:3px; -webkit-border-radius:3px; border-radius:3px; box-shadow:0px 0px 5px #194a81; color:#666; background:#fff; text-align:left;margin-left: 200px;margin-top: 10px;} +.info_ni{ width:100px; padding:5px;position: absolute;display:none;-moz-border-radius:3px; -webkit-border-radius:3px; border-radius:3px; box-shadow:0px 0px 5px #194a81; color:#666; background:#fff; text-align:left;margin-left: 50px;margin-top: -5px;} /*返回顶部*/ .to_top{width: 19px;height: 74px;position: fixed;top: 50px;right: 1px;color: white;background: #15bccf; line-height: 1.2; padding-top: 10px;padding-left: 5px;font-size: 14px;cursor: pointer;} .hwork_num_ab{ width:120px; display:block; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;min-height: 1px;} @@ -671,6 +685,12 @@ input#score{ width:40px;} .ui-slider .ui-slider-handle:hover,.ui-slider .ui-slider-handle:focus{background:#64bdd9;} .ui-slider .ui-slider-handle:active{background-image:none;} .ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;top:0;height:100%;background:#64bdd9;left:0;} +/* 编程作品 */ +.border_ce{ border:1px solid #e4e4e4; } +.border_ce tr td{ height:26px; } +.td_tit{width:155px; text-align:center;} +.td_50{width:50px; text-align:center;} +a.work_list_tit{width:610px; display:block; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} .filename { background: url(../images/pic_file.png) 0 -25px no-repeat;color: #3ca5c6;max-width: 150px;border: none; padding-left: 20px;margin-right: 10px;margin-bottom: 5px; white-space: nowrap; text-overflow:ellipsis;} .evaluation{position: relative;} @@ -678,11 +698,13 @@ input#score{ width:40px;} .student_work_search{background-color: #64bdd9;color: white !important;padding: 2px 7px;margin-left: 10px;cursor: pointer; } /* 与我相关 */ -.new_icon{background:url(../images/new_icon.png) 0px 0px no-repeat; width:35px; height:15px; display:block;} +/*.new_icon{background:url(../images/new_icon.png) 0px 0px no-repeat; width:35px; height:15px; display:block;}*/ a.about_me{text-align:center;font-size:16px; color:#64bdd9; margin:10px 0 0 10px;} a:hover.about_me{ color:#0781b4;} - +.mb5 li{width:200px;word-wrap: break-word; + word-break: normal; +} diff --git a/public/stylesheets/jstoolbar.css b/public/stylesheets/jstoolbar.css index 2cc00b4a3..bfd93619a 100644 --- a/public/stylesheets/jstoolbar.css +++ b/public/stylesheets/jstoolbar.css @@ -3,7 +3,7 @@ } .jstEditor textarea, .jstEditor iframe { margin: 0; - margin-left: 80px; + margin-left: 0px; } .jstHandle { diff --git a/public/stylesheets/leftside.css b/public/stylesheets/leftside.css index 9095cc6e3..50b47fff4 100644 --- a/public/stylesheets/leftside.css +++ b/public/stylesheets/leftside.css @@ -45,7 +45,7 @@ a:hover.subnav_green{ background:#14ad5a;} /*简介*/ .project_intro{ width:220px; padding:10px; background:#fff; margin-top:10px; padding-top:5px; color:#6d6d6d; line-height:1.9;} .course_description{max-height: 112px;overflow:hidden; word-break: break-all;word-wrap: break-word;} -.project_board_content{overflow: hidden;max-height: 182px;word-break: break-all;word-wrap: break-word;} +.project_board_content{overflow: hidden;max-height: 212px;word-break: break-all;word-wrap: break-word;} .project_board_content1{overflow: hidden;max-height: 72px;word-break: break-all;word-wrap: break-word;} .course_description_none{max-height: none;} .lg-foot{ border:1px solid #e8eef2; color: #929598; text-align:center; width:220px; height:23px; cursor:pointer;display: none;} diff --git a/public/stylesheets/leftside_new.css b/public/stylesheets/leftside_new.css new file mode 100644 index 000000000..c2d4d043c --- /dev/null +++ b/public/stylesheets/leftside_new.css @@ -0,0 +1,67 @@ +.topbar_info02{ margin:5px 10px;width:480px; } +.topbar_info02 p{color: #7f7f7f;} +.search{ margin-top:8px; float:right; margin-right:5px;} +/*信息*/ +.project_info{ background:#fff; padding:10px; padding-right:0px;width:222px; padding-right:8px; margin-bottom:10px;} +.pr_info_id{ width:137px; color:#5a5a5a; font-size:14px; margin-top:5px;} +.pr_info_logo{ border:1px solid #eaeaea; width:60px; height:60px; padding:1px;} +.pr_info_logo:hover{ border:1px solid #64bdd9; } +.pr_info_join{} +a.pr_join_a{ color:#fff; display:block; padding:0 5px 0 3px; padding-top:2px; height:20px; margin-right:5px; float:left; text-align:center; background-color:#64bdd9; float:left; } +a:hover.pr_join_a{ background:#41a8c8;} +.pr_join_span{color: #fff; display:block; padding:0 5px; padding-top:2px; height:20px; margin-right:5px; float:left; text-align:center; background: #CCC;} +.pr_setting{ display:block; background:url(../images/leftside.png) -1px 0 no-repeat; width:11px; height:11px; margin-top:3px; float:left; } +.pr_copy{ display:block; background:url(../images/leftside.png) -1px -23px no-repeat; width:11px; height:11px; margin-top:3px; float:left; } +.pr_close{ display:block; background:url(../images/leftside.png) -1px -49px no-repeat; width:11px; height:11px; margin-top:3px; float:left; } +.pr_add{display:block; background:url(../images/leftside.png) 0px -71px no-repeat; width:11px; height:11px; margin-top:3px; float:left; } +.pr_arrow{display:block; background:url(../images/leftside.png) 0px -90px no-repeat; width:11px; height:11px; margin-top:3px; float:left; } +.pr_info_name{ color:#3e4040; font-size:14px; line-height:1.5;} +.pr_info_name:hover{ color:#3ca5c6;} +.pr_info_score{ font-size:14px; color:#3e4040; } +.pr_info_score a{ color:#ff7143;} +.pr_info_score a:hover{ color:#64bdd9;} + +.img_private{ background:url(../images/new_project/img_project.png) 0 0 no-repeat; width:33px; height:16px; color:#fff; font-size:12px; padding-left:7px; } +/*.img_private{ background:url(../images/project/img_project.png) 0 0 no-repeat; width:33px; height:16px; color:#fff; font-size:12px; padding-left:7px; }*/ +.info_foot_num{ color:#3ca5c6; } +.pr_info_foot{ color:#7f7f7f; margin-top:5px; } +.info_foot_num:hover{ color:#2390b2;} +.info_box{background:#fff; padding:10px;width:220px; } +.info_box ul li{ font-size:12px; color: #3e4040; line-height:1.7;} + +/*左侧导航*/ +.subNavBox{width:240px; background:#fff;margin:10px 10px 0 0;} +.subNav{border-bottom:solid 1px #e5e3da;cursor:pointer;font-weight:bold;font-size:14px;color:#3ca5c6; height:26px;padding-left:10px;background-color:#fff; padding-top:2px;} +.subNav_jiantou{background:url(../images/jiantou1.jpg) no-repeat;background-position:95% 50%; background-color:#fff;} +.subNav_jiantou:hover{color:#0781b4; } +.currentDd{color:#0781b4;} +.currentDt{background-color:#fff;} +.navContent{display: none;border-bottom:solid 1px #e5e3da; } +.navContent li a{display:block;width:240px;heigh:28px;text-align:center;font-size:12px;line-height:28px;color:#333} +.navContent li a:hover{color:#fff;background-color:#b3e0ee} +a.subnav_num{ font-weight:normal; color:#ff7143; font-size:12px;} +a.subnav_green{ background:#28be6c; color:#fff; font-size:12px; font-weight:normal;height:18px; padding:0px 5px; padding-top:2px; display:block; margin-top:2px; margin-bottom:5px; float:right; margin-right:5px;} +a:hover.subnav_green{ background:#14ad5a;} + + +/*简介*/ +.project_intro{ width:220px; padding:10px; background:#fff; margin-top:10px; padding-top:5px; color:#6d6d6d; line-height:1.9;} +.course_description{max-height: 112px;overflow:hidden; word-break: break-all;word-wrap: break-word;} +.course_description_none{max-height: none;} +.lg-foot{ border:1px solid #e8eef2; color: #929598; text-align:center; width:220px; height:23px; cursor:pointer;} +.lg-foot:hover{ color:#787b7e; border:1px solid #d4d4d4;} +/****标签(和资源库的tag样式一致)***/ +.project_Label{ width:220px; padding:10px; background:#fff; margin-top:10px; padding-top:5px; margin-bottom:10px;} +a.yellowBtn{ display:inline-block;color:#0d90c3; height:22px;} +.submit{height:21px;border:0; cursor:pointer; background:url(../images/btn.png) no-repeat 0 0;width:42px; margin-top:2px; margin-left:3px; } +.isTxt{background:#fbfbfb url(../images/inputBg.png) repeat-x left top;height:22px;line-height:22px;border:1px solid #c1c1c1;padding:0 5px;color:#666666;} +.re_tag{ width: auto; padding:0 5px; padding-top:2px; height:20px; border:1px solid #f8df8c; background:#fffce6; margin-right:5px; } +.re_tag a{ color:#0d90c3;} +.tag_h{ } +.tag_h span,.tag_h a{ margin-bottom:5px;} + + + + + + diff --git a/public/stylesheets/pleft.css b/public/stylesheets/pleft.css index acf470dfe..1f48c9166 100644 --- a/public/stylesheets/pleft.css +++ b/public/stylesheets/pleft.css @@ -49,7 +49,7 @@ a:hover.subnav_green{ background:#14ad5a;} /*简介*/ .project_intro{ width:220px; padding:10px; background:#fff; margin-top:10px; padding-top:5px; color:#6d6d6d; line-height:1.9;} .course_description{max-height: 112px;overflow:hidden; word-break: break-all;word-wrap: break-word;} -.project_board_content{overflow: hidden;max-height: 182px;word-break: break-all;word-wrap: break-word;} +.project_board_content{overflow: hidden;max-height: 212px;word-break: break-all;word-wrap: break-word;} .project_board_content1{overflow: hidden;max-height: 72px;word-break: break-all;word-wrap: break-word;} .course_description_none{max-height: none;} .lg-foot{ border:1px solid #e8eef2; color: #929598; text-align:center; width:220px; height:23px; cursor:pointer;display: none;} diff --git a/public/stylesheets/project.css b/public/stylesheets/project.css index a32a050d7..f005b2df6 100644 --- a/public/stylesheets/project.css +++ b/public/stylesheets/project.css @@ -12,6 +12,7 @@ a:hover.lg-foot{ color:#787b7e;} /*右侧内容--动态*/ .project_r_h{ width:670px; height:40px; background:#eaeaea; margin-bottom:10px;} .project_h2{ background:#64bdd9; color:#fff; height:33px; width:90px; text-align:center; font-weight:normal; padding-top:7px; font-size:16px;} +.project_h22{ background:#64bdd9; color:#fff; height:33px; width:124px; text-align:center; font-weight:normal; padding-top:7px; font-size:16px;} .project_r_box{ border:1px solid #e2e1e1; width:670px; margin-top:10px;} .project_h3 { color:#646464; font-size:14px; padding:0 10px; border-bottom:1px solid #e2e1e1;} a.more{ float:right; font-size:12px; font-weight:normal; color:#a9a9a9; margin-top:3px;} @@ -84,6 +85,7 @@ a:hover.problem_tit,a:hover.problem_tit02{ color:#09658c; } .problem_main{ border-bottom:1px dashed #d4d4d4; padding-bottom:10px; margin-bottom:10px;} a.pro_mes{ float:left; color:#a0a0a0; display:block; width:100px; height:20px; } a.pro_mes_w{ height:20px; float:left;display:block; color:#999999;} +a.pro_mes_w_news{ height:20px; float:right;display:block; color:#999999;} .pro_page_top{ font-size:14px; border-bottom:2px solid #64bdd9; margin-bottom:10px; padding-bottom:5px;} .pro_page_tit{color:#3e4040; font-weight:bold;width:480px; float:left; font-size:14px; margin-bottom:5px;} @@ -94,6 +96,12 @@ a.pro_mes_w{ height:20px; float:left;display:block; color:#999999;} .pro_info_box ul li{ height:24px;} .pro_info_p{color:#0781b4 !important; float:left; width:80px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis; } .edit_pro_box{overflow:hidden;display:none; margin-bottom:30px; border-bottom:1px dashed #CCC; padding-bottom:10px;} +/*问题状态图片*/ +.issues{ background:url(../images/public_icon.png) -66px 5px no-repeat; width:16px; height:21px;} +.duty{ background:url(../images/public_icon.png) -66px -18px no-repeat; width:16px; height:21px;} +.support{ background:url(../images/public_icon.png) -66px -45px no-repeat; width:16px; height:21px;} +.function{ background:url(../images/public_icon.png) -66px -70px no-repeat; width:16px; height:21px;} +.weekly{ background:url(../images/public_icon.png) -66px -95px no-repeat; width:16px; height:21px;} /****翻页***/ ul.wlist{ float:right; border-bottom:none; height:30px; margin-top:20px; } ul.wlist li{float: left;} @@ -152,7 +160,7 @@ a:hover.c_dblue{ color: #0781b4;} .re_top input{ float:left;} .re_search{ margin-top:7px; margin-left:5px;} .re_schbox{ width:240px; height:24px; border:1px solid #64bdd9; color:#666666;} -.re_schbtn{ width:60px; height:26px; color:#fff; margin-right:5px; border:none; margin-left:0px; } +.re_schbtn{ width: 60px;height: 26px;color: #FFF;margin-right: 5px;margin-left: 0px;padding-left: 0px;border: medium none; } a.re_fabu { display:block; width:90px; height:30px; font-size:14px; color:#fff; text-align:center; padding-top:10px; } a:hover.re_fabu{background:#55a1b9;} .re_con{ margin:5px; width:665px;} @@ -244,7 +252,7 @@ a.remove-upload:hover {text-decoration:none !important;} #attachments_fields span.ispublic-label {display: inline-block;width: 30px;margin-left: 10px;} a.remove-upload {background: url(../images/delete.png) no-repeat 1px 50%;width: 1px;display: inline-block;padding-left: 16px;} -#attachments_fields input.filename {border: 0;height: 1.8em;width: 150px;color: #555;background-color: inherit;background: url(../images/attachment.png) no-repeat 1px 50%;padding-left: 18px;padding-top: 2px;} +#attachments_fields input.filename {border: 0;height: 1.8em;width: 150px;color: #555;background-color: inherit;background: url(../images/attachment.png) no-repeat 1px 50%;padding-left: 18px;padding-top: 2px; white-space: nowrap; text-overflow:ellipsis;} span.add_attachment {font-size: 80%;line-height: 2.5em;} #attachments_fields span {display: block;white-space: nowrap;} .file_selector{position: relative;opacity: 0;filter: alpha(opacity:0);} @@ -745,3 +753,4 @@ a:hover.Reply_pic{border:1px solid #64bdd9;} #about_newtalk{ display:none;} + diff --git a/public/stylesheets/public.css b/public/stylesheets/public.css index b688b495f..b3d16908d 100644 --- a/public/stylesheets/public.css +++ b/public/stylesheets/public.css @@ -79,6 +79,7 @@ h4{ font-size:14px; color:#3b3b3b;} .mr50{margin-right: 50px;} .mr55{margin-right: 55px;} .mr70{margin-right: 70px;} +.mt1{margin-top: 1px;} .mt3{ margin-top:3px;} .mt5{ margin-top:5px;} .mt8{ margin-top:8px;} @@ -95,9 +96,12 @@ h4{ font-size:14px; color:#3b3b3b;} .w60{ width:60px;} .w70{ width:70px;} .w90{ width:90px;} +.w100{width: 100px;} .w210{ width:210px;} .w150{ width:150px;} .w280{ width:280px;} +.w265{ width: 265px;} +.w270{ width: 270px;} .w430{ width:470px;} .w520{ width:520px;} .w543{ width:543px;} @@ -107,6 +111,7 @@ h4{ font-size:14px; color:#3b3b3b;} .w350{ width:350px;} .w610{ width:610px;} .w600{ width:600px;} +.h20{height: 20px;} .h22{ height:22px;} .h26{ height:26px;} .h50{ height:50px;} @@ -164,6 +169,7 @@ a.green_btn{background:#28be6c;color:#fff;font-size:14px; font-weight:normal; pa a:hover.green_btn{ background:#14ad5a;} .blue_btn{ background:#64bdd9; color:#fff; font-size:14px; font-weight:normal;padding:2px 10px; text-align:center;} a.blue_btn{background:#64bdd9;color:#fff;font-size:14px; font-weight:normal; padding:2px 10px; text-align:center;} +a.orange_btn_homework{background:#d63502;color:#fff;font-size:14px; font-weight:normal; padding:2px 10px; text-align:center;} a:hover.blue_btn{ background:#329cbd;cursor: pointer;} a.orange_btn{ background:#ff5722;color:#fff;font-size:14px; font-weight:normal; padding:2px 10px; text-align:center; } a:hover.orange_btn{ background:#d63502;} @@ -439,7 +445,7 @@ a.box_close{background:url(../images/img_floatbox.png) -22px 0 no-repeat;} /*文本左对齐*/ .tl{text-align: left;} -img{max-width: 100%;} +img,embed{max-width: 100%;} .attachments {clear: both;} .is_public_checkbox{margin-left: 15px;margin-right: 10px;} .author_name{color: #3ca5c6 !important;} diff --git a/public/stylesheets/public_new.css b/public/stylesheets/public_new.css new file mode 100644 index 000000000..428da5712 --- /dev/null +++ b/public/stylesheets/public_new.css @@ -0,0 +1,432 @@ +/* CSS Document */ +/* 2015-06-26 */ +body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{ margin:0; padding:0;} +body,table,input,textarea,select,button { font-family: "微软雅黑","宋体"; font-size:12px;line-height:1.5; background:#eaebec;} +div,img,tr,td,table{ border:0;} +table,tr,td{border:0;cellspacing:0; cellpadding:0;} +ol,ul,li{ list-style-type:none} +a:link,a:visited{color:#7f7f7f;text-decoration:none;} +a:hover,a:active{color:#000;} + +/*常用*/ +select,input,textarea{ border:1px solid #64bdd9; background:#fff; color:#000; padding-left:5px; } +.sub_btn{ cursor:pointer; -moz-border-radius:3px; -webkit-border-radius:3px; border:1px solid #707070; color:#000; border-radius:3px; padding:1px 10px; background:#dbdbdb;} +.sub_btn:hover{ background:#b5e2fa; color:#000; border:1px solid #3c7fb1;} +table{ background:#fff;} +.more{ font-weight:normal; color:#999; font-size:12px;} +.no_line{ border-bottom:none;} +.line{border-bottom:1px dashed #d4d4d4; padding-bottom:10px; margin-bottom:10px;} +.no_border{ border:none;background:none;} +.min_search{ width:150px; height:20px; border:1px solid #d0d0d0; color:#666; background:url(../images/public_icon.png) 135px -193px no-repeat; cursor:pointer;} + +/* font & color */ +h2{ font-size:18px; color:#15bccf;} +h3{ font-size:14px; color:#e8770d;} +h4{ font-size:14px; color:#3b3b3b;} +.f12{font-size:12px; font-weight:normal;} +.f14{font-size:14px;} +.f16{font-size:16px;} +.f18{font-size:18px;} +.fb{font-weight:bold;} +.lh20{line-height:20px;} +.lh22{line-height:22px;} +.lh24{line-height:24px;} +.lh26{line-height:26px;} +.fmYh{font-family:"MicroSoft Yahei";} +.font999{ color:#999;} +.fontRed{color:#770000;} +.text_c{ text-align:center;} + +/* Float & Clear */ +.cl{ clear:both; overflow:hidden; } +.fl{float:left;display:inline;} +.fr{float:right;display:inline;} +.f_l{ float:left;} +.f_r{ float:right;} +.clearfix:after{clear:both;content:".";display:block;font-size:0;height:0;line-height:0;visibility:hidden} +.clearfix{clear:both;zoom:1} +.break_word{ word-break:break-all; word-wrap: break-word;} +.white_space{white-space:nowrap;} + +/* Spacing */ +.ml2{ margin-left:2px;} +.ml3{ margin-left:3px;} +.ml4{ margin-left:4px;} +.ml5{ margin-left:5px;} +.ml8{ margin-left:8px;} +.ml10{ margin-left:10px;} +.ml15{ margin-left:15px;} +.ml20{ margin-left:20px;} +.ml40{ margin-left:40px;} +.ml45{ margin-left:45px;} +.ml55{ margin-left:55px;} +.ml30{ margin-left:30px;} +.ml60{ margin-left:60px;} +.ml80{ margin-left:80px;} +.ml90{ margin-left:90px;} +.ml100{ margin-left:100px;} +.ml110{ margin-left:110px;} +.mr5{ margin-right:5px;} +.mr10{ margin-right:10px;} +.mr20{ margin-right:20px;} +.mr30{ margin-right:30px;} +.mr40{ margin-right:40px;} +.mt3{ margin-top:3px;} +.mt5{ margin-top:5px;} +.mt8{ margin-top:8px;} +.mt10{ margin-top:10px;} +.mb5{ margin-bottom:5px;} +.mb10{ margin-bottom:10px;} +.mb20{ margin-bottom:20px;} +.pl15{ padding-left:15px;} +.w20{ width:20px;} +.w60{ width:60px;} +.w70{ width:70px;} +.w90{ width:90px;} +.w210{ width:210px;} +.w150{ width:150px;} +.w280{ width:280px;} +.w430{ width:470px;} +.w520{ width:520px;} +.w543{ width:543px;} +.w557{ width:557px;} +.w583{ width:583px;} +.w350{ width:350px;} +.w610{ width:610px;} +.w600{ width:600px;} +.h22{ height:22px;} +.h26{ height:26px;} +.h50{ height:50px;} +.h70{ height:70px;} +.h150{ height:150px;} + +/* Font & background Color */ +a.b_grey{ background: #F5F5F5;} +a.b_dgrey{ background: #CCC;} +a.c_orange{color:#ff5722;} +a:hover.c_orange{color: #d33503;} +a.c_lorange{color:#ff9900;} +a:hover.c_lorange{color:#fff;} +a.c_blue{ color:#15bccf;} +a.c_dblue{ color:#09658c;} +a:hover.c_dblue{ color:#15bccf;} +a.c_white{ color:#fff;} +a.c_dorange{ color:#fd6e2a;} +a.c_dark{color: #3e4040;} +a:hover.c_dark{color: #3ca5c6;} +a.b_blue{background: #64bdd9;} +a:hover.b_blue{background: #41a8c8;} +a.b_green{background:#28be6c;} +a:hover.b_green{background:#14ad5a;} +a.c_blue02{color: #3ca5c6;} +a:hover.c_blue02{color: #0781b4;} +a.c_red{ color:#F00;} +a:hover.c_red{ color: #C00;} +a.c_purple{color: #426e9a;} +a:hover.c_purple{color: #d33503;} +a.c_green{ color:#28be6c;} + +.b_grey{ background: #F5F5F5;} +.b_dgrey{ background: #CCC;} +.c_orange{color:#e8770d;} +.c_dark{ color:#2d2d2d;} +.c_lorange{ color:#ff9900;} +.c_purple{color: #6883b6;} +.c_blue{ color:#15bccf;} +.c_red{ color:#F00;} +.c_green{ color:#28be6c;} +.c_dblue{ color:#09658c;} +.b_blue{background:#64bdd9;} +.b_green{background:#28be6c;} +.b_w{ background:#fff;} + +/* commonBtn */ +.grey_btn{ background:#d9d9d9; color:#656565;font-size:14px; font-weight:normal; text-align:center;padding:2px 10px;} +a.grey_btn{ background:#d9d9d9; color:#656565;font-size:14px; font-weight:normal; text-align:center;padding:2px 10px;} +a:hover.grey_btn{ background:#717171; color:#fff;} +.grey_n_btn{ background:#d9d9d9; color:#656565; font-weight:normal;padding:2px 10px; text-align:center;} +a.grey_n_btn{background:#d9d9d9; color:#656565;font-weight:normal; padding:2px 10px; text-align:center;} +a:hover.grey_n_btn{ background:#717171; color:#fff;} +.green_btn{ background:#28be6c; color:#fff; font-size:14px; font-weight:normal;padding:2px 10px; text-align:center;} +a.green_btn{background:#28be6c;color:#fff;font-size:14px; font-weight:normal; padding:2px 10px; text-align:center;} +a:hover.green_btn{ background:#14ad5a;} +.blue_btn{ background:#64bdd9; color:#fff; font-size:14px; font-weight:normal;padding:2px 10px; text-align:center;} +a.blue_btn{background:#64bdd9;color:#fff;font-size:14px; font-weight:normal; padding:2px 10px; text-align:center;} +a:hover.blue_btn{ background:#329cbd;} +a.orange_btn{ background:#ff5722;color:#fff;font-size:14px; font-weight:normal; padding:2px 10px; text-align:center; } +a:hover.orange_btn{ background:#d63502;} + +.green_u_btn{border:1px solid #3cb761; padding:2px 10px; color:#3cb761;} +a.green_u_btn{border:1px solid #3cb761; padding:2px 10px; color:#3cb761;} +a:hover.green_u_btn{ background:#3cb761; color:#fff;} +.orange_u_btn{border:1px solid #ff5d31; padding:2px 10px; color:#ff5d31;} +a.orange_u_btn{border:1px solid #ff5d31; padding:2px 10px; color:#ff5d31;} +a:hover.orange_u_btn{background:#ff5d31; color:#fff;} +.bgreen_u_btn{border:1px solid #1abc9c; padding:2px 10px; color:#1abc9c;} +a.bgreen_u_btn{border:1px solid #1abc9c1; padding:2px 10px; color:#1abc9c;} +a:hover.bgreen_u_btn{background:#1abc9c; color:#fff;} +.blue_u_btn{border:1px solid #64bdd9; padding:2px 10px; color:#64bdd9;} +a.blue_u_btn{border:1px solid #64bdd9; padding:2px 10px; color:#64bdd9;} +a:hover.blue_u_btn{background:#64bdd9; color:#fff;} +.blue_n_btn{ background:#64bdd9; color:#fff; font-weight:normal;padding:2px 10px; text-align:center;} +a.blue_n_btn{background:#64bdd9;color:#fff;font-weight:normal; padding:2px 10px; text-align:center;} +a:hover.blue_n_btn{ background:#329cbd;} +.green_n_btn{background:#3cb761; padding:2px 10px; color:#fff;} +a.green_n_btn{background:#3cb761; padding:2px 10px; color:#fff;} +a:hover.green_n_btn{ background:#14ad5a;} +.orange_n_btn{background:#ff5d31; padding:2px 10px; color:#fff;} +a.orange_n_btn{background:#ff5d31; padding:2px 10px; color:#fff;} +a:hover.orange_n_btn{background:#d63502;} +.bgreen_n_btn{background:#1abc9c; padding:2px 10px; color:#fff;} +a.bgreen_n_btn{background:#1abc9c; padding:2px 10px; color:#fff;} +a:hover.bgreen_n_btn{background:#08a384;} + +.nolink_btn{ background:#BCBCBC; color: #fff; padding:2px 5px;} +.more_btn{-moz-border-radius:3px; -webkit-border-radius:3px; border:1px solid #9DCEFF; color:#9DCEFF; border-radius:3px; padding:0px 3px;} +.upbtn{ margin:42px 0 0 10px; border:none; color:#999; width:150px;} +.red_btn_cir{ background:#e74c3c; padding:1px 10px; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; color:#fff; font-weight:normal;font-size:12px;} +.green_btn_cir{ background:#28be6c; padding:1px 10px; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; color:#fff; font-weight:normal;font-size:12px;} +.blue_btn_cir{ background:#3498db; padding:1px 10px; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; color:#fff; font-weight:normal;font-size:12px;} +.orange_btn_cir{ background:#e67e22; padding:1px 10px; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; color:#fff; font-weight:normal; font-size:12px;} +.bgreen_btn_cir{ background:#1abc9c; padding:1px 10px; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; color:#fff; font-weight:normal; font-size:12px;} +/* commonpic */ +.pic_date{ display:block; background:url(../images/public_icon.png) -31px 0 no-repeat; width:16px; height:15px; float:left;} +.pic_add{ display:block; background:url(../images/public_icon.png) -31px -273px no-repeat; width:16px; height:15px; float:left;} +.pic_sch{ display:block; background:url(../images/public_icon.png) -31px -195px no-repeat; width:16px; height:15px; float:left;} +.pic_mes{ display:block; background:url(../images/public_icon.png) 0px -376px no-repeat; width:20px; height:15px; padding-left:18px;} +.pic_img{ display:block; background:url(../images/public_icon.png) -31px -419px no-repeat; width:20px; height:15px; } +.pic_del{ display:block; background:url(../images/public_icon.png) 0px -235px no-repeat; width:20px; height:15px; } +.pic_del:hover{ background:url(../images/public_icon.png) -32px -235px no-repeat; } +.pic_stats{display:block; background:url(../images/public_icon.png) 0px -548px no-repeat; width:20px; height:15px;} +.pic_files{display:block; background:url(../images/public_icon.png) 0px -578px no-repeat; width:20px; height:15px;} +.pic_text{display:block; background:url(../images/public_icon.png) 0px -609px no-repeat; width:20px; height:18px;} +.pic_text02{display:block; background:url(../images/public_icon.png) 0px -642px no-repeat; width:20px; height:19px;} +.pic_edit{display:block; background:url(../images/public_icon.png) 0px -32px no-repeat; width:20px; height:15px;} +.pic_edit:hover{display:block; background:url(../images/public_icon.png) -32px -32px no-repeat; width:20px; height:15px;} + + + + + +/*框架主类容*/ +#Container{ width:1000px; margin:0 auto; } + +/*头部导航*/ +#Header{ margin:10px 0; background:#15bccf; height:40px; -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px; } +.logo{ margin:5px 10px; } +#TopNav{} +#TopNav ul li{ margin-top:8px;} +.topnav_a a{ font-size:14px; font-weight:bold; color:#fff; margin-right:10px;} +.topnav_a a:hover{color: #a1ebff;} +#TopUser{} +#TopUser ul li{ margin-top:8px;} +.topuser_a a{ font-size:14px; font-weight:bold; color:#fff; margin-right:10px;} +.topuser_a a:hover{color: #a1ebff;} +#TopUser02{ } +#TopUser02 li{ float: left;} +#TopUser02 li a{ margin-right:10px;color: #FFF;text-align: center;} +#TopUser02 li a:hover{color: #a1ebff;} +#TopUser02 div{ position: absolute;visibility: hidden;background:#fff;border: 1px solid #15bccf;} +#TopUser02 div a{position: relative;display: block;white-space: nowrap;text-align: left; line-height:1.9; margin-left:5px;background: #fff;color:#15bccf; font-weight:normal;} +#TopUser02 div a:hover{ color:#e8770d; font-weight: bold;} +/*头部导航下拉*/ +div#menu {height:41px; font-size:14px; font-weight:bold; } +div#menu ul {float: left;} +div#menu ul.menu { padding-left: 30px; } +div#menu li {position: relative; z-index: 9; margin: 0; display: block; float: left; } +div#menu li:hover>ul { left: -2px;} +div#menu a {position: relative;z-index: 10; height: 41px; display: block; float: left;line-height: 41px; text-decoration: none; font-size:14px; } +div#menu a:hover, div#menu a:hover span { color: #a1ebff; } +div#menu li.current a {} +div#menu {display: block; cursor: pointer; background-repeat: no-repeat;background-position: 95% 0;padding-right: 15px; _padding-right: 20px;} +div#menu ul a.parent {background: url(../images/item.png) -20px -30px no-repeat; width:60px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} +div#menu ul a.parent:hover {background: url(../images/item.png) -20px -60px no-repeat;} +div#menu ul ul a.parent {background: url(../images/item.png) -20px 6px no-repeat;} +div#menu ul ul a.parent:hover {background: url(../images/item.png) -20px -11px no-repeat;} +/* menu::level1 */ +div#menu a { padding: 5px 12px 0 10px;line-height: 30px; color: #fff;} +div#menu li { background: url(images/main-delimiter.png) 98% 4px no-repeat; } +div#menu li.last { background: none; } +/* menu::level2 */ +div#menu ul ul li { background: none; } +div#menu ul ul { position: absolute;top: 38px; left: -999em; width: 90px; padding: 5px 0 0 0; background:#fff; border:1px solid #15bccf; margin-top:1px;} +div#menu ul ul a {padding: 0 0 0 15px; height: auto; float: none;display: block; line-height: 24px; font-size:12px; font-weight:normal;color:#15bccf;} +div#menu ul ul a:hover { color:#ff9900;} +div#menu ul ul li.last { margin-left:15px; } +div#menu ul ul li {width: 100%;} +/* menu::level3 */ +div#menu ul ul ul {padding: 0;margin: -38px 0 0 92px !important; width:140px; } +div#menu ul ul ul li a{ width:125px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;color:#15bccf;} + +/*主类容*/ +#Main{ background:#fff; margin-bottom:10px;} +#content{} +#content02{ background:#fff; padding:10px; margin-bottom:10px;} +/*主类容搜索*/ +#TopBar{ height:60px; margin-bottom:10px; background:#fff;} +.topbar_info02{ margin:5px 10px;width:480px; } +.topbar_info02 p{color: #7f7f7f;} +.search{ margin-top:8px; margin-left:71px;} +.search_form{margin-top:8px;margin-left:72px;} +.topbar_info{ width:350px; color:#5c5c5c; font-size:16px; margin-right:50px; line-height:1.3; padding-left:100px;} +a.search_btn{ display:block; background:#15bccf; color:#fff; width:60px; height:24px; text-align:center; padding-top:3px;} +a:hover.search_btn{ background: #0fa9bb;} +.search_text{ border:1px solid #15bccf; background:#fff; width:220px; height:25px; padding-left:5px; } +/*主类容左右分栏*/ +#LSide{ width:240px; } +#RSide{ width:730px; margin-left:10px; background:#fff; padding:10px; margin-bottom:10px;} + + +/*底部*/ +#Footer{ padding-top:10px; background:#fff; margin-bottom:10px;} +.copyright{ width:780px; margin:0 auto;height:30px; } +.footlogo{ width:580px; margin:0 auto;height:50px; } +/*意见反馈*/ +html{ overflow-x:hidden;} +.scrollsidebar{ position: fixed; bottom:1px; right:1px; background:none; } +.side_content{width:154px; height:auto; overflow:hidden; float:left; } +.side_content .side_list {width:154px;overflow:hidden;} +.show_btn{ width:0; height:112px; overflow:hidden; float:left; margin-top:190px;cursor:pointer;} +.show_btn span { display:none;} +.close_btn{width:24px;height:24px;cursor:pointer;} +.side_title,.side_bottom,.close_btn,.show_btn {background:url(../images/sidebar_bg.png) no-repeat; } +.side_title {height:35px;} +.side_bottom { height:8px;} +.side_center {font-family:Verdana, Geneva, sans-serif; padding:0px 12px; font-size:12px;} +.close_btn { float:right; display:block; width:21px; height:16px; margin:9px 10px 0 0; _margin:16px 5px 0 0;} +.close_btn span { display:none;} +.side_center .custom_service p { text-align:center; padding:6px 0; margin:0; vertical-align:middle;} +.msgserver { margin-top:5px;} +/*.msgserver a { background:url(../images/sidebar_bg.png) no-repeat -119px -112px; padding-left:22px; height:21px; display:block; }*/ +.msgserver a { height:21px; display:block; } +.opnionText{box-shadow:none; width:122px; height:180px; border-color: #DFDFDF; background:#fff; color:#999; padding:3px; font-size:12px;overflow:auto; background-attachment:fixed;border-style:solid;} +a.opnionButton{ display:block; background:#15bccf; width:130px; height:23px; margin-top:5px; text-align:center; padding-top:3px;} +a:hover.opnionButton{background: #0fa9bb; } +/* blue skin as the default skin */ +.side_title {background-position:-195px 0;} +.side_center {background:url(../images/blue_line.png) repeat-y center; } +.side_bottom {background-position:-195px -50px;} +a.close_btn {background-position:-44px 0;} +a:hover.close_btn {background-position:-66px 0;} +.show_btn {background-position:-119px 0;} +.msgserver a {color:#15bccf; } +.msgserver a:hover { text-decoration:underline; } + + +/***** Ajax indicator ******/ +#ajax-indicator { + position: absolute; /* fixed not supported by IE */ + background-color:#eee; + border: 1px solid #bbb; + top:35%; + left:40%; + width:20%; + font-weight:bold; + text-align:center; + padding:0.6em; + z-index:100000; + opacity: 0.5; +} + +html>body #ajax-indicator { position: fixed; } + +#ajax-indicator span { + background-position: 0% 40%; + background-repeat: no-repeat; + background-image: url(../images/loading.gif); + padding-left: 26px; + vertical-align: bottom; +} + +div.modal { + border-radius: 5px; + background: #fff; + z-index: 50; + padding: 4px; +} +.ui-widget-content { + border: 1px solid #ddd; + color: #333; +} +.ui-widget { + font-family: Verdana, sans-serif; + font-size: 1.1em; +} +.ui-dialog .ui-dialog-content { + position: relative; + border: 0; + padding: .5em 1em; + background: none; + overflow: auto; + zoom: 1; +} +.ui-widget-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-widget-overlay { + background: #666 url(http://forge.trustie.net/stylesheets/jquery/images/xui-bg_diagonals-thick_20_666666_40x40.png.pagespeed.ic.9mfuw_R0z1.png) 50% 50% repeat; + opacity: .5; + filter: Alpha(Opacity=50); +} +/***** end Ajax indicator ******/ + +/***** Flash & error messages ****/ +#errorExplanation, div.flash, .nodata, .warning, .conflict { + padding: 4px 4px 4px 30px; + margin-bottom: 12px; + font-size: 1.1em; + border: 2px solid; +} + +div.flash {margin-top: 8px;} + +div.flash.error, #errorExplanation { + background: url(../images/exclamation.png) 8px 50% no-repeat; + background-color: #ffe3e3; + border-color: #dd0000; + color: #880000; +} + +div.flash.notice { + background: url(../images/true.png) 8px 5px no-repeat; + background-color: #dfffdf; + border-color: #9fcf9f; + color: #005f00; +} + +div.flash.warning, .conflict { + background: url(../images/warning.png) 8px 5px no-repeat; + background-color: #FFEBC1; + border-color: #FDBF3B; + color: #A6750C; + text-align: left; +} + +.nodata, .warning { + text-align: center; + background-color: #FFEBC1; + border-color: #FDBF3B; + color: #A6750C; +} + +#errorExplanation ul { font-size: 0.9em;} +#errorExplanation h2, #errorExplanation p { display: none; } + +.conflict-details {font-size:80%;} +/***** end Flash & error messages ****/ + + +/*弹出框*/ +.black_overlay{display:none;position:fixed;top:0px;left:0px;width:100%;height:100%;background-color:black;z-index:1001;-moz-opacity:0.8;opacity:.80;filter:alpha(opacity=80);} +.white_content{display:none;position:fixed;top:15%;left:30%;width:420px;height: auto; margin-bottom:20px;padding:16px;border:3px solid #15bccf;background-color:white;z-index:1002;overflow:auto;} +.white_content02{display:none;position:fixed;top:15%;left:30%;width:200px;height: auto; margin-bottom:20px;padding:10px;border:3px solid #15bccf;background-color:white;z-index:1002;overflow:auto;} +.newhwork_content{ display:none;position:fixed;top:15%;left:30%;width:600px;height: auto; margin-bottom:20px;padding:16px;border:3px solid #15bccf;background-color:white;z-index:1002;overflow:auto;} +.floatbox{ width:420px; border:3px solid #15bccf; background:#fff; padding:5px;} +a.box_close{ display:block; float:right; width:16px; height:16px; background:url(../images/img_floatbox.png) 0 0 no-repeat;} +a:hover.box_close{background:url(../images/img_floatbox.png) -22px 0 no-repeat;} + +div.ke-statusbar{height:1px; border-top:none;} \ No newline at end of file diff --git a/public/stylesheets/users.css b/public/stylesheets/users.css new file mode 100644 index 000000000..81529288c --- /dev/null +++ b/public/stylesheets/users.css @@ -0,0 +1,127 @@ +#RSide{ min-height:1px;} +/* 左侧信息*/ +.users_info{background:#fff; padding:10px; width:230px; padding-right:0px; margin-bottom:10px; } +.pic_head{ width:214px; height:214px; border:1px solid #cbcbcb; padding:2px; position:relative;} +.pic_head:hover{border:1px solid #64bdd9;} +.usersphoto_edit{ position:absolute; left:198px; top:200px;} +.icon_male{ background:url(../images/pic_uersall.png) 0 0 no-repeat; width:15px; height:15px;} +.icon_female{ background:url(../images/pic_uersall.png) 0 -24px no-repeat; width:15px; height:15px;} +.pf_intro{ width:222px; margin-top:5px; color:#696969;word-break: break-all; } +.leftbox{ width:230px; padding:10px; padding-right:0px; padding-bottom:5px;background:#fff; margin-bottom:10px; margin-right:10px;} +.pic_members{ background:url(../images/pic_users.jpg) 0 0 no-repeat; display:block; width:38px; height:38px; border:1px solid #e9edf0; margin-right:5px; margin-bottom:5px;float:left;} +.pic_members:hover{border:1px solid #c9c9c9;} +/*新建*/ +.top_new{ height:26px; border-bottom:10px solid #eaebed; padding:10px; background:#fff; float:left; margin-left:10px; width:730px; } +.top_new_bg{ background:url(../images/pic_uersall.png) -43px 3px no-repeat; height:26px; width:260px;} +.top_newcourses_bg{ background:url(../images/pic_uersall.png) -43px -29px no-repeat; height:28px; width:260px;} +.top_newproject_bg{ background:url(../images/pic_uersall.png) -43px -56px no-repeat; height:26px; width:260px;} +.newbtn{ height:24px; background:#18ca74; color:#fff; font-size:14px; padding:2px 12px 0 12px;} +.newbtn:hover{background: #14ad5a;} +a.newbtn_add{ display:block; background:url(../images/pic_uersall.png) -265px 3px no-repeat; height:20px; width:15px;} +a.newbtn_t{ font-size:14px; font-weight:bold; color:#fff;} +/*留言*/ +a.icon_face{background:url(../images/public_icon.png) 0px -671px no-repeat; display:block; height:25px; width:40px; padding-left:25px; padding-top:3px; } +a:hover.icon_face{background:url(../images/public_icon.png) -79px -671px no-repeat; } +.inputUsers_message{ border:1px solid #d2d2d2; width:718px; height:48px; color:#666; padding:5px; margin-bottom:5px;} +.inputUsers_message02{ border:1px solid #d2d2d2; width:618px; height:26px; color:#666; padding:5px; margin-bottom:5px; } +.message_list_box{ background:#f5f5f5; padding:10px;} +.users_pic{ width:27px; height:27px; border:1px solid #e3e3e3;} +.users_pic:hover{ border:1px solid #a5a5a5;} +.massage_txt{ max-width:360px; color: #666;word-break:break-all;} +.massage_time{ color:#8d8d8d; margin-top:5px;} +.message_list{ border-bottom:1px dashed #c9c9c9; padding-bottom:10px; margin-bottom:10px;} +.message_list_more{ text-align:center; width:720px;} +/*课程动态*/ +.line_box{ width:728px; border:1px solid #d9d9d9; padding-bottom:10px;} +.users_courses_list{ height:24px; border-bottom:1px dashed #CCC; margin-bottom:10px;} +.users_coursename{max-width:135px; font-weight:bold; overflow:hidden; white-space: nowrap; text-overflow:ellipsis; margin-right:5px; } +.course_name{max-width:60px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} +.c_grey{ color:#8d8d8d;} +.users_courses_txt{max-width:330px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} +.users_top{ height:39px; border-bottom:1px solid #d9d9d9; margin-bottom:10px;} +.users_h4{border-bottom:1px solid #d9d9d9; height:29px; padding:10px 0 0 10px; margin-bottom:10px; } +/*弹框*/ +.white_content_users{display:none;position:fixed;top:45%;left:45%;width:210px;height: auto; margin-bottom:20px;padding:10px;border:3px solid #15bccf;background-color:white;z-index:1002;overflow:auto;} +a.box_close{background:url(../images/img_floatbox.png) -22px 0 no-repeat;} +/*我的课程*/ +.courses_top{ height:27px; border-bottom:3px solid #ebebeb;} +.courses_h2{ font-size:16px; font-weight:bold; color:#64bddb; border-bottom:3px solid #64bddb; padding-bottom:3px; padding-right:3px;} +.courses_select{} +a.select_btn{ border:1px solid #acacac; padding:0px 10px; color:#989898; display:block;} +a.select_btn:hover{ background:#64bddb; color:#fff;} +a.select_btn_select{ background:#64bddb; color:#fff;} +.courses_list_pic{ border:1px solid #ede7e9; width:64px; height:64px; padding:1px;} +.courses_list_pic:hover{border:1px solid #64bdd9;} +.courses_list_title{ max-width:500px;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} +.pic_eye_blue{display:block; background:url(../images/pic_uersall.png) -372px 3px no-repeat; width:16px; height:15px; } +.pic_eye_grey{display:block; background:url(../images/pic_uersall.png) -372px -10px no-repeat; width:16px; height:15px; } +.td_w70{ width:70px;} +.td_w60{ width:60px;} +.td_w110{ width:110px;} +.mt20{ margin-top:20px;} +.courses_list{ padding-bottom:10px; } +.courses_list_table{ color:#6e6e6e;} +/****翻页***/ +.wlist{float:right;} +.wlist li{float:left;} +.wlist a{ float:left; border:1px solid #64bdd9; padding:0 5px; margin-left:3px; color:#64bdd9;} +.wlist a:hover{border:1px solid #64bdd9; background-color:#64bdd9; color:#fff; text-decoration:none;} +.wlist_select a { background-color:#48aac9; color:#fff;} +/* 设置 */ +#users_setting{clear:both;width:730px;/*滑动门的宽度*/} +/* TAB 切换效果 */ +.users_tb_{ border-bottom:3px solid #CCC; height:26px; } +.users_tb_ ul{height:26px; } +.users_tb_ li{float:left;height:26px;width: 90px;cursor:pointer; font-size:14px; text-align:center; } +/* 控制显示与隐藏css类 */ +.users_normaltab { color:#666; } +.users_hovertab { color:#64bdd9; border-bottom:3px solid #64bdd9; font-weight:bold;} +.users_normaltab a { color:#64bdd9 ; } +.users_hovertab a{color:#fff; background-color:#64bdd9; text-decoration:none;} +.users_dis{display:block; } +.users_undis{display:none;} +.users_ctt{ font-size:14px; color:#666; margin-top:10px;} +.setting_left{ width:85px; text-align:right; float:left;} +.setting_left li{ height:28px;line-height:28px;} +.setting_right{width:500px; text-align:left; float:left; margin-left:8px;} +.setting_right li{ height:28px;line-height:28px;} +.users_ctt ul li{ margin-bottom:10px;} +.users_ctt input,.users_ctt select,.users_ctt textarea{ border:1px solid #CCC;} +.users_ctt input,.users_ctt select,.users_ctt option{ height:26px;} +.users_ctt input,.users_ctt textarea{ margin-left:2px;} +.users_ctt textarea{ margin-bottom:none;} +.w450{ width:450px;} +.w210{ width:200px;} +.w70{ width:70px;} +.h200{ height:200px;} +/* 个人主页*/ +a.gz_btn{display:block; background:url(../images/pic_uersall.png) -318px -25px no-repeat; width:33px; height:18px; border:1px solid #cdcdcd; color:#333333; padding:0px 0 0 18px;} +a:hover.gz_btn{ color:#ff5722;} +a.qx_btn{display:block; background:url(../images/pic_uersall.png) -318px -47px no-repeat; width:33px; height:18px; border:1px solid #cdcdcd; color:#333333; padding:0px 0 0 18px;} +a:hover.qx_btn{color:#64bdd9;} +a.c_lgrey{ color:#CCC;} +a:hover.c_lgrey{ color:#3ca5c6;} +.leftbox_ul_left{ width:60px; float:left; text-align:right; } +.leftbox_ul_right{ width:155px; float:left; margin-left:10px; } +.leftbox_ul_left li,.leftbox_ul_right li{ margin-bottom:5px;} +.c_dgrey{ color:#696969;} +.home_courses_list{ width:364px; margin-bottom:10px; } +.home_list_title{ max-width:260px; font-size:14px; font-weight:bold;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} +.users_list{ } +.users_course_intro{ width:530px;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} + +/* 20150506上传头像*/ +.uppicBox{ width:265px; height:265px; background:#f2f2f5; float:left; color:#666; text-align:center;} +.showpicBox{width:133px; height:250px; background:#f2f2f5; float:left; margin-left:20px; text-align:center; padding-top:15px; color:#666;} +.mr2{ margin-right:2px;} +.uppic_btn{border:none; width:150px; background:none; margin-bottom:5px; color:#666; margin-top:105px;} +/* 新建作品*/ +.mr8{ margin-right:8px;} +.mt2{ margin-top:2px;} +.fans_sign{ width:560px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} +.newhwork_div ul li{ margin-bottom:10px; font-size:14px; color:#666;} +.newhwork_div input,.newhwork_div select{ height:26px;border:1px solid #CCC; } +.newhwork_div textarea{border:1px solid #CCC;} +.w460{ width:460px;} + +a.hidepic>img{display:none;} \ No newline at end of file diff --git a/public/themes/redpenny-master/stylesheets/application.css b/public/themes/redpenny-master/stylesheets/application.css index 95092aa1d..4a23e59c5 100644 --- a/public/themes/redpenny-master/stylesheets/application.css +++ b/public/themes/redpenny-master/stylesheets/application.css @@ -1635,6 +1635,7 @@ img.avatar { display: block; width: 38px; height: 38px; + max-width: none; } @@ -1697,6 +1698,23 @@ div.project-search { } /*huang*/ +/*zhangshen*/ +a.enterprise { + float:left; + text-align: center; + width: 40px; + height: 18px; + font-family: '微软雅黑',Arial,Helvetica,sans-serif; + font-size: 12px; + color:#fff; + padding: 0px; + border-radius:4px; + border: 1px solid rgb(148, 148, 148); + box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2), 0px 0px 2px rgb(255, 255, 255) inset; + text-shadow: 0px -1px 0px rgba(0, 0, 0, 0.1), 0px 0px 0px rgb(255, 255, 255); + cursor: pointer; +} + input.enterprise[type="button"] { padding-bottom: 5px; width: 55px; diff --git a/spec/factories/dts.rb b/spec/factories/dts.rb new file mode 100644 index 000000000..05e6148c2 --- /dev/null +++ b/spec/factories/dts.rb @@ -0,0 +1,19 @@ +FactoryGirl.define do + factory :dt, :class => 'Dts' do + IPLineCode "MyString" +Description "MyString" +Num "MyString" +Variable "MyString" +TraceInfo "MyString" +Method "MyString" +File "MyString" +IPLine "MyString" +Review "MyString" +Category "MyString" +Defect "MyString" +PreConditions "MyString" +StartLine "MyString" +project_id 1 + end + +end diff --git a/spec/models/dts_spec.rb b/spec/models/dts_spec.rb new file mode 100644 index 000000000..5c274cba4 --- /dev/null +++ b/spec/models/dts_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe Dts, :type => :model do + pending "add some examples to (or delete) #{__FILE__}" +end