diff --git a/Gemfile b/Gemfile index 037c606c8..1bc9e6629 100644 --- a/Gemfile +++ b/Gemfile @@ -21,7 +21,7 @@ gem 'acts-as-taggable-on', '2.4.1' gem 'spreadsheet' gem 'ruby-ole' #gem 'email_verifier', path: 'lib/email_verifier' - +gem 'rufus-scheduler' group :development do gem 'grape-swagger' gem 'grape-swagger-ui', git: 'https://github.com/guange2015/grape-swagger-ui.git' diff --git a/Gemfile.lock b/Gemfile.lock index 355ca422d..861c49754 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -252,6 +252,8 @@ GEM ruby-ole (1.2.11.7) ruby-openid (2.1.8) rubyzip (1.1.6) + rufus-scheduler (3.0.8) + tzinfo sass (3.3.10) sass-rails (3.2.6) railties (~> 3.2.0) @@ -339,6 +341,7 @@ DEPENDENCIES rspec-rails (= 2.13.1) ruby-ole ruby-openid (~> 2.1.4) + rufus-scheduler sass-rails (~> 3.2.3) seems_rateable! selenium-webdriver (~> 2.42.0) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 61944ca2c..a55abd123 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -5,6 +5,7 @@ class CoursesController < ApplicationController helper :members helper :words + before_filter :authorize1, :only => [:show, :feedback] menu_item :overview menu_item :feedback, :only => :feedback menu_item :homework, :only => :homework diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index 8d6943f02..d2a253c2a 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -17,6 +17,7 @@ class MessagesController < ApplicationController include ApplicationHelper + before_filter :authorize1, :only => [:show] menu_item :boards default_search_scope :messages before_filter :find_board, :only => [:new, :preview,:edit] diff --git a/app/controllers/news_controller.rb b/app/controllers/news_controller.rb index 2df17d73f..b44e8a348 100644 --- a/app/controllers/news_controller.rb +++ b/app/controllers/news_controller.rb @@ -17,6 +17,7 @@ class NewsController < ApplicationController layout 'base_projects'# by young + before_filter :authorize1, :only => [:show] default_search_scope :news model_object News before_filter :find_model_object, :except => [:new, :create, :index] diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 02bfc9e19..5054fd5c1 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -19,7 +19,7 @@ # Description 封装代码,简化代码,格式化代码, class ProjectsController < ApplicationController layout :select_project_layout - + before_filter :authorize1, :only => [:show] menu_item :overview, :only => :show menu_item :roadmap, :only => :roadmap menu_item :settings, :only => :settings diff --git a/app/models/journals_for_message.rb b/app/models/journals_for_message.rb index c71fbaf47..39618e43b 100644 --- a/app/models/journals_for_message.rb +++ b/app/models/journals_for_message.rb @@ -22,8 +22,8 @@ class JournalsForMessage < ActiveRecord::Base :foreign_key => 'jour_id', :conditions => "#{self.table_name}.jour_type = 'Project' " belongs_to :course, - :foreign_key => 'jour_id', - :conditions => "#{self.table_name}.jour_type = 'Course' " + :foreign_key => 'jour_id' + belongs_to :jour, :polymorphic => true belongs_to :user diff --git a/app/models/mailer.rb b/app/models/mailer.rb index 2cae982a7..85ce46e8b 100644 --- a/app/models/mailer.rb +++ b/app/models/mailer.rb @@ -27,6 +27,80 @@ class Mailer < ActionMailer::Base { :host => Setting.host_name, :protocol => Setting.protocol } end + # author: alan + # 根据用户选择发送个人日报或周报 + # 发送内容: 项目【缺陷,讨论区,新闻】,课程【通知,留言,新闻】, 贴吧, 个人留言 + def send_for_user_activities(user, date_to, days) + date_from = date_to - days.days + + # 生成token用于直接点击登录 + token = Token.new(:user =>user , :action => 'autologin') + token.save + @token = token + + @user_url = url_for(my_account_url(user,:token => @token.value)) + # 查询user参加的项目及课程 + projects = user.projects + courses = user.courses + project_ids = projects.map{|project| project.id}.join(",") + course_ids = courses.map {|course| course.id}.join(",") + + # 查询user的缺陷,包括发布的,跟踪的以及被指派的缺陷 + @issues = Issue.find_by_sql("select DISTINCT i.* from issues i, watchers w + where (i.assigned_to_id = #{user.id} or i.author_id = #{user.id} + or (w.watchable_type = 'Issue' and w.watchable_id = i.id and w.user_id = #{user.id})) + and (i.created_on between #{date_from} and #{date_to}) order by i.created_on desc") + + # 查询课程作业,包括老师发布的作业,以及user提交作业 + @bids ||= [] # 老师发布的作业 + courses.each do |course| + @bids << course.homeworks.where("created_at between #{date_from} and #{date_to} order by i.created_on desc") + end + # user 提交的作业 + @homeworks = HomeworkAttach.where("user_id=#{user.id} and (created_at between #{date_from} and #{date_to})") + + # 查询user在课程。项目中发布的讨论帖子 + 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 i.created_on desc") + @course_messages ||= [] + @project_messages ||= [] + messages.each do |msg| + if msg.project + @project_messages << msg + elsif msg.course + @course_messages << msg + end + end + + # 查询user在课程中发布的通知,项目中发的新闻 + @course_news = 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 i.created_on desc") + @project_news = 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 i.created_on desc") + + # 查询user在课程及个人中留言 + @course_journal_messages = JournalsForMessage.find_by_sql("select DISTINCT * from journals_for_messages where + jour_type='Course' and user_id = #{user.id} + and (created_on between #{date_from} and #{date_to}) order by i.created_on desc") + @user_journal_messages = user.journals_for_messages.where("m_parent_id IS NULL and (created_on between #{date_from} and #{date_to})").order('created_on DESC') + + # 查询课程课件更新 + @attachments ||= [] + courses.each do |course| + @attachments << course.attachments.where("created_on between #{date_from} and #{date_to}").order('created_at DESC') + end + # 查询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 i.created_on desc") + @memos = Memo.find_by_sql("select DISTINCT m.* from memos m, forums f where (m.author_id = #{user.id} or (m.forum_id = f.id and f.creator_id = #{user.id})) + and (created_at between #{date_from} and #{date_to}) order by i.created_on desc") + if days == 1 + subject = "[ #{user.show_name} : #{date_from} - #{l(:label_day_mail)}]" + else + subject = "[ #{user.show_name} : #{l(:label_week_mail)}]" + end + mail :to => user.mail,:subject => "[ #{user.show_name} : #{l(:notice_successful_create)}]" + + end # 贴吧新建贴吧发送邮件 # example Mailer.forum(forum).deliver def forum_add(forum) @@ -140,7 +214,6 @@ class Mailer < ActionMailer::Base @author = issue.author @issue = issue user = User.find_by_mail(recipients) - token = Token.new(:user =>user , :action => 'autologin') token.save @token = token diff --git a/app/models/user.rb b/app/models/user.rb index 06f59c764..dd06db838 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -24,7 +24,7 @@ class User < Principal DEVELOPER = 3 include Redmine::SafeAttributes - + seems_rateable_rater # Different ways of displaying/sorting users USER_FORMATS = { :firstname_lastname => { @@ -149,7 +149,7 @@ class User < Principal scope :by_join_date, order("created_on DESC") ############################# added by liuping 关注 acts_as_watchable - seems_rateable_rater + has_one :user_extensions,:dependent => :destroy ## end diff --git a/app/views/mailer/send_for_user_activities.html.erb b/app/views/mailer/send_for_user_activities.html.erb new file mode 100644 index 000000000..22b071a1f --- /dev/null +++ b/app/views/mailer/send_for_user_activities.html.erb @@ -0,0 +1,337 @@ + + + + + +
+
+

<%= l(:label_course_overview)%>

+ <% unless @course_news.first.nil? %> + + <% end %> + <% if !@bids.first.nil? || !@homeworks.first.nil? %> + + <% end %> + + <% unless @course_journal_messages.first.nil? %> + + <% end %> + + <% unless @course_messages.first.nil? %> + + <% end %> + + <% unless @attachments.first.nil? %> + + <% end %> +
+ + +
+

<%= l(:label_project_overview)%>

+ <% unless @issues.first.nil? %> + + <% end %> + + <% unless @project_messages.first.nil? %> + + <% end %> + + + +
+ +
+

<%= l(:label_activities) %>

+ <% unless @user_journal_messages.first.nil? %> + + <% end %> +
+
+ <%= link_to l(:mail_footer), @user_url, :style => "margin-top:20px;color:#2775d2; margin-left:10px;" %> +
+ + +
+ diff --git a/app/views/mailer/send_for_user_activities.text.erb b/app/views/mailer/send_for_user_activities.text.erb new file mode 100644 index 000000000..03ea31ec3 --- /dev/null +++ b/app/views/mailer/send_for_user_activities.text.erb @@ -0,0 +1,253 @@ +<%= l(:label_course_overview)%> + <% unless @course_news.first.nil? %> + <%= l(:label_course_news) %> + (<%= @course_news.count %>) + + + <% @course_news.each do |course_new|%> + + ▪ + [ + + <%= link_to course_new.course.name, [:controller => 'courses', :action => 'show', :id => course_new.course_id, :token => @token.value], + :class=> "wmail_column", + :style=> "width:90px; font-weight: bold; display:block; float:left; color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" %> + ] + + <%= link_to course_new.author, user_activities_url(course_new.author,:token => @token.value), :class => "wmail_name", + :style => "color:#fe5722; float:left;display:block; margin-right:5px; margin-left:5px; width:50px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;"%> + <%= l(:label_project_notice) %> + + <%= link_to course_new.title, [:controller => 'news', :action => 'show', :id => course_new.id,:token => @token.value], + :class => 'wmail_info', + :style => "color:#5a5a5a; float:left; width:400px; margin-right:5px; display:block;color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" + %> <%= course_new.created_on %> + + <% end %> + + <% end %> + <% if !@bids.first.nil? || !@homeworks.first.nil? %> + <%= l(:label_homework_overview) %><%= @bids.count %> + <% unless @bids.first.nil?%> + <% @bids.each do |bid| %> + ▪ + [ + + <%= link_to bid.courses.first.name, [:controller => 'courses', :action => 'show', :id => bid.courses.first.id, :token => @token.value], + :class=> "wmail_column", + :style=> "width:90px; font-weight: bold; display:block; float:left; color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" %> + ] + + <%= link_to bid.author, user_activities_url(bid.author,:token => @token.value), :class => "wmail_name", + :style => "color:#fe5722; float:left;display:block; margin-right:5px; margin-left:5px; width:50px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;"%> + <%= l(:label_course_homework) %> + + <%= link_to bid.name, course_for_bid(:id => bid.id,:token => @token.value), + :class => 'wmail_info', + :style => "color:#5a5a5a; float:left; width:400px; margin-right:5px; display:block;color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" + %> + <%= bid.created_on %> + + <% end %> + <% end %> + <% unless @homeworks.first.nil? %> + <% @homeworks.each do |homework| %> + ▪[ + + <%= link_to homework.bid.courses.first.name, [:controller => 'courses', :action => 'show', :id => homework.bid.courses.first.id, :token => @token.value], + :class=> "wmail_column", + :style=> "width:90px; font-weight: bold; display:block; float:left; color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" %> + ] + + <%= link_to homework.user, user_activities_url(homework.user,:token => @token.value), :class => "wmail_name", + :style => "color:#fe5722; float:left;display:block; margin-right:5px; margin-left:5px; width:50px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;"%> + <%= l(:label_course_submit_homework) %> + + <%= link_to homework.name, course_for_bid(:id => homework.bid.id,:token => @token.value), + :class => 'wmail_info', + :style => "color:#5a5a5a; float:left; width:400px; margin-right:5px; display:block;color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" + %> + <%= homework.created_on %> + <% end %> + <% end %> + + + + <% end %> + + <% unless @course_journal_messages.first.nil? %> + + <%= l(:view_course_journals_for_messages) %> (<%= @course_journal_messages.count %>) + + + <% @course_journal_messages.each do |course_journal_message|%> + + [ + + <%= link_to course_journal_message.course.name, [:controller => 'courses', :action => 'show', :id => course_journal_message.jour_id, :token => @token.value], + :class=> "wmail_column", + :style=> "width:90px; font-weight: bold; display:block; float:left; color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" %> + ] + + <%= link_to course_journal_message.user, user_activities_url(course_journal_message.user,:token => @token.value), :class => "wmail_name", + :style => "color:#fe5722; float:left;display:block; margin-right:5px; margin-left:5px; width:50px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;"%> + <%= l(:label_send_course_journals_for_messages) %> + + <%= link_to course_journal_message.notes, [:controller => 'courses', :action => 'feedback', :id => course_journal_message.jour_id,:token => @token.value], + :class => 'wmail_info', + :style => "color:#5a5a5a; float:left; width:400px; margin-right:5px; display:block;color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" + %> + <%= course_journal_message.created_on %> + + <% end %> + + + <% end %> + + <% unless @course_messages.first.nil? %> + + <%= l(:view_borad_course) %> + (<%= @course_journal_messages.count %>) + + + <% @course_messages.each do |course_message|%> + + ▪ + [ + + <%= link_to course_message.course.name, [:controller => 'courses', :action => 'show', :id => course_message.course.id, :token => @token.value], + :class=> "wmail_column", + :style=> "width:90px; font-weight: bold; display:block; float:left; color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" %> + ] + + <%= link_to course_message.author, user_activities_url(course_message.author,:token => @token.value), :class => "wmail_name", + :style => "color:#fe5722; float:left;display:block; margin-right:5px; margin-left:5px; width:50px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;"%> + <%= l(:label_send_course_messages) %> + + <%= link_to course_message.subject,url_for(course_message.event_url(:token => @token.value)), + :class => 'wmail_info', + :style => "color:#5a5a5a; float:left; width:400px; margin-right:5px; display:block;color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" + %> + <%= course_message.created_on %> + + <% end %> + + + <% end %> + + <% unless @attachments.first.nil? %> + + <%= l(:label_course_attendingcontestwork_download) %> + (<%= @attachments.count %>) + + + <% @attachments.each do |attachment|%> + ▪[ + + <%= link_to attachment.course.name, [:controller => 'courses', :action => 'show', :id => attachment.course.id, :token => @token.value], + :class=> "wmail_column", + :style=> "width:90px; font-weight: bold; display:block; float:left; color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" %> + ] + + <%= link_to attachment.author, user_activities_url(attachment.author,:token => @token.value), :class => "wmail_name", + :style => "color:#fe5722; float:left;display:block; margin-right:5px; margin-left:5px; width:50px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;"%> + <%= l(:label_course_file_upload) %> + + <%= link_to attachment.filename,course_files_path(@course,:token => @token.value), + :class => 'wmail_info', + :style => "color:#5a5a5a; float:left; width:400px; margin-right:5px; display:block;color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" + %> + <%= course_message.created_on %> + + <% end %> + + + <% end %> + + + +<%= l(:label_project_overview)%> + <% unless @issues.first.nil? %> + + <%= l(:label_issue_tracking) %> + (<%= @issues.count %>) + + <% @issues.each do |issue|%> + ▪ + [ + + <%= link_to issue.project.name, [:controller => 'projects', :action => 'show', :id => issue.project.id, :token => @token.value], + :class=> "wmail_column", + :style=> "width:90px; font-weight: bold; display:block; float:left; color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" %> + ] + + <%= link_to issue.author, user_activities_url(issue.author,:token => @token.value), :class => "wmail_name", + :style => "color:#fe5722; float:left;display:block; margin-right:5px; margin-left:5px; width:50px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;"%> + <%= l(:label_project_issue) %> + + <%= link_to issue.subject,url_for(:controller => 'issues', :action => 'show', :id => issue.id, :token => @token.value), + :class => 'wmail_info', + :style => "color:#5a5a5a; float:left; width:400px; margin-right:5px; display:block;color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" + %> + <%= issue.created_on %> + <% end %> + + + <% end %> + + <% unless @project_messages.first.nil? %> + + <%= l(:project_moule_boards_show) %> + (<%= @course_journal_messages.count %>) + + <% @project_messages.each do |project_message|%> + ▪[ + + <%= link_to project_message.project.name, [:controller => 'projects', :action => 'show', :id => project_message.project.id, :token => @token.value], + :class=> "wmail_column", + :style=> "width:90px; font-weight: bold; display:block; float:left; color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" %> + ] + + <%= link_to project_message.author, user_activities_url(project_message.author,:token => @token.value), :class => "wmail_name", + :style => "color:#fe5722; float:left;display:block; margin-right:5px; margin-left:5px; width:50px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;"%> + <%= l(:label_send_course_messages) %> + + <%= link_to project_message.subject,url_for(project_message.event_url(:token => @token.value)), + :class => 'wmail_info', + :style => "color:#5a5a5a; float:left; width:400px; margin-right:5px; display:block;color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" + %> + <%= project_message.created_on %> + <% end %> + + + <% end %> + + + +<%= l(:label_activities) %> + <% unless @user_journal_messages.first.nil? %> + + <%= l(:label_user_message) %> + (<%= @user_journal_messages.count %>) + + <% @user_journal_messages.each do |user_journal_message|%> + ▪ + + <%= link_to user_journal_message.user, user_activities_url(course_journal_message.user,:token => @token.value), + :class => "wmail_name", + :style => "color:#fe5722; float:left;display:block; margin-right:5px; margin-left:5px; width:50px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" %> + <%= l(:label_show_your_message) %> + + <%= link_to user_journal_message.notes, [:controller => 'courses', :action => 'feedback', :id => course_journal_message.jour_id,:token => @token.value], + :class => 'wmail_info', + :style => "color:#5a5a5a; float:left; width:400px; margin-right:5px; display:block;color:#1b55a7;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;" + %> + <%= user_journal_message.created_on %> + + <% end %> + + + <% end %> +< + + <%= link_to l(:mail_footer), @user_url, :style => "margin-top:20px;color:#2775d2; margin-left:10px;" %> diff --git a/config/initializers/send_mail.rb b/config/initializers/send_mail.rb new file mode 100644 index 000000000..4cfd3cc03 --- /dev/null +++ b/config/initializers/send_mail.rb @@ -0,0 +1,23 @@ +#!/usr/bin/env ruby + +require 'rubygems' +require 'rufus-scheduler' + +#users = User.where("mail_notification = 'week' or mail_notification = 'day'") + +scheduler = Rufus::Scheduler.new +scheduler.cron('*/1 * * * *') do + users = User.where("login like '%alan%'") + users.each do |user| + # if user.mail_notification == "week" + # cycle = '*/1 * * * *' + # else + # cycle = '*/2 * * * *' + # end + Rails.logger.info "send mail to #{user.show_name}(#{user.mail}) at #{Time.now}" + Thread.start do + Mailer.send_for_user_activities(user, Date.today, 7).deliver + end + end +end + diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 42a1143ec..8899256a9 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -248,6 +248,9 @@ zh: # end field_name: 名称 field_enterprise_name: 组织名称 + + label_week_mail: 一周动态 + label_day_mail: 一日动态 #added by huang field_tea_name: 教师 field_couurse_time: 学时 @@ -497,6 +500,9 @@ zh: permission_paret_in_homework: 加入作业 permission_view_homework_attaches: 查看作业附件 permission_view_course_journals_for_messages: 查看课程留言 + view_course_journals_for_messages: 课程留言 + label_send_course_journals_for_messages: 发布了留言 + label_send_course_messages: 发布了讨论 permission_select_course_modules: 选择课程模块 permission_view_course_files: 查看课程资源 permission_add_course: 新建课程 @@ -511,6 +517,7 @@ zh: permission_upload_attachments: 资源上传 project_module_issue_tracking: 问题跟踪 + project_moule_boards_show: 项目论坛 project_module_time_tracking: 时间跟踪 project_module_news: 新闻 project_module_documents: 文档 @@ -657,6 +664,8 @@ zh: label_user_login_attending_contest: 您还没有登录,请登录后参赛 label_user_login_score_and_comment: 您还没有登录,请登录后对作品进行打分评价 label_user_login_notificationcomment: 您还没有登录,请登录后参加评论 + label_user_message: 您的留言 + label_show_your_message: 给您的留言 #end #by huang # modified by bai label_college: 高校进入 @@ -727,6 +736,7 @@ zh: label_attachment: 文件 label_attachment_new: 新建文件 label_file_upload: 上传资料 + label_course_file_upload: 上传了课件 label_attachment_delete: 删除文件 label_attachment_plural: 文件 label_file_added: 文件已添加 @@ -745,6 +755,8 @@ zh: label_settings: 配置 label_overview: 近期动态 label_course_overview: "课程动态" + label_project_overview: "项目动态" + label_homework_overview: 作业动态 label_question_student: 作业交流 #bai label_homework_commit: 提交作业 #huang label_homework_info: 提交情况 #huang @@ -992,6 +1004,7 @@ zh: label_project_newother: "查看其他评论" label_project_newshare: "分享了" label_project_notice: "发布了通知:" + label_project_issue: "发布了问题:" label_project_newadd: "添加了" label_project_unadd: "暂无项目,赶快去创建吧!" label_project_un: "该用户暂未参与任何项目!" @@ -1591,6 +1604,7 @@ zh: label_exist_repository_path: 定义已有版本库URL路径,定义格式file://, http://, https://, svn:// label_project_no_activity: 该项目暂无动态! label_course_homework_un: 暂未发布任何作业 + label_course_homework: 发布了作业 label_follow_no_requirement: 暂未关注任何需求! label_no_user_respond_you: 暂无任何用户对您进行反馈! label_tags_issue: 问题名称: @@ -1662,6 +1676,7 @@ zh: label_project_no_follow: 该项目暂未被关注! label_no_bid_project: 暂无参与项目 label_no_course_project: 暂无已提交的作业! + label_course_submit_homework: 提交了作业 label_bids_reward_method: 奖励方式 : label_bids_reward_what: 输入奖励内容 label_call_bonus: 奖金 @@ -1769,6 +1784,7 @@ zh: label_wiki_number: wiki的数量 label_message_number: 留言的数量 label_activity_number: 个人动态数量 + label_activities: 个人动态 label_issue_message_number: 对issue的留言数量 label_code_submit_number: 代码提交次数 label_topic_number: 讨论区发言数量 @@ -1954,6 +1970,7 @@ zh: label_hot_project: '热门项目' label_borad_project: 项目讨论区 label_borad_course: 课程讨论区 + view_borad_course: 课程讨论 label_memo_create_succ: 发布成功 label_memo_create_fail: 发布失败 label_forum_create_succ: 贴吧新建成功 @@ -2117,6 +2134,7 @@ zh: label_attendingcontestwork_release_person: 发布人员 label_attendingcontestwork_adaptive_system: 系统支持 label_attendingcontestwork_download: 作品下载 + label_course_attendingcontestwork_download: 课件下载 label_attendingcontestwork_developers: 开发人员 label_attendingcontestwork_average_scores: 平均评分 label_attendingcontestwork_release_time: 发布时间 @@ -2370,7 +2388,7 @@ zh: mail_issue_from_project: "项目问题跟踪" mail_issue_attachments: "附件:" mail_issue_reply: "我要回复" - + mail_footer: "退订Trustie社区任务提醒?" # 课程资源上传 # edit by meng # 课程资源上传>