diff --git a/Gemfile b/Gemfile
index 078289fe5..87cd6dba2 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,4 +1,4 @@
-source 'http://ruby.taobao.org'
+source 'https://ruby.taobao.org'
#source 'http://ruby.sdutlinux.org/'
unless RUBY_PLATFORM =~ /w32/
@@ -29,6 +29,7 @@ gem 'ruby-ole'
gem 'rails_kindeditor',path:'lib/rails_kindeditor'
#gem "rmagick", ">= 2.0.0"
gem 'binding_of_caller'
+gem 'chinese_pinyin'
group :development do
gem 'grape-swagger'
diff --git a/app/controllers/boards_controller.rb b/app/controllers/boards_controller.rb
index 434ea4470..2ec3cac0d 100644
--- a/app/controllers/boards_controller.rb
+++ b/app/controllers/boards_controller.rb
@@ -90,65 +90,67 @@ class BoardsController < ApplicationController
end
end
end
+
+ sort_init 'updated_on', 'desc'
+ sort_update 'created_on' => "#{Message.table_name}.created_on",
+ 'replies' => "#{Message.table_name}.replies_count",
+ 'updated_on' => "COALESCE(last_replies_messages.created_on, #{Message.table_name}.created_on)"
+
+ @is_new = params[:is_new]
+ @topic_count = @board ? @board.topics.count : 0
+ if @project
+ @topic_pages = Paginator.new @topic_count, per_page_option, params['page']
+ #现在发布帖子的时候置顶功能已经没有了。所以取消这个置顶排序 #{Message.table_name}.sticky DESC,
+ @topics = @board.topics.
+ reorder("#{Message.table_name}.created_on desc").
+ includes(:last_reply).
+ limit(@topic_pages.per_page).
+ offset(@topic_pages.offset).
+
+ preload(:author, {:last_reply => :author}).
+ all
+ elsif @course
+ #
+ # board_topics = @board ? @board.topics.reorder("#{Message.table_name}.sticky DESC, #{Message.table_name}.created_on desc").
+ # includes(:last_reply).
+ # # limit(@topic_pages.per_page).
+ # # offset(@topic_pages.offset).
+ #
+ # preload(:author, {:last_reply => :author}).
+ # all : []
+ # @topics = paginateHelper board_topics,10
+ if (@board)
+ limit = 10;
+ #pageno = params[:page];
+ #if(pageno == nil || pageno=='')
+ # dw_topic = nil;
+ # if( params[:parent_id]!=nil && params[:parent_id]!='' )
+ # dw_topic = @board.topics.where(id:params[:parent_id]).first();
+ # end
+ # if( dw_topic != nil )
+ # dw_count = @board.topics.where('(sticky>?) or (sticky=? and created_on>?)',dw_topic.sticky,dw_topic.sticky,dw_topic.created_on).count();
+ # dw_count = dw_count+1;
+ # pageno = dw_count%10==0 ? (dw_count/limit) : (dw_count/limit+1)
+ # end
+ #end
+ #if(pageno == nil || pageno=='')
+ # pageno=1;
+ #end
+ @topic_count = @board.topics.count();
+ @topic_pages = (params[:page] ? params[:page].to_i + 1 : 0) *10
+ @topics = @board.topics.reorder("#{Message.table_name}.sticky DESC, COALESCE(last_replies_messages.created_on, #{Message.table_name}.created_on) desc").
+ limit(limit).offset(@topic_pages).includes(:last_reply).
+ preload(:author, {:last_reply => :author}).all();
+ else
+ @topics = [];
+ end
+ end
+
+ @message = Message.new(:board => @board)
+ #modify by nwb
respond_to do |format|
format.js
format.html {
- sort_init 'updated_on', 'desc'
- sort_update 'created_on' => "#{Message.table_name}.created_on",
- 'replies' => "#{Message.table_name}.replies_count",
- 'updated_on' => "COALESCE(last_replies_messages.created_on, #{Message.table_name}.created_on)"
-
- @topic_count = @board ? @board.topics.count : 0
- if @project
- @topic_pages = Paginator.new @topic_count, per_page_option, params['page']
- #现在发布帖子的时候置顶功能已经没有了。所以取消这个置顶排序 #{Message.table_name}.sticky DESC,
- @topics = @board.topics.
- reorder("#{Message.table_name}.created_on desc").
- includes(:last_reply).
- limit(@topic_pages.per_page).
- offset(@topic_pages.offset).
-
- preload(:author, {:last_reply => :author}).
- all
- elsif @course
- #
- # board_topics = @board ? @board.topics.reorder("#{Message.table_name}.sticky DESC, #{Message.table_name}.created_on desc").
- # includes(:last_reply).
- # # limit(@topic_pages.per_page).
- # # offset(@topic_pages.offset).
- #
- # preload(:author, {:last_reply => :author}).
- # all : []
- # @topics = paginateHelper board_topics,10
- if( @board )
- limit = 10;
- pageno = params[:page];
- if(pageno == nil || pageno=='')
- dw_topic = nil;
- if( params[:parent_id]!=nil && params[:parent_id]!='' )
- dw_topic = @board.topics.where(id:params[:parent_id]).first();
- end
- if( dw_topic != nil )
- dw_count = @board.topics.where('(sticky>?) or (sticky=? and created_on>?)',dw_topic.sticky,dw_topic.sticky,dw_topic.created_on).count();
- dw_count = dw_count+1;
- pageno = dw_count%10==0 ? (dw_count/limit) : (dw_count/limit+1)
- end
- end
- if(pageno == nil || pageno=='')
- pageno=1;
- end
- @topic_count = @board.topics.count();
- @topic_pages = Paginator.new @topic_count, limit, pageno
- @topics = @board.topics.reorder("#{Message.table_name}.sticky DESC, #{Message.table_name}.created_on desc").
- limit(limit).offset(@topic_pages.offset).includes(:last_reply).
- preload(:author, {:last_reply => :author}).all();
- else
- @topics = [];
- end
- end
-
- @message = Message.new(:board => @board)
- #modify by nwb
if @project
render :action => 'show', :layout => 'base_projects'
elsif @course
@@ -158,10 +160,10 @@ class BoardsController < ApplicationController
}
format.atom {
@messages = @board.messages.
- reorder('created_on DESC').
- includes(:author, :board).
- limit(Setting.feeds_limit.to_i).
- all
+ reorder('created_on DESC').
+ includes(:author, :board).
+ limit(Setting.feeds_limit.to_i).
+ all
if @project
render_feed(@messages, :title => "#{@project}: #{@board}")
elsif @course
diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb
index 4f3f3ec0d..4f78d61f5 100644
--- a/app/controllers/messages_controller.rb
+++ b/app/controllers/messages_controller.rb
@@ -37,6 +37,7 @@ class MessagesController < ApplicationController
# Show a topic and its replies
def show
+=begin
if @course
topic_id = params[:r]?params[:r]:params[:id]
parent_id = params[:id]
@@ -44,6 +45,7 @@ class MessagesController < ApplicationController
redirect_to url
return;
end
+=end
@isReply = true
page = params[:page]
diff --git a/app/controllers/my_controller.rb b/app/controllers/my_controller.rb
index 9728ddf11..16d516f82 100644
--- a/app/controllers/my_controller.rb
+++ b/app/controllers/my_controller.rb
@@ -126,11 +126,13 @@ class MyController < ApplicationController
end
@se = @user.extensions
- if params[:occupation].to_i.to_s == params[:occupation]
- @se.school_id = params[:occupation]
- else
- @se.occupation = params[:occupation]
- end
+ # if params[:occupation].to_i.to_s == params[:occupation]
+ # @se.school_id = params[:occupation]
+ # else
+ # @se.occupation = params[:occupation]
+ # end
+ @se.school_id = params[:occupation]
+
@se.gender = params[:gender]
@se.location = params[:province] if params[:province]
@se.location_city = params[:city] if params[:city]
diff --git a/app/controllers/school_controller.rb b/app/controllers/school_controller.rb
index 3e0c280ac..062b0fa34 100644
--- a/app/controllers/school_controller.rb
+++ b/app/controllers/school_controller.rb
@@ -105,4 +105,42 @@ class SchoolController < ApplicationController
render :text => options
end
+
+ #根据学校名字或者拼音来查询
+ def on_search
+ condition = "#{params[:name].strip}".gsub(" ","")
+ #将条件截断为汉字和拼音(全汉字 或者 全拼音 或者 汉字和拼音),
+ #获取拼音的第一次出现的位置
+ chinese = []
+ pinyin = []
+ condition.scan(/./).each_with_index do |char,index|
+ if char =~ /[a-zA-Z0-9]/
+ pinyin << char
+ else
+ chinese << char
+ end
+ end
+ if(condition == '')
+ @school = School.all
+ else
+ @school = School.where("name like '%#{chinese.join("")}%' and pinyin like '%#{pinyin.join("")}%'").all
+ end
+
+ result = []
+ # @school.each do |sc|
+ # result << {:value=>sc.name,:data=>sc.id}
+ # end
+ render :json => @school.to_json
+ end
+
+ #添加学校
+ def add_school
+ @school = School.new
+ @school.name = params[:name].strip
+ @school.pinyin = Pinyin.t(params[:name].strip, splitter: '')
+ @school.save
+ respond_to do |format|
+ format.js
+ end
+ end
end
diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb
index 3de491421..90fdbe837 100644
--- a/app/controllers/users_controller.rb
+++ b/app/controllers/users_controller.rb
@@ -883,6 +883,7 @@ class UsersController < ApplicationController
user_course_ids = @user.courses.visible.empty? ? "(-1)" : "(" + @user.courses.visible.map{|course| course.id}.join(",") + ")"
course_types = "('Message','News','HomeworkCommon','Poll')"
project_types = "('Message','Issue')"
+ principal_types = "JournalsForMessage"
if params[:type].present?
case params[:type]
when "course_homework"
@@ -897,13 +898,15 @@ class UsersController < ApplicationController
@user_activities = UserActivity.where("container_type = 'Project' and container_id in #{user_project_ids} and act_type = 'Issue'").order('updated_at desc').limit(10).offset(@page * 10)
when "project_message"
@user_activities = UserActivity.where("container_type = 'Project' and container_id in #{user_project_ids} and act_type = 'Message'").order('updated_at desc').limit(10).offset(@page * 10)
+ when "user_journals"
+ @user_activities = UserActivity.where("container_type = 'Principal' and act_type= 'JournalsForMessage' and container_id = #{@user.id}").order('updated_at desc').limit(10).offset(@page * 10)
when "current_user"
@user_activities = UserActivity.where("user_id = #{@user.id} and ((container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types}) or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types}))").order('updated_at desc').limit(10).offset(@page * 10)
else
- @user_activities = UserActivity.where("(container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types}) or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types})").order('updated_at desc').limit(10).offset(@page * 10)
+ @user_activities = UserActivity.where("(container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types}) or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types}) or (container_type = 'Principal' and act_type= '#{principal_types}' and container_id = #{@user.id})").order('updated_at desc').limit(10).offset(@page * 10)
end
else
- @user_activities = UserActivity.where("(container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types}) or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types})").order('updated_at desc').limit(10).offset(@page * 10)
+ @user_activities = UserActivity.where("(container_type = 'Project' and container_id in #{user_project_ids} and act_type in #{project_types}) or (container_type = 'Course' and container_id in #{user_course_ids} and act_type in #{course_types})or (container_type = 'Principal' and act_type= '#{principal_types}' and container_id = #{@user.id})").order('updated_at desc').limit(10).offset(@page * 10)
end
# @user_activities = paginateHelper @user_activities,500
@type = params[:type]
diff --git a/app/controllers/words_controller.rb b/app/controllers/words_controller.rb
index a59f507df..6304055ed 100644
--- a/app/controllers/words_controller.rb
+++ b/app/controllers/words_controller.rb
@@ -76,7 +76,8 @@ class WordsController < ApplicationController
# render 'test/index'
# }
format.js {
- @user_activity_id = params[:user_activity_id] if
+ @reply_type = params[:reply_type]
+ @user_activity_id = params[:user_activity_id]
@activity = JournalsForMessage.find(parent_id)
}
end
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 41e016562..b18d0c706 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -2349,22 +2349,25 @@ module ApplicationHelper
#根据传入作业确定显示为编辑作品还是新建作品,或者显示作品数量
def user_for_homework_common homework,is_teacher
- if is_teacher #老师显示作品数量
- link_to "提交(#{homework.student_works.count})",student_work_index_path(:homework => homework.id),:class => "c_blue"
- else #学生显示提交作品、修改作品等按钮
- work = cur_user_works_for_homework homework
- if work.nil?
- link_to "提交作品", new_student_work_path(:homework => homework.id),:class => 'c_blue'
- else
- if homework.homework_detail_manual && homework.homework_detail_manual.comment_status != 1 #匿评作业,且作业状态不是在开启匿评之前
- link_to "作品已交", "javascript:void(0)", :class => 'c_blue', :title => "开启匿评后不可修改作品"
- elsif homework.homework_type == 2 #编程作业不能修改作品
- link_to "修改作品", new_student_work_path(:homework => homework.id),:class => 'c_blue'
+ if User.current.member_of_course?(homework.course)
+ if is_teacher #老师显示作品数量
+ link_to "提交(#{homework.student_works.count})",student_work_index_path(:homework => homework.id),:class => "c_blue"
+ else #学生显示提交作品、修改作品等按钮
+ work = cur_user_works_for_homework homework
+ if work.nil?
+ link_to "提交作品", new_student_work_path(:homework => homework.id),:class => 'c_blue'
else
- link_to "修改作品", edit_student_work_path(work.id),:class => 'c_blue'
+ if homework.homework_detail_manual && homework.homework_detail_manual.comment_status != 1 #匿评作业,且作业状态不是在开启匿评之前
+ link_to "作品匿评", student_work_index_path(:homework => homework.id), :class => 'c_blue', :title => "开启匿评后不可修改作品"
+ elsif homework.homework_type == 2 #编程作业不能修改作品
+ link_to "修改作品", new_student_work_path(:homework => homework.id),:class => 'c_blue'
+ else
+ link_to "修改作品", edit_student_work_path(work.id),:class => 'c_blue'
+ end
end
end
end
+
end
def student_anonymous_comment homework
diff --git a/app/models/journals_for_message.rb b/app/models/journals_for_message.rb
index dde34abfd..faab129a6 100644
--- a/app/models/journals_for_message.rb
+++ b/app/models/journals_for_message.rb
@@ -56,6 +56,7 @@ class JournalsForMessage < ActiveRecord::Base
acts_as_attachable
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
+ has_many :principal_acts, :class_name => 'PrincipalActivity',:as =>:principal_act ,:dependent => :destroy
# 课程动态
has_many :course_acts, :class_name => 'CourseActivity',:as =>:course_act ,:dependent => :destroy
# 消息关联
@@ -63,7 +64,7 @@ class JournalsForMessage < ActiveRecord::Base
has_many :user_feedback_messages, :class_name => 'UserFeedbackMessage', :as =>:journals_for_message, :dependent => :destroy
validates :notes, presence: true, if: :is_homework_jour?
- after_create :act_as_activity, :act_as_course_activity, :act_as_course_message, :act_as_user_feedback_message
+ after_create :act_as_activity, :act_as_course_activity, :act_as_course_message, :act_as_user_feedback_message, :act_as_principal_activity
after_create :reset_counters!
after_destroy :reset_counters!
after_save :be_user_score
@@ -133,6 +134,15 @@ class JournalsForMessage < ActiveRecord::Base
end
end
+ #用户动态公共表记录
+ def act_as_principal_activity
+ if self.jour_type == 'Principal'
+ unless self.user_id == self.jour.id && self.user_id != self.reply_id && self.reply_id != 0
+ self.principal_acts << PrincipalActivity.new(:user_id => self.user_id, :principal_id => self.jour_id)
+ end
+ end
+ end
+
def reset_counters!
self.class.reset_counters!(self)
end
diff --git a/app/models/principal_activity.rb b/app/models/principal_activity.rb
new file mode 100644
index 000000000..bdd7cd60e
--- /dev/null
+++ b/app/models/principal_activity.rb
@@ -0,0 +1,34 @@
+class PrincipalActivity < ActiveRecord::Base
+ attr_accessible :principal_act_id, :principal_act_type, :principal_id, :user_id
+ #虚拟关联
+ belongs_to :principal_act ,:polymorphic => true
+ belongs_to :user
+ validates :user_id,presence: true
+ validates :principal_id,presence: true
+ validates :principal_act_id,presence: true
+ validates :principal_act_type, presence: true
+ has_many :user_acts, :class_name => 'UserAcivity',:as =>:act
+ after_save :add_user_activity
+ before_destroy :destroy_user_activity
+
+ #在个人动态里面增加当前动态
+ def add_user_activity
+ user_activity = UserActivity.where("act_type = '#{self.principal_act_type.to_s}' and act_id = '#{self.principal_act_id}'").first
+ if user_activity
+ user_activity.save
+ else
+ user_activity = UserActivity.new
+ user_activity.act_id = self.principal_act_id
+ user_activity.act_type = self.principal_act_type
+ user_activity.container_type = "Principal"
+ user_activity.container_id = self.principal_id
+ user_activity.user_id = self.user_id
+ user_activity.save
+ end
+ end
+
+ def destroy_user_activity
+ user_activity = UserActivity.where("act_type = '#{self.principal_act_type.to_s}' and act_id = '#{self.principal_act_id}'")
+ user_activity.destroy_all
+ end
+end
diff --git a/app/models/project.rb b/app/models/project.rb
index 6d24fa4ed..fd1012fa0 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -91,8 +91,10 @@ class Project < ActiveRecord::Base
has_many :tags, :through => :project_tags, :class_name => 'Tag'
has_many :project_tags, :class_name => 'ProjectTags'
+ # 动态级联删除
+ has_many :forge_activities, :class_name => 'ForgeActivity', :dependent => :destroy
# 关联虚拟表
- has_many :forge_messages, :class_name =>'ForgeMessage', :as => :forge_message, :dependent => :destroy
+ has_many :forge_messages, :class_name =>'ForgeMessage', :as => :forge_message, :dependent => :destroy
belongs_to :organization
diff --git a/app/models/school.rb b/app/models/school.rb
index a180eefbe..6cafb0473 100644
--- a/app/models/school.rb
+++ b/app/models/school.rb
@@ -1,5 +1,5 @@
class School < ActiveRecord::Base
- attr_accessible :name, :province
+ attr_accessible :name, :province,:pinyin
has_many :courses
def to_s
diff --git a/app/models/user.rb b/app/models/user.rb
index fd565cbdf..8baf81d77 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -114,6 +114,7 @@ class User < Principal
has_many :students_for_courses
#has_many :courses, :through => :students_for_courses, :source => :project
has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy
+ has_many :principal_acts, :class_name => 'PrincipalActivity',:as =>:principal_act ,:dependent => :destroy
has_many :file_commit, :class_name => 'Attachment', :foreign_key => 'author_id', :conditions => "container_type = 'Project' or container_type = 'Version'"
####
# added by bai
@@ -211,7 +212,7 @@ class User < Principal
before_save :update_hashed_password
before_destroy :remove_references_before_destroy
# added by fq
- after_create :act_as_activity, :add_onclick_time
+ after_create :act_as_activity, :add_onclick_time, :act_as_principal_activity
# end
# 更新邮箱用户或用户名的同事,同步更新邀请信息
after_update :update_invite_list
@@ -1006,6 +1007,11 @@ class User < Principal
self.acts << Activity.new(:user_id => self.id)
end
+ #用户动态公共表记录
+ def act_as_principal_activity
+ self.principal_acts << PrincipalActivity.new(:user_id => self.id,:principal_id => self.id)
+ end
+
# 注册用户的时候消息默认点击时间为用户创建时间
def add_onclick_time
if OnclickTime.where("user_id =?" , self.id).first.nil?
diff --git a/app/views/attachments/_form_course.html.erb b/app/views/attachments/_form_course.html.erb
index b0ab39b5a..b66632c7f 100644
--- a/app/views/attachments/_form_course.html.erb
+++ b/app/views/attachments/_form_course.html.erb
@@ -42,7 +42,9 @@
<%#= button_tag "浏览", :type=>"button", :onclick=>"CompatibleSend();" %>
-<%= button_tag "#{l(:button_browse)}", :type=>"button", :onclick=>"file#{container.id}.click()",:class =>"sub_btn",:style => ie8? ? 'display:none' : '' %>
+<%#= button_tag "#{l(:button_browse)}", :type=>"button", :onclick=>"file#{container.id}.click()",:class =>"sub_btn",:style => ie8? ? 'display:none' : '' %>
+<% id ="file#{container.id}"%>
+上传附件
<%= file_field_tag 'attachments[dummy][file]',
:id => "file#{container.id}",
:class => 'file_selector',
@@ -63,7 +65,7 @@
<% if container.nil? %>
<%= l(:label_no_file_uploaded)%>
<% end %>
-(<%= l(:label_max_size) %>: <%= number_to_human_size(Setting.attachment_max_size.to_i.kilobytes) %>)
+
<% content_for :header_tags do %>
diff --git a/app/views/boards/_course_message_edit.html.erb b/app/views/boards/_course_message_edit.html.erb
new file mode 100644
index 000000000..16807afb0
--- /dev/null
+++ b/app/views/boards/_course_message_edit.html.erb
@@ -0,0 +1,16 @@
+
+
\ No newline at end of file
diff --git a/app/views/boards/_course_new.html.erb b/app/views/boards/_course_new.html.erb
index 61c774a95..a5cbc1c1e 100644
--- a/app/views/boards/_course_new.html.erb
+++ b/app/views/boards/_course_new.html.erb
@@ -1,12 +1,67 @@
-<%= form_for @message, :url =>{:controller=>'messages',:action => 'new', :board_id => @board.id, :is_board => 'true'}, :html => {:nhname=>'form',:multipart => true, :id => 'message-form'} do |f| %>
+<%= javascript_include_tag "/assets/kindeditor/kindeditor",'/assets/kindeditor/pasteimg' %>
+<%= error_messages_for 'message' %>
+
+
+
+
+
+
+ <%= f.check_box :sticky, :value => topic.sticky%>
+ <%= label_tag 'message_sticky', l(:label_board_sticky) %>
+ <%= f.check_box :locked, :value => topic.locked%>
+ <%= label_tag 'message_locked', l(:label_board_locked) %>
+
+
+
+
+ <%= text_area :quote,:quote,:style => 'display:none' %>
+ <%= hidden_field_tag :asset_id,params[:asset_id],:required => false,:style => 'display:none' %>
- <%= render :partial => 'form_course', :locals => {:f => f, :topic => @message} %>
-
+ <%= f.kindeditor :content, :editor_id => 'message_content_editor',
+ :owner_id => topic.nil? ? 0: topic.id,
+ :owner_type => OwnerTypeHelper::MESSAGE,
+ :width => '100%',
+ :height => 300,
+ :minHeight=>300,
+ :class => 'talk_text fl',
+ :input_html => { :id => 'message_content',
+ :class => 'talk_text fl',
+ :maxlength => 5000 }%>
+
+
+
+
+
+
+ <%= render :partial => 'attachments/form_course', :locals => {:container => topic, :isReply => @isReply} %>
+
+
+
+
+ <%if !edit_mode %>
+
确定
+
或
+
取消
+ <% else %>
+
确定
+
或
+ <%= link_to "取消",board_message_url(topic.board, topic.root, :r => (topic.parent_id && topic.id)), :class => "fr mr10 mt3"%>
+ <% end %>
+
+
+
+
+ <%#= render :partial => 'course_new_topic', :locals => {:f => f, :topic => @message} %>
+
+
+
\ 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 db174f30e..ef16d0c23 100644
--- a/app/views/boards/_course_show.html.erb
+++ b/app/views/boards/_course_show.html.erb
@@ -1,313 +1,110 @@
-
-
-
- <% if User.current.language == "zh"%>
- <%= h @board.name %>
- <% else %>
- <%= l(:project_module_boards) %>
- <% end %>
-
-
- <% if User.current.logged? %>
-
<%= l(:label_message_new) %>
- <% end %>
-
-
-
-
-
-
- <%= render :partial => 'course_new' %>
-
-
-
-
-
-
+<%= javascript_include_tag "/assets/kindeditor/kindeditor", '/assets/kindeditor/pasteimg', "init_activity_KindEditor" %>
+
+
-<% if !User.current.logged?%>
-
- <%= l(:label_user_login_course_board) %>
- <%= link_to l(:label_user_login_new), signin_path %>
-
+
-
-
\ No newline at end of file
+
diff --git a/app/views/boards/_project_show.html.erb b/app/views/boards/_project_show.html.erb
index 4f022261f..5f6275e9d 100644
--- a/app/views/boards/_project_show.html.erb
+++ b/app/views/boards/_project_show.html.erb
@@ -51,9 +51,9 @@
:data => {:confirm => l(:text_are_you_sure)},
:class => 'talk_edit fr',
:style => ' margin-right: 10px;') if topic.destroyable_by?(User.current) %>
- <%# if topic.sticky? %>
-
- <%# end %>
+ <% if topic.sticky? %>
+
<%= l(:label_board_sticky)%>
+ <% end %>
+
+
+
+
+ <%= link_to image_tag(url_to_avatar(@topic.author),:width=>50,:height => 50,:alt=>'图像' ),user_path(@topic.author) %>
+
+
+ <% if @topic.author.id == User.current.id%>
+
+
+
+
+
+ <%= link_to(
+ l(:button_edit),
+ {:action => 'edit', :id => @topic},
+ :class => 'postOptionLink'
+ ) if @message.course_editable_by?(User.current) %>
+
+
+ <%= link_to(
+ l(:button_delete),
+ {:action => 'destroy', :id => @topic},
+ :method => :post,
+ :data => {:confirm => l(:text_are_you_sure)},
+ :class => 'postOptionLink'
+ ) if @message.course_destroyable_by?(User.current) %>
+
+
+
+
+
+ <%end%>
+
+
-
-
- <%= link_to image_tag(url_to_avatar(@topic.author),:width => '46',:height => '46'), user_path(@topic.author) %>
-
-
-
- <%= @topic.subject %>
-
-
-
- 由<%= link_to_user_header @topic.author,false,:class=> 'problem_name' %>
- 添加于<%= format_time(@topic.created_on) %>
-
+
+ <% if @topic.try(:author).try(:realname) == ' ' %>
+ <%= link_to @topic.try(:author), user_path(@topic.author,:host=>Setting.host_user), :class => "linkBlue2", :target=> "_blank" %>
+ <% else %>
+ <%= link_to @topic.try(:author).try(:realname), user_path(@topic.author,:host=>Setting.host_user), :class => "linkBlue2", :target=> "_blank" %>
+ <% end %>
+
+
<%= format_time( @topic.created_on)%>
+
+
+ <%= @topic.content.html_safe%>
+
+
+
+ <%= link_to_attachments_course @topic, :author => false %>
+
+
+
- <%= link_to(
- l(:button_delete),
- {:action => 'destroy', :id => @topic},
- :method => :post,
- :data => {:confirm => l(:text_are_you_sure)},
- :class => 'talk_edit fr'
- ) if @message.course_destroyable_by?(User.current) %>
- <%= link_to(
- l(:button_edit),
- {:action => 'edit', :id => @topic},
- :class => 'talk_edit fr'
- ) if @message.course_editable_by?(User.current) %>
-
-
<%= @topic.content.html_safe %>
-
<%= link_to_attachments_course @topic, :author => false %>
-
-
- <% if User.current.logged? %>
- <%= toggle_link l(:button_reply), "reply", :focus => 'message_subject',:class => 'talk_edit fr' %>
- <% else %>
- <%= link_to l(:button_reply), signin_path,:class => 'talk_edit fr' %>
- <% end %>
- <%= link_to(
- l(:button_quote),
- {:action => 'quote', :id => @topic},
- :remote => true,
- :method => 'get',
- :class => 'talk_edit fr',
- :remote => true) if !@topic.locked? && authorize_for('messages', 'reply') %>
-
-<% unless @replies.empty? %>
- <% reply_count = 0 %>
- <% @replies.each do |message| %>
-
">
-
<%= link_to image_tag(url_to_avatar(message.author), :width => '46',:height => '46'), user_path(message.author) %>
-
-
- <%= link_to_user_header message.author,false,:class => 'c_blue fb fl mb10 ' %>
-
<%= format_time(message.created_on) %>
-
-
<%= textAreailizable message,:content,:attachments => message.attachments %>
- <%= link_to_attachments_course message, :author => false %>
+
+ <% unless @replies.empty? %>
+
+
回复(<%=@reply_count %>)
+
+
+
+
+ <% @replies.each_with_index do |reply,i| %>
+
+
+ <%= link_to image_tag(url_to_avatar(reply.author), :width => 33,:height => 33), user_path(reply.author) %>
-
-
-
- <% end %>
-<% end %>
-<% if !@topic.locked? && authorize_for_course('messages', 'reply') %>
-
- <%= form_for @reply, :as => :reply, :url => {:action => 'reply', :id => @topic}, :html => {:multipart => true, :id => 'message_form'} do |f| %>
- <%= render :partial => 'form_course', :locals => {:f => f, :replying => true} %>
- <%= link_to l(:button_submit),"javascript:void(0)",:onclick => 'course_board_submit_message_replay();' ,:class => "blue_btn fl c_white" ,:style=>"margin-left: 50px;"%>
- <%= link_to l(:button_cancel), "javascript:void(0)", :onclick => 'course_board_canel_message_replay();', :class => "blue_btn grey_btn fl c_white" %>
<% end %>
-<% end %>
-
-
- <%= pagination_links_full @obj_pages, @obj_count, :per_page_links => false, :remote => false, :flag => true%>
-
-<% html_title @topic.subject %>
+ <% end %>
+
+
+
+
+
+ <% if !@topic.locked? && authorize_for_course('messages', 'reply') %>
+ <%= form_for @reply, :as => :reply, :url => {:action => 'reply', :id => @topic}, :html => {:multipart => true, :id => 'message_form'} do |f| %>
+ <%= render :partial => 'form_course', :locals => {:f => f, :replying => true} %>
+ <%= link_to l(:button_cancel), "javascript:void(0)", :onclick => 'course_board_canel_message_replay();', :class => "blue_btn grey_btn fr c_white mt10 mr5" %>
+ <%= link_to l(:button_submit),"javascript:void(0)",:onclick => 'course_board_submit_message_replay();' ,:class => "blue_btn fr c_white mt10" ,:style=>"margin-left: 50px;"%>
+ <% end %>
+ <% end %>
+
+
+
+
+
\ No newline at end of file
diff --git a/app/views/messages/_course_show_old.html.erb b/app/views/messages/_course_show_old.html.erb
new file mode 100644
index 000000000..de9205433
--- /dev/null
+++ b/app/views/messages/_course_show_old.html.erb
@@ -0,0 +1,117 @@
+
+
+ <%= l(:label_board) %>
+
+
+
+
+
+ <%= l(:label_user_location) %> :
+ <%= link_to l(:label_borad_course), course_boards_path(@course) %>
+ >
+ <%= link_to @topic.subject, course_board_path(@course, @board) %>
+
+
+
+
+
+
+ <%= link_to image_tag(url_to_avatar(@topic.author),:width => '46',:height => '46'), user_path(@topic.author) %>
+
+
+
+ <%= @topic.subject %>
+
+
+
+ 由<%= link_to_user_header @topic.author,false,:class=> 'problem_name' %>
+ 添加于<%= format_time(@topic.created_on) %>
+
+
+ <%= link_to(
+ l(:button_delete),
+ {:action => 'destroy', :id => @topic},
+ :method => :post,
+ :data => {:confirm => l(:text_are_you_sure)},
+ :class => 'talk_edit fr'
+ ) if @message.course_destroyable_by?(User.current) %>
+ <%= link_to(
+ l(:button_edit),
+ {:action => 'edit', :id => @topic},
+ :class => 'talk_edit fr'
+ ) if @message.course_editable_by?(User.current) %>
+
+
<%= @topic.content.html_safe %>
+
<%= link_to_attachments_course @topic, :author => false %>
+
+
+ <% if User.current.logged? %>
+ <%= toggle_link l(:button_reply), "reply", :focus => 'message_subject',:class => 'talk_edit fr' %>
+ <% else %>
+ <%= link_to l(:button_reply), signin_path,:class => 'talk_edit fr' %>
+ <% end %>
+ <%= link_to(
+ l(:button_quote),
+ {:action => 'quote', :id => @topic},
+ :remote => true,
+ :method => 'get',
+ :class => 'talk_edit fr',
+ :remote => true) if !@topic.locked? && authorize_for('messages', 'reply') %>
+
+
+<% unless @replies.empty? %>
+ <% reply_count = 0 %>
+ <% @replies.each do |message| %>
+
">
+
<%= link_to image_tag(url_to_avatar(message.author), :width => '46',:height => '46'), user_path(message.author) %>
+
+
+ <%= link_to_user_header message.author,false,:class => 'c_blue fb fl mb10 ' %>
+
<%= format_time(message.created_on) %>
+
+
<%= textAreailizable message,:content,:attachments => message.attachments %>
+ <%= link_to_attachments_course message, :author => false %>
+
+
+
+
+
+
+ <% end %>
+<% end %>
+<% if !@topic.locked? && authorize_for_course('messages', 'reply') %>
+
+ <%= form_for @reply, :as => :reply, :url => {:action => 'reply', :id => @topic}, :html => {:multipart => true, :id => 'message_form'} do |f| %>
+ <%= render :partial => 'form_course', :locals => {:f => f, :replying => true} %>
+ <%= link_to l(:button_submit),"javascript:void(0)",:onclick => 'course_board_submit_message_replay();' ,:class => "blue_btn fl c_white" ,:style=>"margin-left: 50px;"%>
+ <%= link_to l(:button_cancel), "javascript:void(0)", :onclick => 'course_board_canel_message_replay();', :class => "blue_btn grey_btn fl c_white" %>
+ <% end %>
+
+<% end %>
+
+
+ <%= pagination_links_full @obj_pages, @obj_count, :per_page_links => false, :remote => false, :flag => true%>
+
+<% html_title @topic.subject %>
+
diff --git a/app/views/messages/_form_course.html.erb b/app/views/messages/_form_course.html.erb
index 7952e4820..86a6df836 100644
--- a/app/views/messages/_form_course.html.erb
+++ b/app/views/messages/_form_course.html.erb
@@ -28,16 +28,17 @@
-
+
<%= text_area :quote,:quote,:style => 'display:none' %>
<%= hidden_field_tag :asset_id,params[:asset_id],:required => false,:style => 'display:none' %>
<% if replying %>
<%= f.kindeditor :content, :editor_id => 'message_content_editor',
- :width => '89%',
- :height => 300,
+ :width => '99%',
+ :height => 100,
+ :minHeight=>100,
:input_html => { :id => 'message_content',
:class => 'talk_text fl',
:maxlength => 5000 }%>
@@ -47,21 +48,24 @@
:owner_type => OwnerTypeHelper::MESSAGE,
:width => '90%',
:height => 300,
+ :minHeight=>300,
:class => 'talk_text fl',
:input_html => { :id => 'message_content',
:class => 'talk_text fl',
:maxlength => 5000 }%>
<% end %>
-
+
-
- <%= l(:label_attachment_plural) %> :
-
- <%= render :partial => 'attachments/form_course', :locals => {:container => @message,:isReply => @isReply} %>
-
-
+<% unless replying %>
+
+ <%= l(:label_attachment_plural) %> :
+
+ <%= render :partial => 'attachments/form_course', :locals => {:container => @message,:isReply => @isReply} %>
+
+
+<% end %>
diff --git a/app/views/messages/_reply_message.html.erb b/app/views/messages/_reply_message.html.erb
new file mode 100644
index 000000000..3e9550ee2
--- /dev/null
+++ b/app/views/messages/_reply_message.html.erb
@@ -0,0 +1,31 @@
+
+
+
+
<%= link_to image_tag(url_to_avatar(User.current), :width => "33", :height => "33"), user_path(User.current), :alt => "用户头像" %>
+
+
+
\ No newline at end of file
diff --git a/app/views/messages/edit.html.erb b/app/views/messages/edit.html.erb
index d30aee45d..0817594ab 100644
--- a/app/views/messages/edit.html.erb
+++ b/app/views/messages/edit.html.erb
@@ -1,45 +1,38 @@
-
-
<%= l(:label_course_board) %>
-
+<% if @message.project %>
+
+
<%= l(:label_course_board) %>
+
+
- <% if @message.project %>
<%#= board_breadcrumb(@message) %>
-
-
-
- <%= form_for @message, { :as => :message,
- :url => {:action => 'edit'},
- :html => {:multipart => true,
- :id => 'message-form',
- :method => :post}
- } do |f| %>
+
+
+
+ <%= form_for @message, {:as => :message,
+ :url => {:action => 'edit'},
+ :html => {:multipart => true,
+ :id => 'message-form',
+ :method => :post}
+ } do |f| %>
<%= render :partial => 'form_project',
- :locals => {:f => f, :replying => !@message.parent.nil?} %>
- <%= l(:button_submit)%>
- <%= link_to l(:button_cancel), board_message_url(@message.board, @message.root, :r => (@message.parent_id && @message.id)), :class => "blue_btn grey_btn fl c_white" %>
-
-
- <% end %>
+ :locals => {:f => f, :replying => !@message.parent.nil?} %>
+ <%= l(:button_submit) %>
+ <%= link_to l(:button_cancel), board_message_url(@message.board, @message.root, :r => (@message.parent_id && @message.id)), :class => "blue_btn grey_btn fl c_white" %>
+
+
+ <% end %>
<% elsif @message.course %>
- <%#= course_board_breadcrumb(@message) %>
-
-
0
- <%= form_for @message, {
- :as => :message,
- :url => {:action => 'edit'},
- :html => {:multipart => true,
- :id => 'message-form',
- :method => :post}
- } do |f| %>
- <%= render :partial => 'form_course',
- :locals => {:f => f, :replying => !@message.parent.nil?} %>
- <%= l(:button_submit)%>
- <%= link_to l(:button_cancel), board_message_url(@message.board, @message.root, :r => (@message.parent_id && @message.id)), :class => "blue_btn grey_btn fl c_white" %>
+ <%= form_for @message, {
+ :as => :message,
+ :url => {:action => 'edit'},
+ :html => {:multipart => true,
+ :id => 'message-form',
+ :method => :post}
+ } do |f| %>
+ <%= render :partial => 'boards/course_message_edit',
+ :locals => {:f => f, :edit_mode => true, :topic => @message} %>
- <% end %>
-
-
+ <% end %>
<% end %>
-
diff --git a/app/views/messages/quote.js.erb b/app/views/messages/quote.js.erb
index e7ee0bca0..78ba0c142 100644
--- a/app/views/messages/quote.js.erb
+++ b/app/views/messages/quote.js.erb
@@ -1,8 +1,16 @@
-$('#message_subject').val("<%= raw escape_javascript(@subject) %>");
-$('#message_quote').html("<%= raw escape_javascript(@temp.content.html_safe) %>");
+/*$('#message_subject').val("<%#= raw escape_javascript(@subject) %>");
+$('#message_quote').html("<%#= raw escape_javascript(@temp.content.html_safe) %>");
//$('#message_content').val("<#%= raw escape_javascript(@content) %>");
-$('#quote_quote').html("<%= raw escape_javascript(@temp.content.html_safe) %>");
+$('#quote_quote').html("<%#= raw escape_javascript(@temp.content.html_safe) %>");
showAndScrollTo("reply", "message_content");
$('#message_content').scrollTop = $('#message_content').scrollHeight - $('#message_content').clientHeight;
-$("img").removeAttr("align");
+$("img").removeAttr("align");*/
+if($("#reply_message_<%= @message.id%>").length > 0) {
+ $("#reply_message_<%= @message.id%>").replaceWith("<%= escape_javascript(render :partial => 'reply_message', :locals => {:reply => @message,:temp =>@temp,:subject =>@subject}) %>");
+ $(function(){
+ init_activity_KindEditor_data(<%= @message.id%>,null,"85%");
+ });
+}else if($("#reply_to_message_<%= @message.id%>").length >0) {
+ $("#reply_to_message_<%= @message.id%>").replaceWith("
");
+}
\ No newline at end of file
diff --git a/app/views/my/account.html.erb b/app/views/my/account.html.erb
index 0e36d5fd9..d0125cd3b 100644
--- a/app/views/my/account.html.erb
+++ b/app/views/my/account.html.erb
@@ -18,8 +18,8 @@
登录名 : *
邮箱 : *
身份 :
-
姓氏 : *
-
名字 : *
+
姓(First Name) : *
+
名(Last Name) : *
组织名 : *
性别 :
工作单位 :
@@ -72,21 +72,25 @@
<% if User.current.user_extensions.nil? %>
- readonly>
+
-
+ 平台找到了0 个包含"国防" 的高校
+
<% elsif User.current.user_extensions.identity == 3 || User.current.user_extensions.identity == 2 %>
- readonly>
+
-
+ 平台找到了0 个包含"国防" 的高校
+
<% elsif User.current.user_extensions.school.nil? %>
- readonly>
+
-
+ 平台找到了0 个包含"国防" 的高校
+
<% else %>
-
+
-
+ 平台找到了0 个包含"国防" 的高校
+
<% end %>
@@ -140,7 +144,7 @@
<%= f.select :language, :Chinese => :zh, :English => :en %>
- 确认
+ 确认
@@ -166,7 +170,7 @@
确认
-
+
@@ -180,7 +184,9 @@
-
+
+
<%= l(:lable_school_list)%>
@@ -202,6 +208,7 @@
+
<%= stylesheet_link_tag 'nyan' %>
@@ -518,10 +525,118 @@
}
}
}
- $(function(){
- //学校
- $("#province").attr("href", "#WOpenWindow")
- $("#province").leanModal({top: 100, closeButton: ".modal_close"});
+ function changeValue(value,data){
+ //console.log(value+","+data)
+ $("input[name='province']").val(value);
+ $("input[name='occupation']").val(data);
+ $("#search_school_result_list").hide();
+ $("#hint").hide();
+ }
+ function add_school(name){
+ $.ajax({
+ url: '<%= url_for(:controller => 'school',:action => 'add_school') %>' + '?name=' + name,
+ type: 'post',
+ success: function (data) {
+
+ }
+ });
+ }
+ var lastSearchCondition = '';
+ $(function() {
+// $("input[name='province']").keydown(function(e){
+// if(e.keyCode == 13 && $("#search_school_result_list").css('display') == 'block'){
+// str = $("#search_school_result_list").children().eq(0).attr('onclick').match(/\(.*\)/)[0]
+//
+// str = str.replace(/\(/,'').replace(/\)/,'');
+// arr = str.split(',');
+// id = arr[1].replace(/\'/,'')
+// name = arr.replace(/\'/,'')
+// changeValue(name,id);
+// return false;
+// }
+// });
+ //查询学校
+ $("input[name='province']").on('input', function (e) {
+ $("input[name='occupation']").val(''); //一旦有输入就清空id。
+ if($(e.target).val().trim() == lastSearchCondition && $(e.target).val().trim() != ''){
+ return;
+ }
+ lastSearchCondition = $(e.target).val().trim();
+ $.ajax({
+ url: '<%= url_for(:controller => 'school',:action => 'on_search') %>' + '?name=' + e.target.value,
+ type: 'post',
+ success: function (data) {
+ if(data.length != undefined && data.length != 0) {
+ var i = 0;
+ $("#search_school_result_list").html('');
+ for (; i < data.length; i++) {
+ link = '
' + data[i].school.name + ' ';
+ $("#search_school_result_list").append(link);
+ }
+ $("#search_school_result_list").css('left', $(e.target).offset().left);
+ $("#search_school_result_list").css('top', $(e.target).offset().top + 28);
+ $("#search_school_result_list").css("position", "absolute");
+ $("#search_school_result_list").show();
+ if($(e.target).val().trim() != '') {
+ str = e.target.value.length > 8 ? e.target.value.substr(0, 6)+"..." : e.target.value;
+ $("#hint").html('找到了' + data.length + '个包含"' + str + '"的高校');
+ $("#hint").show();
+ }else{
+ $("#hint").hide();
+ }
+ }else{
+ $("#search_school_result_list").html('');
+ str = e.target.value.length > 4 ? e.target.value.substr(0, 4)+"..." : e.target.value;
+ $("#hint").html('没有找到包含"'+str+'"的高校,
创建高校 ');
+ $("#hint").show();
+ }
+ }
+ });
+ });
+ $(document.body).click(function(e){
+ if($(e.target).attr("id") != 'search_school_result_list' && $(e.target).attr("id") != 'province')
+ {
+ $("#search_school_result_list").hide();
+ $("#hint").hide();
+ }
+ })
+ $("input[name='province']").on('focus', function (e) {
+ if($(e.target).val() == ''){
+ return;
+ }
+ $.ajax({
+ url: '<%= url_for(:controller => 'school',:action => 'on_search') %>' + '?name=' + e.target.value,
+ type: 'post',
+ success: function (data) {
+ if(data.length != undefined && data.length != 0) {
+ var i = 0;
+ $("#search_school_result_list").html('');
+ for (; i < data.length; i++) {
+ link = '
' + data[i].school.name + ' ';
+ $("#search_school_result_list").append(link);
+ }
+ $("#search_school_result_list").css('left', $(e.target).offset().left);
+ $("#search_school_result_list").css('top', $(e.target).offset().top + 28);
+ $("#search_school_result_list").css("position", "absolute");
+ $("#search_school_result_list").show();
+ if ($(e.target).val().trim() != '') {
+ str = e.target.value.length > 8 ? e.target.value.substr(0, 6) + "..." : e.target.value;
+ $("#hint").html('找到了' + data.length + '个包含"' + str + '"的高校');
+ $("#hint").show();
+ } else {
+ $("#hint").hide();
+ }
+ }else {
+ $("#search_school_result_list").html('');
+ str = e.target.value.length > 4 ? e.target.value.substr(0, 4)+"..." : e.target.value;
+ $("#hint").html('没有找到包含"'+str+'"的高校,
创建高校 ');
+ $("#hint").show();
+ }
+ }
+ });
+ });
+
+// $("#province").leanModal({top: 100, closeButton: ".modal_close"});
//地区
var province = "<%= "#{province}" %>"
@@ -544,6 +659,9 @@
$("#users_tb_2").click();
<% end %>
$('#my_account_form_link').click(function(){
+ if( $("input[name='province']").val().trim() != '' && $("input[name='occupation']").val().trim() == ''){ //学校名字和id不对的话
+ return;
+ }
$('#my_account_form_btn').click();
});
$('#my_password_form_link').click(function(){
diff --git a/app/views/school/add_school.js.erb b/app/views/school/add_school.js.erb
new file mode 100644
index 000000000..181c4e03b
--- /dev/null
+++ b/app/views/school/add_school.js.erb
@@ -0,0 +1 @@
+$("input[name='occupation']").val('<%= @school.id%>');
\ No newline at end of file
diff --git a/app/views/student_work/_add_score.html.erb b/app/views/student_work/_add_score.html.erb
index bdfcff6e1..961f351de 100644
--- a/app/views/student_work/_add_score.html.erb
+++ b/app/views/student_work/_add_score.html.erb
@@ -16,7 +16,7 @@
<%= render :partial => 'student_work/student_work_attachment_form', :locals => {:work => work,:score => score} %>
<%end%>
-
提交
+
提交
<% end%>
\ No newline at end of file
diff --git a/app/views/student_work/_evaluation_un_work.html.erb b/app/views/student_work/_evaluation_un_work.html.erb
index 94fcfcee2..832350e3e 100644
--- a/app/views/student_work/_evaluation_un_work.html.erb
+++ b/app/views/student_work/_evaluation_un_work.html.erb
@@ -3,7 +3,7 @@
- <%= link_to(image_tag(url_to_avatar(student_work.user),:width =>"40",:height => "40"),user_activities_path(User.current.id))%>
+ <%= link_to(image_tag(url_to_avatar(student_work.user),:width =>"40",:height => "40"),user_activities_path(student_work.user)) %>
diff --git a/app/views/student_work/_evaluation_work.html.erb b/app/views/student_work/_evaluation_work.html.erb
index 63cb7ea99..4a6a4eb68 100644
--- a/app/views/student_work/_evaluation_work.html.erb
+++ b/app/views/student_work/_evaluation_work.html.erb
@@ -13,7 +13,7 @@
<%= link_to student_work_name, student_work_path(student_work),:remote => true,:title => student_work_name, :class => "linkGrey f14 StudentName break_word width285"%>
-
+
<%= student_work.user.show_name%>
@@ -32,7 +32,7 @@
<%= link_to "匿名的作品", student_work_path(student_work),:remote => true,:title => student_work_name, :class => "linkGrey f14 StudentName break_word width285"%>
-
+
-
+
<%= Time.parse(format_time(student_work.created_at)).strftime("%m-%d %H:%M")%>
<% if Time.parse(@homework.end_time.to_s).strftime("%Y-%m-%d") < Time.parse(student_work.created_at.to_s).strftime("%Y-%m-%d") %>
[迟交]
diff --git a/app/views/student_work/index.html.erb b/app/views/student_work/index.html.erb
index 9c48d310b..d0f4f82b7 100644
--- a/app/views/student_work/index.html.erb
+++ b/app/views/student_work/index.html.erb
@@ -6,17 +6,17 @@
});
// 匿评弹框提示
- <% if @is_evaluation && !@stundet_works.empty?%>
- $(function(){
- $('#ajax-modal').html('<%= escape_javascript(render :partial => 'student_work/praise_alert') %>');
- showModal('ajax-modal', '500px');
- $('#ajax-modal').siblings().remove();
- $('#ajax-modal').before("" +
- " ");
- $('#ajax-modal').parent().css("top","").css("left","");
- $('#ajax-modal').parent().addClass("anonymos");
- });
- <% end%>
+ <%# if @is_evaluation && !@stundet_works.empty?%>
+// $(function(){
+// $('#ajax-modal').html('<%#= escape_javascript(render :partial => 'student_work/praise_alert') %>');
+// showModal('ajax-modal', '500px');
+// $('#ajax-modal').siblings().remove();
+// $('#ajax-modal').before("" +
+// " ");
+// $('#ajax-modal').parent().css("top","").css("left","");
+// $('#ajax-modal').parent().addClass("anonymos");
+// });
+ <%# end%>
//设置评分规则
function set_score_rule(){
diff --git a/app/views/users/_course_homework.html.erb b/app/views/users/_course_homework.html.erb
index 868f952fa..703a52c32 100644
--- a/app/views/users/_course_homework.html.erb
+++ b/app/views/users/_course_homework.html.erb
@@ -24,10 +24,12 @@
匿评已结束
<% end%>
-
- <% is_teacher = User.current.allowed_to?(:as_teacher,activity.course) %>
- <%= user_for_homework_common activity,is_teacher %>
-
+ <% if User.current.member_of_course?(activity.course) %>
+
+ <% is_teacher = User.current.allowed_to?(:as_teacher,activity.course) %>
+ <%= user_for_homework_common activity,is_teacher %>
+
+ <% end %>
<% if activity.homework_type == 2 && is_teacher%>
diff --git a/app/views/users/_course_journalsformessage.html.erb b/app/views/users/_course_journalsformessage.html.erb
index aab26c20b..93e7f0c29 100644
--- a/app/views/users/_course_journalsformessage.html.erb
+++ b/app/views/users/_course_journalsformessage.html.erb
@@ -5,7 +5,7 @@
- <% if @ctivity.try(:user).try(:realname) == ' ' %>
+ <% if activity.try(:user).try(:realname) == ' ' %>
<%= link_to activity.try(:user), user_path(activity.user_id), :class => "newsBlue mr15" %>
<% else %>
<%= link_to activity.try(:user).try(:realname), user_path(activity.user_id), :class => "newsBlue mr15" %>
@@ -30,11 +30,11 @@
-
+
回复(<%= count %>)
- <%if count>2 %>
+ <%if count>3 %>
-
+
<%= reply.notes.html_safe %>
diff --git a/app/views/users/_course_message.html.erb b/app/views/users/_course_message.html.erb
index 8ec605567..7fe15bd1e 100644
--- a/app/views/users/_course_message.html.erb
+++ b/app/views/users/_course_message.html.erb
@@ -13,13 +13,17 @@
TO
<%= link_to activity.course.name.to_s+" | 课程讨论区", course_boards_path(activity.course,:host=> Setting.host_course), :class => "newsBlue ml15 mr5"%>
-
+
<% if activity.parent_id.nil? %>
- <%= link_to activity.subject.to_s.html_safe, course_boards_path(activity.course,:parent_id =>activity.id, :topic_id => activity.id,:host=> Setting.host_course), :class=> "postGrey" %>
+ <%= link_to activity.subject.to_s.html_safe, board_message_path(activity.board_id, activity), :class=> "postGrey" %>
<% else %>
- <%= link_to activity.parent.subject.to_s.html_safe, course_boards_path(activity.course,:parent_id =>activity.parent_id, :topic_id => activity.id,:host=> Setting.host_course), :class=> "postGrey"%>
+ <%= link_to activity.parent.subject.to_s.html_safe, board_message_path(activity.board_id, activity), :class=> "postGrey"%>
<% end %>
+ <% if activity.sticky == 1%>
+
置顶
+ <% end%>
+
发帖时间:<%= format_time(activity.created_on) %>
@@ -58,7 +62,7 @@
<%= count %>
)
<%#=format_date(activity.updated_on)%>
- <%if count > 2 %>
+ <%if count > 3 %>
展开更多
@@ -74,7 +78,7 @@
<% activity.children.reorder("created_on desc").each do |reply|%>
<% replies_all_i=replies_all_i+1 %>
-
+
<%= link_to image_tag(url_to_avatar(reply.author), :width => "33", :height => "33", :class =>"mt8"), user_path(reply.author_id,:host=>Setting.host_user), :alt => "用户头像" %>
diff --git a/app/views/users/_course_news.html.erb b/app/views/users/_course_news.html.erb
index 4b5b73ceb..c74b43031 100644
--- a/app/views/users/_course_news.html.erb
+++ b/app/views/users/_course_news.html.erb
@@ -32,7 +32,7 @@
回复(<%= count %>)
<%#= format_date(activity.updated_on) %>
- <%if count>2 %>
+ <%if count>3 %>
展开更多
@@ -47,7 +47,7 @@
<% activity.comments.reorder("created_on desc").each do |comment| %>
<% replies_all_i = replies_all_i + 1 %>
-
+
<%= link_to image_tag(url_to_avatar(comment.author), :width => "33", :height => "33", :class =>"mt8"), user_path(comment.author_id), :alt => "用户头像" %>
diff --git a/app/views/users/_project_issue.html.erb b/app/views/users/_project_issue.html.erb
index 02d1940a6..34e840b50 100644
--- a/app/views/users/_project_issue.html.erb
+++ b/app/views/users/_project_issue.html.erb
@@ -69,7 +69,7 @@
回复(<%= count %>)
<%#= format_date(activity.updated_on) %>
- <% if count > 2 %>
+ <% if count > 3 %>
<%#=format_date(activity.updated_on)%>
- <%if count>2 %>
+ <%if count>3 %>
<% end %>
@@ -61,7 +61,7 @@
<% activity.children.reorder("created_on desc").each do |reply| %>
<% replies_all_i=replies_all_i+1 %>
-
+
<%= link_to image_tag(url_to_avatar(reply.author), :width => "33", :height => "33", :class =>"mt8"), user_path(reply.author_id), :alt => "用户头像" %>
diff --git a/app/views/users/_user_activities.html.erb b/app/views/users/_user_activities.html.erb
index 29752121f..dcb6cd9da 100644
--- a/app/views/users/_user_activities.html.erb
+++ b/app/views/users/_user_activities.html.erb
@@ -20,14 +20,15 @@
var btn = $(btnid);
if(btn.data('init')=='0'){
btn.data('init',1);
- btn.html('收起回复('+btn.data('count')+')');
+ btn.html('收起回复');
target.show();
}else{
btn.data('init',0);
- btn.html('展开更多('+btn.data('count')+')');
+ btn.html('展开更多');
target.hide();
target.eq(0).show();
target.eq(1).show();
+ target.eq(2).show();
}
}
@@ -83,6 +84,13 @@
<%= render :partial => 'project_message', :locals => {:activity => act,:user_activity_id =>user_activity.id,:first_user_activity =>first_user_activity,:page => page} %>
<% end %>
<% end %>
+ <% when 'Principal' %>
+ <% if act %>
+ <% case user_activity.act_type.to_s %>
+ <% when 'JournalsForMessage' %>
+ <%= render :partial => 'user_journalsformessage', :locals => {:activity => act,:user_activity_id =>user_activity.id} %>
+ <% end %>
+ <% end %>
<% end %>
<% end %>
<% end %>
diff --git a/app/views/users/_user_journalsformessage.html.erb b/app/views/users/_user_journalsformessage.html.erb
new file mode 100644
index 000000000..43ec2a0c2
--- /dev/null
+++ b/app/views/users/_user_journalsformessage.html.erb
@@ -0,0 +1,97 @@
+
+
+
+ <%= link_to image_tag(url_to_avatar(activity.user), :width => "50", :height => "50"), user_path(activity.user_id), :alt => "用户头像" %>
+
+
+
+ <%= link_to activity.user.show_name, user_path(activity.user_id), :class => "newsBlue mr15" %>
+ TO
+ <% if activity.jour %>
+ <%= link_to activity.jour.show_name+"("+(activity.jour.login ? activity.jour.login : activity.jour.show_name ).to_s+")的留言", feedback_path(activity.jour, :host=> Setting.host_user), :class => "newsBlue ml15" %>
+ <% end %>
+
+
+ <% if activity.parent %>
+ <%= link_to activity.parent.notes.html_safe, feedback_path(activity.jour, :host=> Setting.host_user), :class => "postGrey" %>
+ <% else %>
+ <%= link_to activity.notes.html_safe, feedback_path(activity.jour, :host=> Setting.host_user), :class => "postGrey" %>
+ <% end %>
+
+
+ 留言时间:<%= format_time(activity.created_on) %>
+
+
+
+
+ <% count=fetch_user_leaveWord_reply(activity).count %>
+
+
+
+
+ 回复(<%= count %>)
+
+
+ <%if count>3 %>
+
+ <% end %>
+
+
+ <% replies_all_i = 0 %>
+ <% if count > 0 %>
+
+
+ <% fetch_user_leaveWord_reply(activity).reorder("created_on desc").each do |comment| %>
+ <% replies_all_i = replies_all_i + 1 %>
+
+
+ <%= link_to image_tag(url_to_avatar(comment.user), :width => "33", :height => "33", :class =>"mt8"), user_path(comment.user_id), :alt => "用户头像" %>
+
+
+
+ <% if comment.try(:user).try(:realname) == ' ' %>
+ <%= link_to comment.try(:user), user_path(comment.user_id), :class => "newsBlue mr10 f14" %>
+ <% else %>
+ <%= link_to comment.try(:user).try(:realname), user_path(comment.user_id), :class => "newsBlue mr10 f14" %>
+ <% end %>
+ <%= format_time(comment.created_on) %>
+
+
+ <%= comment.notes.html_safe %>
+
+ <% end %>
+
+
+
+
+
+ <% end %>
+
+
+
<%= link_to image_tag(url_to_avatar(User.current), :width => "33", :height => "33"), :alt => "用户头像" %>
+
+
+ <%= form_for('new_form',:url => {:controller => 'words', :action => 'create_reply', :id => activity.id},:method => "post", :remote => true) do |f|%>
+ <%= hidden_field_tag 'reference_id', params[:reference_id], :value => activity.id %>
+ <%= hidden_field_tag 'reference_user_id', params[:reference_user_id], :value => activity.user.id %>
+ <%= hidden_field_tag 'reference_message_id', params[:reference_message_id], :value => activity.id %>
+ <%= hidden_field_tag 'show_name',params[:show_name],:value =>true %>
+ <%= hidden_field_tag 'user_activity_id',params[:user_activity_id],:value =>user_activity_id %>
+ <%= hidden_field_tag 'reply_type',params[:reply_type],:value =>'user' %>
+
+
+
发送
+
+
+ <% end%>
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/views/users/_user_message_course.html.erb b/app/views/users/_user_message_course.html.erb
index 1b9b175ea..d4b61e966 100644
--- a/app/views/users/_user_message_course.html.erb
+++ b/app/views/users/_user_message_course.html.erb
@@ -144,9 +144,13 @@
课程名称:<%= ma.course_message.course.name %>(<%= ma.course_message.course.term %>)
作业标题:<%= ma.course_message.name %>
+ 缺评扣分:<%= ma.course_message.homework_detail_manual.absence_penalty %>分
- 截止日期:<%= ma.course_message.homework_detail_manual.evaluation_end %> 24点
+ 匿评截止:<%= ma.course_message.homework_detail_manual.evaluation_end %> 24点
+ <% unless User.current.allowed_to?(:as_teacher, ma.course_message.course)%>
+ 请您尽早完成匿评!如果您在规定时间内未完成匿评,一次将被扣<%= ma.course_message.homework_detail_manual.absence_penalty %>分。
+ <% end%>
<%= time_tag(ma.created_at).html_safe %>
@@ -193,12 +197,15 @@
<%= User.current.lastname + User.current.firstname %><%= User.current.allowed_to?(:as_teacher, ma.course_message.course) ? '老师':'同学'%>您好!
- <%= User.current.eql?(ma.course_message.user) ?"您":(ma.course_message.user.lastname + ma.course_message.user.firstname + "老师") %>启动作业匿评失败,
- 失败原因:提交作品的人数低于2人
+ <%= User.current.eql?(ma.course_message.user) ?"您":(ma.course_message.user.lastname + ma.course_message.user.firstname + "老师") %>启动作业匿评失败!
+
失败原因:提交作品的人数低于2人
作业详情如下:
课程名称:<%= ma.course_message.course.name %>(<%= ma.course_message.course.term %>)
作业标题:<%= ma.course_message.name %>
+
+ 提交截止:<%= ma.course_message.end_time%> 24点
+
<%= time_tag(ma.created_at).html_safe %>
@@ -281,9 +288,22 @@
:onmouseover =>"message_titile_show($(this),event)",
:onmouseout => "message_titile_hide($(this))" %>
- <%= ma.content.html_safe %>
课程名称:<%= ma.course.name %>(<%= ma.course.term %>)
作业标题:<%=ma.course_message.student_work.homework_common.name %>
+ <% content = ma.content.gsub("作业评分:","").split(" 评语:")%>
+
+ 作品评分:<%= content[0] %>
+
+ <% if content.size > 1 %>
+
作品评语:
+
<%= content[1] %>
+ <% end %>
+
+ 本次作业将在<%= ma.course_message.student_work.homework_common.homework_detail_manual.evaluation_end %> 24点结束匿评,到时您将可以看到所有其他同学的作品啦!大家可以进一步互相学习。
+
+
+ 期待你取得更大的进步!
+
<% end %>
<%= time_tag(ma.created_at).html_safe %>
diff --git a/app/views/users/show.html.erb b/app/views/users/show.html.erb
index de166b4e7..fc87bd3a0 100644
--- a/app/views/users/show.html.erb
+++ b/app/views/users/show.html.erb
@@ -29,6 +29,7 @@
更多
+ <%= link_to "留言动态", {:controller => "users", :action => "show", :type => "user_journals"}, :class =>"homepagePostTypeMessage postTypeGrey"%>
<%= link_to "我的动态", {:controller => "users", :action => "show", :type => "current_user"}, :class =>"homepagePostTypeMine postTypeGrey"%>
<%= link_to "全部动态", {:controller => "users", :action => "show", :type => nil}, :class =>"homepagePostTypeAll postTypeGrey"%>
diff --git a/app/views/words/create_reply.js.erb b/app/views/words/create_reply.js.erb
index d91ce08ce..db645f011 100644
--- a/app/views/words/create_reply.js.erb
+++ b/app/views/words/create_reply.js.erb
@@ -1,6 +1,10 @@
<% if @save_succ %>
<% if @user_activity_id %>
- $("#user_activity_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/course_journalsformessage', :locals => {:activity => @activity,:user_activity_id =>@user_activity_id}) %>");
+ <% if @reply_type == 'user' %>
+ $("#user_activity_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/user_journalsformessage', :locals => {:activity => @activity,:user_activity_id =>@user_activity_id}) %>");
+ <% else %>
+ $("#user_activity_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/course_journalsformessage', :locals => {:activity => @activity,:user_activity_id =>@user_activity_id}) %>");
+ <% end %>
init_activity_KindEditor_data('<%= @user_activity_id%>', "", "87%");
<% else %>
<% if !@jfm.nil? && @jfm.jour_type == 'Principal' %>
diff --git a/config/configuration.yml b/config/configuration.yml
index ef39f6493..2ac986927 100644
--- a/config/configuration.yml
+++ b/config/configuration.yml
@@ -83,12 +83,12 @@ default:
email_delivery:
delivery_method: :smtp
smtp_settings:
- address: smtp.163.com
- port: 25
- domain: smtp.163.com
- authentication: :plain
- user_name: "huang.jingquan@163.com"
- password: 'xinhu1ji2qu366'
+ address: mail.trustie.net
+ port: 25
+ domain: mail.trustie.net
+ authentication: :login
+ user_name: "mail@trustie.net"
+ password: "loong2010"
# Absolute path to the directory where attachments are stored.
# The default is the 'files' directory in your Redmine instance.
diff --git a/config/routes.rb b/config/routes.rb
index 2e02cd3d2..810c22e7a 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -318,6 +318,7 @@ RedmineApp::Application.routes.draw do
post '/users/:id/user_activities', :to => 'users#show', :as => "user_activities"
post '/courses/:id/course_activity', :to => 'courses#show', :as => 'course_activity'
+ get '/boards/:id/boards_topic', :to =>'boards#show', :as => 'boards_topic'
#added by young
resources :users do
@@ -802,7 +803,11 @@ RedmineApp::Application.routes.draw do
end
end
resources :news, :except => [:show, :edit, :update, :destroy]
- resources :boards
+ # resources :boards do
+ # member do
+ # match 'boards_topic', :to => 'boards#boards_topic', :via => :get, :as => "boards_topic"
+ # end
+ # end
match '/homework', :to => 'courses#homework', :as => 'homework', :via => :get
resources :activity_notifys do
collection do
@@ -879,6 +884,8 @@ RedmineApp::Application.routes.draw do
post 'school/search_school/', :to => 'school#search_school'
get 'school/search_school/', :to => 'school#search_school'
+ post 'school/on_search'
+ post 'school/add_school'
######added by nie
match 'tags/show_projects_tags'
########### added by liuping
diff --git a/db/migrate/20151013081912_create_principal_activities.rb b/db/migrate/20151013081912_create_principal_activities.rb
new file mode 100644
index 000000000..f688ed807
--- /dev/null
+++ b/db/migrate/20151013081912_create_principal_activities.rb
@@ -0,0 +1,12 @@
+class CreatePrincipalActivities < ActiveRecord::Migration
+ def change
+ create_table :principal_activities do |t|
+ t.integer :user_id
+ t.integer :principal_id
+ t.integer :principal_act_id
+ t.string :principal_act_type
+
+ t.timestamps
+ end
+ end
+end
diff --git a/db/migrate/20151013091057_update_principal_activity.rb b/db/migrate/20151013091057_update_principal_activity.rb
new file mode 100644
index 000000000..bfcf9ccd9
--- /dev/null
+++ b/db/migrate/20151013091057_update_principal_activity.rb
@@ -0,0 +1,15 @@
+class UpdatePrincipalActivity < ActiveRecord::Migration
+ def up
+ User.all.each do |user|
+ transaction do
+ user.principal_acts << PrincipalActivity.new(:user_id => user.id,:principal_id => user.id)
+ user.journals_for_messages.each do |jour|
+ jour.principal_acts << PrincipalActivity.new(:user_id => jour.user_id,:principal_id => user.id)
+ end
+ end
+ end
+ end
+
+ def down
+ end
+end
diff --git a/db/migrate/20151013092356_update_principal_activity_time.rb b/db/migrate/20151013092356_update_principal_activity_time.rb
new file mode 100644
index 000000000..8c1e5bd79
--- /dev/null
+++ b/db/migrate/20151013092356_update_principal_activity_time.rb
@@ -0,0 +1,43 @@
+class UpdatePrincipalActivityTime < ActiveRecord::Migration
+ def up
+ count = PrincipalActivity.all.count / 30 + 2
+ transaction do
+ for i in 1 ... count do i
+ PrincipalActivity.page(i).per(30).each do |activity|
+ if activity.principal_act
+ if activity.principal_act.respond_to?("created_on")
+ activity.created_at = activity.principal_act.created_on
+ activity.updated_at = activity.principal_act.created_on
+ elsif activity.principal_act.respond_to?("created_at")
+ activity.created_at = activity.principal_act.created_at
+ activity.updated_at = activity.principal_act.created_at
+ end
+ activity.save
+
+ user_activity = UserActivity.where("act_type = '#{activity.principal_act_type.to_s}' and act_id = '#{activity.principal_act_id}'").first
+ user_activity.created_at = activity.created_at
+ user_activity.updated_at = activity.created_at
+ if user_activity.act_type == 'JournalsForMessage'
+ if user_activity.act
+ unless user_activity.act.m_parent_id.nil?
+ parent_act = UserActivity.where("act_id = #{user_activity.act.m_parent_id} and act_type='JournalsForMessage' and container_type='Principal'").first
+ if parent_act
+ parent_act.created_at = user_activity.act.parent.children.maximum("created_on")
+ parent_act.save
+ user_activity.destroy
+ end
+ end
+ else
+ user_activity.destroy
+ end
+ end
+ user_activity.save
+ end
+ end
+ end
+ end
+ end
+
+ def down
+ end
+end
diff --git a/db/migrate/20151014012627_add_column_pinyin_to_schools.rb b/db/migrate/20151014012627_add_column_pinyin_to_schools.rb
new file mode 100644
index 000000000..8da287d4a
--- /dev/null
+++ b/db/migrate/20151014012627_add_column_pinyin_to_schools.rb
@@ -0,0 +1,5 @@
+class AddColumnPinyinToSchools < ActiveRecord::Migration
+ def change
+ add_column :schools, :pinyin, :string
+ end
+end
diff --git a/db/migrate/20151014013243_update_user_activity_updated_at.rb b/db/migrate/20151014013243_update_user_activity_updated_at.rb
new file mode 100644
index 000000000..6678e07e1
--- /dev/null
+++ b/db/migrate/20151014013243_update_user_activity_updated_at.rb
@@ -0,0 +1,16 @@
+class UpdateUserActivityUpdatedAt < ActiveRecord::Migration
+ def up
+ count = UserActivity.all.count / 30 + 2
+ transaction do
+ for i in 1 ... count do i
+ UserActivity.page(i).per(30).each do |activity|
+ activity.updated_at = activity.created_at
+ activity.save
+ end
+ end
+ end
+ end
+
+ def down
+ end
+end
diff --git a/db/migrate/20151014023806_transfer_name_column_value_to_pinyin_column_value.rb b/db/migrate/20151014023806_transfer_name_column_value_to_pinyin_column_value.rb
new file mode 100644
index 000000000..a5aeba07a
--- /dev/null
+++ b/db/migrate/20151014023806_transfer_name_column_value_to_pinyin_column_value.rb
@@ -0,0 +1,11 @@
+class TransferNameColumnValueToPinyinColumnValue < ActiveRecord::Migration
+ def up
+ School.all.each do |school|
+ school.pinyin = Pinyin.t(school.name, splitter: '')
+ school.save
+ end
+ end
+
+ def down
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 78e280e43..9432cff39 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -1,3 +1,4 @@
+<<<<<<< HEAD
# encoding: UTF-8
# This file is auto-generated from the current state of the database. Instead
# of editing this file, please use the migrations feature of Active Record to
@@ -1712,3 +1713,1734 @@ ActiveRecord::Schema.define(:version => 20151013023237) do
end
end
+=======
+# encoding: UTF-8
+# This file is auto-generated from the current state of the database. Instead
+# of editing this file, please use the migrations feature of Active Record to
+# incrementally modify your database, and then regenerate this schema definition.
+#
+# Note that this schema.rb definition is the authoritative source for your
+# database schema. If you need to create the application database on another
+# system, you should be using db:schema:load, not running all the migrations
+# from scratch. The latter is a flawed and unsustainable approach (the more migrations
+# you'll amass, the slower it'll run and the greater likelihood for issues).
+#
+# It's strongly recommended to check this file into your version control system.
+
+ActiveRecord::Schema.define(:version => 20151014023806) 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 "activity_container_id"
+ t.string "activity_container_type", :default => ""
+ t.datetime "created_at"
+ end
+
+ add_index "activities", ["act_id", "act_type"], :name => "index_activities_on_act_id_and_act_type"
+ add_index "activities", ["user_id", "act_type"], :name => "index_activities_on_user_id_and_act_type"
+ add_index "activities", ["user_id"], :name => "index_activities_on_user_id"
+
+ create_table "activity_notifies", :force => true do |t|
+ t.integer "activity_container_id"
+ t.string "activity_container_type"
+ t.integer "activity_id"
+ t.string "activity_type"
+ t.integer "notify_to"
+ t.datetime "created_on"
+ t.integer "is_read"
+ end
+
+ add_index "activity_notifies", ["activity_container_id", "activity_container_type"], :name => "index_an_activity_container_id"
+ add_index "activity_notifies", ["created_on"], :name => "index_an_created_on"
+ add_index "activity_notifies", ["notify_to"], :name => "index_an_notify_to"
+
+ create_table "api_keys", :force => true do |t|
+ t.string "access_token"
+ t.datetime "expires_at"
+ t.integer "user_id"
+ t.boolean "active", :default => true
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "api_keys", ["access_token"], :name => "index_api_keys_on_access_token"
+ add_index "api_keys", ["user_id"], :name => "index_api_keys_on_user_id"
+
+ create_table "applied_projects", :force => true do |t|
+ t.integer "project_id", :null => false
+ t.integer "user_id", :null => false
+ end
+
+ create_table "apply_project_masters", :force => true do |t|
+ t.integer "user_id"
+ t.string "apply_type"
+ t.integer "apply_id"
+ t.integer "status"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "attachments", :force => true do |t|
+ t.integer "container_id"
+ t.string "container_type", :limit => 30
+ t.string "filename", :default => "", :null => false
+ t.string "disk_filename", :default => "", :null => false
+ t.integer "filesize", :default => 0, :null => false
+ t.string "content_type", :default => ""
+ t.string "digest", :limit => 40, :default => "", :null => false
+ t.integer "downloads", :default => 0, :null => false
+ t.integer "author_id", :default => 0, :null => false
+ t.datetime "created_on"
+ t.string "description"
+ t.string "disk_directory"
+ t.integer "attachtype", :default => 1
+ t.integer "is_public", :default => 1
+ t.integer "copy_from"
+ t.integer "quotes"
+ end
+
+ add_index "attachments", ["author_id"], :name => "index_attachments_on_author_id"
+ add_index "attachments", ["container_id", "container_type"], :name => "index_attachments_on_container_id_and_container_type"
+ add_index "attachments", ["created_on"], :name => "index_attachments_on_created_on"
+
+ create_table "attachmentstypes", :force => true do |t|
+ t.integer "typeId", :null => false
+ t.string "typeName", :limit => 50
+ end
+
+ create_table "auth_sources", :force => true do |t|
+ t.string "type", :limit => 30, :default => "", :null => false
+ t.string "name", :limit => 60, :default => "", :null => false
+ t.string "host", :limit => 60
+ t.integer "port"
+ t.string "account"
+ t.string "account_password", :default => ""
+ t.string "base_dn"
+ t.string "attr_login", :limit => 30
+ t.string "attr_firstname", :limit => 30
+ t.string "attr_lastname", :limit => 30
+ t.string "attr_mail", :limit => 30
+ t.boolean "onthefly_register", :default => false, :null => false
+ t.boolean "tls", :default => false, :null => false
+ t.string "filter"
+ t.integer "timeout"
+ end
+
+ add_index "auth_sources", ["id", "type"], :name => "index_auth_sources_on_id_and_type"
+
+ create_table "biding_projects", :force => true do |t|
+ t.integer "project_id"
+ t.integer "bid_id"
+ t.integer "user_id"
+ t.string "description"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "reward"
+ end
+
+ create_table "bids", :force => true do |t|
+ t.string "name"
+ t.string "budget", :null => false
+ t.integer "author_id"
+ t.date "deadline"
+ t.text "description"
+ t.datetime "created_on", :null => false
+ t.datetime "updated_on", :null => false
+ t.integer "commit"
+ t.integer "reward_type"
+ t.integer "homework_type"
+ t.integer "parent_id"
+ t.string "password"
+ t.integer "is_evaluation"
+ t.integer "proportion", :default => 60
+ t.integer "comment_status", :default => 0
+ t.integer "evaluation_num", :default => 3
+ t.integer "open_anonymous_evaluation", :default => 1
+ end
+
+ create_table "boards", :force => true do |t|
+ t.integer "project_id", :null => false
+ t.string "name", :default => "", :null => false
+ t.string "description"
+ t.integer "position", :default => 1
+ t.integer "topics_count", :default => 0, :null => false
+ t.integer "messages_count", :default => 0, :null => false
+ t.integer "last_message_id"
+ t.integer "parent_id"
+ t.integer "course_id"
+ end
+
+ add_index "boards", ["last_message_id"], :name => "index_boards_on_last_message_id"
+ add_index "boards", ["project_id"], :name => "boards_project_id"
+
+ create_table "bug_to_osps", :force => true do |t|
+ t.integer "osp_id"
+ t.integer "relative_memo_id"
+ t.string "description"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "changes", :force => true do |t|
+ t.integer "changeset_id", :null => false
+ t.string "action", :limit => 1, :default => "", :null => false
+ t.text "path", :null => false
+ t.text "from_path"
+ t.string "from_revision"
+ t.string "revision"
+ t.string "branch"
+ end
+
+ add_index "changes", ["changeset_id"], :name => "changesets_changeset_id"
+
+ create_table "changeset_parents", :id => false, :force => true do |t|
+ t.integer "changeset_id", :null => false
+ t.integer "parent_id", :null => false
+ end
+
+ add_index "changeset_parents", ["changeset_id"], :name => "changeset_parents_changeset_ids"
+ add_index "changeset_parents", ["parent_id"], :name => "changeset_parents_parent_ids"
+
+ create_table "changesets", :force => true do |t|
+ t.integer "repository_id", :null => false
+ t.string "revision", :null => false
+ t.string "committer"
+ t.datetime "committed_on", :null => false
+ t.text "comments"
+ t.date "commit_date"
+ t.string "scmid"
+ t.integer "user_id"
+ end
+
+ add_index "changesets", ["committed_on"], :name => "index_changesets_on_committed_on"
+ add_index "changesets", ["repository_id", "revision"], :name => "changesets_repos_rev", :unique => true
+ add_index "changesets", ["repository_id", "scmid"], :name => "changesets_repos_scmid"
+ add_index "changesets", ["repository_id"], :name => "index_changesets_on_repository_id"
+ add_index "changesets", ["user_id"], :name => "index_changesets_on_user_id"
+
+ create_table "changesets_issues", :id => false, :force => true do |t|
+ t.integer "changeset_id", :null => false
+ t.integer "issue_id", :null => false
+ end
+
+ add_index "changesets_issues", ["changeset_id", "issue_id"], :name => "changesets_issues_ids", :unique => true
+
+ create_table "code_review_assignments", :force => true do |t|
+ t.integer "issue_id"
+ t.integer "change_id"
+ t.integer "attachment_id"
+ t.string "file_path"
+ t.string "rev"
+ t.string "rev_to"
+ t.string "action_type"
+ t.integer "changeset_id"
+ end
+
+ create_table "code_review_project_settings", :force => true do |t|
+ t.integer "project_id"
+ t.integer "tracker_id"
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ t.integer "updated_by"
+ t.boolean "hide_code_review_tab", :default => false
+ t.integer "auto_relation", :default => 1
+ t.integer "assignment_tracker_id"
+ t.text "auto_assign"
+ t.integer "lock_version", :default => 0, :null => false
+ t.boolean "tracker_in_review_dialog", :default => false
+ end
+
+ create_table "code_review_user_settings", :force => true do |t|
+ t.integer "user_id", :default => 0, :null => false
+ t.integer "mail_notification", :default => 0, :null => false
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ end
+
+ create_table "code_reviews", :force => true do |t|
+ t.integer "project_id"
+ t.integer "change_id"
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ t.integer "line"
+ t.integer "updated_by_id"
+ t.integer "lock_version", :default => 0, :null => false
+ t.integer "status_changed_from"
+ t.integer "status_changed_to"
+ t.integer "issue_id"
+ t.string "action_type"
+ t.string "file_path"
+ t.string "rev"
+ t.string "rev_to"
+ t.integer "attachment_id"
+ t.integer "file_count", :default => 0, :null => false
+ t.boolean "diff_all"
+ end
+
+ create_table "comments", :force => true do |t|
+ t.string "commented_type", :limit => 30, :default => "", :null => false
+ t.integer "commented_id", :default => 0, :null => false
+ t.integer "author_id", :default => 0, :null => false
+ t.text "comments"
+ t.datetime "created_on", :null => false
+ t.datetime "updated_on", :null => false
+ end
+
+ add_index "comments", ["author_id"], :name => "index_comments_on_author_id"
+ add_index "comments", ["commented_id", "commented_type"], :name => "index_comments_on_commented_id_and_commented_type"
+
+ create_table "contest_notifications", :force => true do |t|
+ t.text "title"
+ t.text "content"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "contesting_projects", :force => true do |t|
+ t.integer "project_id"
+ t.string "contest_id"
+ t.integer "user_id"
+ t.string "description"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "reward"
+ end
+
+ create_table "contesting_softapplications", :force => true do |t|
+ t.integer "softapplication_id"
+ t.integer "contest_id"
+ t.integer "user_id"
+ t.string "description"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "reward"
+ end
+
+ create_table "contestnotifications", :force => true do |t|
+ t.integer "contest_id"
+ t.string "title"
+ t.string "summary"
+ t.text "description"
+ t.integer "author_id"
+ t.integer "notificationcomments_count"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "contests", :force => true do |t|
+ t.string "name"
+ t.string "budget", :default => ""
+ t.integer "author_id"
+ t.date "deadline"
+ t.string "description"
+ t.integer "commit"
+ t.string "password"
+ t.datetime "created_on", :null => false
+ t.datetime "updated_on", :null => false
+ end
+
+ create_table "course_activities", :force => true do |t|
+ t.integer "user_id"
+ t.integer "course_id"
+ t.integer "course_act_id"
+ t.string "course_act_type"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "course_attachments", :force => true do |t|
+ t.string "filename"
+ t.string "disk_filename"
+ t.integer "filesize"
+ t.string "content_type"
+ t.string "digest"
+ t.integer "downloads"
+ t.string "author_id"
+ t.string "integer"
+ t.string "description"
+ t.string "disk_directory"
+ t.integer "attachtype"
+ t.integer "is_public"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "container_id", :default => 0
+ end
+
+ create_table "course_groups", :force => true do |t|
+ t.string "name"
+ t.integer "course_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "course_infos", :force => true do |t|
+ t.integer "course_id"
+ t.integer "user_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "course_messages", :force => true do |t|
+ t.integer "user_id"
+ t.integer "course_id"
+ t.integer "course_message_id"
+ t.string "course_message_type"
+ t.integer "viewed"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "content"
+ t.integer "status"
+ end
+
+ create_table "course_statuses", :force => true do |t|
+ t.integer "changesets_count"
+ t.integer "watchers_count"
+ t.integer "course_id"
+ t.float "grade", :default => 0.0
+ t.integer "course_ac_para", :default => 0
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "courses", :force => true do |t|
+ t.integer "tea_id"
+ t.string "name"
+ t.integer "state"
+ t.string "code"
+ t.integer "time"
+ t.string "extra"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "location"
+ t.string "term"
+ t.string "string"
+ t.string "password"
+ t.string "setup_time"
+ t.string "endup_time"
+ t.string "class_period"
+ t.integer "school_id"
+ t.text "description"
+ t.integer "status", :default => 1
+ t.integer "attachmenttype", :default => 2
+ t.integer "lft"
+ t.integer "rgt"
+ t.integer "is_public", :limit => 1, :default => 1
+ t.integer "inherit_members", :limit => 1, :default => 1
+ t.integer "open_student", :default => 0
+ end
+
+ create_table "custom_fields", :force => true do |t|
+ t.string "type", :limit => 30, :default => "", :null => false
+ t.string "name", :limit => 30, :default => "", :null => false
+ t.string "field_format", :limit => 30, :default => "", :null => false
+ t.text "possible_values"
+ t.string "regexp", :default => ""
+ t.integer "min_length", :default => 0, :null => false
+ t.integer "max_length", :default => 0, :null => false
+ t.boolean "is_required", :default => false, :null => false
+ t.boolean "is_for_all", :default => false, :null => false
+ t.boolean "is_filter", :default => false, :null => false
+ t.integer "position", :default => 1
+ t.boolean "searchable", :default => false
+ t.text "default_value"
+ t.boolean "editable", :default => true
+ t.boolean "visible", :default => true, :null => false
+ t.boolean "multiple", :default => false
+ end
+
+ add_index "custom_fields", ["id", "type"], :name => "index_custom_fields_on_id_and_type"
+
+ create_table "custom_fields_projects", :id => false, :force => true do |t|
+ t.integer "custom_field_id", :default => 0, :null => false
+ t.integer "project_id", :default => 0, :null => false
+ end
+
+ add_index "custom_fields_projects", ["custom_field_id", "project_id"], :name => "index_custom_fields_projects_on_custom_field_id_and_project_id", :unique => true
+
+ create_table "custom_fields_trackers", :id => false, :force => true do |t|
+ t.integer "custom_field_id", :default => 0, :null => false
+ t.integer "tracker_id", :default => 0, :null => false
+ end
+
+ add_index "custom_fields_trackers", ["custom_field_id", "tracker_id"], :name => "index_custom_fields_trackers_on_custom_field_id_and_tracker_id", :unique => true
+
+ create_table "custom_values", :force => true do |t|
+ t.string "customized_type", :limit => 30, :default => "", :null => false
+ t.integer "customized_id", :default => 0, :null => false
+ t.integer "custom_field_id", :default => 0, :null => false
+ t.text "value"
+ end
+
+ add_index "custom_values", ["custom_field_id"], :name => "index_custom_values_on_custom_field_id"
+ add_index "custom_values", ["customized_type", "customized_id"], :name => "custom_values_customized"
+
+ create_table "delayed_jobs", :force => true do |t|
+ t.integer "priority", :default => 0, :null => false
+ t.integer "attempts", :default => 0, :null => false
+ t.text "handler", :null => false
+ t.text "last_error"
+ t.datetime "run_at"
+ t.datetime "locked_at"
+ t.datetime "failed_at"
+ t.string "locked_by"
+ t.string "queue"
+ t.datetime "created_at"
+ t.datetime "updated_at"
+ end
+
+ add_index "delayed_jobs", ["priority", "run_at"], :name => "delayed_jobs_priority"
+
+ create_table "discuss_demos", :force => true do |t|
+ t.string "title"
+ t.text "body"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "documents", :force => true do |t|
+ t.integer "project_id", :default => 0, :null => false
+ t.integer "category_id", :default => 0, :null => false
+ t.string "title", :limit => 60, :default => "", :null => false
+ t.text "description"
+ t.datetime "created_on"
+ t.integer "user_id", :default => 0
+ t.integer "is_public", :default => 1
+ end
+
+ add_index "documents", ["category_id"], :name => "index_documents_on_category_id"
+ 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
+ t.integer "course_id"
+ end
+
+ add_index "enabled_modules", ["project_id"], :name => "enabled_modules_project_id"
+
+ create_table "enumerations", :force => true do |t|
+ t.string "name", :limit => 30, :default => "", :null => false
+ t.integer "position", :default => 1
+ t.boolean "is_default", :default => false, :null => false
+ t.string "type"
+ t.boolean "active", :default => true, :null => false
+ t.integer "project_id"
+ t.integer "parent_id"
+ t.string "position_name", :limit => 30
+ end
+
+ add_index "enumerations", ["id", "type"], :name => "index_enumerations_on_id_and_type"
+ add_index "enumerations", ["project_id"], :name => "index_enumerations_on_project_id"
+
+ create_table "first_pages", :force => true do |t|
+ t.string "web_title"
+ t.string "title"
+ t.text "description"
+ t.string "page_type"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "sort_type"
+ t.integer "image_width", :default => 107
+ t.integer "image_height", :default => 63
+ t.integer "show_course", :default => 1
+ t.integer "show_contest", :default => 1
+ end
+
+ create_table "forge_activities", :force => true do |t|
+ t.integer "user_id"
+ t.integer "project_id"
+ t.integer "forge_act_id"
+ t.string "forge_act_type"
+ t.integer "org_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "forge_activities", ["forge_act_id"], :name => "index_forge_activities_on_forge_act_id"
+
+ create_table "forge_messages", :force => true do |t|
+ t.integer "user_id"
+ t.integer "project_id"
+ t.integer "forge_message_id"
+ t.string "forge_message_type"
+ t.integer "viewed"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "secret_key"
+ t.integer "status"
+ end
+
+ create_table "forums", :force => true do |t|
+ t.string "name", :null => false
+ t.text "description"
+ t.integer "topic_count", :default => 0
+ t.integer "memo_count", :default => 0
+ t.integer "last_memo_id", :default => 0
+ t.integer "creator_id", :null => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "sticky"
+ t.integer "locked"
+ end
+
+ create_table "groups_users", :id => false, :force => true do |t|
+ t.integer "group_id", :null => false
+ t.integer "user_id", :null => false
+ end
+
+ add_index "groups_users", ["group_id", "user_id"], :name => "groups_users_ids", :unique => true
+
+ create_table "homework_attaches", :force => true do |t|
+ t.integer "bid_id"
+ t.integer "user_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "reward"
+ t.string "name"
+ t.text "description"
+ t.integer "state"
+ t.integer "project_id", :default => 0
+ t.float "score", :default => 0.0
+ t.integer "is_teacher_score", :default => 0
+ end
+
+ add_index "homework_attaches", ["bid_id"], :name => "index_homework_attaches_on_bid_id"
+
+ create_table "homework_commons", :force => true do |t|
+ t.string "name"
+ t.integer "user_id"
+ t.text "description"
+ t.date "publish_time"
+ t.date "end_time"
+ t.integer "homework_type", :default => 1
+ t.string "late_penalty"
+ t.integer "course_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "teacher_priority", :default => 1
+ end
+
+ create_table "homework_detail_manuals", :force => true do |t|
+ t.float "ta_proportion"
+ t.integer "comment_status"
+ t.date "evaluation_start"
+ t.date "evaluation_end"
+ t.integer "evaluation_num"
+ t.integer "absence_penalty", :default => 1
+ t.integer "homework_common_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "homework_detail_programings", :force => true do |t|
+ 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.float "ta_proportion", :default => 0.1
+ t.integer "question_id"
+ end
+
+ create_table "homework_evaluations", :force => true do |t|
+ t.string "user_id"
+ t.string "homework_attach_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "homework_for_courses", :force => true do |t|
+ t.integer "course_id"
+ t.integer "bid_id"
+ end
+
+ add_index "homework_for_courses", ["bid_id"], :name => "index_homework_for_courses_on_bid_id"
+ add_index "homework_for_courses", ["course_id"], :name => "index_homework_for_courses_on_course_id"
+
+ create_table "homework_tests", :force => true do |t|
+ t.text "input"
+ t.text "output"
+ t.integer "homework_common_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "result"
+ t.text "error_msg"
+ end
+
+ create_table "homework_users", :force => true do |t|
+ t.string "homework_attach_id"
+ t.string "user_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "invite_lists", :force => true do |t|
+ t.integer "project_id"
+ t.integer "user_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "mail"
+ end
+
+ create_table "issue_categories", :force => true do |t|
+ t.integer "project_id", :default => 0, :null => false
+ t.string "name", :limit => 30, :default => "", :null => false
+ t.integer "assigned_to_id"
+ end
+
+ add_index "issue_categories", ["assigned_to_id"], :name => "index_issue_categories_on_assigned_to_id"
+ add_index "issue_categories", ["project_id"], :name => "issue_categories_project_id"
+
+ create_table "issue_relations", :force => true do |t|
+ t.integer "issue_from_id", :null => false
+ t.integer "issue_to_id", :null => false
+ t.string "relation_type", :default => "", :null => false
+ t.integer "delay"
+ end
+
+ add_index "issue_relations", ["issue_from_id", "issue_to_id"], :name => "index_issue_relations_on_issue_from_id_and_issue_to_id", :unique => true
+ add_index "issue_relations", ["issue_from_id"], :name => "index_issue_relations_on_issue_from_id"
+ add_index "issue_relations", ["issue_to_id"], :name => "index_issue_relations_on_issue_to_id"
+
+ create_table "issue_statuses", :force => true do |t|
+ t.string "name", :limit => 30, :default => "", :null => false
+ t.boolean "is_closed", :default => false, :null => false
+ t.boolean "is_default", :default => false, :null => false
+ t.integer "position", :default => 1
+ t.integer "default_done_ratio"
+ end
+
+ add_index "issue_statuses", ["is_closed"], :name => "index_issue_statuses_on_is_closed"
+ add_index "issue_statuses", ["is_default"], :name => "index_issue_statuses_on_is_default"
+ add_index "issue_statuses", ["position"], :name => "index_issue_statuses_on_position"
+
+ create_table "issues", :force => true do |t|
+ t.integer "tracker_id", :null => false
+ t.integer "project_id", :null => false
+ t.string "subject", :default => "", :null => false
+ t.text "description"
+ t.date "due_date"
+ t.integer "category_id"
+ t.integer "status_id", :null => false
+ t.integer "assigned_to_id"
+ t.integer "priority_id", :null => false
+ t.integer "fixed_version_id"
+ t.integer "author_id", :null => false
+ t.integer "lock_version", :default => 0, :null => false
+ t.datetime "created_on"
+ t.datetime "updated_on"
+ t.date "start_date"
+ t.integer "done_ratio", :default => 0, :null => false
+ t.float "estimated_hours"
+ t.integer "parent_id"
+ t.integer "root_id"
+ t.integer "lft"
+ t.integer "rgt"
+ t.boolean "is_private", :default => false, :null => false
+ t.datetime "closed_on"
+ t.integer "project_issues_index"
+ end
+
+ add_index "issues", ["assigned_to_id"], :name => "index_issues_on_assigned_to_id"
+ add_index "issues", ["author_id"], :name => "index_issues_on_author_id"
+ add_index "issues", ["category_id"], :name => "index_issues_on_category_id"
+ add_index "issues", ["created_on"], :name => "index_issues_on_created_on"
+ add_index "issues", ["fixed_version_id"], :name => "index_issues_on_fixed_version_id"
+ add_index "issues", ["priority_id"], :name => "index_issues_on_priority_id"
+ add_index "issues", ["project_id"], :name => "issues_project_id"
+ add_index "issues", ["root_id", "lft", "rgt"], :name => "index_issues_on_root_id_and_lft_and_rgt"
+ add_index "issues", ["status_id"], :name => "index_issues_on_status_id"
+ add_index "issues", ["tracker_id"], :name => "index_issues_on_tracker_id"
+
+ create_table "join_in_competitions", :force => true do |t|
+ t.integer "user_id"
+ t.integer "competition_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "join_in_contests", :force => true do |t|
+ t.integer "user_id"
+ t.integer "bid_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "journal_details", :force => true do |t|
+ t.integer "journal_id", :default => 0, :null => false
+ t.string "property", :limit => 30, :default => "", :null => false
+ t.string "prop_key", :limit => 30, :default => "", :null => false
+ t.text "old_value"
+ t.text "value"
+ end
+
+ add_index "journal_details", ["journal_id"], :name => "journal_details_journal_id"
+
+ create_table "journal_details_copy", :force => true do |t|
+ t.integer "journal_id", :default => 0, :null => false
+ t.string "property", :limit => 30, :default => "", :null => false
+ t.string "prop_key", :limit => 30, :default => "", :null => false
+ t.text "old_value"
+ t.text "value"
+ end
+
+ add_index "journal_details_copy", ["journal_id"], :name => "journal_details_journal_id"
+
+ create_table "journal_replies", :id => false, :force => true do |t|
+ t.integer "journal_id"
+ t.integer "user_id"
+ t.integer "reply_id"
+ end
+
+ add_index "journal_replies", ["journal_id"], :name => "index_journal_replies_on_journal_id"
+ add_index "journal_replies", ["reply_id"], :name => "index_journal_replies_on_reply_id"
+ add_index "journal_replies", ["user_id"], :name => "index_journal_replies_on_user_id"
+
+ create_table "journals", :force => true do |t|
+ t.integer "journalized_id", :default => 0, :null => false
+ t.string "journalized_type", :limit => 30, :default => "", :null => false
+ t.integer "user_id", :default => 0, :null => false
+ t.text "notes"
+ t.datetime "created_on", :null => false
+ t.boolean "private_notes", :default => false, :null => false
+ end
+
+ add_index "journals", ["created_on"], :name => "index_journals_on_created_on"
+ add_index "journals", ["journalized_id", "journalized_type"], :name => "journals_journalized_id"
+ add_index "journals", ["journalized_id"], :name => "index_journals_on_journalized_id"
+ add_index "journals", ["user_id"], :name => "index_journals_on_user_id"
+
+ create_table "journals_for_messages", :force => true do |t|
+ t.integer "jour_id"
+ t.string "jour_type"
+ t.integer "user_id"
+ t.text "notes"
+ t.integer "status"
+ t.integer "reply_id"
+ t.datetime "created_on", :null => false
+ t.datetime "updated_on", :null => false
+ t.string "m_parent_id"
+ t.boolean "is_readed"
+ t.integer "m_reply_count"
+ t.integer "m_reply_id"
+ t.integer "is_comprehensive_evaluation"
+ end
+
+ create_table "kindeditor_assets", :force => true do |t|
+ t.string "asset"
+ t.integer "file_size"
+ t.string "file_type"
+ t.integer "owner_id"
+ t.string "asset_type"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "owner_type", :default => 0
+ end
+
+ create_table "member_roles", :force => true do |t|
+ t.integer "member_id", :null => false
+ t.integer "role_id", :null => false
+ t.integer "inherited_from"
+ end
+
+ add_index "member_roles", ["member_id"], :name => "index_member_roles_on_member_id"
+ add_index "member_roles", ["role_id"], :name => "index_member_roles_on_role_id"
+
+ create_table "members", :force => true do |t|
+ t.integer "user_id", :default => 0, :null => false
+ t.integer "project_id", :default => 0
+ t.datetime "created_on"
+ t.boolean "mail_notification", :default => false, :null => false
+ t.integer "course_id", :default => -1
+ t.integer "course_group_id", :default => 0
+ end
+
+ add_index "members", ["project_id"], :name => "index_members_on_project_id"
+ add_index "members", ["user_id", "project_id", "course_id"], :name => "index_members_on_user_id_and_project_id", :unique => true
+ add_index "members", ["user_id"], :name => "index_members_on_user_id"
+
+ create_table "memo_messages", :force => true do |t|
+ t.integer "user_id"
+ t.integer "forum_id"
+ t.integer "memo_id"
+ t.string "memo_type"
+ t.integer "viewed"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "memos", :force => true do |t|
+ t.integer "forum_id", :null => false
+ t.integer "parent_id"
+ t.string "subject", :null => false
+ t.text "content", :null => false
+ t.integer "author_id", :null => false
+ t.integer "replies_count", :default => 0
+ t.integer "last_reply_id"
+ t.boolean "lock", :default => false
+ t.boolean "sticky", :default => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "viewed_count", :default => 0
+ end
+
+ create_table "message_alls", :force => true do |t|
+ t.integer "user_id"
+ t.integer "message_id"
+ t.string "message_type"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "messages", :force => true do |t|
+ t.integer "board_id", :null => false
+ t.integer "parent_id"
+ t.string "subject", :default => "", :null => false
+ t.text "content"
+ t.integer "author_id"
+ t.integer "replies_count", :default => 0, :null => false
+ t.integer "last_reply_id"
+ t.datetime "created_on", :null => false
+ t.datetime "updated_on", :null => false
+ t.boolean "locked", :default => false
+ t.integer "sticky", :default => 0
+ t.integer "reply_id"
+ end
+
+ add_index "messages", ["author_id"], :name => "index_messages_on_author_id"
+ add_index "messages", ["board_id"], :name => "messages_board_id"
+ add_index "messages", ["created_on"], :name => "index_messages_on_created_on"
+ add_index "messages", ["last_reply_id"], :name => "index_messages_on_last_reply_id"
+ add_index "messages", ["parent_id"], :name => "messages_parent_id"
+
+ create_table "news", :force => true do |t|
+ t.integer "project_id"
+ t.string "title", :limit => 60, :default => "", :null => false
+ t.string "summary", :default => ""
+ t.text "description"
+ t.integer "author_id", :default => 0, :null => false
+ t.datetime "created_on"
+ t.integer "comments_count", :default => 0, :null => false
+ t.integer "course_id"
+ end
+
+ add_index "news", ["author_id"], :name => "index_news_on_author_id"
+ add_index "news", ["created_on"], :name => "index_news_on_created_on"
+ add_index "news", ["project_id"], :name => "news_project_id"
+
+ create_table "no_uses", :force => true do |t|
+ t.integer "user_id", :null => false
+ t.string "no_use_type"
+ t.integer "no_use_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "notificationcomments", :force => true do |t|
+ t.string "notificationcommented_type"
+ t.integer "notificationcommented_id"
+ t.integer "author_id"
+ t.text "notificationcomments"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "onclick_times", :force => true do |t|
+ t.integer "user_id"
+ t.datetime "onclick_time"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "open_id_authentication_associations", :force => true do |t|
+ t.integer "issued"
+ t.integer "lifetime"
+ t.string "handle"
+ t.string "assoc_type"
+ t.binary "server_url"
+ t.binary "secret"
+ end
+
+ create_table "open_id_authentication_nonces", :force => true do |t|
+ t.integer "timestamp", :null => false
+ t.string "server_url"
+ t.string "salt", :null => false
+ end
+
+ create_table "open_source_projects", :force => true do |t|
+ t.string "name"
+ t.text "description"
+ t.integer "commit_count", :default => 0
+ t.integer "code_line", :default => 0
+ t.integer "users_count", :default => 0
+ t.date "last_commit_time"
+ t.string "url"
+ t.date "date_collected"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "option_numbers", :force => true do |t|
+ t.integer "user_id"
+ t.integer "memo"
+ t.integer "messages_for_issues"
+ t.integer "issues_status"
+ t.integer "replay_for_message"
+ t.integer "replay_for_memo"
+ t.integer "follow"
+ t.integer "tread"
+ t.integer "praise_by_one"
+ t.integer "praise_by_two"
+ t.integer "praise_by_three"
+ t.integer "tread_by_one"
+ t.integer "tread_by_two"
+ t.integer "tread_by_three"
+ t.integer "changeset"
+ t.integer "document"
+ t.integer "attachment"
+ t.integer "issue_done_ratio"
+ t.integer "post_issue"
+ t.integer "score_type"
+ t.integer "total_score"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "project_id"
+ end
+
+ create_table "organizations", :force => true do |t|
+ t.string "name"
+ t.string "logo_link"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "phone_app_versions", :force => true do |t|
+ t.string "version"
+ t.text "description"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "poll_answers", :force => true do |t|
+ t.integer "poll_question_id"
+ t.text "answer_text"
+ t.integer "answer_position"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "poll_questions", :force => true do |t|
+ t.string "question_title"
+ t.integer "question_type"
+ t.integer "is_necessary"
+ t.integer "poll_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "question_number"
+ end
+
+ create_table "poll_users", :force => true do |t|
+ t.integer "user_id"
+ t.integer "poll_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "poll_votes", :force => true do |t|
+ t.integer "user_id"
+ t.integer "poll_question_id"
+ t.integer "poll_answer_id"
+ t.text "vote_text"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "polls", :force => true do |t|
+ t.string "polls_name"
+ t.string "polls_type"
+ t.integer "polls_group_id"
+ t.integer "polls_status"
+ t.integer "user_id"
+ t.datetime "published_at"
+ t.datetime "closed_at"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.text "polls_description"
+ t.integer "show_result", :default => 1
+ end
+
+ create_table "praise_tread_caches", :force => true do |t|
+ t.integer "object_id", :null => false
+ t.string "object_type"
+ t.integer "praise_num"
+ t.integer "tread_num"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "praise_treads", :force => true do |t|
+ t.integer "user_id", :null => false
+ t.integer "praise_tread_object_id"
+ t.string "praise_tread_object_type"
+ t.integer "praise_or_tread"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "principal_activities", :force => true do |t|
+ t.integer "user_id"
+ t.integer "principal_id"
+ t.integer "principal_act_id"
+ t.string "principal_act_type"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "project_infos", :force => true do |t|
+ t.integer "project_id"
+ t.integer "user_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "project_scores", :force => true do |t|
+ t.string "project_id"
+ t.integer "score"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "issue_num", :default => 0
+ t.integer "issue_journal_num", :default => 0
+ t.integer "news_num", :default => 0
+ t.integer "documents_num", :default => 0
+ t.integer "changeset_num", :default => 0
+ t.integer "board_message_num", :default => 0
+ end
+
+ create_table "project_statuses", :force => true do |t|
+ t.integer "changesets_count"
+ t.integer "watchers_count"
+ t.integer "project_id"
+ t.integer "project_type"
+ t.float "grade", :default => 0.0
+ t.integer "course_ac_para", :default => 0
+ end
+
+ add_index "project_statuses", ["grade"], :name => "index_project_statuses_on_grade"
+
+ create_table "projecting_softapplictions", :force => true do |t|
+ t.integer "user_id"
+ t.integer "softapplication_id"
+ t.integer "project_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "projects", :force => true do |t|
+ t.string "name", :default => "", :null => false
+ t.text "description"
+ t.string "homepage", :default => ""
+ t.boolean "is_public", :default => true, :null => false
+ t.integer "parent_id"
+ t.datetime "created_on"
+ t.datetime "updated_on"
+ t.string "identifier"
+ t.integer "status", :default => 1, :null => false
+ t.integer "lft"
+ t.integer "rgt"
+ t.boolean "inherit_members", :default => false, :null => false
+ t.integer "project_type"
+ t.boolean "hidden_repo", :default => false, :null => false
+ t.integer "attachmenttype", :default => 1
+ t.integer "user_id"
+ t.integer "dts_test", :default => 0
+ t.string "enterprise_name"
+ t.integer "organization_id"
+ t.integer "project_new_type"
+ end
+
+ add_index "projects", ["lft"], :name => "index_projects_on_lft"
+ add_index "projects", ["rgt"], :name => "index_projects_on_rgt"
+
+ create_table "projects_trackers", :id => false, :force => true do |t|
+ t.integer "project_id", :default => 0, :null => false
+ t.integer "tracker_id", :default => 0, :null => false
+ end
+
+ add_index "projects_trackers", ["project_id", "tracker_id"], :name => "projects_trackers_unique", :unique => true
+ add_index "projects_trackers", ["project_id"], :name => "projects_trackers_project_id"
+
+ create_table "queries", :force => true do |t|
+ t.integer "project_id"
+ t.string "name", :default => "", :null => false
+ t.text "filters"
+ t.integer "user_id", :default => 0, :null => false
+ t.boolean "is_public", :default => false, :null => false
+ t.text "column_names"
+ t.text "sort_criteria"
+ t.string "group_by"
+ t.string "type"
+ end
+
+ add_index "queries", ["project_id"], :name => "index_queries_on_project_id"
+ add_index "queries", ["user_id"], :name => "index_queries_on_user_id"
+
+ create_table "relative_memo_to_open_source_projects", :force => true do |t|
+ t.integer "osp_id"
+ t.integer "relative_memo_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "relative_memos", :force => true do |t|
+ t.integer "osp_id"
+ t.integer "parent_id"
+ t.string "subject", :null => false
+ t.text "content", :limit => 16777215, :null => false
+ t.integer "author_id"
+ t.integer "replies_count", :default => 0
+ t.integer "last_reply_id"
+ t.boolean "lock", :default => false
+ t.boolean "sticky", :default => false
+ t.boolean "is_quote", :default => false
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "viewed_count_crawl", :default => 0
+ t.integer "viewed_count_local", :default => 0
+ t.string "url"
+ t.string "username"
+ t.string "userhomeurl"
+ t.date "date_collected"
+ t.string "topic_resource"
+ end
+
+ create_table "repositories", :force => true do |t|
+ t.integer "project_id", :default => 0, :null => false
+ t.string "url", :default => "", :null => false
+ t.string "login", :limit => 60, :default => ""
+ t.string "password", :default => ""
+ t.string "root_url", :default => ""
+ t.string "type"
+ t.string "path_encoding", :limit => 64
+ t.string "log_encoding", :limit => 64
+ t.text "extra_info"
+ t.string "identifier"
+ t.boolean "is_default", :default => false
+ t.boolean "hidden", :default => false
+ end
+
+ add_index "repositories", ["project_id"], :name => "index_repositories_on_project_id"
+
+ create_table "rich_rich_files", :force => true do |t|
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "rich_file_file_name"
+ t.string "rich_file_content_type"
+ t.integer "rich_file_file_size"
+ t.datetime "rich_file_updated_at"
+ t.string "owner_type"
+ t.integer "owner_id"
+ t.text "uri_cache"
+ t.string "simplified_type", :default => "file"
+ end
+
+ create_table "roles", :force => true do |t|
+ t.string "name", :limit => 30, :default => "", :null => false
+ t.integer "position", :default => 1
+ t.boolean "assignable", :default => true
+ t.integer "builtin", :default => 0, :null => false
+ t.text "permissions"
+ t.string "issues_visibility", :limit => 30, :default => "default", :null => false
+ end
+
+ create_table "schools", :force => true do |t|
+ t.string "name"
+ t.string "province"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "logo_link"
+ t.string "pinyin"
+ end
+
+ create_table "seems_rateable_cached_ratings", :force => true do |t|
+ t.integer "cacheable_id", :limit => 8
+ t.string "cacheable_type"
+ t.float "avg", :null => false
+ t.integer "cnt", :null => false
+ t.string "dimension"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "seems_rateable_rates", :force => true do |t|
+ t.integer "rater_id", :limit => 8
+ t.integer "rateable_id"
+ t.string "rateable_type"
+ t.float "stars", :null => false
+ t.string "dimension"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "is_teacher_score", :default => 0
+ end
+
+ create_table "settings", :force => true do |t|
+ t.string "name", :default => "", :null => false
+ t.text "value"
+ t.datetime "updated_on"
+ end
+
+ add_index "settings", ["name"], :name => "index_settings_on_name"
+
+ create_table "shares", :force => true do |t|
+ t.date "created_on"
+ t.string "url"
+ t.string "title"
+ t.integer "share_type"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "project_id"
+ t.integer "user_id"
+ t.string "description"
+ end
+
+ create_table "softapplications", :force => true do |t|
+ t.string "name"
+ t.text "description"
+ t.integer "app_type_id"
+ t.string "app_type_name"
+ t.string "android_min_version_available"
+ t.integer "user_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "contest_id"
+ t.integer "softapplication_id"
+ t.integer "is_public"
+ t.string "application_developers"
+ t.string "deposit_project_url"
+ t.string "deposit_project"
+ t.integer "project_id"
+ end
+
+ create_table "student_work_tests", :force => true do |t|
+ t.integer "student_work_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "status", :default => 9
+ t.text "results"
+ t.text "src"
+ end
+
+ create_table "student_works", :force => true do |t|
+ t.string "name"
+ 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 "late_penalty", :default => 0
+ t.integer "absence_penalty", :default => 0
+ t.float "system_score", :default => 0.0
+ t.boolean "is_test", :default => false
+ end
+
+ create_table "student_works_evaluation_distributions", :force => true do |t|
+ t.integer "student_work_id"
+ t.integer "user_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "student_works_scores", :force => true do |t|
+ t.integer "student_work_id"
+ t.integer "user_id"
+ t.integer "score"
+ t.text "comment"
+ t.integer "reviewer_role"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "students_for_courses", :force => true do |t|
+ t.integer "student_id"
+ t.integer "course_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "students_for_courses", ["course_id"], :name => "index_students_for_courses_on_course_id"
+ add_index "students_for_courses", ["student_id"], :name => "index_students_for_courses_on_student_id"
+
+ create_table "system_messages", :force => true do |t|
+ t.integer "user_id"
+ t.string "content"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.text "description"
+ t.string "subject"
+ end
+
+ create_table "taggings", :force => true do |t|
+ t.integer "tag_id"
+ t.integer "taggable_id"
+ t.string "taggable_type"
+ t.integer "tagger_id"
+ t.string "tagger_type"
+ t.string "context", :limit => 128
+ t.datetime "created_at"
+ end
+
+ add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id"
+ add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context"
+ add_index "taggings", ["taggable_type"], :name => "index_taggings_on_taggable_type"
+
+ create_table "tags", :force => true do |t|
+ t.string "name"
+ end
+
+ create_table "teachers", :force => true do |t|
+ t.string "tea_name"
+ t.string "location"
+ t.integer "couurse_time"
+ t.integer "course_code"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "extra"
+ end
+
+ create_table "time_entries", :force => true do |t|
+ t.integer "project_id", :null => false
+ t.integer "user_id", :null => false
+ t.integer "issue_id"
+ t.float "hours", :null => false
+ t.string "comments"
+ t.integer "activity_id", :null => false
+ t.date "spent_on", :null => false
+ t.integer "tyear", :null => false
+ t.integer "tmonth", :null => false
+ t.integer "tweek", :null => false
+ t.datetime "created_on", :null => false
+ t.datetime "updated_on", :null => false
+ end
+
+ add_index "time_entries", ["activity_id"], :name => "index_time_entries_on_activity_id"
+ add_index "time_entries", ["created_on"], :name => "index_time_entries_on_created_on"
+ add_index "time_entries", ["issue_id"], :name => "time_entries_issue_id"
+ add_index "time_entries", ["project_id"], :name => "time_entries_project_id"
+ add_index "time_entries", ["user_id"], :name => "index_time_entries_on_user_id"
+
+ create_table "tokens", :force => true do |t|
+ t.integer "user_id", :default => 0, :null => false
+ t.string "action", :limit => 30, :default => "", :null => false
+ t.string "value", :limit => 40, :default => "", :null => false
+ t.datetime "created_on", :null => false
+ end
+
+ add_index "tokens", ["user_id"], :name => "index_tokens_on_user_id"
+ add_index "tokens", ["value"], :name => "tokens_value", :unique => true
+
+ create_table "trackers", :force => true do |t|
+ t.string "name", :limit => 30, :default => "", :null => false
+ t.boolean "is_in_chlog", :default => false, :null => false
+ t.integer "position", :default => 1
+ t.boolean "is_in_roadmap", :default => true, :null => false
+ t.integer "fields_bits", :default => 0
+ end
+
+ create_table "user_activities", :force => true do |t|
+ t.string "act_type"
+ t.integer "act_id"
+ t.string "container_type"
+ t.integer "container_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.integer "user_id"
+ end
+
+ create_table "user_extensions", :force => true do |t|
+ t.integer "user_id", :null => false
+ t.date "birthday"
+ t.string "brief_introduction"
+ t.integer "gender"
+ t.string "location"
+ t.string "occupation"
+ t.integer "work_experience"
+ t.integer "zip_code"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.string "technical_title"
+ t.integer "identity"
+ t.string "student_id"
+ t.string "teacher_realname"
+ t.string "student_realname"
+ t.string "location_city"
+ t.integer "school_id"
+ t.string "description", :default => ""
+ end
+
+ create_table "user_feedback_messages", :force => true do |t|
+ t.integer "user_id"
+ t.integer "journals_for_message_id"
+ t.string "journals_for_message_type"
+ t.integer "viewed"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "user_grades", :force => true do |t|
+ t.integer "user_id", :null => false
+ t.integer "project_id", :null => false
+ t.float "grade", :default => 0.0
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ add_index "user_grades", ["grade"], :name => "index_user_grades_on_grade"
+ add_index "user_grades", ["project_id"], :name => "index_user_grades_on_project_id"
+ add_index "user_grades", ["user_id"], :name => "index_user_grades_on_user_id"
+
+ create_table "user_levels", :force => true do |t|
+ t.integer "user_id"
+ t.integer "level"
+ end
+
+ create_table "user_preferences", :force => true do |t|
+ t.integer "user_id", :default => 0, :null => false
+ t.text "others"
+ t.boolean "hide_mail", :default => false
+ t.string "time_zone"
+ end
+
+ add_index "user_preferences", ["user_id"], :name => "index_user_preferences_on_user_id"
+
+ create_table "user_score_details", :force => true do |t|
+ t.integer "current_user_id"
+ t.integer "target_user_id"
+ t.string "score_type"
+ t.string "score_action"
+ t.integer "user_id"
+ t.integer "old_score"
+ t.integer "new_score"
+ t.integer "current_user_level"
+ t.integer "target_user_level"
+ t.integer "score_changeable_obj_id"
+ t.string "score_changeable_obj_type"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "user_scores", :force => true do |t|
+ t.integer "user_id", :null => false
+ t.integer "collaboration"
+ t.integer "influence"
+ t.integer "skill"
+ t.integer "active"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "user_statuses", :force => true do |t|
+ t.integer "changesets_count"
+ t.integer "watchers_count"
+ t.integer "user_id"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ t.float "grade", :default => 0.0
+ end
+
+ add_index "user_statuses", ["changesets_count"], :name => "index_user_statuses_on_changesets_count"
+ add_index "user_statuses", ["grade"], :name => "index_user_statuses_on_grade"
+ add_index "user_statuses", ["watchers_count"], :name => "index_user_statuses_on_watchers_count"
+
+ create_table "users", :force => true do |t|
+ t.string "login", :default => "", :null => false
+ t.string "hashed_password", :limit => 40, :default => "", :null => false
+ t.string "firstname", :limit => 30, :default => "", :null => false
+ t.string "lastname", :default => "", :null => false
+ t.string "mail", :limit => 60, :default => "", :null => false
+ t.boolean "admin", :default => false, :null => false
+ t.integer "status", :default => 1, :null => false
+ t.datetime "last_login_on"
+ t.string "language", :limit => 5, :default => ""
+ t.integer "auth_source_id"
+ t.datetime "created_on"
+ t.datetime "updated_on"
+ t.string "type"
+ t.string "identity_url"
+ t.string "mail_notification", :default => "", :null => false
+ t.string "salt", :limit => 64
+ end
+
+ add_index "users", ["auth_source_id"], :name => "index_users_on_auth_source_id"
+ add_index "users", ["id", "type"], :name => "index_users_on_id_and_type"
+ add_index "users", ["type"], :name => "index_users_on_type"
+
+ create_table "versions", :force => true do |t|
+ t.integer "project_id", :default => 0, :null => false
+ t.string "name", :default => "", :null => false
+ t.string "description", :default => ""
+ t.date "effective_date"
+ t.datetime "created_on"
+ t.datetime "updated_on"
+ t.string "wiki_page_title"
+ t.string "status", :default => "open"
+ t.string "sharing", :default => "none", :null => false
+ end
+
+ 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
+ t.integer "user_id"
+ end
+
+ add_index "watchers", ["user_id", "watchable_type"], :name => "watchers_user_id_type"
+ add_index "watchers", ["user_id"], :name => "index_watchers_on_user_id"
+ add_index "watchers", ["watchable_id", "watchable_type"], :name => "index_watchers_on_watchable_id_and_watchable_type"
+
+ create_table "web_footer_companies", :force => true do |t|
+ t.string "name"
+ t.string "logo_size"
+ t.string "url"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "web_footer_oranizers", :force => true do |t|
+ t.string "name"
+ t.text "description"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "wiki_content_versions", :force => true do |t|
+ t.integer "wiki_content_id", :null => false
+ t.integer "page_id", :null => false
+ t.integer "author_id"
+ t.binary "data", :limit => 2147483647
+ t.string "compression", :limit => 6, :default => ""
+ t.string "comments", :default => ""
+ t.datetime "updated_on", :null => false
+ t.integer "version", :null => false
+ end
+
+ add_index "wiki_content_versions", ["updated_on"], :name => "index_wiki_content_versions_on_updated_on"
+ add_index "wiki_content_versions", ["wiki_content_id"], :name => "wiki_content_versions_wcid"
+
+ create_table "wiki_contents", :force => true do |t|
+ t.integer "page_id", :null => false
+ t.integer "author_id"
+ t.text "text", :limit => 2147483647
+ t.string "comments", :default => ""
+ t.datetime "updated_on", :null => false
+ t.integer "version", :null => false
+ end
+
+ add_index "wiki_contents", ["author_id"], :name => "index_wiki_contents_on_author_id"
+ add_index "wiki_contents", ["page_id"], :name => "wiki_contents_page_id"
+
+ create_table "wiki_pages", :force => true do |t|
+ t.integer "wiki_id", :null => false
+ t.string "title", :null => false
+ t.datetime "created_on", :null => false
+ t.boolean "protected", :default => false, :null => false
+ t.integer "parent_id"
+ end
+
+ add_index "wiki_pages", ["parent_id"], :name => "index_wiki_pages_on_parent_id"
+ add_index "wiki_pages", ["wiki_id", "title"], :name => "wiki_pages_wiki_id_title"
+ add_index "wiki_pages", ["wiki_id"], :name => "index_wiki_pages_on_wiki_id"
+
+ create_table "wiki_redirects", :force => true do |t|
+ t.integer "wiki_id", :null => false
+ t.string "title"
+ t.string "redirects_to"
+ t.datetime "created_on", :null => false
+ end
+
+ add_index "wiki_redirects", ["wiki_id", "title"], :name => "wiki_redirects_wiki_id_title"
+ add_index "wiki_redirects", ["wiki_id"], :name => "index_wiki_redirects_on_wiki_id"
+
+ create_table "wikis", :force => true do |t|
+ t.integer "project_id", :null => false
+ t.string "start_page", :null => false
+ t.integer "status", :default => 1, :null => false
+ end
+
+ add_index "wikis", ["project_id"], :name => "wikis_project_id"
+
+ create_table "workflows", :force => true do |t|
+ t.integer "tracker_id", :default => 0, :null => false
+ t.integer "old_status_id", :default => 0, :null => false
+ t.integer "new_status_id", :default => 0, :null => false
+ t.integer "role_id", :default => 0, :null => false
+ t.boolean "assignee", :default => false, :null => false
+ t.boolean "author", :default => false, :null => false
+ t.string "type", :limit => 30
+ t.string "field_name", :limit => 30
+ t.string "rule", :limit => 30
+ end
+
+ add_index "workflows", ["new_status_id"], :name => "index_workflows_on_new_status_id"
+ add_index "workflows", ["old_status_id"], :name => "index_workflows_on_old_status_id"
+ add_index "workflows", ["role_id", "tracker_id", "old_status_id"], :name => "wkfs_role_tracker_old_status"
+ add_index "workflows", ["role_id"], :name => "index_workflows_on_role_id"
+
+ create_table "works_categories", :force => true do |t|
+ t.string "category"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+ create_table "zip_packs", :force => true do |t|
+ t.integer "user_id"
+ t.integer "homework_id"
+ t.string "file_digest"
+ t.string "file_path"
+ t.integer "pack_times", :default => 1
+ t.integer "pack_size", :default => 0
+ t.text "file_digests"
+ t.datetime "created_at", :null => false
+ t.datetime "updated_at", :null => false
+ end
+
+end
+>>>>>>> szzh
diff --git a/lib/grack/Gemfile b/lib/grack/Gemfile
index b7113caa8..80932e7e4 100644
--- a/lib/grack/Gemfile
+++ b/lib/grack/Gemfile
@@ -1,4 +1,4 @@
-source "http://ruby.taobao.org"
+source "https://ruby.taobao.org"
gemspec
diff --git a/lib/grack/Gemfile.lock b/lib/grack/Gemfile.lock
index 52d60f85d..68fa71a2b 100644
--- a/lib/grack/Gemfile.lock
+++ b/lib/grack/Gemfile.lock
@@ -5,7 +5,7 @@ PATH
rack (~> 1.5.1)
GEM
- remote: http://ruby.taobao.org/
+ remote: https://ruby.taobao.org/
specs:
byebug (4.0.5)
columnize (= 0.9.0)
diff --git a/lib/rails_kindeditor/app/controllers/kindeditor/assets_controller.rb b/lib/rails_kindeditor/app/controllers/kindeditor/assets_controller.rb
index d7d5948d4..0e1177563 100644
--- a/lib/rails_kindeditor/app/controllers/kindeditor/assets_controller.rb
+++ b/lib/rails_kindeditor/app/controllers/kindeditor/assets_controller.rb
@@ -13,7 +13,7 @@ class Kindeditor::AssetsController < ApplicationController
logger.warn '========= Warning: the owner_id is 0, "delete uploaded files automatically" will not work. =========' if defined?(logger) && @asset.owner_id == 0
@asset.asset_type = @dir
if @asset.save
- render :text => ({:error => 0, :url => "http://"+Setting.host_name + "/" + @asset.asset.url,:asset_id => @asset.id}.to_json)
+ render :text => ({:error => 0, :url => @asset.asset.url,:asset_id => @asset.id}.to_json)
else
show_error(@asset.errors.full_messages)
end
diff --git a/plugins/redmine_ckeditor/Gemfile b/plugins/redmine_ckeditor/Gemfile
index ce2f3c583..07a2bac50 100644
--- a/plugins/redmine_ckeditor/Gemfile
+++ b/plugins/redmine_ckeditor/Gemfile
@@ -1,4 +1,4 @@
-source 'http://ruby.taobao.org'
+source 'https://ruby.taobao.org'
gem 'rich', '1.4.6'
gem 'kaminari'
diff --git a/public/assets/kindeditor/pasteimg.js b/public/assets/kindeditor/pasteimg.js
index c413bbcb9..767cefb09 100644
--- a/public/assets/kindeditor/pasteimg.js
+++ b/public/assets/kindeditor/pasteimg.js
@@ -277,7 +277,10 @@ https://github.com/layerssss/paste.js
if (!img["_paste_marked_" + timespan]) {
cb(img.src);
}
- _results.push($(img).remove());
+ //firefox问题处理,因为采用了 pastableContenteditable 模式,故只需要删除默认的粘贴
+ if ($(img).attr('src').startsWith('data:image/')) {
+ _results.push($(img).remove());
+ };
}
return _results;
};
@@ -290,10 +293,9 @@ https://github.com/layerssss/paste.js
}).call(this);
-function enablePasteImg(_editor) {
- var editor = _editor,
+KindEditor.plugin('paste', function(K) {
+ var editor = this,
name = 'paste';
- //òƶ༭Ͳͻ
if(editor.edit == undefined || editor.edit.iframe == undefined){
return;
}
@@ -303,7 +305,7 @@ function enablePasteImg(_editor) {
var nodeBody = contentWindow.document.getElementsByTagName('body')[0];
console.log(nodeBody);
$(nodeBody).pastableContenteditable();
-
+
dataURItoBlob = function(dataURI) {
// convert base64/URLEncoded data component to raw binary data held in a string
var byteString;
@@ -329,7 +331,6 @@ function enablePasteImg(_editor) {
console.log("dataURL: " + data.dataURL);
console.log("width: " + data.width);
console.log("height: " + data.height);
- console.log(data.blob);
var blob = dataURItoBlob(data.dataURL);
if (data.blob !== null) {
var data = new FormData();
@@ -342,6 +343,7 @@ function enablePasteImg(_editor) {
data: data,
processData: false,
success: function(data) {
+ console.log(data);
editor.exec('insertimage', JSON.parse(data).url);
}
});
@@ -349,37 +351,5 @@ function enablePasteImg(_editor) {
});
return;
- contentWindow.document.getElementsByTagName('body')[0].onpaste = function(event) {
- // use event.originalEvent.clipboard for newer chrome versions
- var items = (event.clipboardData || event.originalEvent.clipboardData).items;
- console.log(JSON.stringify(items)); // will give you the mime types
- // find pasted image among pasted items
- var blob = null;
- for (var i = 0; i < items.length; i++) {
- if (items[i].type.indexOf("image") === 0) {
- blob = items[i].getAsFile();
- }
- }
- // load image if there is a pasted image
- if (blob !== null) {
- var reader = new FileReader();
- reader.onload = function(event) {
- console.log(event.target.result); // data url!
- var data = new FormData();
- data.append("imgFile", blob, "imageFilename.png");
- console.log(blob);
- $.ajax({
- url: '/kindeditor/upload?dir=image',
- contentType: false,
- type: 'POST',
- data: data,
- processData: false,
- success: function(data) {
- editor.exec('insertimage', JSON.parse(data).url);
- }
- });
- };
- reader.readAsDataURL(blob);
- }
- }
-};
+
+});
diff --git a/public/assets/kindeditor/plugins/paste/paste.js b/public/assets/kindeditor/plugins/paste/paste.js
index 943c0bbe7..767cefb09 100644
--- a/public/assets/kindeditor/plugins/paste/paste.js
+++ b/public/assets/kindeditor/plugins/paste/paste.js
@@ -277,7 +277,10 @@ https://github.com/layerssss/paste.js
if (!img["_paste_marked_" + timespan]) {
cb(img.src);
}
- _results.push($(img).remove());
+ //firefox问题处理,因为采用了 pastableContenteditable 模式,故只需要删除默认的粘贴
+ if ($(img).attr('src').startsWith('data:image/')) {
+ _results.push($(img).remove());
+ };
}
return _results;
};
@@ -293,7 +296,6 @@ https://github.com/layerssss/paste.js
KindEditor.plugin('paste', function(K) {
var editor = this,
name = 'paste';
- //òƶ༭Ͳͻ
if(editor.edit == undefined || editor.edit.iframe == undefined){
return;
}
@@ -303,7 +305,7 @@ KindEditor.plugin('paste', function(K) {
var nodeBody = contentWindow.document.getElementsByTagName('body')[0];
console.log(nodeBody);
$(nodeBody).pastableContenteditable();
-
+
dataURItoBlob = function(dataURI) {
// convert base64/URLEncoded data component to raw binary data held in a string
var byteString;
@@ -329,7 +331,6 @@ KindEditor.plugin('paste', function(K) {
console.log("dataURL: " + data.dataURL);
console.log("width: " + data.width);
console.log("height: " + data.height);
- console.log(data.blob);
var blob = dataURItoBlob(data.dataURL);
if (data.blob !== null) {
var data = new FormData();
@@ -342,6 +343,7 @@ KindEditor.plugin('paste', function(K) {
data: data,
processData: false,
success: function(data) {
+ console.log(data);
editor.exec('insertimage', JSON.parse(data).url);
}
});
@@ -349,37 +351,5 @@ KindEditor.plugin('paste', function(K) {
});
return;
- contentWindow.document.getElementsByTagName('body')[0].onpaste = function(event) {
- // use event.originalEvent.clipboard for newer chrome versions
- var items = (event.clipboardData || event.originalEvent.clipboardData).items;
- console.log(JSON.stringify(items)); // will give you the mime types
- // find pasted image among pasted items
- var blob = null;
- for (var i = 0; i < items.length; i++) {
- if (items[i].type.indexOf("image") === 0) {
- blob = items[i].getAsFile();
- }
- }
- // load image if there is a pasted image
- if (blob !== null) {
- var reader = new FileReader();
- reader.onload = function(event) {
- console.log(event.target.result); // data url!
- var data = new FormData();
- data.append("imgFile", blob, "imageFilename.png");
- console.log(blob);
- $.ajax({
- url: '/kindeditor/upload?dir=image',
- contentType: false,
- type: 'POST',
- data: data,
- processData: false,
- success: function(data) {
- editor.exec('insertimage', JSON.parse(data).url);
- }
- });
- };
- reader.readAsDataURL(blob);
- }
- }
+
});
diff --git a/public/images/blue_line.png b/public/images/blue_line.png
index 4ae87f343..b7654fb6a 100644
Binary files a/public/images/blue_line.png and b/public/images/blue_line.png differ
diff --git a/public/javascripts/course.js b/public/javascripts/course.js
index 3818d447d..3baa11970 100644
--- a/public/javascripts/course.js
+++ b/public/javascripts/course.js
@@ -148,6 +148,65 @@ function submit_edit_course(id)
$("#edit_course_"+id).submit();
}
}
+//课程讨论区
+function regexTopicSubject() {
+ var name = $("#message_subject").val();
+ if(name.length ==0)
+ {
+ $("#subjectmsg").text("标题不能为空");
+ $("#subjectmsg").css('color','#ff0000');
+ $("#message_subject").focus();
+ return false;
+ }
+ else if(name.length <= 255)
+ {
+ $("#subjectmsg").text("填写正确");
+ $("#subjectmsg").css('color','#008000');
+ return true;
+ }
+ else
+ {
+ $("#subjectmsg").text("标题超过255个字符");
+ $("#subjectmsg").css('color','#ff0000');
+ $("#message_subject").focus();
+ return false;
+ }
+}
+
+function regexTopicDescription()
+{
+ var name = message_content_editor.html();
+ if(name.length ==0)
+ {
+ $("#message_content_span").text("描述不能为空");
+ $("#message_content_span").css('color','#ff0000');
+ return false;
+ }
+ else if(name.length >=6000){
+ $("#message_content_span").text("描述最多3000个汉字(或6000个英文字符)");
+ $("#message_content_span").css('color','#ff0000');
+ return false;
+ }
+ else
+ {
+ $("#message_content_span").text("填写正确");
+ $("#message_content_span").css('color','#008000');
+ return true;
+ }
+}
+
+function submit_topic()
+{
+ if(regexTopicSubject() && regexTopicDescription())
+ {
+ message_content_editor.sync();
+ $("#message-form").submit();
+ }
+}
+
+function reset_topic(){
+
+}
///////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////课程讨论区
diff --git a/public/javascripts/init_activity_KindEditor.js b/public/javascripts/init_activity_KindEditor.js
index decbbb341..977c62117 100644
--- a/public/javascripts/init_activity_KindEditor.js
+++ b/public/javascripts/init_activity_KindEditor.js
@@ -5,7 +5,7 @@ function init_editor(params){
var paramsWidth = params.width == undefined ? "100%" : params.width;
var editor = params.kindutil.create(params.textarea, {
- resizeType : 1,minWidth:"1px",width:"95%",
+ resizeType : 1,minWidth:"1px",width:"94%",
height:"33px",// == undefined ? "30px":paramsHeight+"px",
minHeight:"33px",// == undefined ? "30px":paramsHeight+"px",
items:['emoticons'],
@@ -25,8 +25,8 @@ function init_editor(params){
$('#reply_image_' + id).addClass('imageFuzzy');
if(/^\s*<\w*\s*\w*\=\"\w*\"\s*\w*\=\"\w*\:\s*\#\d*\;\s*\w*\-\w*\:\s*\w*\;\"\>[\u4e00-\u9fa5]*<\/\w*\>\s*$/.test(this.edit.html())){
params.submit_btn.hide();
- this.resize("95%", null);
- }else if(edit.html().val().trim() != ""){
+ this.resize("94%", null);
+ }else if(this.edit.html().trim() != ""){
params.submit_btn.show();
}
@@ -157,5 +157,6 @@ function init_activity_KindEditor_data(id){
});
});
- $(".ke-edit").css("height","33px");
+ div_form = $("div[nhname='new_message_" + id + "']");
+ $(".ke-edit", div_form).css("height","33px");
}
\ No newline at end of file
diff --git a/public/stylesheets/courses.css b/public/stylesheets/courses.css
index 73488ad18..e8ecf897f 100644
--- a/public/stylesheets/courses.css
+++ b/public/stylesheets/courses.css
@@ -119,7 +119,7 @@ a.postTypeGrey:hover {color:#269ac9;}
.borderBottomNone {border-bottom:none !important;}
.topBorder {border-top: 1px solid #e4e4e4;}
div.minHeight48{min-height: 48px;}
-.homepagePostReplyBannerCount{width:255px; display:inline-block; margin-left:20px;}
+.homepagePostReplyBannerCount{width:255px; display:inline-block; margin-left:15px;}
.homepagePostReplyBannerTime{width:85px; display:inline-block;}
.homepagePostReplyBannerMore{width:330px; display:inline-block; text-align:right;}
.homepagePostReplyInputContainer {width:630px; float:left;}
@@ -171,6 +171,7 @@ a.f_grey:hover {color:#000000;}
.grey_btn_cir{ background:#b2b2b2; 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;}
+.sticky_btn_cir{ background:#269ac9; 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;}
.homepageNewsTime {width:75px; font-size:12px; color:#888888; display:block; text-align:right;}
a.homepageWhite {color:#ffffff;}
@@ -904,6 +905,7 @@ a:hover.BlueCirBtn{ background:#269ac9; color:#fff;}
.w720{width:721px;}
.w709{width: 709px;}
.w701{width: 701px;}
+.w704{width: 704px;}
a.AnnexBtn{ background: url(images/homepage_icon2.png) 0px -343px no-repeat !important; height:20px; display:block; padding-left:20px; color:#888888;}
a:hover.AnnexBtn{background: url(images/homepage_icon2.png) -90px -343px no-repeat !important; color:#3598db;}
a.FilesBtn{ background: url(../images/homepage_icon2.png) 0px -373px no-repeat; width:70px; height:20px; display:block; padding-left:20px; color:#888888;}
@@ -1040,3 +1042,38 @@ a:hover.c_grey{ color:#333;}
a.postOptionLink {color:#616060; display:block; width:55px; padding:0px 15px;}
a.postOptionLink:hover {color:#ffffff; background-color:#15bccf;}
+/*讨论区内部样式*/
+.postDetailContainer {padding:15px; border:1px solid #dddddd; background-color:#ffffff;}
+.postlabel {background-color:#edf1f2; color:#888888; padding:2px 5px; float:left; margin-bottom:5px;}
+.postRightContainer {width:718px; border:1px solid #dddddd; padding:15px; background-color:#ffffff; float:left; margin-bottom:10px;}
+.postDetailBanner {height:30px; width:720px; border-bottom:1px solid #efefef;}
+.postDetailRow {width:720px; border-bottom:1px solid #efefef; padding:15px 0;}
+.postDetailPortrait {width:50px; height:50px; float:left; margin-right:15px;}
+.postDetailWrap {width:580px; float:left;}
+.postDetailTitle {width:580px; max-width:580px; margin-bottom:5px;}
+.postDetailDes {width:580px; max-width:580px; margin-bottom:6px; color:#888888;display:block;overflow:hidden;word-break:keep-all;text-overflow:ellipsis;}
+.postDetailDes p,div,em{word-break: break-all;word-wrap: break-word;}
+.postDetailCreater {color:#888888; font-size:12px; float:left; margin-right:25px;}
+.postDetailDate {color:#888888; font-size:12px; float:left;}
+.postDetailReply { margin-top:28px; color:#888888; float:right;}
+a.postReplyIcon {background:url(images/post_image_list.png) -40px 2px no-repeat; width:18px; height:18px; float:left;}
+a.postReplyIcon:hover {background:url(images/post_image_list.png) -40px -29px no-repeat;}
+.postDetailInput {width:713px; height:28px; border:1px solid #d9d9d9; outline:none !important;}
+.postAttIcon {background:url(images/post_image_list.png) 0px -91px no-repeat; width:16px; height:16px; padding-left:20px;}
+.postAttIcon:hover {background:url(images/post_image_list.png) 0px -113px no-repeat;}
+.postThemeContainer {width:720px;}
+.postThemeWrap {width:655px; float:left;position: relative}
+.postLikeIcon {background:url(images/post_image_list.png) 0px -42px no-repeat ;float:right; padding-left:18px; margin-top:3px;}
+.postLikeIcon:hover {background:url(images/post_image_list.png) 0px -64px no-repeat ;}
+a.AnnexBtn{ background: url(images/homepage_icon2.png) 0px -343px no-repeat !important; width:70px; height:20px; display:block; padding-left:20px; color:#888888;}
+a:hover.AnnexBtn{background: url(images/homepage_icon2.png) -90px -343px no-repeat !important; color:#3598db;}
+.postEdit {background:url(images/post_image_list.png) 0px -94px no-repeat; width:18px; height:18px; display:block; float:left;}
+.postDelete {background:url(images/post_image_list.png) -42px -93px no-repeat; width:18px; height:18px; display:block; float:right;}
+.pageBanner {width:968px; margin:0px auto; border:1px solid #dddddd; background-color: #FFF; padding: 10px 15px; float:left;}
+.homepagePostReplyInput {width:543px; height:33px; max-width:543px; max-height:33px; border:1px solid #d9d9d9; outline:none;}
+.postRouteContainer {padding:10px 15px; background-color:#ffffff; border:1px solid #dddddd; margin-top:10px; font-size:14px;}
+a.postRouteLink {font-weight:bold; color:#484848;}
+a.postRouteLink:hover {text-decoration:underline;}
+
+.ReplyToMessageContainer {border-bottom:1px solid #e3e3e3; width:632px; margin:0px auto; margin-top:15px; min-height:60px;}
+.ReplyToMessageInputContainer {width:582px; float:left;}
\ No newline at end of file
diff --git a/public/stylesheets/new_user.css b/public/stylesheets/new_user.css
index ee284683f..75ffd716c 100644
--- a/public/stylesheets/new_user.css
+++ b/public/stylesheets/new_user.css
@@ -296,6 +296,7 @@ a:hover.bgreen_n_btn{background:#08a384;}
.grey_btn_cir{ background:#b2b2b2; 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;}
+.sticky_btn_cir{ background:#269ac9; 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; }
@@ -624,6 +625,7 @@ a.homepagePostTypeQuiz {background:url(../images/homepage_icon.png) -90px -124px
a.homepagePostTypeQuestion {background:url(../images/homepage_icon.png) -10px -273px no-repeat; padding-left:23px;}
a.homepagePostTypeMine {background:url(../images/homepage_icon.png) -187px -277px no-repeat; padding-left:23px;}
a.homepagePostTypeAll {background:url(../images/homepage_icon.png) -185px -308px no-repeat; padding-left:23px;}
+a.homepagePostTypeMessage {background:url(images/homepage_icon.png) -3px -518px no-repeat; padding-left:23px;}
.homepagePostTypeMore {width:180px; border-top:1px dashed #dddddd; margin-top:5px;}
.w100 {width:100px;}
a.homepageTypeUnread {background:url(../images/homepage_icon.png) -6px -579px no-repeat; padding-left:23px;}
@@ -651,7 +653,7 @@ a.postTypeGrey:hover {color:#269ac9;}
.borderBottomNone {border-bottom:none !important;}
.topBorder {border-top: 1px solid #e4e4e4;}
div.minHeight48{min-height: 48px;}
-.homepagePostReplyBannerCount{width:255px; display:inline-block; margin-left:20px;}
+.homepagePostReplyBannerCount{width:255px; display:inline-block; margin-left:15px;}
.homepagePostReplyBannerTime{width:85px; display:inline-block;}
.homepagePostReplyBannerMore{width:330px; display:inline-block; text-align:right;}
.homepagePostReplyInputContainer {width:630px; float:left;}
diff --git a/public/stylesheets/public.css b/public/stylesheets/public.css
index c6ce61251..476ccefde 100644
--- a/public/stylesheets/public.css
+++ b/public/stylesheets/public.css
@@ -542,7 +542,7 @@ a.postTypeGrey:hover {color:#269ac9;}
.homepagePostReplyBanner {width:708px; height:33px; border:1px solid #e4e4e4; line-height:33px; vertical-align:middle; font-size:12px; color:#888888;}
.borderBottomNone {border-bottom:none !important;}
.topBorder {border-top: 1px solid #e4e4e4;}
-.homepagePostReplyBannerCount{width:255px; display:inline-block; margin-left:20px;}
+.homepagePostReplyBannerCount{width:255px; display:inline-block; margin-left:15px;}
.homepagePostReplyBannerTime{width:85px; display:inline-block;}
.homepagePostReplyBannerMore{width:330px; display:inline-block; text-align:right;}
.homepagePostReplyInputContainer {width:690px; margin:0px auto;}
diff --git a/public/stylesheets/users.css b/public/stylesheets/users.css
index 849aa1c02..7db6e121d 100644
--- a/public/stylesheets/users.css
+++ b/public/stylesheets/users.css
@@ -81,7 +81,7 @@ a.select_btn_select{ background:#64bddb; color:#fff;}
.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{ width:115px; 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;}
diff --git a/spec/factories/principal_activities.rb b/spec/factories/principal_activities.rb
new file mode 100644
index 000000000..58e52fa17
--- /dev/null
+++ b/spec/factories/principal_activities.rb
@@ -0,0 +1,10 @@
+# Read about factories at https://github.com/thoughtbot/factory_girl
+
+FactoryGirl.define do
+ factory :principal_activity do
+ user_id 1
+ principal_id 1
+ principal_act_id 1
+ principal_act_type "MyString"
+ end
+end
diff --git a/spec/models/principal_activity_spec.rb b/spec/models/principal_activity_spec.rb
new file mode 100644
index 000000000..3ae176e25
--- /dev/null
+++ b/spec/models/principal_activity_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe PrincipalActivity, :type => :model do
+ pending "add some examples to (or delete) #{__FILE__}"
+end