commit
						e55d307d33
					
				@ -1,18 +1,31 @@
 | 
				
			||||
*.swp
 | 
				
			||||
/.project
 | 
				
			||||
/.idea
 | 
				
			||||
/.bundle
 | 
				
			||||
*.swp
 | 
				
			||||
/config/database.yml
 | 
				
			||||
/files/*
 | 
				
			||||
/log/*
 | 
				
			||||
/tmp/*
 | 
				
			||||
.gitignore
 | 
				
			||||
/public/images/avatars/*
 | 
				
			||||
/Gemfile
 | 
				
			||||
/Gemfile.lock
 | 
				
			||||
/db/schema.rb
 | 
				
			||||
/Gemfile.lock
 | 
				
			||||
/lib/plugins/acts_as_versioned/test/debug.log
 | 
				
			||||
/config/configuration.yml
 | 
				
			||||
.rbenv-gemsets
 | 
				
			||||
*.swp
 | 
				
			||||
/.project
 | 
				
			||||
/.idea
 | 
				
			||||
/.bundle
 | 
				
			||||
*.swp
 | 
				
			||||
/config/database.yml
 | 
				
			||||
/config/configuration.yml
 | 
				
			||||
/config/additional_environment.rb
 | 
				
			||||
 | 
				
			||||
/files/*
 | 
				
			||||
/log/*
 | 
				
			||||
/public/tmp/*
 | 
				
			||||
/tmp/*
 | 
				
			||||
/public/cache/*
 | 
				
			||||
.gitignore
 | 
				
			||||
/config/newrelic.yml
 | 
				
			||||
/public/images/avatars/*
 | 
				
			||||
/Gemfile
 | 
				
			||||
/Gemfile.lock
 | 
				
			||||
/db/schema.rb
 | 
				
			||||
/Gemfile.lock
 | 
				
			||||
/lib/plugins/acts_as_versioned/test/debug.log
 | 
				
			||||
.rbenv-gemsets
 | 
				
			||||
.DS_Store
 | 
				
			||||
public/api_doc/
 | 
				
			||||
/.metadata
 | 
				
			||||
vendor/cache
 | 
				
			||||
/files
 | 
				
			||||
/public/images/avatars
 | 
				
			||||
/public/files
 | 
				
			||||
/tags
 | 
				
			||||
 | 
				
			||||
@ -1,2 +0,0 @@
 | 
				
			||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||
<connections/>
 | 
				
			||||
											
												Binary file not shown.
											
										
									
								
											
												Binary file not shown.
											
										
									
								
											
												Binary file not shown.
											
										
									
								@ -1,7 +0,0 @@
 | 
				
			||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||
<connection>
 | 
				
			||||
<connection>
 | 
				
			||||
<name>Default</name>
 | 
				
			||||
<source>file:/C:/Users/nudt</source>
 | 
				
			||||
</connection>
 | 
				
			||||
</connection>
 | 
				
			||||
@ -1,2 +0,0 @@
 | 
				
			||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||
<sites/>
 | 
				
			||||
@ -1,6 +0,0 @@
 | 
				
			||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||
<servers>
 | 
				
			||||
<server host="0.0.0.0" port="3000" project="E:/code/demo" type="org.radrails.rails.railsServer">
 | 
				
			||||
<name>demo</name>
 | 
				
			||||
</server>
 | 
				
			||||
</servers>
 | 
				
			||||
											
												Binary file not shown.
											
										
									
								
											
												Binary file not shown.
											
										
									
								
											
												Binary file not shown.
											
										
									
								@ -0,0 +1,3 @@
 | 
				
			||||
#safe table
 | 
				
			||||
#Mon Jan 05 10:27:54 CST 2015
 | 
				
			||||
connections=connections.15
 | 
				
			||||
@ -1,3 +0,0 @@
 | 
				
			||||
#safe table
 | 
				
			||||
#Tue Mar 11 17:27:27 CST 2014
 | 
				
			||||
connections=connections.9
 | 
				
			||||
@ -0,0 +1,4 @@
 | 
				
			||||
#safe table
 | 
				
			||||
#Mon Jan 05 10:27:54 CST 2015
 | 
				
			||||
defaultConnection=defaultConnection.15
 | 
				
			||||
sites=sites.15
 | 
				
			||||
@ -1,4 +0,0 @@
 | 
				
			||||
#safe table
 | 
				
			||||
#Tue Mar 11 17:27:27 CST 2014
 | 
				
			||||
defaultConnection=defaultConnection.9
 | 
				
			||||
sites=sites.9
 | 
				
			||||
@ -0,0 +1,3 @@
 | 
				
			||||
#safe table
 | 
				
			||||
#Mon Jan 05 10:27:28 CST 2015
 | 
				
			||||
webservers=webservers.12
 | 
				
			||||
@ -1,3 +0,0 @@
 | 
				
			||||
#safe table
 | 
				
			||||
#Tue Mar 11 17:27:27 CST 2014
 | 
				
			||||
webservers=webservers.8
 | 
				
			||||
											
												Binary file not shown.
											
										
									
								@ -1,2 +1,2 @@
 | 
				
			||||
activeProject=demo
 | 
				
			||||
activeProject=trustie
 | 
				
			||||
eclipse.preferences.version=1
 | 
				
			||||
 | 
				
			||||
@ -1,2 +1,2 @@
 | 
				
			||||
eclipse.preferences.version=1
 | 
				
			||||
last_known_studio_version=3.4.0.1358388620
 | 
				
			||||
last_known_studio_version=3.4.2.1368863613
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,3 @@
 | 
				
			||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||
<session version="1.0">
<refactoring comment="Delete resource 'trustie2'" deleteContents="false" description="Delete resource 'trustie2'" element1="/trustie2" flags="7" id="org.eclipse.ltk.core.refactoring.delete.resources" resources="1" stamp="1420424676858"/>
<refactoring comment="Delete resource 'trustie2'" deleteContents="false" description="Delete resource 'trustie2'" element1="/trustie2" flags="7" id="org.eclipse.ltk.core.refactoring.delete.resources" resources="1" stamp="1420424775104"/>
 | 
				
			||||
</session>
 | 
				
			||||
@ -0,0 +1,2 @@
 | 
				
			||||
1420424676858	Delete resource 'trustie2'
 | 
				
			||||
1420424775104	Delete resource 'trustie2'
 | 
				
			||||
@ -0,0 +1,7 @@
 | 
				
			||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||
<section name="Workbench">
 | 
				
			||||
	<section name="RefactoringWizard.preview">
 | 
				
			||||
		<item value="400" key="height"/>
 | 
				
			||||
		<item value="600" key="width"/>
 | 
				
			||||
	</section>
 | 
				
			||||
</section>
 | 
				
			||||
@ -1,14 +1,26 @@
 | 
				
			||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
				
			||||
<section name="Workbench">
 | 
				
			||||
	<list key="installedFeatures">
 | 
				
			||||
		<item value="com.aptana.feature.rcp:3.4.0.201304151603-7o7nFDBFFeFt3XrpXNucaz0uIWkY"/>
 | 
				
			||||
		<item value="com.aptana.feature.studio:3.4.0.201304151542-7E7G-7MEMVKUHgFcLgFbkKoz0t-7"/>
 | 
				
			||||
		<item value="com.aptana.feature:3.4.0.1365900908-BW7R8FBu-Ylk0DFYW1DC44EXt-dS"/>
 | 
				
			||||
		<item value="com.aptana.php.feature:3.3.0.201304151524-7J7E-7IOW_UXOSJY"/>
 | 
				
			||||
		<item value="com.aptana.feature.rcp:3.4.2.201308081805-7o7nFDFFFcLz-2l0rkQ0UYz0u_Wm"/>
 | 
				
			||||
		<item value="com.aptana.feature.studio:3.4.2.201308081736-7W7I57boG98RAi489ctbvKi7VXbq"/>
 | 
				
			||||
		<item value="com.aptana.feature:3.4.2.1376005939-B87T88BWOnwWRYdZO1DC44EXtPxS"/>
 | 
				
			||||
		<item value="com.aptana.php.feature:3.4.2.201308081728-7J7E-7IOYXVXXUJS"/>
 | 
				
			||||
		<item value="com.aptana.pydev.feature:2.7.0.2013032300-7g9I-8Jez0cfdJcee"/>
 | 
				
			||||
		<item value="org.eclipse.help:1.3.0.v20110530-0844-7i7uFFmFFl8nvqbDpEqTvx"/>
 | 
				
			||||
		<item value="org.eclipse.platform:3.7.2.v20120207-1839-9gF7UHPDFxGjd-PqDr2jX_4yKaumkoHTz04_q-q"/>
 | 
				
			||||
		<item value="org.eclipse.rcp:3.7.2.v20120120-1424-9DB5FmnFq5JCf1UA38R-kz0S0272"/>
 | 
				
			||||
		<item value="org.radrails.rails:3.3.0.201304151525-7e-7Q7f5GRKMDENR"/>
 | 
				
			||||
		<item value="org.radrails.rails:3.4.2.201308081726-7n-7Z7oKfjkqlemv"/>
 | 
				
			||||
	</list>
 | 
				
			||||
	<section name="ChooseWorkspaceDialogSettings">
 | 
				
			||||
		<item value="316" key="DIALOG_Y_ORIGIN"/>
 | 
				
			||||
		<item value="656" key="DIALOG_X_ORIGIN"/>
 | 
				
			||||
	</section>
 | 
				
			||||
	<section name="WORKBENCH_SETTINGS">
 | 
				
			||||
		<list key="ENABLED_TRANSFERS">
 | 
				
			||||
		</list>
 | 
				
			||||
	</section>
 | 
				
			||||
	<section name="ExternalProjectImportWizard">
 | 
				
			||||
		<item value="false" key="WizardProjectsImportPage.STORE_ARCHIVE_SELECTED"/>
 | 
				
			||||
		<item value="false" key="WizardProjectsImportPage.STORE_COPY_PROJECT_ID"/>
 | 
				
			||||
	</section>
 | 
				
			||||
</section>
 | 
				
			||||
 | 
				
			||||
@ -1,136 +1,84 @@
 | 
				
			||||
source 'http://rubygems.org'
 | 
				
			||||
#source 'http://ruby.sdutlinux.org/'
 | 
				
			||||
 | 
				
			||||
unless RUBY_PLATFORM =~ /w32/
 | 
				
			||||
  # unix-like only
 | 
				
			||||
  gem 'iconv'
 | 
				
			||||
  gem 'rubyzip'
 | 
				
			||||
  gem 'zip-zip'
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
gem 'seems_rateable', path: 'lib/seems_rateable'
 | 
				
			||||
gem "rails", "3.2.13"
 | 
				
			||||
gem "jquery-rails", "~> 2.0.2"
 | 
				
			||||
gem "i18n", "~> 0.6.0"
 | 
				
			||||
gem "coderay", "~> 1.0.6"
 | 
				
			||||
gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby]
 | 
				
			||||
gem "builder", "3.0.0"
 | 
				
			||||
gem 'acts-as-taggable-on', '2.4.1'
 | 
				
			||||
gem 'spreadsheet'
 | 
				
			||||
gem 'ruby-ole'
 | 
				
			||||
 | 
				
			||||
group :development do
 | 
				
			||||
  gem 'better_errors', path: 'lib/better_errors'
 | 
				
			||||
  gem 'rack-mini-profiler', path: 'lib/rack-mini-profiler'
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
group :test do
 | 
				
			||||
  gem "shoulda", "~> 3.5.0"
 | 
				
			||||
  gem "mocha", "~> 1.1.0"
 | 
				
			||||
  gem 'capybara', '~> 2.4.1'
 | 
				
			||||
  gem 'nokogiri', '~> 1.6.3'
 | 
				
			||||
  gem 'factory_girl', '~> 4.4.0'
 | 
				
			||||
  gem 'selenium-webdriver', '~> 2.42.0'
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
  # platforms :mri, :mingw do
 | 
				
			||||
  #   group :rmagick do
 | 
				
			||||
  #     # RMagick 2 supports ruby 1.9
 | 
				
			||||
  #     # RMagick 1 would be fine for ruby 1.8 but Bundler does not support
 | 
				
			||||
  #     # different requirements for the same gem on different platforms
 | 
				
			||||
  #     gem "rmagick", ">= 2.0.0"
 | 
				
			||||
  #   end
 | 
				
			||||
  #end
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
group :development, :test do
 | 
				
			||||
	# gem "guard-rails", '~> 0.5.3'
 | 
				
			||||
	gem 'spork-testunit', '~> 0.0.8'
 | 
				
			||||
	# gem 'guard-spork', '~> 1.5.1'
 | 
				
			||||
	# gem 'guard-test', '~> 1.0.0'
 | 
				
			||||
	gem 'ruby-prof', '~> 0.15.1' unless RUBY_PLATFORM =~ /w32/
 | 
				
			||||
	gem 'pry'
 | 
				
			||||
	gem 'pry-nav'
 | 
				
			||||
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
# Gems used only for assets and not required
 | 
				
			||||
# in production environments by default.
 | 
				
			||||
group :assets do
 | 
				
			||||
  gem 'sass-rails',   '~> 3.2.3'
 | 
				
			||||
  gem 'coffee-rails', '~> 3.2.1'
 | 
				
			||||
 | 
				
			||||
  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
 | 
				
			||||
   gem 'therubyracer', :platforms => :ruby
 | 
				
			||||
 | 
				
			||||
  gem 'uglifier', '>= 1.0.3'
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
# Optional gem for LDAP authentication
 | 
				
			||||
group :ldap do
 | 
				
			||||
  gem "net-ldap", "~> 0.3.1"
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
# Optional gem for OpenID authentication
 | 
				
			||||
group :openid do
 | 
				
			||||
  gem "ruby-openid", "~> 2.1.4", :require => "openid"
 | 
				
			||||
  gem "rack-openid"
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
# Optional gem for exporting the gantt to a PNG file, not supported with jruby
 | 
				
			||||
platforms :jruby do
 | 
				
			||||
  # jruby-openssl is bundled with JRuby 1.7.0
 | 
				
			||||
  gem "jruby-openssl" if Object.const_defined?(:JRUBY_VERSION) && JRUBY_VERSION < '1.7.0'
 | 
				
			||||
  gem "activerecord-jdbc-adapter", "1.2.5"
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
# Include database gems for the adapters found in the database
 | 
				
			||||
# configuration file
 | 
				
			||||
require 'erb'
 | 
				
			||||
require 'yaml'
 | 
				
			||||
database_file = File.join(File.dirname(__FILE__), "config/database.yml")
 | 
				
			||||
if File.exist?(database_file)
 | 
				
			||||
  database_config = YAML::load(ERB.new(IO.read(database_file)).result)
 | 
				
			||||
  adapters = database_config.values.map {|c| c['adapter']}.compact.uniq
 | 
				
			||||
  if adapters.any?
 | 
				
			||||
    adapters.each do |adapter|
 | 
				
			||||
      case adapter
 | 
				
			||||
      when 'mysql2'
 | 
				
			||||
        gem "mysql2", "= 0.3.11", :platforms => [:mri, :mingw]
 | 
				
			||||
        gem "activerecord-jdbcmysql-adapter", :platforms => :jruby
 | 
				
			||||
      when 'mysql'
 | 
				
			||||
        gem "mysql", "~> 2.8.1", :platforms => [:mri, :mingw]
 | 
				
			||||
        gem "activerecord-jdbcmysql-adapter", :platforms => :jruby
 | 
				
			||||
      when /postgresql/
 | 
				
			||||
        gem "pg", ">= 0.11.0", :platforms => [:mri, :mingw]
 | 
				
			||||
        gem "activerecord-jdbcpostgresql-adapter", :platforms => :jruby
 | 
				
			||||
      when /sqlite3/
 | 
				
			||||
        gem "sqlite3", :platforms => [:mri, :mingw]
 | 
				
			||||
        gem "activerecord-jdbcsqlite3-adapter", :platforms => :jruby
 | 
				
			||||
      when /sqlserver/
 | 
				
			||||
        gem "tiny_tds", "~> 0.5.1", :platforms => [:mri, :mingw]
 | 
				
			||||
        gem "activerecord-sqlserver-adapter", :platforms => [:mri, :mingw]
 | 
				
			||||
      else
 | 
				
			||||
        warn("Unknown database adapter `#{adapter}` found in config/database.yml, use Gemfile.local to load your own database gems")
 | 
				
			||||
      end
 | 
				
			||||
    end
 | 
				
			||||
  else
 | 
				
			||||
    warn("No adapter found in config/database.yml, please configure it first")
 | 
				
			||||
  end
 | 
				
			||||
else
 | 
				
			||||
  warn("Please configure your config/database.yml first")
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
local_gemfile = File.join(File.dirname(__FILE__), "Gemfile.local")
 | 
				
			||||
if File.exists?(local_gemfile)
 | 
				
			||||
  puts "Loading Gemfile.local ..." if $DEBUG # `ruby -d` or `bundle -v`
 | 
				
			||||
  instance_eval File.read(local_gemfile)
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
# Load plugins' Gemfiles
 | 
				
			||||
Dir.glob File.expand_path("../plugins/*/Gemfile", __FILE__) do |file|
 | 
				
			||||
  puts "Loading #{file} ..." if $DEBUG # `ruby -d` or `bundle -v`
 | 
				
			||||
  instance_eval File.read(file)
 | 
				
			||||
end
 | 
				
			||||
source 'http://ruby.taobao.org'
 | 
				
			||||
#source 'http://ruby.sdutlinux.org/'
 | 
				
			||||
 | 
				
			||||
unless RUBY_PLATFORM =~ /w32/
 | 
				
			||||
  # unix-like only
 | 
				
			||||
  gem 'iconv'
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
gem 'rest-client'
 | 
				
			||||
gem "mysql2", "= 0.3.18"
 | 
				
			||||
gem 'redis-rails'
 | 
				
			||||
gem 'rubyzip'
 | 
				
			||||
gem 'delayed_job_active_record'#, :group => :production
 | 
				
			||||
gem 'daemons'
 | 
				
			||||
gem 'grape', '~> 0.9.0'
 | 
				
			||||
gem 'grape-entity'
 | 
				
			||||
gem 'seems_rateable', '~> 1.0.13'
 | 
				
			||||
gem "rails", "3.2.13"
 | 
				
			||||
gem "jquery-rails", "~> 2.0.2"
 | 
				
			||||
gem "i18n", "~> 0.6.0"
 | 
				
			||||
gem 'coderay', '~> 1.1.0'
 | 
				
			||||
gem "fastercsv", "~> 1.5.0", :platforms => [:mri_18, :mingw_18, :jruby]
 | 
				
			||||
gem "builder", "3.0.0"
 | 
				
			||||
gem 'acts-as-taggable-on', '2.4.1'
 | 
				
			||||
gem 'spreadsheet'
 | 
				
			||||
gem 'ruby-ole'
 | 
				
			||||
gem 'rails_kindeditor',path:'lib/rails_kindeditor'
 | 
				
			||||
#gem "rmagick", ">= 2.0.0"
 | 
				
			||||
 | 
				
			||||
group :development do
 | 
				
			||||
  gem 'grape-swagger'
 | 
				
			||||
  gem 'better_errors', '~> 1.1.0'
 | 
				
			||||
  gem 'rack-mini-profiler', '~> 0.9.3'
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
group :development, :test do 
 | 
				
			||||
  unless RUBY_PLATFORM =~ /w32/
 | 
				
			||||
    gem 'pry-rails'
 | 
				
			||||
    if RUBY_VERSION >= '2.0.0'
 | 
				
			||||
      gem 'pry-byebug'
 | 
				
			||||
    end
 | 
				
			||||
    gem 'pry-stack_explorer'
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  gem 'rspec-rails', '~> 3.0'
 | 
				
			||||
  gem 'factory_girl_rails'
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
# Gems used only for assets and not required
 | 
				
			||||
# in production environments by default.
 | 
				
			||||
group :assets do
 | 
				
			||||
  gem 'sass-rails',   '~> 3.2.3'
 | 
				
			||||
  gem 'coffee-rails', '~> 3.2.1'
 | 
				
			||||
 | 
				
			||||
  # See https://github.com/sstephenson/execjs#readme for more supported runtimes
 | 
				
			||||
   gem 'therubyracer', :platforms => :ruby
 | 
				
			||||
 | 
				
			||||
  gem 'uglifier', '>= 1.0.3'
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
# Optional gem for LDAP authentication
 | 
				
			||||
group :ldap do
 | 
				
			||||
  gem "net-ldap", "~> 0.3.1"
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
# Optional gem for OpenID authentication
 | 
				
			||||
group :openid do
 | 
				
			||||
  gem "ruby-openid", "~> 2.1.4", :require => "openid"
 | 
				
			||||
  gem "rack-openid"
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
database_file = File.join(File.dirname(__FILE__), "config/database.yml")
 | 
				
			||||
if File.exist?(database_file)
 | 
				
			||||
else
 | 
				
			||||
  warn("Please configure your config/database.yml first")
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
# Load plugins' Gemfiles
 | 
				
			||||
Dir.glob File.expand_path("../plugins/*/Gemfile", __FILE__) do |file|
 | 
				
			||||
  puts "Loading #{file} ..." if $DEBUG # `ruby -d` or `bundle -v`
 | 
				
			||||
  instance_eval File.read(file)
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,49 @@
 | 
				
			||||
module Mobile
 | 
				
			||||
  require_relative 'middleware/error_handler'
 | 
				
			||||
  require_relative 'apis/auth'
 | 
				
			||||
  require_relative 'apis/users'
 | 
				
			||||
  require_relative 'apis/courses'
 | 
				
			||||
  require_relative 'apis/watches'
 | 
				
			||||
  require_relative 'apis/upgrade'
 | 
				
			||||
  require_relative 'apis/homeworks'
 | 
				
			||||
  require_relative 'apis/comments'
 | 
				
			||||
  class API < Grape::API
 | 
				
			||||
    version 'v1', using: :path
 | 
				
			||||
    format :json
 | 
				
			||||
    content_type :json, "application/json;charset=UTF-8"
 | 
				
			||||
    use Mobile::Middleware::ErrorHandler
 | 
				
			||||
 | 
				
			||||
    helpers do
 | 
				
			||||
      def logger
 | 
				
			||||
        API.logger
 | 
				
			||||
      end
 | 
				
			||||
 | 
				
			||||
      def authenticate!
 | 
				
			||||
        raise('Unauthorized. Invalid or expired token.') unless current_user
 | 
				
			||||
      end
 | 
				
			||||
 | 
				
			||||
      def current_user
 | 
				
			||||
        token = ApiKey.where(access_token: params[:token]).first
 | 
				
			||||
        if token && !token.expired?
 | 
				
			||||
          @current_user = User.find(token.user_id)
 | 
				
			||||
        else
 | 
				
			||||
          nil
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
    end
 | 
				
			||||
 | 
				
			||||
    mount Apis::Auth
 | 
				
			||||
    mount Apis::Users
 | 
				
			||||
    mount Apis::Courses
 | 
				
			||||
    mount Apis::Watches
 | 
				
			||||
    mount Apis::Upgrade
 | 
				
			||||
    mount Apis::Homeworks
 | 
				
			||||
    mount Apis::Comments
 | 
				
			||||
 | 
				
			||||
    #add_swagger_documentation ({api_version: 'v1', base_path: 'http://u06.shellinfo.cn/trustie/api'})
 | 
				
			||||
    #add_swagger_documentation ({api_version: 'v1', base_path: '/api'})  if Rails.env.development?
 | 
				
			||||
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,59 @@
 | 
				
			||||
#coding=utf-8
 | 
				
			||||
 | 
				
			||||
module Mobile
 | 
				
			||||
 | 
				
			||||
  module Entities 
 | 
				
			||||
    class Auth < Grape::Entity
 | 
				
			||||
      expose :token
 | 
				
			||||
      expose :user, using: User
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  module Apis
 | 
				
			||||
    class Auth < Grape::API
 | 
				
			||||
      resource :auth do
 | 
				
			||||
        desc "用户登录"
 | 
				
			||||
        params do
 | 
				
			||||
          requires :login, type: String, desc: 'Username or email'
 | 
				
			||||
          requires :password, type: String, desc: 'Password'
 | 
				
			||||
        end
 | 
				
			||||
        post do
 | 
				
			||||
          user,last_logon = ::User.try_to_login(params[:login], params[:password])
 | 
				
			||||
          if user
 | 
				
			||||
            ::ApiKey.delete_all(user_id: user.id)
 | 
				
			||||
            key = ::ApiKey.create!(user_id: user.id)
 | 
				
			||||
            api_user = ::UsersService.new.show_user({id:user.id})
 | 
				
			||||
            present :data, {token: key.access_token, user: api_user}, using: Entities::Auth
 | 
				
			||||
            present :status, 0
 | 
				
			||||
          else
 | 
				
			||||
            raise "无效的用户名或密码"
 | 
				
			||||
          end
 | 
				
			||||
        end
 | 
				
			||||
 | 
				
			||||
        desc "用户登出"
 | 
				
			||||
        params do
 | 
				
			||||
          requires :token, type: String
 | 
				
			||||
        end
 | 
				
			||||
        delete do
 | 
				
			||||
          authenticate!
 | 
				
			||||
          ::ApiKey.delete_all(user_id: current_user.id)
 | 
				
			||||
          {status: 0}
 | 
				
			||||
        end
 | 
				
			||||
 | 
				
			||||
        desc "忘记密码"
 | 
				
			||||
        params do
 | 
				
			||||
          requires :mail,type: String
 | 
				
			||||
        end
 | 
				
			||||
        post 'lost_password' do
 | 
				
			||||
          us = UsersService.new
 | 
				
			||||
          message = us.lost_password params
 | 
				
			||||
          present :message, message
 | 
				
			||||
          present :status, 0
 | 
				
			||||
        end
 | 
				
			||||
 | 
				
			||||
      end
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
@ -0,0 +1,49 @@
 | 
				
			||||
#coding=utf-8
 | 
				
			||||
module Mobile
 | 
				
			||||
  module Apis
 | 
				
			||||
    class Watches < Grape::API
 | 
				
			||||
      resource :watches do
 | 
				
			||||
 | 
				
			||||
        desc "获取所有关注"
 | 
				
			||||
        params do
 | 
				
			||||
          requires :token, type: String
 | 
				
			||||
        end
 | 
				
			||||
        get do
 | 
				
			||||
          authenticate!
 | 
				
			||||
          us = UsersService.new
 | 
				
			||||
          ws = us.user_watcher(id: current_user.id)
 | 
				
			||||
          present :data, ws, with: Mobile::Entities::User
 | 
				
			||||
          present :status, 0
 | 
				
			||||
        end
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
        desc "关注某人"
 | 
				
			||||
        params do
 | 
				
			||||
          requires :token, type: String
 | 
				
			||||
          requires :object_id, type: Integer, desc: '关注的用户的id'
 | 
				
			||||
        end
 | 
				
			||||
        post do
 | 
				
			||||
          authenticate!
 | 
				
			||||
          ws = WatchesService.new
 | 
				
			||||
          o = ws.watch(params.merge({current_user_id:current_user.id, object_type:'user' }) )
 | 
				
			||||
          present :data, o, with: Mobile::Entities::User
 | 
				
			||||
          present :status, 0
 | 
				
			||||
        end
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
        desc "取消关注"
 | 
				
			||||
        params do
 | 
				
			||||
          requires :token, type: String
 | 
				
			||||
          requires :object_id, type: Integer, desc: '取消关注的用户的id'
 | 
				
			||||
        end
 | 
				
			||||
        delete do
 | 
				
			||||
          authenticate!
 | 
				
			||||
          ws = WatchesService.new
 | 
				
			||||
          ws.unwatch(params.merge({current_user_id:current_user.id, object_type:'user' }) )
 | 
				
			||||
          {status: 0}
 | 
				
			||||
        end
 | 
				
			||||
 | 
				
			||||
      end
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,36 @@
 | 
				
			||||
module Mobile
 | 
				
			||||
  module Entities
 | 
				
			||||
    #匿评作品页面相关参数
 | 
				
			||||
    class AnonymousWorksParams < Grape::Entity
 | 
				
			||||
      def self.anonymous_works_params_expose(field)
 | 
				
			||||
        expose field do |f,opt|
 | 
				
			||||
          if f.is_a?(Hash) && f.key?(field)
 | 
				
			||||
            f[field]
 | 
				
			||||
          elsif f.is_a?(Hash) && !f.key?(field)
 | 
				
			||||
 | 
				
			||||
          end
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
      anonymous_works_params_expose :is_teacher
 | 
				
			||||
      anonymous_works_params_expose :m_score
 | 
				
			||||
      anonymous_works_params_expose :is_anonymous_comments
 | 
				
			||||
      anonymous_works_params_expose :cur_type
 | 
				
			||||
      anonymous_works_params_expose :cur_page
 | 
				
			||||
      expose :jours ,using: Mobile::Entities::Jours do |f, opt|
 | 
				
			||||
        if f.is_a?(Hash) && f.key?(:jours)
 | 
				
			||||
          f[:jours]
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
      expose :teacher_stars,using: Mobile::Entities::HomeworkJours do |f, opt|
 | 
				
			||||
        if f.is_a?(Hash) && f.key?(:teacher_stars)
 | 
				
			||||
          f[:teacher_stars]
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
      expose :student_stars , using: Mobile::Entities::HomeworkJours do |f, opt|
 | 
				
			||||
        if f.is_a?(Hash) && f.key?(:student_stars)
 | 
				
			||||
          f[:student_stars]
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,32 @@
 | 
				
			||||
module Mobile
 | 
				
			||||
  module Entities
 | 
				
			||||
    class Attachment  < Grape::Entity
 | 
				
			||||
      include Redmine::I18n
 | 
				
			||||
      def self.attachment_expose(field)
 | 
				
			||||
        expose field do |f,opt|
 | 
				
			||||
          if f.is_a?(Hash) && f.key?(field)
 | 
				
			||||
            f[field]
 | 
				
			||||
          elsif f.is_a?(::Attachment)
 | 
				
			||||
            if f.respond_to?(field)
 | 
				
			||||
              if field == :created_on
 | 
				
			||||
                format_time(f.send(field))
 | 
				
			||||
              else
 | 
				
			||||
                f.send(field)
 | 
				
			||||
              end
 | 
				
			||||
            else
 | 
				
			||||
              #case field
 | 
				
			||||
              #  when ""
 | 
				
			||||
              #end
 | 
				
			||||
            end
 | 
				
			||||
          end
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
      attachment_expose :id
 | 
				
			||||
      attachment_expose :filename
 | 
				
			||||
      attachment_expose :description
 | 
				
			||||
      attachment_expose :downloads
 | 
				
			||||
      attachment_expose :quotes
 | 
				
			||||
      attachment_expose :created_on
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,30 @@
 | 
				
			||||
module Mobile
 | 
				
			||||
  module Entities
 | 
				
			||||
    class Comment < Grape::Entity
 | 
				
			||||
      include Redmine::I18n
 | 
				
			||||
      def self.comment_expose(field)
 | 
				
			||||
        expose field do |f,opt|
 | 
				
			||||
          if f.is_a?(Hash) && f.key?(field)
 | 
				
			||||
            f[field]
 | 
				
			||||
          elsif f.is_a?(::Comment)
 | 
				
			||||
            if f.respond_to?(field)
 | 
				
			||||
              if field == :created_on
 | 
				
			||||
                format_time(f.send(field))
 | 
				
			||||
              else
 | 
				
			||||
                f.send(field)
 | 
				
			||||
              end
 | 
				
			||||
            end
 | 
				
			||||
          end
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
      comment_expose :id
 | 
				
			||||
      expose :author, using: Mobile::Entities::User do |c, opt|
 | 
				
			||||
        if c.is_a? ::Comment
 | 
				
			||||
          c.author
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
      comment_expose :comments
 | 
				
			||||
      comment_expose :created_on
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,65 @@
 | 
				
			||||
module Mobile
 | 
				
			||||
  module Entities
 | 
				
			||||
    class Course < Grape::Entity
 | 
				
			||||
      include Redmine::I18n
 | 
				
			||||
      def self.course_expose(field)
 | 
				
			||||
        expose field do |f,opt|
 | 
				
			||||
          c = nil
 | 
				
			||||
          if f.is_a? ::Course
 | 
				
			||||
            c = f
 | 
				
			||||
          else
 | 
				
			||||
            c = f[:course]
 | 
				
			||||
          end
 | 
				
			||||
          if f.is_a?(Hash) && f.key?(field)
 | 
				
			||||
            f[field] if f.is_a?(Hash) && f.key?(field)
 | 
				
			||||
            #f.img_url if f.respond_to?(:img_url)
 | 
				
			||||
          elsif field == :created_at || field == :updated_at
 | 
				
			||||
            (format_time(c[field]) if (c.is_a?(Hash) && c.key?(field))) || (format_time(c.send(field)) if c.respond_to?(field))
 | 
				
			||||
          else
 | 
				
			||||
            (c[field] if (c.is_a?(Hash) && c.key?(field))) || (c.send(field) if c.respond_to?(field))
 | 
				
			||||
          end
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
      course_expose :img_url
 | 
				
			||||
      course_expose :attachmenttype
 | 
				
			||||
      course_expose :class_period
 | 
				
			||||
      course_expose :code
 | 
				
			||||
      course_expose :created_at
 | 
				
			||||
      course_expose :description
 | 
				
			||||
      course_expose :endup_time
 | 
				
			||||
      course_expose :extra
 | 
				
			||||
      course_expose :id
 | 
				
			||||
      course_expose :inherit_members
 | 
				
			||||
      course_expose :is_public
 | 
				
			||||
      course_expose :lft
 | 
				
			||||
      course_expose :location
 | 
				
			||||
      course_expose :name
 | 
				
			||||
      course_expose :open_student
 | 
				
			||||
      # course_expose :password
 | 
				
			||||
      course_expose :rgt
 | 
				
			||||
      course_expose :school_id
 | 
				
			||||
      course_expose :setup_time
 | 
				
			||||
      course_expose :state
 | 
				
			||||
      course_expose :status
 | 
				
			||||
      course_expose :string
 | 
				
			||||
      course_expose :tea_id
 | 
				
			||||
      course_expose :term
 | 
				
			||||
      course_expose :time
 | 
				
			||||
      course_expose :updated_at
 | 
				
			||||
      course_expose :course_student_num
 | 
				
			||||
      expose :teacher, using: Mobile::Entities::User do |c, opt|
 | 
				
			||||
        if c.is_a? ::Course
 | 
				
			||||
          c.teacher
 | 
				
			||||
        else
 | 
				
			||||
          c[:course].teacher
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
      expose :my_homework,using: Mobile::Entities::Homework  do |f, opt|
 | 
				
			||||
        f[:my_homework] if f.is_a?(Hash) && f.key?(:my_homework)
 | 
				
			||||
      end
 | 
				
			||||
      course_expose :current_user_is_member
 | 
				
			||||
      course_expose :current_user_is_teacher
 | 
				
			||||
      course_expose :work_unit
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,129 @@
 | 
				
			||||
module Mobile
 | 
				
			||||
  module Entities
 | 
				
			||||
    class CourseDynamic < Grape::Entity
 | 
				
			||||
      include Redmine::I18n
 | 
				
			||||
      def self.course_dynamic_expose(field)
 | 
				
			||||
        expose field do |c,opt|
 | 
				
			||||
          if field == :update_time
 | 
				
			||||
            (format_time(c[field]) if (c.is_a?(Hash) && c.key?(field)))
 | 
				
			||||
          elsif field == :news_count
 | 
				
			||||
            obj  =  nil
 | 
				
			||||
            c[:dynamics].each do |d|
 | 
				
			||||
              if d[:type] == 1
 | 
				
			||||
                obj =  d[:count]
 | 
				
			||||
              end
 | 
				
			||||
            end
 | 
				
			||||
            obj
 | 
				
			||||
          elsif field == :document_count
 | 
				
			||||
            obj = nil
 | 
				
			||||
            c[:dynamics].each do |d|
 | 
				
			||||
              if d[:type] == 3
 | 
				
			||||
                obj = d[:count]
 | 
				
			||||
              end
 | 
				
			||||
            end
 | 
				
			||||
            obj
 | 
				
			||||
          elsif field == :topic_count
 | 
				
			||||
            obj  =  nil
 | 
				
			||||
            c[:dynamics].each do |d|
 | 
				
			||||
              if d[:type] == 2
 | 
				
			||||
                obj =  d[:count]
 | 
				
			||||
              end
 | 
				
			||||
            end
 | 
				
			||||
            obj
 | 
				
			||||
          elsif field == :homework_count
 | 
				
			||||
            obj  =  nil
 | 
				
			||||
            c[:dynamics].each do |d|
 | 
				
			||||
              if d[:type] == 4
 | 
				
			||||
                obj =  d[:count]
 | 
				
			||||
              end
 | 
				
			||||
            end
 | 
				
			||||
            obj
 | 
				
			||||
          elsif field == :homework_submit_num
 | 
				
			||||
            obj = nil
 | 
				
			||||
            c[:dynamics].each do |d|
 | 
				
			||||
              if d[:type] == 4
 | 
				
			||||
                obj =  d[:submit_count]
 | 
				
			||||
              end
 | 
				
			||||
            end
 | 
				
			||||
            obj
 | 
				
			||||
          elsif field == :homework_submit_students
 | 
				
			||||
            obj = nil
 | 
				
			||||
            c[:dynamics].each do |d|
 | 
				
			||||
              if d[:type] == 4
 | 
				
			||||
                obj =  d[:studentlist]
 | 
				
			||||
              end
 | 
				
			||||
            end
 | 
				
			||||
            obj
 | 
				
			||||
          elsif field == :homework_status
 | 
				
			||||
          obj = nil
 | 
				
			||||
          c[:dynamics].each do |d|
 | 
				
			||||
            if d[:type] == 4
 | 
				
			||||
              obj =  d[:homework_status]
 | 
				
			||||
            end
 | 
				
			||||
          end
 | 
				
			||||
          obj
 | 
				
			||||
          else
 | 
				
			||||
            c[field] if (c.is_a?(Hash) && c.key?(field))
 | 
				
			||||
          end
 | 
				
			||||
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
      course_dynamic_expose :type
 | 
				
			||||
      course_dynamic_expose :count
 | 
				
			||||
      course_dynamic_expose :course_name
 | 
				
			||||
      course_dynamic_expose :course_term
 | 
				
			||||
      course_dynamic_expose :course_time
 | 
				
			||||
      course_dynamic_expose :course_id
 | 
				
			||||
      course_dynamic_expose :course_img_url
 | 
				
			||||
      course_dynamic_expose :message
 | 
				
			||||
      course_dynamic_expose :update_time
 | 
				
			||||
      course_dynamic_expose :count
 | 
				
			||||
      course_dynamic_expose :news_count
 | 
				
			||||
      course_dynamic_expose :document_count
 | 
				
			||||
      course_dynamic_expose :topic_count
 | 
				
			||||
      course_dynamic_expose :homework_count
 | 
				
			||||
      course_dynamic_expose :homework_submit_students
 | 
				
			||||
      course_dynamic_expose :homework_submit_num
 | 
				
			||||
      course_dynamic_expose :homework_status
 | 
				
			||||
      #在dynamics里解析出四种动态
 | 
				
			||||
      expose :document,using:Mobile::Entities::Attachment do |f,opt|
 | 
				
			||||
        obj = nil
 | 
				
			||||
        f[:dynamics].each do |d|
 | 
				
			||||
          if d[:type] == 3
 | 
				
			||||
            obj = d[:documents]
 | 
				
			||||
          end
 | 
				
			||||
        end
 | 
				
			||||
        obj
 | 
				
			||||
      end
 | 
				
			||||
      expose :topic,using:Mobile::Entities::Message do |f,opt|
 | 
				
			||||
        obj  =  nil
 | 
				
			||||
        f[:dynamics].each do |d|
 | 
				
			||||
          if d[:type] == 2
 | 
				
			||||
           obj =  d[:topic]
 | 
				
			||||
          end
 | 
				
			||||
        end
 | 
				
			||||
        obj
 | 
				
			||||
      end
 | 
				
			||||
      expose :homework,using:Mobile::Entities::Homework do |f,opt|
 | 
				
			||||
        obj  =  nil
 | 
				
			||||
        f[:dynamics].each do |d|
 | 
				
			||||
          if d[:type] == 4
 | 
				
			||||
            obj =  d[:homework]
 | 
				
			||||
          end
 | 
				
			||||
        end
 | 
				
			||||
        obj
 | 
				
			||||
      end
 | 
				
			||||
 | 
				
			||||
      expose :news,using:Mobile::Entities::News do |f,opt|
 | 
				
			||||
        obj  =  nil
 | 
				
			||||
        f[:dynamics].each do |d|
 | 
				
			||||
          if d[:type] == 1
 | 
				
			||||
            obj =  d
 | 
				
			||||
          end
 | 
				
			||||
        end
 | 
				
			||||
        obj
 | 
				
			||||
      end
 | 
				
			||||
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,29 @@
 | 
				
			||||
module Mobile
 | 
				
			||||
  module Entities
 | 
				
			||||
    #带评分的留言(教师评论、学生匿名评分都属于此类)
 | 
				
			||||
    class HomeworkJours < Grape::Entity
 | 
				
			||||
      include Redmine::I18n
 | 
				
			||||
      def self.homework_jours_expose(field)
 | 
				
			||||
        expose field do |f,opt|
 | 
				
			||||
          if f.is_a?(Hash) && f.key?(field)
 | 
				
			||||
            if field == :created_at
 | 
				
			||||
              format_time(f[field])
 | 
				
			||||
            else
 | 
				
			||||
              f[field]
 | 
				
			||||
            end
 | 
				
			||||
          elsif f.is_a?(::SeemsRateableRates)
 | 
				
			||||
 | 
				
			||||
          end
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
      homework_jours_expose :rater_id
 | 
				
			||||
      homework_jours_expose :rater_name
 | 
				
			||||
      homework_jours_expose :created_at
 | 
				
			||||
      homework_jours_expose :stars
 | 
				
			||||
      expose :comment,using: Mobile::Entities::Jours do |f,opt|
 | 
				
			||||
         f[:comment]
 | 
				
			||||
      end
 | 
				
			||||
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,18 @@
 | 
				
			||||
module Mobile
 | 
				
			||||
  module Entities
 | 
				
			||||
    class Homeworkscore < Grape::Entity
 | 
				
			||||
      include Redmine::I18n
 | 
				
			||||
      include ApplicationHelper
 | 
				
			||||
      def self.homeworkscore_expose(field)
 | 
				
			||||
        expose field do |f,opt|
 | 
				
			||||
          if f.is_a?(Hash) && f.key?(field)
 | 
				
			||||
              f[field]
 | 
				
			||||
          end
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
 | 
				
			||||
      homeworkscore_expose :name
 | 
				
			||||
      homeworkscore_expose :score
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,50 @@
 | 
				
			||||
module Mobile
 | 
				
			||||
  module Entities
 | 
				
			||||
    #普通留言
 | 
				
			||||
    class Jours < Grape::Entity
 | 
				
			||||
      include Redmine::I18n
 | 
				
			||||
      include WordsHelper
 | 
				
			||||
      def self.jours_expose(field)
 | 
				
			||||
        expose field do |f,opt|
 | 
				
			||||
          if f.is_a?(Hash) && f.key?(field)
 | 
				
			||||
            f[field]
 | 
				
			||||
          elsif f.is_a?(::JournalsForMessage) && f.respond_to?(field)
 | 
				
			||||
            if field == :created_on
 | 
				
			||||
              format_time(f.send(field))
 | 
				
			||||
            else
 | 
				
			||||
              f.send(field)
 | 
				
			||||
            end
 | 
				
			||||
          else
 | 
				
			||||
            case f
 | 
				
			||||
              when :course_name
 | 
				
			||||
                f[:jour_type] == "Course" ? f.course.name : ""
 | 
				
			||||
            end
 | 
				
			||||
          end
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
      jours_expose :id
 | 
				
			||||
      jours_expose :jour_type
 | 
				
			||||
      jours_expose :jour_id
 | 
				
			||||
      expose :user,using: Mobile::Entities::User do |f, opt|
 | 
				
			||||
        f.user
 | 
				
			||||
      end
 | 
				
			||||
      jours_expose :created_on
 | 
				
			||||
      jours_expose :notes
 | 
				
			||||
      jours_expose :m_reply_id
 | 
				
			||||
      jours_expose :m_parent_id
 | 
				
			||||
      expose :course,using:Mobile::Entities::Course do |f,opt|
 | 
				
			||||
        if f.is_a?(::JournalsForMessage) && f[:jour_type] == "Course"
 | 
				
			||||
          f.course
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
      expose :reply_user,using: Mobile::Entities::User do |f, opt|
 | 
				
			||||
        f.at_user
 | 
				
			||||
      end
 | 
				
			||||
      expose :child_reply,using: Mobile::Entities::Jours do |f, opt|
 | 
				
			||||
        if f.is_a?(::JournalsForMessage)
 | 
				
			||||
          fetch_user_leaveWord_reply(f)
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,34 @@
 | 
				
			||||
module Mobile
 | 
				
			||||
  module Entities
 | 
				
			||||
    class Member < Grape::Entity
 | 
				
			||||
      include ApplicationHelper
 | 
				
			||||
      include ApiHelper
 | 
				
			||||
      def self.member_expose(f)
 | 
				
			||||
        expose f do |u,opt|
 | 
				
			||||
          if u.is_a?(Hash) && u.key?(f)
 | 
				
			||||
            u[f]
 | 
				
			||||
          elsif u.is_a?(::Member)
 | 
				
			||||
            if u.respond_to?(f)
 | 
				
			||||
              u.send(f)
 | 
				
			||||
            else
 | 
				
			||||
              case f
 | 
				
			||||
               when :student_id
 | 
				
			||||
                u.user.user_extensions.student_id
 | 
				
			||||
              end
 | 
				
			||||
            end
 | 
				
			||||
          end
 | 
				
			||||
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
 | 
				
			||||
      expose :user, using: Mobile::Entities::User do |c, opt|
 | 
				
			||||
        if c.is_a?(::Member)
 | 
				
			||||
          c.user
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
      member_expose :student_id
 | 
				
			||||
      member_expose :score
 | 
				
			||||
      member_expose :id
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,46 @@
 | 
				
			||||
module Mobile
 | 
				
			||||
  module Entities
 | 
				
			||||
    class Message < Grape::Entity
 | 
				
			||||
      include ApplicationHelper
 | 
				
			||||
      include ApiHelper
 | 
				
			||||
      def self.message_expose(f)
 | 
				
			||||
        expose f do |u,opt|
 | 
				
			||||
          if u.is_a?(Hash) && u.key?(f)
 | 
				
			||||
            u[f]
 | 
				
			||||
          elsif u.is_a?(::Message)
 | 
				
			||||
            if u.respond_to?(f)
 | 
				
			||||
              if f == :created_on
 | 
				
			||||
                format_time( u.send(f))
 | 
				
			||||
              else
 | 
				
			||||
                u.send(f)
 | 
				
			||||
              end
 | 
				
			||||
            else
 | 
				
			||||
              # case f
 | 
				
			||||
              #   when :xx
 | 
				
			||||
              #    #
 | 
				
			||||
              # end
 | 
				
			||||
            end
 | 
				
			||||
          end
 | 
				
			||||
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
 | 
				
			||||
      expose :user, using: Mobile::Entities::User do |c, opt|
 | 
				
			||||
        if c.is_a?(::Message)
 | 
				
			||||
          c.author
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
      message_expose :board_id
 | 
				
			||||
      message_expose :subject
 | 
				
			||||
      message_expose :content
 | 
				
			||||
      message_expose :replies_count
 | 
				
			||||
      message_expose :created_on
 | 
				
			||||
      message_expose :id
 | 
				
			||||
      expose :message_children,using:Mobile::Entities::Message do |c,opt|
 | 
				
			||||
        if c.is_a? (::Message)
 | 
				
			||||
          c.children
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,54 @@
 | 
				
			||||
module Mobile
 | 
				
			||||
  module Entities
 | 
				
			||||
    class News < Grape::Entity
 | 
				
			||||
      include Redmine::I18n
 | 
				
			||||
      def self.news_expose(field)
 | 
				
			||||
        expose field do |f,opt|
 | 
				
			||||
          if f.is_a?(Hash) && f.key?(field)
 | 
				
			||||
            f[field]
 | 
				
			||||
          elsif f.is_a?(Hash) && !f.key?(field)
 | 
				
			||||
            n = f[:news]
 | 
				
			||||
            comments = f[:comments]
 | 
				
			||||
            if n.is_a?(::News)
 | 
				
			||||
              if field == :created_on
 | 
				
			||||
                format_time(n.send(field)) if n.respond_to?(field)
 | 
				
			||||
              else
 | 
				
			||||
                n.send(field) if n.respond_to?(field)
 | 
				
			||||
              end
 | 
				
			||||
 | 
				
			||||
            end
 | 
				
			||||
 | 
				
			||||
          end
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
      news_expose :id
 | 
				
			||||
      #新闻标题
 | 
				
			||||
      news_expose :title
 | 
				
			||||
 | 
				
			||||
      expose :author,using: Mobile::Entities::User do |f, opt|
 | 
				
			||||
        n = f[:author]
 | 
				
			||||
        #n.author if n.respond_to?(:author)
 | 
				
			||||
      end
 | 
				
			||||
      #作者id
 | 
				
			||||
      news_expose :author_id
 | 
				
			||||
      #作者名
 | 
				
			||||
      news_expose :author_name
 | 
				
			||||
      #作者头像url
 | 
				
			||||
      news_expose :author_img_url
 | 
				
			||||
      #新闻内容
 | 
				
			||||
      news_expose :description
 | 
				
			||||
      #发布时间
 | 
				
			||||
      news_expose :created_on
 | 
				
			||||
      #评论数量
 | 
				
			||||
      news_expose :comments_count
 | 
				
			||||
      #评论
 | 
				
			||||
      expose :comments, using: Mobile::Entities::Comment do |f, opt|
 | 
				
			||||
        if f.is_a?(Hash) && f.key?(:comments)
 | 
				
			||||
          f[:comments]
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
 | 
				
			||||
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,53 @@
 | 
				
			||||
module Mobile
 | 
				
			||||
    module Entities
 | 
				
			||||
    class User < Grape::Entity
 | 
				
			||||
      include ApplicationHelper
 | 
				
			||||
      include ApiHelper
 | 
				
			||||
      def self.user_expose(f)
 | 
				
			||||
        expose f do |u,opt|
 | 
				
			||||
          if u.is_a?(Hash) && u.key?(f)
 | 
				
			||||
            u[f]
 | 
				
			||||
          elsif u.is_a?(::User)
 | 
				
			||||
            if u.respond_to?(f)
 | 
				
			||||
              u.send(f)  unless u.user_extensions.nil?
 | 
				
			||||
            else
 | 
				
			||||
              case f
 | 
				
			||||
                when :img_url
 | 
				
			||||
                  url_to_avatar(u)
 | 
				
			||||
                when :gender
 | 
				
			||||
                  u.nil? || u.user_extensions.nil? || u.user_extensions.gender.nil? ? 0 : u.user_extensions.gender
 | 
				
			||||
                when :work_unit
 | 
				
			||||
                  get_user_work_unit u  unless u.user_extensions.nil?
 | 
				
			||||
                when :location
 | 
				
			||||
                  get_user_location u  unless u.user_extensions.nil?
 | 
				
			||||
                when :brief_introduction
 | 
				
			||||
                  u.nil? || u.user_extensions.nil? ? "" : u.user_extensions.brief_introduction
 | 
				
			||||
              end
 | 
				
			||||
            end
 | 
				
			||||
          end
 | 
				
			||||
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
 | 
				
			||||
      expose :id 
 | 
				
			||||
      #头像
 | 
				
			||||
      user_expose :img_url
 | 
				
			||||
      #昵称
 | 
				
			||||
      expose :nickname
 | 
				
			||||
      #真名
 | 
				
			||||
      expose :realname
 | 
				
			||||
      #性别
 | 
				
			||||
      user_expose :gender
 | 
				
			||||
      #我的二维码
 | 
				
			||||
      #工作单位
 | 
				
			||||
      user_expose :work_unit
 | 
				
			||||
      #邮箱地址
 | 
				
			||||
      user_expose :mail
 | 
				
			||||
      #地区
 | 
				
			||||
      user_expose :location
 | 
				
			||||
      #签名
 | 
				
			||||
      user_expose :brief_introduction
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,19 @@
 | 
				
			||||
module Mobile
 | 
				
			||||
  module Middleware
 | 
				
			||||
    class ErrorHandler < Grape::Middleware::Base
 | 
				
			||||
      def call!(env)
 | 
				
			||||
        @env = env
 | 
				
			||||
        begin
 | 
				
			||||
          @app.call(@env)
 | 
				
			||||
        rescue =>e
 | 
				
			||||
          message = {status: 1, message: e.message }.to_json
 | 
				
			||||
          puts(e.backtrace.join("\n")) if Rails.env.development?
 | 
				
			||||
          status = 200
 | 
				
			||||
          headers = { 'Content-Type' => content_type }
 | 
				
			||||
          Rack::Response.new([message], status, headers).finish
 | 
				
			||||
          # throw :error, :message => e.message || options[:default_message], :status => 500
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,3 @@
 | 
				
			||||
# Place all the behaviors and hooks related to the matching controller here.
 | 
				
			||||
# All this logic will automatically be available in application.js.
 | 
				
			||||
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/
 | 
				
			||||
@ -0,0 +1,3 @@
 | 
				
			||||
# Place all the behaviors and hooks related to the matching controller here.
 | 
				
			||||
# All this logic will automatically be available in application.js.
 | 
				
			||||
# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/
 | 
				
			||||
@ -0,0 +1,3 @@
 | 
				
			||||
// Place all the styles related to the Enterprises controller here.
 | 
				
			||||
// They will automatically be included in application.css.
 | 
				
			||||
// You can use Sass (SCSS) here: http://sass-lang.com/
 | 
				
			||||
@ -0,0 +1,3 @@
 | 
				
			||||
// Place all the styles related to the system_log controller here.
 | 
				
			||||
// They will automatically be included in application.css.
 | 
				
			||||
// You can use Sass (SCSS) here: http://sass-lang.com/
 | 
				
			||||
@ -0,0 +1,52 @@
 | 
				
			||||
class ActivityNotifysController < ApplicationController
 | 
				
			||||
#  layout 'base_projects'#by young
 | 
				
			||||
#  default_search_scope :messages
 | 
				
			||||
  before_filter :find_project_by_project_id#, :find_board_if_available
 | 
				
			||||
#  before_filter :authorize, :except => [:new, :show, :create, :index]
 | 
				
			||||
#  accept_rss_auth :index, :show
 | 
				
			||||
 | 
				
			||||
  helper :activities
 | 
				
			||||
  def index
 | 
				
			||||
    query = nil
 | 
				
			||||
    if @course
 | 
				
			||||
      query = ActivityNotify.where('activity_container_id=? and activity_container_type=? and notify_to=?',@course.id,'Course',User.current.id);
 | 
				
			||||
    else
 | 
				
			||||
      @events_by_day = []
 | 
				
			||||
    end
 | 
				
			||||
 | 
				
			||||
    if( query != nil )
 | 
				
			||||
      limit = 10;
 | 
				
			||||
      @obj_count = query.count();
 | 
				
			||||
      @obj_pages = Paginator.new @obj_count,limit,params['page']
 | 
				
			||||
      list = query.order('is_read,id desc').limit(limit).offset(@obj_pages.offset).all();
 | 
				
			||||
      events=[];
 | 
				
			||||
      for item in list
 | 
				
			||||
        event = item.activity;
 | 
				
			||||
        event.set_notify_id(item.id)
 | 
				
			||||
        event.set_notify_is_read(item.is_read)
 | 
				
			||||
        events << event
 | 
				
			||||
      end
 | 
				
			||||
      @events_by_day = events.group_by {|event| User.current.time_to_date(event.event_datetime)}
 | 
				
			||||
      @controller_name = 'ActivityNotifys'
 | 
				
			||||
    end
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.html  {render :template => 'courses/show', :layout => 'base_courses'}
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def chang_read_flag
 | 
				
			||||
    if @course
 | 
				
			||||
      if(params[:an_id] != nil )
 | 
				
			||||
        query = ActivityNotify.where('id=? and notify_to=?',params[:an_id],User.current.id)
 | 
				
			||||
      else
 | 
				
			||||
        query = ActivityNotify.where('activity_container_id=? and activity_container_type=? and notify_to=? and is_read=0',@course.id,'Course',User.current.id)
 | 
				
			||||
      end
 | 
				
			||||
      @result = query.update_all('is_read=1');
 | 
				
			||||
    else
 | 
				
			||||
      @result = false;
 | 
				
			||||
    end
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.html{render :layout => nil}
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -1,35 +1,59 @@
 | 
				
			||||
class AppliedProjectController < ApplicationController
 | 
				
			||||
 | 
				
			||||
  #申请加入项目
 | 
				
			||||
  def applied_join_project
 | 
				
			||||
    @user_id = params[:user_id]
 | 
				
			||||
    @project = Project.find(params[:project_id])
 | 
				
			||||
    @applieds = AppliedProject.where("user_id = ? and project_id = ?", params[:user_id],params[:project_id])
 | 
				
			||||
    if  @applieds.count == 0
 | 
				
			||||
      appliedproject = AppliedProject.create(:user_id => params[:user_id], :project_id => params[:project_id])
 | 
				
			||||
      Mailer.applied_project(appliedproject).deliver
 | 
				
			||||
    end
 | 
				
			||||
 | 
				
			||||
    #redirect_to project_path(params[:project_id])
 | 
				
			||||
    #redirect_to_referer_or {render :text => ( 'applied success.'), :layout => true}
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.html { redirect_to_referer_or {render :text => (watching ? 'Watcher added.' : 'Watcher removed.'), :layout => true}}
 | 
				
			||||
      format.js { render :partial => 'set_applied'}
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  #取消申请
 | 
				
			||||
  def unapplied_join_project
 | 
				
			||||
    @project = Project.find(params[:project_id])
 | 
				
			||||
    #@applied = AppliedProject.find(params[:id])
 | 
				
			||||
    #@applied.destroy
 | 
				
			||||
 | 
				
			||||
    AppliedProject.deleteappiled(params[:user_id], params[:project_id])
 | 
				
			||||
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.html { redirect_to_referer_or {render :text => (watching ? 'Watcher added.' : 'Watcher removed.'), :layout => true}}
 | 
				
			||||
      format.js { render :partial => 'set_applied' }
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
end
 | 
				
			||||
class AppliedProjectController < ApplicationController
 | 
				
			||||
 | 
				
			||||
  #申请加入项目
 | 
				
			||||
  def applied_join_project
 | 
				
			||||
    @user_id = params[:user_id]
 | 
				
			||||
    @project = Project.find_by_id(params[:project_id])
 | 
				
			||||
    if params[:project_join]
 | 
				
			||||
      if @project
 | 
				
			||||
        user = User.find @user_id
 | 
				
			||||
        if user.member_of?(@project)
 | 
				
			||||
          @status = 3
 | 
				
			||||
        else
 | 
				
			||||
          @applieds = AppliedProject.where("user_id = ? and project_id = ?", params[:user_id],params[:project_id])
 | 
				
			||||
          if  @applieds.count == 0
 | 
				
			||||
            appliedproject = AppliedProject.create(:user_id => params[:user_id], :project_id => params[:project_id])
 | 
				
			||||
            Mailer.run.applied_project(appliedproject)
 | 
				
			||||
            @status = 2
 | 
				
			||||
          else
 | 
				
			||||
            @status = 1
 | 
				
			||||
          end
 | 
				
			||||
        end
 | 
				
			||||
      else
 | 
				
			||||
        @status = 0
 | 
				
			||||
      end
 | 
				
			||||
      respond_to do |format|
 | 
				
			||||
        format.js
 | 
				
			||||
      end
 | 
				
			||||
      return
 | 
				
			||||
    end
 | 
				
			||||
 | 
				
			||||
    @applieds = AppliedProject.where("user_id = ? and project_id = ?", params[:user_id],params[:project_id])
 | 
				
			||||
    if  @applieds.count == 0
 | 
				
			||||
      appliedproject = AppliedProject.create(:user_id => params[:user_id], :project_id => params[:project_id])
 | 
				
			||||
      Mailer.run.applied_project(appliedproject)
 | 
				
			||||
    end
 | 
				
			||||
 | 
				
			||||
    #redirect_to project_path(params[:project_id])
 | 
				
			||||
    #redirect_to_referer_or {render :text => ( 'applied success.'), :layout => true}
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.html { redirect_to_referer_or {render :text => (watching ? 'Watcher added.' : 'Watcher removed.'), :layout => true}}
 | 
				
			||||
      format.js { render :partial => 'set_applied'}
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  #取消申请
 | 
				
			||||
  def unapplied_join_project
 | 
				
			||||
    @project = Project.find(params[:project_id])
 | 
				
			||||
    #@applied = AppliedProject.find(params[:id])
 | 
				
			||||
    #@applied.destroy
 | 
				
			||||
 | 
				
			||||
    AppliedProject.deleteappiled(params[:user_id], params[:project_id])
 | 
				
			||||
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.html { redirect_to_referer_or {render :text => (watching ? 'Watcher added.' : 'Watcher removed.'), :layout => true}}
 | 
				
			||||
      format.js { render :partial => 'set_applied' }
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
end
 | 
				
			||||
 | 
				
			||||
											
												
													File diff suppressed because it is too large
													Load Diff
												
											
										
									
								@ -0,0 +1,42 @@
 | 
				
			||||
class DiscussDemosController < ApplicationController
 | 
				
			||||
  def index
 | 
				
			||||
 | 
				
			||||
    @discuss_demo_list = DiscussDemo.where("body is not null").order("created_at desc").page(params[:page] || 1).per(10)
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def new
 | 
				
			||||
    @discuss_demo = DiscussDemo.create
 | 
				
			||||
    @discuss_demo.save!
 | 
				
			||||
    @discuss_demo
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def create
 | 
				
			||||
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def update
 | 
				
			||||
    @discuss_demo = DiscussDemo.find(params[:id])
 | 
				
			||||
    @discuss_demo.update_attributes(:title =>  params[:discuss_demo][:title],:body =>  params[:discuss_demo][:body])
 | 
				
			||||
    redirect_to :controller=> 'discuss_demos',:action => 'show',:id => params[:id]
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def delete
 | 
				
			||||
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def destroy
 | 
				
			||||
    asset = Kindeditor::Asset.find_by_owner_id(params[:id])
 | 
				
			||||
    if !asset.nil?
 | 
				
			||||
      filepath = File.join(Rails.root,"public","files","uploads",
 | 
				
			||||
                           asset[:created_at].to_s.gsub("+0800","").to_datetime.strftime("%Y%m").to_s,
 | 
				
			||||
                           asset[:asset].to_s)
 | 
				
			||||
      File.delete(filepath) if File.exist?filepath
 | 
				
			||||
    end
 | 
				
			||||
    DiscussDemo.destroy(params[:id])
 | 
				
			||||
    redirect_to :controller=> 'discuss_demos',:action => 'index'
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def show
 | 
				
			||||
    @discuss_demo = DiscussDemo.find(params[:id])
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,9 @@
 | 
				
			||||
class GitCallbackController < ApplicationController
 | 
				
			||||
 | 
				
			||||
  def post_update
 | 
				
			||||
    @repository = Repository.find_by_root_url(params[:root_url])
 | 
				
			||||
    @repository.fetch_changesets
 | 
				
			||||
    render :text => 'success'
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,55 @@
 | 
				
			||||
class OrganizationController < ApplicationController
 | 
				
			||||
  layout 'base_projects'
 | 
				
			||||
  before_filter :require_admin, :except => [:index]
 | 
				
			||||
 | 
				
			||||
  def index
 | 
				
			||||
    #@projects = Project.find_by_sql("SELECT * FROM projects WHERE id  IN (select MAX(id) from projects GROUP BY enterprise_name)")
 | 
				
			||||
    @organizations = Organization.all
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.html
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def new
 | 
				
			||||
    @organizations = Organization.new
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.html
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def create
 | 
				
			||||
    @organizations = Organization.new
 | 
				
			||||
    @organizations.name = params[:organization][:name]
 | 
				
			||||
    if @organizations.save
 | 
				
			||||
      redirect_to admin_organization_url
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def edit
 | 
				
			||||
    @organization = Organization.find params[:id]
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.html
 | 
				
			||||
    end
 | 
				
			||||
  rescue Exception => e
 | 
				
			||||
    render_404
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def update
 | 
				
			||||
    @organization = Organization.find params[:id]
 | 
				
			||||
    @organization.name = params[:organization][:name]
 | 
				
			||||
    if @organization.save
 | 
				
			||||
      redirect_to admin_organization_url
 | 
				
			||||
    end
 | 
				
			||||
  rescue Exception => e
 | 
				
			||||
    render_404
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def destroy
 | 
				
			||||
    @organization = Organization.find params[:id]
 | 
				
			||||
    if @organization.destroy
 | 
				
			||||
      redirect_to admin_organization_url
 | 
				
			||||
    end
 | 
				
			||||
  rescue Exception => e
 | 
				
			||||
    render_404
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,420 @@
 | 
				
			||||
class StudentWorkController < ApplicationController
 | 
				
			||||
  layout "base_courses"
 | 
				
			||||
  include StudentWorkHelper
 | 
				
			||||
  require 'bigdecimal'
 | 
				
			||||
  before_filter :find_homework, :only => [:new, :index, :create, :student_work_absence_penalty, :absence_penalty_list, :evaluation_list]
 | 
				
			||||
  before_filter :find_work, :only => [:edit, :update, :show, :destroy, :add_score, :praise_student_work]
 | 
				
			||||
  before_filter :member_of_course, :only => [:index, :new, :create, :show, :add_score, :praise_student_work]
 | 
				
			||||
  before_filter :author_of_work, :only => [:edit, :update, :destroy]
 | 
				
			||||
  before_filter :teacher_of_course, :only => [:student_work_absence_penalty, :absence_penalty_list, :evaluation_list]
 | 
				
			||||
 | 
				
			||||
  def index
 | 
				
			||||
    @order,@b_sort,@name = params[:order] || "final_score",params[:sort] || "desc",params[:name] || ""
 | 
				
			||||
    @is_teacher = User.current.allowed_to?(:as_teacher,@course)
 | 
				
			||||
    #老师 || 非匿评作业 || 匿评结束 显示所有的作品
 | 
				
			||||
    @show_all = @is_teacher || @homework.homework_type != 1 || @homework.homework_detail_manual.comment_status == 3
 | 
				
			||||
    if @show_all
 | 
				
			||||
      if @homework.homework_type == 1 || @is_teacher || User.current.admin?
 | 
				
			||||
        if @order == "name"
 | 
				
			||||
          @stundet_works = search_homework_member @homework.student_works.joins(:user).order("users.lastname #{@b_sort}, users.firstname #{@b_sort}"),@name
 | 
				
			||||
        else
 | 
				
			||||
          @stundet_works = search_homework_member @homework.student_works.order("#{@order} #{@b_sort}"),@name
 | 
				
			||||
        end
 | 
				
			||||
      else
 | 
				
			||||
        my_work = @homework.student_works.where(:user_id => User.current.id)
 | 
				
			||||
        if my_work.empty?
 | 
				
			||||
          @stundet_works = []
 | 
				
			||||
        else
 | 
				
			||||
          if @order == "name"
 | 
				
			||||
            @stundet_works = search_homework_member @homework.student_works.joins(:user).order("users.lastname #{@b_sort}, users.firstname #{@b_sort}"),@name
 | 
				
			||||
          else
 | 
				
			||||
            @stundet_works = search_homework_member @homework.student_works.order("#{@order} #{@b_sort}"),@name
 | 
				
			||||
          end
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
    else #学生
 | 
				
			||||
      if @homework.homework_detail_manual.comment_status == 1 #未开启匿评,只显示我的作品
 | 
				
			||||
        @stundet_works = @homework.student_works.where(:user_id => User.current.id)
 | 
				
			||||
      elsif @homework.homework_detail_manual.comment_status == 2 #匿评列表,显示匿评作品和我的作品
 | 
				
			||||
        @is_evaluation = true
 | 
				
			||||
        my_work = @homework.student_works.where(:user_id => User.current.id)
 | 
				
			||||
        @stundet_works = my_work + User.current.student_works_evaluation_distributions.map(&:student_work).select { |work| work.homework_common_id == @homework.id}
 | 
				
			||||
      end
 | 
				
			||||
    end
 | 
				
			||||
    @homework_commons = @course.homework_commons.order("created_at desc")
 | 
				
			||||
    @score = @b_sort == "desc" ? "asc" : "desc"
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.html
 | 
				
			||||
      format.xls {
 | 
				
			||||
        send_data(homework_to_xls(@stundet_works), :type => "text/excel;charset=utf-8; header=present",
 | 
				
			||||
                  :filename => "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@homework.name}#{l(:excel_homework_list)}.xls")
 | 
				
			||||
      }
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def new
 | 
				
			||||
    student_work = @homework.student_works.where("user_id = ?",User.current.id).first
 | 
				
			||||
    if student_work.nil?
 | 
				
			||||
      @stundet_work = StudentWork.new
 | 
				
			||||
      respond_to do |format|
 | 
				
			||||
        format.html
 | 
				
			||||
      end
 | 
				
			||||
    else
 | 
				
			||||
      render_403
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def create
 | 
				
			||||
    if params[:student_work]
 | 
				
			||||
      stundet_work = StudentWork.new
 | 
				
			||||
      stundet_work.name = params[:student_work][:name]
 | 
				
			||||
      stundet_work.description = params[:student_work][:description]
 | 
				
			||||
      stundet_work.project_id = params[:student_work][:project_id]
 | 
				
			||||
      stundet_work.homework_common_id = @homework.id
 | 
				
			||||
      stundet_work.user_id = User.current.id
 | 
				
			||||
      stundet_work.save_attachments(params[:attachments])
 | 
				
			||||
      render_attachment_warning_if_needed(stundet_work)
 | 
				
			||||
      if stundet_work.save
 | 
				
			||||
        respond_to do |format|
 | 
				
			||||
          format.html {
 | 
				
			||||
            flash[:notice] = l(:notice_successful_create)
 | 
				
			||||
            redirect_to student_work_index_url(:homework => @homework.id)
 | 
				
			||||
          }
 | 
				
			||||
        end
 | 
				
			||||
        return
 | 
				
			||||
      end
 | 
				
			||||
    end
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.html {
 | 
				
			||||
        flash[:notice] = l(:notice_failed_create)
 | 
				
			||||
        redirect_to new_student_work_url(:homework => @homework.id)
 | 
				
			||||
      }
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def edit
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.html
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def update
 | 
				
			||||
    if params[:student_work]
 | 
				
			||||
      @work.name = params[:student_work][:name]
 | 
				
			||||
      @work.description = params[:student_work][:description]
 | 
				
			||||
      @work.project_id = params[:student_work][:project]
 | 
				
			||||
      @work.save_attachments(params[:attachments])
 | 
				
			||||
      render_attachment_warning_if_needed(@work)
 | 
				
			||||
      if @work.save
 | 
				
			||||
        respond_to do |format|
 | 
				
			||||
          format.html {
 | 
				
			||||
            flash[:notice] = l(:notice_successful_edit)
 | 
				
			||||
            redirect_to student_work_index_url(:homework => @homework.id)
 | 
				
			||||
          }
 | 
				
			||||
        end
 | 
				
			||||
        return
 | 
				
			||||
      end
 | 
				
			||||
    end
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.html{redirect_to edit_student_work_url(@work)}
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def show
 | 
				
			||||
    @score = student_work_score @work,User.current
 | 
				
			||||
    @is_teacher = User.current.allowed_to?(:as_teacher,@course)
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.js
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def destroy
 | 
				
			||||
    if @work.destroy
 | 
				
			||||
      respond_to do |format|
 | 
				
			||||
        format.html {
 | 
				
			||||
          redirect_to student_work_index_url(:homework => @homework.id)
 | 
				
			||||
        }
 | 
				
			||||
      end
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  #添加评分,已评分则为修改评分
 | 
				
			||||
  def add_score
 | 
				
			||||
    render_403 and return if User.current == @work.user #不可以匿评自己的作品
 | 
				
			||||
    @is_teacher = User.current.allowed_to?(:as_teacher,@course)
 | 
				
			||||
    #老师、教辅可以随时评分,学生只能在匿评作业的匿评阶段进行评分
 | 
				
			||||
    render_403 and return unless @is_teacher || (@homework.homework_type == 1 && @homework.homework_detail_manual.comment_status == 2)
 | 
				
			||||
    @score = student_work_score @work,User.current
 | 
				
			||||
    if @score
 | 
				
			||||
      @score.comment = params[:new_form][:user_message] if params[:new_form] && params[:new_form][:user_message] && params[:new_form][:user_message] != ""
 | 
				
			||||
      @score.score = params[:score] if params[:score]
 | 
				
			||||
      @is_new = false
 | 
				
			||||
    else
 | 
				
			||||
      @score = StudentWorksScore.new
 | 
				
			||||
      @score.score = params[:score] if params[:score]
 | 
				
			||||
      @score.comment = params[:new_form][:user_message] if params[:new_form] && params[:new_form][:user_message] && params[:new_form][:user_message] != ""
 | 
				
			||||
      @score.user_id = User.current.id
 | 
				
			||||
      @score.student_work_id = @work.id
 | 
				
			||||
      role = User.current.members.where("course_id = ?",@course.id).first.roles.first.name
 | 
				
			||||
      User.current.admin? ? @score.reviewer_role = 1 : @score.reviewer_role = get_role_by_name(role)
 | 
				
			||||
      @is_new = true
 | 
				
			||||
    end
 | 
				
			||||
 | 
				
			||||
    @score.save_attachments(params[:attachments])
 | 
				
			||||
    render_attachment_warning_if_needed(@score)
 | 
				
			||||
 | 
				
			||||
    if @score.save
 | 
				
			||||
      case @score.reviewer_role
 | 
				
			||||
        when 1 #教师评分:最后一个教师评分为最终评分
 | 
				
			||||
          @work.teacher_score = @score.score
 | 
				
			||||
          @work.final_score = @score.score
 | 
				
			||||
        when 2 #教辅评分 教辅评分显示平均分
 | 
				
			||||
          @work.teaching_asistant_score = @work.student_works_scores.where(:reviewer_role => 2).average(:score).try(:round, 2).to_f
 | 
				
			||||
          if @work.teacher_score.nil?
 | 
				
			||||
            if @work.student_score.nil?
 | 
				
			||||
              @work.final_score = @work.teaching_asistant_score
 | 
				
			||||
            else
 | 
				
			||||
              final_ta_score = BigDecimal.new("#{@work.teaching_asistant_score}") * BigDecimal.new("#{@homework.homework_detail_manual.ta_proportion}")
 | 
				
			||||
              final_s_score = BigDecimal.new("#{@work.student_score}") * (BigDecimal.new('1.0')  - BigDecimal.new("#{@homework.homework_detail_manual.ta_proportion}"))
 | 
				
			||||
              final_score = final_ta_score + final_s_score
 | 
				
			||||
              @work.final_score = format("%.2f",final_score.to_f)
 | 
				
			||||
            end
 | 
				
			||||
          end
 | 
				
			||||
        when 3 #学生评分 学生评分显示平均分
 | 
				
			||||
          @work.student_score = @work.student_works_scores.where(:reviewer_role => 3).average(:score).try(:round, 2).to_f
 | 
				
			||||
          if @work.teacher_score.nil?
 | 
				
			||||
            if @work.teaching_asistant_score.nil?
 | 
				
			||||
              @work.final_score = @work.student_score
 | 
				
			||||
            else
 | 
				
			||||
              final_ta_score = BigDecimal.new("#{@work.teaching_asistant_score}") * BigDecimal.new("#{@homework.homework_detail_manual.ta_proportion}")
 | 
				
			||||
              final_s_score = BigDecimal.new("#{@work.student_score}") * (BigDecimal.new('1.0')  - BigDecimal.new("#{@homework.homework_detail_manual.ta_proportion}"))
 | 
				
			||||
              final_score = final_ta_score + final_s_score
 | 
				
			||||
              @work.final_score = format("%.2f",final_score.to_f)
 | 
				
			||||
            end
 | 
				
			||||
          end
 | 
				
			||||
      end
 | 
				
			||||
 | 
				
			||||
      if @work.save
 | 
				
			||||
        respond_to do |format|
 | 
				
			||||
          format.js
 | 
				
			||||
        end
 | 
				
			||||
      end
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  #添加评分的回复
 | 
				
			||||
  def add_score_reply
 | 
				
			||||
    @score = StudentWorksScore.find params[:score_id]
 | 
				
			||||
    @jour = @score.journals_for_messages.new(:user_id => User.current.id,:notes =>params[:message], :reply_id => 0)
 | 
				
			||||
    if @jour.save
 | 
				
			||||
      @status = 1
 | 
				
			||||
    else
 | 
				
			||||
      @status = 2
 | 
				
			||||
    end
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.js
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  #删除评分的回复
 | 
				
			||||
  def destroy_score_reply
 | 
				
			||||
    @jour = JournalsForMessage.find params[:jour_id]
 | 
				
			||||
    if @jour.destroy
 | 
				
			||||
      respond_to do |format|
 | 
				
			||||
        format.js
 | 
				
			||||
      end
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  #为作品点赞
 | 
				
			||||
  def praise_student_work
 | 
				
			||||
    pt = PraiseTread.new
 | 
				
			||||
    pt.user_id = User.current.id
 | 
				
			||||
    pt.praise_tread_object_id = @work.id
 | 
				
			||||
    pt.praise_tread_object_type = "StudentWork"
 | 
				
			||||
    pt.praise_or_tread = 1
 | 
				
			||||
    if pt.save
 | 
				
			||||
      respond_to do |format|
 | 
				
			||||
        format.js
 | 
				
			||||
      end
 | 
				
			||||
    else
 | 
				
			||||
      render_404
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  #缺评列表显示
 | 
				
			||||
  def student_work_absence_penalty
 | 
				
			||||
    order = params[:order] || "desc"
 | 
				
			||||
    if @homework.student_works.empty?
 | 
				
			||||
      @stundet_works = []
 | 
				
			||||
    else
 | 
				
			||||
      work_ids = "(" + @homework.student_works.map(&:id).join(",") + ")"
 | 
				
			||||
      @stundet_works = StudentWork.find_by_sql("SELECT *,(all_count - has_count) AS absence FROM(
 | 
				
			||||
      SELECT * ,
 | 
				
			||||
        (SELECT evaluation_num FROM homework_detail_manuals WHERE  homework_detail_manuals.homework_common_id = #{@homework.id}) AS all_count,
 | 
				
			||||
        (SELECT COUNT(*) FROM `student_works_scores` WHERE user_id = student_works.user_id AND student_work_id IN #{work_ids}) AS has_count
 | 
				
			||||
      FROM `student_works`
 | 
				
			||||
      WHERE homework_common_id = #{@homework.id}
 | 
				
			||||
      ) AS table_1
 | 
				
			||||
      ORDER BY absence #{order}")
 | 
				
			||||
    end
 | 
				
			||||
    @order = order == "desc" ? "asc" : "desc"
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.html
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  #导出缺评列表
 | 
				
			||||
  def absence_penalty_list
 | 
				
			||||
    if @homework.student_works.empty?
 | 
				
			||||
      @stundet_works = []
 | 
				
			||||
    else
 | 
				
			||||
      work_ids = "(" + @homework.student_works.map(&:id).join(",") + ")"
 | 
				
			||||
      @stundet_works = StudentWork.find_by_sql("SELECT * FROM (SELECT *,(all_count - has_count) AS absence FROM(
 | 
				
			||||
      SELECT * ,
 | 
				
			||||
        (SELECT evaluation_num FROM homework_detail_manuals WHERE  homework_detail_manuals.homework_common_id = #{@homework.id}) AS all_count,
 | 
				
			||||
        (SELECT COUNT(*) FROM `student_works_scores` WHERE user_id = student_works.user_id AND student_work_id IN #{work_ids}) AS has_count
 | 
				
			||||
      FROM `student_works`
 | 
				
			||||
      WHERE homework_common_id = #{@homework.id}
 | 
				
			||||
      ) AS table_1) AS table_2
 | 
				
			||||
      where absence > 0 order by absence")
 | 
				
			||||
    end
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.xls {
 | 
				
			||||
        send_data(absence_penalty_list_xls(@stundet_works), :type => "text/excel;charset=utf-8; header=present",
 | 
				
			||||
                  :filename => "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@homework.name}#{l(:excel_absence_list)}.xls")
 | 
				
			||||
      }
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  #导出匿评列表
 | 
				
			||||
  def evaluation_list
 | 
				
			||||
    respond_to do |format|
 | 
				
			||||
      format.xls {
 | 
				
			||||
        send_data(evaluation_list_xls(@homework.student_works), :type => "text/excel;charset=utf-8; header=present",
 | 
				
			||||
                  :filename => "#{@course.teacher.lastname.to_s + @course.teacher.firstname}_#{@course.name}_#{@course.time.to_s + @course.term}_#{@homework.name}#{l(:excel_evaluation_list)}.xls")
 | 
				
			||||
      }
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  private
 | 
				
			||||
  #获取作业
 | 
				
			||||
  def find_homework
 | 
				
			||||
    @homework = HomeworkCommon.find params[:homework]
 | 
				
			||||
    @course = @homework.course
 | 
				
			||||
  rescue
 | 
				
			||||
    render_404
 | 
				
			||||
  end
 | 
				
			||||
  #获取作品
 | 
				
			||||
  def find_work
 | 
				
			||||
    @work = StudentWork.find params[:id]
 | 
				
			||||
    @homework = @work.homework_common
 | 
				
			||||
    @course = @homework.course
 | 
				
			||||
  rescue
 | 
				
			||||
    render_404
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  #是不是当前课程的成员
 | 
				
			||||
  #当前课程成员才可以看到作品列表
 | 
				
			||||
  def member_of_course
 | 
				
			||||
    render_403 unless User.current.member_of_course?(@course) || User.current.admin?
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  #判断是不是当前作品的提交者
 | 
				
			||||
  #提交者 && (非匿评作业 || 未开启匿评) 可以编辑作品
 | 
				
			||||
  def author_of_work
 | 
				
			||||
    render_403 unless (User.current.id == @work.user_id || User.current.admin?) && (@homework.homework_type != 1 || @homework.homework_detail_manual.comment_status == 1 )
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  def teacher_of_course
 | 
				
			||||
    render_403 unless User.current.allowed_to?(:as_teacher,@course)
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  #根据条件过滤作业结果
 | 
				
			||||
  def search_homework_member homeworks,name
 | 
				
			||||
    name = name.downcase
 | 
				
			||||
    select_homework = homeworks.select{ |homework|
 | 
				
			||||
      homework.user[:login].to_s.downcase.include?(name) ||  homework.user.user_extensions[:student_id].to_s.downcase.include?(name) || (homework.user[:lastname].to_s.downcase + homework.user[:firstname].to_s.downcase).include?(name)
 | 
				
			||||
    }
 | 
				
			||||
    select_homework
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  #作品列表转换为excel
 | 
				
			||||
  def homework_to_xls items
 | 
				
			||||
    xls_report = StringIO.new
 | 
				
			||||
    book = Spreadsheet::Workbook.new
 | 
				
			||||
    sheet1 = book.create_worksheet :name => "homework"
 | 
				
			||||
    blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
 | 
				
			||||
    sheet1.row(0).default_format = blue
 | 
				
			||||
    sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),
 | 
				
			||||
                          l(:excel_t_score),l(:excel_ta_score),l(:excel_n_score),l(:excel_f_score),l(:excel_commit_time)])
 | 
				
			||||
    count_row = 1
 | 
				
			||||
    items.each do |homework|
 | 
				
			||||
      sheet1[count_row,0]=homework.user.id
 | 
				
			||||
      sheet1[count_row,1] = homework.user.lastname.to_s + homework.user.firstname.to_s
 | 
				
			||||
      sheet1[count_row,2] = homework.user.login
 | 
				
			||||
      sheet1[count_row,3] = homework.user.user_extensions.student_id
 | 
				
			||||
      sheet1[count_row,4] = homework.user.mail
 | 
				
			||||
      sheet1[count_row,5] = homework.name
 | 
				
			||||
      sheet1[count_row,6] = homework.teacher_score.nil? ? l(:label_without_score) : format("%.2f",homework.teacher_score)
 | 
				
			||||
      sheet1[count_row,7] = homework.teaching_asistant_score.nil? ? l(:label_without_score) : format("%.2f",homework.teaching_asistant_score)
 | 
				
			||||
      sheet1[count_row,8] = homework.student_score.nil? ? l(:label_without_score) : format("%.2f",homework.student_score)
 | 
				
			||||
      sheet1[count_row,9] = homework.final_score.nil? ? l(:label_without_score) : format("%.2f",homework.final_score)
 | 
				
			||||
      sheet1[count_row,10] = format_time(homework.created_at)
 | 
				
			||||
      count_row += 1
 | 
				
			||||
    end
 | 
				
			||||
    book.write xls_report
 | 
				
			||||
    xls_report.string
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  #缺评列表转换为excel
 | 
				
			||||
  def absence_penalty_list_xls items
 | 
				
			||||
    xls_report = StringIO.new
 | 
				
			||||
    book = Spreadsheet::Workbook.new
 | 
				
			||||
    sheet1 = book.create_worksheet :name => "homework"
 | 
				
			||||
    blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
 | 
				
			||||
    sheet1.row(0).default_format = blue
 | 
				
			||||
 | 
				
			||||
    sheet1.row(0).concat([l(:excel_student_id),l(:excel_nickname),l(:excel_user_name),l(:lable_all_penalty),l(:lable_has_penalty),l(:lable_absence_penalty)])
 | 
				
			||||
    count_row = 1
 | 
				
			||||
    items.each do |homework|
 | 
				
			||||
      sheet1[count_row,0] = homework.user.user_extensions.student_id
 | 
				
			||||
      sheet1[count_row,1] = homework.user.login
 | 
				
			||||
      sheet1[count_row,2] = homework.user.lastname.to_s + homework.user.firstname.to_s
 | 
				
			||||
      sheet1[count_row,3] = homework.all_count
 | 
				
			||||
      sheet1[count_row,4] = homework.has_count
 | 
				
			||||
      sheet1[count_row,5] = homework.absence
 | 
				
			||||
      count_row += 1
 | 
				
			||||
    end
 | 
				
			||||
    book.write xls_report
 | 
				
			||||
    xls_report.string
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  #匿评列表转换为excel
 | 
				
			||||
  def evaluation_list_xls items
 | 
				
			||||
    xls_report = StringIO.new
 | 
				
			||||
    book = Spreadsheet::Workbook.new
 | 
				
			||||
    sheet1 = book.create_worksheet :name => "homework"
 | 
				
			||||
    blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
 | 
				
			||||
    sheet1.row(0).default_format = blue
 | 
				
			||||
 | 
				
			||||
    sheet1.row(0).concat([l(:label_work_name),l(:label_work_id),l(:label_work_autor),l(:label_evaluation_id),l(:label_evaluation_name),
 | 
				
			||||
                          l(:label_evaluation_score),l(:label_evaluation_common),l(:label_evaluation_time)])
 | 
				
			||||
    count_row = 1
 | 
				
			||||
    items.each do |homework|
 | 
				
			||||
      homework.student_works_scores.where(:reviewer_role => 3).each do |score|
 | 
				
			||||
        sheet1[count_row,0] = homework.name
 | 
				
			||||
        sheet1[count_row,1] = homework.user.user_extensions.student_id
 | 
				
			||||
        sheet1[count_row,2] = homework.user.show_name
 | 
				
			||||
        sheet1[count_row,3] = score.user.user_extensions.student_id
 | 
				
			||||
        sheet1[count_row,4] = score.user.show_name
 | 
				
			||||
        sheet1[count_row,5] = score.score
 | 
				
			||||
        sheet1[count_row,6] = score.comment
 | 
				
			||||
        sheet1[count_row,7] = format_time(score.created_at)
 | 
				
			||||
        count_row += 1
 | 
				
			||||
      end
 | 
				
			||||
    end
 | 
				
			||||
    book.write xls_report
 | 
				
			||||
    xls_report.string
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
@ -0,0 +1,59 @@
 | 
				
			||||
# Time 2015-01-26 17:12:23
 | 
				
			||||
# Author lizanle
 | 
				
			||||
# Description 显示和清理系统日志
 | 
				
			||||
class SystemLogController < ApplicationController
 | 
				
			||||
 | 
				
			||||
  before_filter :require_admin
 | 
				
			||||
  # 默认每页显示20条记录
 | 
				
			||||
  PER_PAGE = 20
 | 
				
			||||
  layout "base"
 | 
				
			||||
  include SystemLogHelper
 | 
				
			||||
 | 
				
			||||
  # Time 2015-01-26 17:12:46
 | 
				
			||||
  # Author lizanle
 | 
				
			||||
  # Description 查看所有日志
 | 
				
			||||
  def index
 | 
				
			||||
    @logs = SystemLog.logo_data(params[:page]||1, params[:per]||PER_PAGE, params[:search], params[:day])
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  # Time 2015-01-26 14:42:38
 | 
				
			||||
  # Author lizanle
 | 
				
			||||
  # Description 清除日志
 | 
				
			||||
  def clear
 | 
				
			||||
    SystemLog.clear params[:day]
 | 
				
			||||
    redirect_to :action => :index
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  # Time 2015-01-26 17:24:25
 | 
				
			||||
  # Author lizanle
 | 
				
			||||
  # Description 访问分析
 | 
				
			||||
  def access_analysis
 | 
				
			||||
    #解析日志,然后逆序
 | 
				
			||||
    @log_result = SystemLog.analysis(params[:day]).reverse[1...-1]
 | 
				
			||||
    @access_module = Hash.new
 | 
				
			||||
    #日誌可能為空
 | 
				
			||||
    if @log_result && !@log_result.empty?
 | 
				
			||||
      #将数组中的模块访问统计出来放到hash中 每条记录的第四个值是Controller#action的形式
 | 
				
			||||
      @log_result.collect! { |r| @access_module[r[3]].nil? ?
 | 
				
			||||
          @access_module[r[3]] = 1 : @access_module[r[3]] +=1 }
 | 
				
			||||
      # 去掉key可能为空记录 排序,然后取逆序
 | 
				
			||||
      @access_module = @access_module.delete_if { |k, v| k.nil? }.sort_by { |key, val| val }.reverse
 | 
				
			||||
    else
 | 
				
			||||
      @access_module
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
 | 
				
			||||
  # Time 2015-01-26 17:24:36
 | 
				
			||||
  # Author lizanle
 | 
				
			||||
  # Description 耗时分析
 | 
				
			||||
  def time_analysis
 | 
				
			||||
    #解析日志
 | 
				
			||||
    @log_result = SystemLog.analysis(params[:day]).reverse[1...-1]
 | 
				
			||||
    if @log_result && !@log_result.empty?
 | 
				
			||||
      #分页
 | 
				
			||||
      @log_result = Kaminari.paginate_array(@log_result).page(params[:page]||1).per(params[:per]||PER_PAGE)
 | 
				
			||||
    else
 | 
				
			||||
      @log_result = []
 | 
				
			||||
    end
 | 
				
			||||
  end
 | 
				
			||||
end
 | 
				
			||||
Some files were not shown because too many files have changed in this diff Show More
					Loading…
					
					
				
		Reference in new issue