Compare commits

...

Author SHA1 Message Date
  sulennnn cdae68fb2c add annotations 7 years ago
  sulennnn 0b6598c133 add 'gemfile.lock' file 7 years ago
  sulennnn 91adaa1aa6 add debug 7 years ago
  sulennnn e4fffdd18f add debug 7 years ago
  Nigel d7297fd5c1 add debug 7 years ago
  Nigel 4c0c69157a add token.rb centent 7 years ago
  Nigel 15ec9401aa add accept issues function 7 years ago
  Nigel fd3c6a1c36 add issue_tokens table and successfully save data into this table 7 years ago
  Nigel 7e4849adbd complete the function that saves tokens to fabricNetwork 7 years ago
  nigel007 1b05b05de6 将any?函数修改为了.length > 0 7 years ago
  nigel007 c28c2b7bce Merge remote-tracking branch 'origin/dev_trustie_blockchain' into dev_trustie_blockchain 7 years ago
  nigel007 3e3c1ad986 在after save方法最后添加了一个puts 7 years ago
  nigel007 d2d50e6a92 修改了any?函数,修改为.length > 0 7 years ago
  Nigel e1a6b6f22c add debug 7 years ago
  Nigel 32f3980544 add debug 7 years ago
  Nigel d940d5eb1d modify the code to solve the undefined problem in issue.rb 7 years ago
  Nigel 68fe31914d add owner_name field in pushTXinfo 7 years ago
  Nigel 14b79ebfb2 add debug 7 years ago
  Nigel e34d378ccd replace pushTXInofoJson variable to base64 7 years ago
  Nigel 7f2ecbf207 add debug 7 years ago
  Nigel 1a413cb415 add debug 7 years ago
  Nigel f7aa2afec8 add logs to debug 7 years ago
  Nigel 00828ea222 add logs to debug 7 years ago
  Nigel a56e888ef5 add modificationLines function 7 years ago
  Nigel 0e8e39ee8c h[project_id] = memberships.where(:project_id => project_id)[0] 7 years ago
  Nigel 253d2523d8 change to @user.homepage.article_homepages.length != 0 7 years ago
  nigel007 b3ab7359c7 add api isRegisteredInTrustie 7 years ago
  nigel007 339b9138a4 add loggers 7 years ago
  nigel007 cc4e28f595 add loggers 7 years ago
  nigel007 5cedd2f832 add loggers 7 years ago
  nigel007 9e1124f0e4 add logger 7 years ago
  nigel007 84145a9fff add rails logger 7 years ago
  nigel007 4bec29371e add some migrations 7 years ago
  nigel007 67529e303d remove some ethereum logics 7 years ago
  nigel007 071d7757d0 change status from 1 to 0 7 years ago
  nigel007 160073df60 change node_id to params[:node_id] 7 years ago
  nigel007 731d6effe5 add judgeAndInsertJoinInfo 7 years ago
  nigel007 3abe5ff4b3 change find_project function 7 years ago
  nigel007 4eb2428ef1 add logger 7 years ago
  nigel007 b18c44db44 remove node_id for api getJoinInfo 7 years ago
  nigel007 ab2d045f0a remove loggers 7 years ago
  nigel007 5d11315cfc add loggers 7 years ago
  nigel007 0a55604178 add logger 7 years ago
  nigel007 5855087f2d 修改了create api,增加了插入blockchain_project_clients表的操作 7 years ago
  nigel007 f26d5c6e59 修改了getJoinInfo的不同获取方式 7 years ago
  nigel007 e197f09bd5 add blockchain_api 查询用户哪些客户端已经加入到了项目对应的区块链网络中 7 years ago
  nigel007 3d4cfccab5 add migration file for creating blockchain_project_clients table 7 years ago
  nigel007 ba5c803c44 remove 双引号 7 years ago
  nigel007 76dcf839bf add " 7 years ago
  nigel007 4aa5510341 将双引号修改为单引号 7 years ago
  nigel007 60547d9dc3 删除单引号 7 years ago
  nigel007 87b807688a 添加单引号 7 years ago
  nigel007 c12161a1e1 add log 7 years ago
  nigel007 c8dc7b7c96 add to_s 7 years ago
  nigel007 d975785d76 add logger of pushTXInfoJson 7 years ago
  nigel007 89cfcb6a5f uncommend popen 7 years ago
  nigel007 ac9a57c4a4 remove require string.io 7 years ago
  nigel007 395126b098 remove popen cmd 7 years ago
  nigel007 154aecfa14 change system to popen 7 years ago
  nigel007 deb42a19d0 add result to system 7 years ago
  nigel007 1f44349296 change accept_pr function 7 years ago
  nigel007 d2edb77194 remove exec_jeckins when creating pull requests 7 years ago
  nigel007 fcaea2019b change the return of blockchain create 7 years ago
  nigel007 44d19d88e3 remove logs 7 years ago
  nigel007 5273d7e36e 改变保留小数位数 7 years ago
  nigel007 a8aef73c15 改变保留小数位数 7 years ago
  nigel007 fd8e1e5e66 change @change_count 7 years ago
  nigel007 6c12c43df0 change branch to branch_name 7 years ago
  nigel007 817f577a6b change appearance 7 years ago
  nigel007 f5d15de788 change appearance 7 years ago
  nigel007 7b8caf6d0b rm logs and add tds 7 years ago
  nigel007 596a0d5723 add to_s and to_i 7 years ago
  nigel007 d3e4d80ef6 add log 7 years ago
  nigel007 b0cadd67d5 change has_key 7 years ago
  nigel007 fbf5d78c6d add logger to contribution_controller 7 years ago
  nigel007 c4645530d9 add contribution rate 7 years ago
  nigel007 0308a31d50 add contribution rate 7 years ago
  nigel007 15fe9de248 remove ref 7 years ago
  nigel007 41ecd2b2df change style 7 years ago
  nigel007 4a9ed49fe0 change style 7 years ago
  nigel007 7d8d3c0007 change style 7 years ago
  nigel007 f2068f8163 change appearance 7 years ago
  nigel007 a5a6dcb98d add logs 7 years ago
  nigel007 cde3df54aa change contribution 7 years ago
  nigel007 66a6e0482b change repository to @repository 7 years ago
  nigel007 c5fa6dcd54 find commits by author 7 years ago
  nigel007 e4b0426ac3 remove some unused things 7 years ago
  nigel007 acbbdc26cb change sth 7 years ago
  nigel007 dc6e08368d add print in controller 7 years ago
  nigel007 6166bccabd change show contribution 7 years ago
  nigel007 9e86138422 change route 7 years ago
  nigel007 31fb33bab6 change tag number 7 years ago
  nigel007 4648de3007 remove action for def show 7 years ago
  nigel007 4b7ff01530 change contribution tab 7 years ago
  nigel007 64f8b88281 change show of contribution 7 years ago
  nigel007 deacfca1fa change contributions_controller.rb functions 7 years ago
  nigel007 1896865495 change prints 7 years ago
  nigel007 a4ba9e8a4d add logs to repositories_controller's show function 7 years ago
  nigel007 8b59e31d85 change contributions_controller.rb 7 years ago
  nigel007 09f0d85d51 change contributions_controller.rb's attributes 7 years ago
  nigel007 e5ff3707cb change routes of contributions and logger of contributions_controller 7 years ago
  nigel007 4d17e6c425 add show of contribution 7 years ago
  nigel007 b3ed98bc37 add some logger.info 7 years ago
  nigel007 62bf884225 remove 7 years ago
  nigel007 af04a44512 change unless port 7 years ago
  nigel007 cd04ace5e7 remove attr_accessor 7 years ago
  nigel007 7ceba9efcf add loggers 7 years ago
  nigel007 917f9a0f2c add log of user_id 7 years ago
  nigel007 393368c38d change the migration file to former style 7 years ago
  nigel007 898e99fb55 change migration files 7 years ago
  nigel007 546fb22643 change logger to Rails.logger 7 years ago
  nigel007 4cfd888414 change port and network_id to bc.sth 7 years ago
  nigel007 68a975d30a add judge of nil value for ports and networkids 7 years ago
  nigel007 f4cff59064 add logger.info to get_networkids_ports 7 years ago
  nigel007 1a9d73b6b3 change repo_name to reponame 7 years ago
  nigel007 883729ed9a add reponame 7 years ago
  nigel007 28951b11bf remove find_by_project_id and change the obtain method of blockchain attributes 7 years ago
  nigel007 d3c3280470 change to accessor 7 years ago
  nigel007 3f81a7fa8e add attr_accessible to blockchain model 7 years ago
  nigel007 55009f2365 change the acquire of project's owner name 7 years ago
  nigel007 192ee15a59 add outputs 7 years ago
  nigel007 9d0d3854ae change return for join service 7 years ago
  nigel007 34daf5d94a finish join service 7 years ago
  nigel007 8d2372cabc change sth 7 years ago
  nigel007 e88f938979 change output 7 years ago
  nigel007 d57561f116 modify function join 7 years ago
  nigel007 cc0fc188c2 add join service for blockchain 7 years ago
  nigel007 9a6456afdc add status to get_already_things function 7 years ago
  nigel007 ea2465092c change return to true and false and remove logger.infos 7 years ago
  nigel007 226b9632b5 add branch 7 years ago
  nigel007 ed9e2b1d37 output gpid 7 years ago
  nigel007 8bc19d36db change true to commit 7 years ago
  nigel007 e4e6c9cc61 change the iterator of shaList 7 years ago
  nigel007 f2d403cc43 change function name to getCommitInfo and return list of true or false 7 years ago
  nigel007 49eb0cf73a change param type 7 years ago
  nigel007 5bbec0b311 change the api of getPushInfo 7 years ago
  nigel007 f59d3f5114 change project.id to project.gpid 7 years ago
  nigel007 8fe2589baa add status for retur 7 years ago
  nigel007 a01fa6ab00 change diff_result.diff to diff_result[0].diff 7 years ago
  nigel007 ecba5eaae4 add two loggers 7 years ago
  nigel007 7ea70e5524 add Rails.logger of owner not found 7 years ago
  nigel007 9ac5b33689 read the diff of commit_diff 7 years ago
  nigel007 18ccb3347d add gitlab commits.rb lib and getPushInfo function 7 years ago
  nigel007 7484ba6826 add gitlab api commits 7 years ago
  nigel007 81842d4ba5 change services and blockchain.rb 7 years ago
  nigel007 46bafc9d35 create repo while creating 7 years ago
  nigel007 c8689b3dd0 add createNewRepoBlockchain function 7 years ago
  nigel007 d2ef049f08 verify current_user through username and password 7 years ago
  nigel007 60415e1182 add blockchain api 7 years ago
  nigel007 4dfef1b571 change createNewProject function and add createNewProjectBlockchain function 7 years ago
  nigel007 c484f17812 add verify_user function 7 years ago
  nigel007 a1d70dae18 change the version of migrations 7 years ago
  nigel007 2698bc58fc change type of genesis_content 7 years ago
  nigel007 49cac39403 change blockchain service 7 years ago
  nigel007 3094a4c19a add user_id to blockchains table 7 years ago
  nigel007 7d18d66b01 delete some lines by huangjingquan 7 years ago
  nigel007 bef1734156 modify attributes by huangjingquan 7 years ago
  nigel007 9d228b01b9 change def create by huangjingquan 7 years ago
  nigel007 8ed186dfe7 register blockchain api in api.rb file 7 years ago
  nigel007 68a41879c5 create model Blockchain and add migrations and add api/blockchains 7 years ago
  nigel007 9e642b8627 remove some test after copying from hjq 7 years ago
100 changed files with 4390 additions and 3697 deletions
Unified View
  1. +0
    -2
      .gitignore
  2. +3
    -3
      .metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.core.io.15
  3. +4
    -4
      .metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.syncing.core.15
  4. +3
    -3
      .metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.webserver.core.12
  5. +2
    -2
      .metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2015/1/2/refactorings.history
  6. +2
    -2
      .metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2015/1/2/refactorings.index
  7. +7
    -7
      .metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml
  8. +2
    -2
      .rspec
  9. +394
    -0
      Gemfile.lock
  10. +40
    -40
      Guardfile
  11. +5
    -5
      README.rdoc
  12. +7
    -7
      Rakefile
  13. +12
    -0
      app/api/mobile/api.rb
  14. +60
    -60
      app/api/mobile/apis/auth.rb
  15. +289
    -0
      app/api/mobile/apis/blockchains.rb
  16. +31
    -31
      app/api/mobile/apis/blog_comments.rb
  17. +934
    -934
      app/api/mobile/apis/courses.rb
  18. +157
    -157
      app/api/mobile/apis/homeworks.rb
  19. +321
    -321
      app/api/mobile/apis/new_comment.rb
  20. +41
    -41
      app/api/mobile/apis/praise.rb
  21. +349
    -349
      app/api/mobile/apis/projects.rb
  22. +118
    -118
      app/api/mobile/apis/resources.rb
  23. +102
    -102
      app/api/mobile/apis/syllabuses.rb
  24. +29
    -29
      app/api/mobile/apis/upgrade.rb
  25. +320
    -320
      app/api/mobile/apis/users.rb
  26. +49
    -49
      app/api/mobile/apis/watches.rb
  27. +138
    -138
      app/api/mobile/entities/blog_comment.rb
  28. +114
    -114
      app/api/mobile/entities/course.rb
  29. +19
    -19
      app/api/mobile/entities/course_group.rb
  30. +43
    -43
      app/api/mobile/entities/exercise.rb
  31. +17
    -17
      app/api/mobile/entities/homeworkscore.rb
  32. +43
    -43
      app/api/mobile/entities/journal.rb
  33. +33
    -33
      app/api/mobile/entities/member.rb
  34. +153
    -153
      app/api/mobile/entities/message.rb
  35. +43
    -43
      app/api/mobile/entities/project.rb
  36. +35
    -35
      app/api/mobile/entities/project_member.rb
  37. +44
    -44
      app/api/mobile/entities/student_work.rb
  38. +15
    -15
      app/api/mobile/entities/syllabus.rb
  39. +87
    -87
      app/api/mobile/entities/user.rb
  40. +118
    -118
      app/api/mobile/entities/whomework.rb
  41. +13
    -13
      app/api/mobile/exceptions/auth_exception.rb
  42. +26
    -26
      app/api/mobile/middleware/error_handler.rb
  43. +2
    -2
      app/assets/javascripts/applied_project.js
  44. +2
    -2
      app/assets/javascripts/apply_project_masters.js
  45. +3
    -3
      app/assets/javascripts/article_homepages.js.coffee
  46. +2
    -2
      app/assets/javascripts/attachment_type_edit.js
  47. +3
    -3
      app/assets/javascripts/contest_members.js.coffee
  48. +3
    -3
      app/assets/javascripts/contestant_works.js.coffee
  49. +3
    -3
      app/assets/javascripts/contests.js.coffee
  50. +3
    -3
      app/assets/javascripts/cooperation.js.coffee
  51. +3
    -3
      app/assets/javascripts/enterprises.js.coffee
  52. +2
    -2
      app/assets/javascripts/forums.js
  53. +3
    -3
      app/assets/javascripts/homepages.js.coffee
  54. +3
    -3
      app/assets/javascripts/main_categories.js.coffee
  55. +2
    -2
      app/assets/javascripts/memos.js
  56. +2
    -2
      app/assets/javascripts/no_uses.js
  57. +3
    -3
      app/assets/javascripts/notificationcomments.js.coffee
  58. +2
    -2
      app/assets/javascripts/open_source_projects.js
  59. +3
    -3
      app/assets/javascripts/org_courses.js.coffee
  60. +3
    -3
      app/assets/javascripts/org_document_comment.js.coffee
  61. +3
    -3
      app/assets/javascripts/org_member.js.coffee
  62. +3
    -3
      app/assets/javascripts/org_projects.js.coffee
  63. +3
    -3
      app/assets/javascripts/org_subfields.js.coffee
  64. +3
    -3
      app/assets/javascripts/organizations.js.coffee
  65. +2
    -2
      app/assets/javascripts/praise_tread.js
  66. +3
    -3
      app/assets/javascripts/pull_requests.js.coffee
  67. +3
    -3
      app/assets/javascripts/quality_analyses.js.coffee
  68. +2
    -2
      app/assets/javascripts/school.js
  69. +2
    -2
      app/assets/javascripts/shares.js
  70. +3
    -3
      app/assets/javascripts/shield_activities.js.coffee
  71. +3
    -3
      app/assets/javascripts/shield_wechat_messages.js.coffee
  72. +2
    -2
      app/assets/javascripts/softapplications.js
  73. +3
    -3
      app/assets/javascripts/statistics.js.coffee
  74. +3
    -3
      app/assets/javascripts/sub_categories.js.coffee
  75. +3
    -3
      app/assets/javascripts/sub_document_comments.js.coffee
  76. +3
    -3
      app/assets/javascripts/sub_domains.js.coffee
  77. +3
    -3
      app/assets/javascripts/subfield_subdomain_dirs.js.coffee
  78. +3
    -3
      app/assets/javascripts/syllabus_member.js.coffee
  79. +3
    -3
      app/assets/javascripts/syllabuses.js.coffee
  80. +3
    -3
      app/assets/javascripts/system_log.js.coffee
  81. +3
    -3
      app/assets/javascripts/system_messages.js.coffee
  82. +2
    -2
      app/assets/javascripts/teachers.js
  83. +3
    -3
      app/assets/javascripts/works.js.coffee
  84. +2
    -2
      app/assets/javascripts/zipdown.js
  85. +4
    -4
      app/assets/stylesheets/applied_project.css
  86. +4
    -4
      app/assets/stylesheets/apply_project_masters.css
  87. +3
    -3
      app/assets/stylesheets/article_homepages.css.scss
  88. +4
    -4
      app/assets/stylesheets/attachment_type_edit.css
  89. +3
    -3
      app/assets/stylesheets/contest_members.css.scss
  90. +3
    -3
      app/assets/stylesheets/contestant_works.css.scss
  91. +3
    -3
      app/assets/stylesheets/contests.css.scss
  92. +3
    -3
      app/assets/stylesheets/cooperation.css.scss
  93. +3
    -3
      app/assets/stylesheets/enterprises.css.scss
  94. +4
    -4
      app/assets/stylesheets/forums.css
  95. +3
    -3
      app/assets/stylesheets/homepages.css.scss
  96. +3
    -3
      app/assets/stylesheets/main_categories.css.scss
  97. +4
    -4
      app/assets/stylesheets/memos.css
  98. +4
    -4
      app/assets/stylesheets/no_uses.css
  99. +3
    -3
      app/assets/stylesheets/notificationcomments.css.scss
  100. +4
    -4
      app/assets/stylesheets/open_source_projects.css

+ 0
- 2
.gitignore View File

@@ -19,9 +19,7 @@
/config/newrelic.yml /config/newrelic.yml
/public/images/avatars/* /public/images/avatars/*
/Gemfile /Gemfile
/Gemfile.lock
/db/schema.rb /db/schema.rb
/Gemfile.lock
/lib/plugins/acts_as_versioned/test/debug.log /lib/plugins/acts_as_versioned/test/debug.log
.rbenv-gemsets .rbenv-gemsets
.DS_Store .DS_Store


+ 3
- 3
.metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.core.io.15 View File

@@ -1,3 +1,3 @@
#safe table
#Mon Jan 05 10:27:54 CST 2015
connections=connections.15
#safe table
#Mon Jan 05 10:27:54 CST 2015
connections=connections.15

+ 4
- 4
.metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.syncing.core.15 View File

@@ -1,4 +1,4 @@
#safe table
#Mon Jan 05 10:27:54 CST 2015
defaultConnection=defaultConnection.15
sites=sites.15
#safe table
#Mon Jan 05 10:27:54 CST 2015
defaultConnection=defaultConnection.15
sites=sites.15

+ 3
- 3
.metadata/.plugins/org.eclipse.core.resources/.safetable/com.aptana.webserver.core.12 View File

@@ -1,3 +1,3 @@
#safe table
#Mon Jan 05 10:27:28 CST 2015
webservers=webservers.12
#safe table
#Mon Jan 05 10:27:28 CST 2015
webservers=webservers.12

+ 2
- 2
.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2015/1/2/refactorings.history View File

@@ -1,3 +1,3 @@
<?xml version="1.0" encoding="UTF-8"?>
<session version="1.0">&#x0A;<refactoring comment="Delete resource &apos;trustie2&apos;" deleteContents="false" description="Delete resource &apos;trustie2&apos;" element1="/trustie2" flags="7" id="org.eclipse.ltk.core.refactoring.delete.resources" resources="1" stamp="1420424676858"/>&#x0A;<refactoring comment="Delete resource &apos;trustie2&apos;" deleteContents="false" description="Delete resource &apos;trustie2&apos;" element1="/trustie2" flags="7" id="org.eclipse.ltk.core.refactoring.delete.resources" resources="1" stamp="1420424775104"/>
<?xml version="1.0" encoding="UTF-8"?>
<session version="1.0">&#x0A;<refactoring comment="Delete resource &apos;trustie2&apos;" deleteContents="false" description="Delete resource &apos;trustie2&apos;" element1="/trustie2" flags="7" id="org.eclipse.ltk.core.refactoring.delete.resources" resources="1" stamp="1420424676858"/>&#x0A;<refactoring comment="Delete resource &apos;trustie2&apos;" deleteContents="false" description="Delete resource &apos;trustie2&apos;" element1="/trustie2" flags="7" id="org.eclipse.ltk.core.refactoring.delete.resources" resources="1" stamp="1420424775104"/>
</session> </session>

+ 2
- 2
.metadata/.plugins/org.eclipse.ltk.core.refactoring/.refactorings/.workspace/2015/1/2/refactorings.index View File

@@ -1,2 +1,2 @@
1420424676858 Delete resource 'trustie2'
1420424775104 Delete resource 'trustie2'
1420424676858 Delete resource 'trustie2'
1420424775104 Delete resource 'trustie2'

+ 7
- 7
.metadata/.plugins/org.eclipse.ltk.ui.refactoring/dialog_settings.xml View File

@@ -1,7 +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>
<?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>

+ 2
- 2
.rspec View File

@@ -1,2 +1,2 @@
--color
--require spec_helper
--color
--require spec_helper

+ 394
- 0
Gemfile.lock View File

@@ -0,0 +1,394 @@
PATH
remote: lib/gitlab-cli
specs:
gitlab (3.2.0)
httparty
terminal-table

PATH
remote: lib/grack
specs:
grack (2.0.2)
rack (~> 1.4.5)

PATH
remote: lib/rails_kindeditor
specs:
rails_kindeditor (0.4.5)
carrierwave
mini_magick

PATH
remote: lib/wechat
specs:
wechat (0.7.1)
activerecord (>= 3.2, < 5.1.x)
http (~> 1.0, >= 1.0.1)
nokogiri (>= 1.6.0)
thor

GEM
remote: https://gems.ruby-china.com/
specs:
actionmailer (3.2.22.5)
actionpack (= 3.2.22.5)
mail (~> 2.5.4)
actionpack (3.2.22.5)
activemodel (= 3.2.22.5)
activesupport (= 3.2.22.5)
builder (~> 3.0.0)
erubis (~> 2.7.0)
journey (~> 1.0.4)
rack (~> 1.4.5)
rack-cache (~> 1.2)
rack-test (~> 0.6.1)
sprockets (~> 2.2.1)
activemodel (3.2.22.5)
activesupport (= 3.2.22.5)
builder (~> 3.0.0)
activerecord (3.2.22.5)
activemodel (= 3.2.22.5)
activesupport (= 3.2.22.5)
arel (~> 3.0.2)
tzinfo (~> 0.3.29)
activeresource (3.2.22.5)
activemodel (= 3.2.22.5)
activesupport (= 3.2.22.5)
activesupport (3.2.22.5)
i18n (~> 0.6, >= 0.6.4)
multi_json (~> 1.0)
acts-as-taggable-on (2.4.1)
rails (>= 3, < 5)
addressable (2.7.0)
public_suffix (>= 2.0.2, < 5.0)
ansi (1.5.0)
arel (3.0.3)
awesome_print (1.8.0)
axiom-types (0.1.1)
descendants_tracker (~> 0.0.4)
ice_nine (~> 0.11.0)
thread_safe (~> 0.3, >= 0.3.1)
better_errors (1.1.0)
coderay (>= 1.0.0)
erubis (>= 2.6.6)
binding_of_caller (0.8.0)
debug_inspector (>= 0.0.1)
builder (3.0.0)
byebug (11.0.1)
carrierwave (0.11.2)
activemodel (>= 3.2.0)
activesupport (>= 3.2.0)
json (>= 1.7)
mime-types (>= 1.16)
mimemagic (>= 0.3.0)
certified (1.0.0)
chinese_pinyin (1.0.2)
climate_control (0.2.0)
cocaine (0.5.8)
climate_control (>= 0.0.3, < 1.0)
coderay (1.1.2)
coercible (1.0.0)
descendants_tracker (~> 0.0.1)
coffee-rails (3.2.2)
coffee-script (>= 2.2.0)
railties (~> 3.2.0)
coffee-script (2.4.1)
coffee-script-source
execjs
coffee-script-source (1.12.2)
daemons (1.3.1)
debug_inspector (0.0.3)
delayed_job (4.1.8)
activesupport (>= 3.0, < 6.1)
delayed_job_active_record (4.1.4)
activerecord (>= 3.0, < 6.1)
delayed_job (>= 3.0, < 5)
descendants_tracker (0.0.4)
thread_safe (~> 0.3, >= 0.3.1)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
elasticsearch (7.3.0)
elasticsearch-api (= 7.3.0)
elasticsearch-transport (= 7.3.0)
elasticsearch-api (7.3.0)
multi_json
elasticsearch-model (7.0.0)
activesupport (> 3)
elasticsearch (> 1)
hashie
elasticsearch-rails (7.0.0)
elasticsearch-transport (7.3.0)
faraday
multi_json
equalizer (0.0.11)
erubis (2.7.0)
execjs (2.7.0)
factory_girl (4.9.0)
activesupport (>= 3.0.0)
factory_girl_rails (4.9.0)
factory_girl (~> 4.9.0)
railties (>= 3.0.0)
faraday (0.17.0)
multipart-post (>= 1.2, < 3)
fastercsv (1.5.5)
ffi (1.11.1)
grape (0.9.0)
activesupport
builder
hashie (>= 2.1.0)
multi_json (>= 1.3.2)
multi_xml (>= 0.5.2)
rack (>= 1.3.0)
rack-accept
rack-mount
virtus (>= 1.0.0)
grape-entity (0.4.5)
activesupport
multi_json (>= 1.3.2)
grape-swagger (0.20.0)
awesome_print
grape
grape-entity
hashie (3.6.0)
hike (1.2.3)
htmlentities (4.3.4)
http (1.0.4)
addressable (~> 2.3)
http-cookie (~> 1.0)
http-form_data (~> 1.0.1)
http_parser.rb (~> 0.6.0)
http-accept (1.7.0)
http-cookie (1.0.3)
domain_name (~> 0.5)
http-form_data (1.0.3)
http_parser.rb (0.6.0)
httparty (0.16.2)
multi_xml (>= 0.5.2)
i18n (0.6.11)
ice_nine (0.11.2)
iconv (1.0.8)
jenkins_api_client (1.5.3)
json (>= 1.0)
mixlib-shellout (>= 1.1.0)
nokogiri (~> 1.6)
socksify (>= 1.7.0)
terminal-table (>= 1.4.0)
thor (>= 0.16.0)
journey (1.0.4)
jquery-rails (2.0.3)
railties (>= 3.1.0, < 5.0)
thor (~> 0.14)
json (1.8.6)
kaminari (0.17.0)
actionpack (>= 3.0.0)
activesupport (>= 3.0.0)
mail (2.5.5)
mime-types (~> 1.16)
treetop (~> 1.4.8)
method_source (0.9.2)
mime-types (1.25.1)
mimemagic (0.3.3)
mini_magick (4.9.5)
mini_portile2 (2.4.0)
mixlib-shellout (3.0.7)
multi_json (1.14.1)
multi_xml (0.6.0)
multipart-post (2.1.1)
mysql2 (0.3.18)
net-ldap (0.3.1)
net-ssh (2.9.1)
netrc (0.11.0)
nokogiri (1.10.4)
mini_portile2 (~> 2.4.0)
paperclip (3.5.4)
activemodel (>= 3.0.0)
activesupport (>= 3.0.0)
cocaine (~> 0.5.3)
mime-types
polyglot (0.3.5)
power_assert (1.1.5)
pry (0.12.2)
coderay (~> 1.1.0)
method_source (~> 0.9.0)
pry-byebug (3.7.0)
byebug (~> 11.0)
pry (~> 0.10)
public_suffix (4.0.1)
rack (1.4.7)
rack-accept (0.4.5)
rack (>= 0.4)
rack-cache (1.9.0)
rack (>= 0.4)
rack-cors (1.0.3)
rack-mini-profiler (0.9.9.2)
rack (>= 1.2.0)
rack-mount (0.8.3)
rack (>= 1.0.0)
rack-openid (1.4.2)
rack (>= 1.1.0)
ruby-openid (>= 2.1.8)
rack-raw-upload (1.1.1)
multi_json
rack-ssl (1.3.4)
rack
rack-test (0.6.3)
rack (>= 1.0)
rails (3.2.22.5)
actionmailer (= 3.2.22.5)
actionpack (= 3.2.22.5)
activerecord (= 3.2.22.5)
activeresource (= 3.2.22.5)
activesupport (= 3.2.22.5)
bundler (~> 1.0)
railties (= 3.2.22.5)
railties (3.2.22.5)
actionpack (= 3.2.22.5)
activesupport (= 3.2.22.5)
rack-ssl (~> 1.3.2)
rake (>= 0.8.7)
rdoc (~> 3.4)
thor (>= 0.14.6, < 2.0)
rake (13.0.0)
rb-fsevent (0.10.3)
rb-inotify (0.10.0)
ffi (~> 1.0)
rdoc (3.12.2)
json (~> 1.4)
redis (4.1.3)
redis-actionpack (3.2.4)
actionpack (~> 3.2.0)
redis-rack (~> 1.4.4)
redis-store (~> 1.1.4)
redis-activesupport (3.2.5)
activesupport (~> 3.2.0)
redis-store (~> 1.1.0)
redis-rack (1.4.4)
rack (~> 1.4.0)
redis-store (~> 1.1.4)
redis-rails (3.2.4)
redis-actionpack (~> 3.2.4)
redis-activesupport (~> 3.2.4)
redis-store (~> 1.1.4)
redis-store (1.1.7)
redis (>= 2.2)
rest-client (2.1.0)
http-accept (>= 1.7.0, < 2.0)
http-cookie (>= 1.0.2, < 2.0)
mime-types (>= 1.16, < 4.0)
netrc (~> 0.8)
rich (1.4.6)
jquery-rails
kaminari
mime-types
paperclip
rack-raw-upload
rails (>= 3.2.0)
sass-rails
rmagick (2.13.4)
ruby-ole (1.2.12.2)
ruby-openid (2.1.8)
rubyzip (1.3.0)
sass (3.7.4)
sass-listen (~> 4.0.0)
sass-listen (4.0.0)
rb-fsevent (~> 0.9, >= 0.9.4)
rb-inotify (~> 0.9, >= 0.9.7)
sass-rails (3.2.6)
railties (~> 3.2.0)
sass (>= 3.1.10)
tilt (~> 1.3)
seems_rateable (1.0.13)
jquery-rails
rails
simple_xlsx_reader (1.0.4)
nokogiri
rubyzip
socksify (1.7.1)
spreadsheet (1.2.4)
ruby-ole (>= 1.0)
sprockets (2.2.3)
hike (~> 1.2)
multi_json (~> 1.0)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
terminal-table (1.8.0)
unicode-display_width (~> 1.1, >= 1.1.1)
test-unit (3.3.4)
power_assert
thor (0.20.3)
thread_safe (0.3.6)
tilt (1.4.1)
treetop (1.4.15)
polyglot
polyglot (>= 0.3.1)
tzinfo (0.3.55)
uglifier (4.2.0)
execjs (>= 0.3.0, < 3)
unf (0.1.4)
unf_ext
unf_ext (0.0.7.6)
unicode-display_width (1.6.0)
virtus (1.0.5)
axiom-types (~> 0.1)
coercible (~> 1.0)
descendants_tracker (~> 0.0, >= 0.0.3)
equalizer (~> 0.0, >= 0.0.9)

PLATFORMS
ruby

DEPENDENCIES
acts-as-taggable-on (= 2.4.1)
ansi
better_errors (~> 1.1.0)
binding_of_caller
builder (= 3.0.0)
certified
chinese_pinyin
coderay (~> 1.1.0)
coffee-rails (~> 3.2.1)
daemons
delayed_job_active_record
elasticsearch-model
elasticsearch-rails
factory_girl_rails
fastercsv (~> 1.5.0)
gitlab!
grack!
grape (~> 0.9.0)
grape-entity (= 0.4.5)
grape-swagger
htmlentities
i18n (~> 0.6.0)
iconv
jenkins_api_client
jquery-rails (~> 2.0.2)
kaminari
mysql2 (= 0.3.18)
net-ldap (~> 0.3.1)
net-ssh (= 2.9.1)
nokogiri
paperclip (~> 3.5.4)
pry-byebug
rack-cors
rack-mini-profiler (~> 0.9.3)
rack-openid
rails (~> 3.2)
rails_kindeditor!
redis-rails
rest-client
rich (= 1.4.6)
rmagick (~> 2.13.1)
ruby-ole
ruby-openid (~> 2.1.4)
rubyzip
sass-rails (~> 3.2.3)
seems_rateable (~> 1.0.13)
simple_xlsx_reader
spreadsheet
test-unit (~> 3.0)
uglifier (>= 1.0.3)
wechat!

BUNDLED WITH
1.17.3

+ 40
- 40
Guardfile View File

@@ -1,40 +1,40 @@
# More info at https://github.com/guard/guard#readme
# guard 'rails' do
# watch('Gemfile.lock')
# watch(%r{^(config|lib)/.*})
# end
#
guard 'spork', :test_unit => true, :test_unit_env => {'RAILS_ENV' => 'test'}, :wait => 60 do
watch(%r{app/models/.+\.rb})
watch('config/application.rb')
watch('config/environment.rb')
watch('config/environments/test.rb')
watch(%r{^config/initializers/.+\.rb$})
watch('Gemfile.lock')
watch('spec/spec_helper.rb') { :rspec }
watch('test/test_helper.rb') { :test_unit }
watch(%r{features/support/}) { :cucumber }
end
guard :test, :drb => true, :all_after_pass => false, :all_on_start => false do
watch(%r{^test/.+_test\.rb$})
watch('test/test_helper.rb') { 'test' }
# Non-rails
watch(%r{^lib/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
# Rails 4
# watch(%r{^app/(.+)\.rb}) { |m| "test/#{m[1]}_test.rb" }
# watch(%r{^app/controllers/application_controller\.rb}) { 'test/controllers' }
# watch(%r{^app/controllers/(.+)_controller\.rb}) { |m| "test/integration/#{m[1]}_test.rb" }
# watch(%r{^app/views/(.+)_mailer/.+}) { |m| "test/mailers/#{m[1]}_mailer_test.rb" }
# watch(%r{^lib/(.+)\.rb}) { |m| "test/lib/#{m[1]}_test.rb" }
# Rails < 4
watch(%r{^app/models/(.+)\.rb$}) { |m| "test/unit/#{m[1]}_test.rb" }
watch(%r{^app/controllers/(.+)\.rb$}) { |m| "test/functional/#{m[1]}_test.rb" }
watch(%r{^app/views/(.+)/.+\.erb$}) { |m| "test/functional/#{m[1]}_controller_test.rb" }
watch(%r{^app/views/.+$}) { 'test/integration' }
watch('app/controllers/application_controller.rb') { ['test/functional', 'test/integration'] }
end
# More info at https://github.com/guard/guard#readme
# guard 'rails' do
# watch('Gemfile.lock')
# watch(%r{^(config|lib)/.*})
# end
#
guard 'spork', :test_unit => true, :test_unit_env => {'RAILS_ENV' => 'test'}, :wait => 60 do
watch(%r{app/models/.+\.rb})
watch('config/application.rb')
watch('config/environment.rb')
watch('config/environments/test.rb')
watch(%r{^config/initializers/.+\.rb$})
watch('Gemfile.lock')
watch('spec/spec_helper.rb') { :rspec }
watch('test/test_helper.rb') { :test_unit }
watch(%r{features/support/}) { :cucumber }
end
guard :test, :drb => true, :all_after_pass => false, :all_on_start => false do
watch(%r{^test/.+_test\.rb$})
watch('test/test_helper.rb') { 'test' }
# Non-rails
watch(%r{^lib/(.+)\.rb$}) { |m| "test/#{m[1]}_test.rb" }
# Rails 4
# watch(%r{^app/(.+)\.rb}) { |m| "test/#{m[1]}_test.rb" }
# watch(%r{^app/controllers/application_controller\.rb}) { 'test/controllers' }
# watch(%r{^app/controllers/(.+)_controller\.rb}) { |m| "test/integration/#{m[1]}_test.rb" }
# watch(%r{^app/views/(.+)_mailer/.+}) { |m| "test/mailers/#{m[1]}_mailer_test.rb" }
# watch(%r{^lib/(.+)\.rb}) { |m| "test/lib/#{m[1]}_test.rb" }
# Rails < 4
watch(%r{^app/models/(.+)\.rb$}) { |m| "test/unit/#{m[1]}_test.rb" }
watch(%r{^app/controllers/(.+)\.rb$}) { |m| "test/functional/#{m[1]}_test.rb" }
watch(%r{^app/views/(.+)/.+\.erb$}) { |m| "test/functional/#{m[1]}_controller_test.rb" }
watch(%r{^app/views/.+$}) { 'test/integration' }
watch('app/controllers/application_controller.rb') { ['test/functional', 'test/integration'] }
end

+ 5
- 5
README.rdoc View File

@@ -1,5 +1,5 @@
= Redmine
Redmine is a flexible project management web application written using Ruby on Rails framework.
More details can be found in the doc directory or on the official website http://www.redmine.org
= Redmine
Redmine is a flexible project management web application written using Ruby on Rails framework.
More details can be found in the doc directory or on the official website http://www.redmine.org

+ 7
- 7
Rakefile View File

@@ -1,7 +1,7 @@
#!/usr/bin/env rake
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
require File.expand_path('../config/application', __FILE__)
RedmineApp::Application.load_tasks
#!/usr/bin/env rake
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
require File.expand_path('../config/application', __FILE__)
RedmineApp::Application.load_tasks

+ 12
- 0
app/api/mobile/api.rb View File

@@ -54,6 +54,17 @@ module Mobile
return User.find(token.user_id) return User.find(token.user_id)
end end
# 通过另外一种方式验证当前用户 username, password
username = params[:username]
password = params[:password]
if username && password
us = UsersService.new
user = us.verify_user username, password
if user != nil
return user
end
end
nil nil
end end
end end
@@ -77,6 +88,7 @@ module Mobile
mount Apis::Resources mount Apis::Resources
mount Apis::Syllabuses mount Apis::Syllabuses
mount Apis::Projects mount Apis::Projects
mount Apis::Blockchains
add_swagger_documentation ({api_version: 'v1', base_path: '/api'}) if Rails.env.development? add_swagger_documentation ({api_version: 'v1', base_path: '/api'}) if Rails.env.development?


+ 60
- 60
app/api/mobile/apis/auth.rb View File

@@ -1,60 +1,60 @@
#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
present :message, "无效的用户名或密码"
present :status,1
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
#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
present :message, "无效的用户名或密码"
present :status,1
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

+ 289
- 0
app/api/mobile/apis/blockchains.rb View File

@@ -0,0 +1,289 @@
#coding=utf-8

module Mobile
module Apis
class Blockchains < Grape::API
resources :blockchains do

desc "创建项目"
params do
requires :username, type: String
requires :reponame, type: String
requires :password, type: String
# requires :genesis_content, type: String # 以太坊过期参数
# requires :network_id, type: Integer
# requires :connect_ip, type: String
# requires :port, type: Integer
# requires :enode, type: String
# requires :node_id, type: String
# user_id, created_at, updated_at需要在程序中创建
end
post 'create' do
authenticate!
ps = ProjectsService.new # 创建项目
user = current_user
status, project = ps.createNewProjectBlockchain params,user
if status == 0
# 表示项目创建成功
# 创建版本库
rs = RepositoriesService.new
params_repository = ActiveSupport::HashWithIndifferentAccess.new(identifier: project.name)
Rails.logger.info("!!!!!!!!!!!!!params_repository is: ")
Rails.logger.info(params_repository)
status, repository = rs.createNewRepoBlockchain project, params_repository
Rails.logger.info("!!!!!!!!!!!!!in line 34 repository identifier is:")
Rails.logger.info(repository.identifier)
gitlab_address = Redmine::Configuration['gitlab_address']
gitUrl = gitlab_address.to_s+"/"+project.owner.to_s+"/"+ repository.identifier + "."+"git"
Rails.logger.info("!!!!!!!!!!!!git url is :" + gitUrl)
gitUrl = Base64.encode64(gitUrl)
if status == 0
bs = BlockchainsService.new
status, blockchain = bs.create_item project, user, params # 创建blockchain item
if status == 0
# 表示插入blockchains表成功了
# bpcs = BlockchainProjectClientsService.new # 删除以太坊过期内容
# status, bpc = bpcs.create_item project, user, params
# if status == 0
# 表示插入blockchain_project_clients表也成功了
present :gitUrl, gitUrl
# end
end
present :status, status # status -1:表示创建失败; 0:表示创建成功
end
end
present :status, status # status -1:表示创建失败; 0:表示创建成功
end

desc "获取用户已经创建的东西"
params do
requires :username, type: String
requires :password, type: String
end
post 'get_already_things' do
authenticate!
bs = BlockchainsService.new
user = current_user
result_hash = bs.get_already_things(user)
present result_hash
end

desc "加入已经创建的项目"
params do
requires :username, type: String
requires :password, type: String
requires :repo_url, type: String
end
post 'join' do
authenticate!
# 根据repo_git_url找到repository对应的项目
rs = RepositoriesService.new
status, project, reponame = rs.findProjectByRepoUrl(params[:repo_url])
if project
blockchain = Blockchain.find_by_project_id(project.id)
if blockchain
{status:status, reponame: reponame} # 去除blockchains表中过期的attributes
else
{status:-1, message: '数据库有问题,blockchain信息不存在'}
end
else
{status:-1, message: '该项目不存在' }
end
end

###
#
# 测试
# ##
desc "测试"
get 'test' do
puts "pause"
end


desc "获取两次代码提交之间的区别"
params do
requires :username, type: String
requires :password, type: String
requires :shaList, type: Array[String]
requires :branch, type: String
requires :ownername, type: String
requires :reponame, type: String
end
post 'getCommitInfo' do
authenticate!
owner = User.find_by_login(params[:ownername])
Rails.logger.info "1111111111111122222222!!!1111111111111111111111111111"
if owner
project = Project.find_by_user_id_name(owner.id, params[:reponame])
if project
g = Gitlab.client # 用于通过gitlab api进行查询
result = []

branch_sha_array = [] # 存储分支branch上所有的commit sha
branch_commits = g.commits(project.gpid, :ref_name => params[:branch]) # 查询branch的所有commit
branch_commits.each do |branch_commit|
branch_sha_array << branch_commit.id
end

modificationLines = 0
Rails.logger.info "111111111111111111111111111111111111111111111111111111"
params[:shaList].each do |sha|
Rails.logger.info project.gpid
commit = g.commit(project.gpid, sha)
if commit
if branch_sha_array.include?(commit.id)
# result << commit
result << true
else
Rails.logger.info "当前的commit不属于这个分支"
result << false # 表示当前的commit不属于这个分支
end
else
result << false
end
Rails.logger.info "222222222222222222222222222222222222222222222"
# add by qiubing start
commit_diff = g.commit_diff(project.gpid, sha)
Rails.logger.info("111111111111111111qiubingqiubing1111111111111111111111111")
(0...commit_diff.length).each do |i|
tempDiff = commit_diff[i]
tempDiffArry = tempDiff.diff.split("\n")
(2...tempDiffArry.length).each do |j|
Rails.logger.info tempDiffArry[j]
if tempDiffArry[j][0] == "+" or tempDiffArry[j][0] == "-"
modificationLines += 1
end
end
end
# add by qiubing end
end
# {status:0, result:result}
Rails.logger.info("ssssssssssssssssssssssssssssssssssssssucess!!!")
Rails.logger.info(0)
Rails.logger.info(result)
Rails.logger.info(modificationLines)
{status:0, result:result, modificationLines:modificationLines}
else
Rails.logger.info("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerror!!!")
Rails.logger.info(1)
Rails.logger.info('the project did\'t exist or has been deleted')
{status:1, message: 'the project did\'t exist or has been deleted' }
end
else
Rails.logger.info("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeerror!!!")
Rails.logger.info(1)
Rails.logger.info('the project did\'t exist or has been deleted')
{status:1, message: 'the project did\'t exist or has been deleted' }
end
end

desc "查询用户哪些客户端已经加入到了项目对应的区块链网络中"
params do
requires :username, type: String
requires :password, type: String
requires :repo_url, type: String
requires :ownername, type: String # 可以选择是通过repo_url来查询project,还是通过ownername, reponame定位project
requires :reponame, type: String
end
post 'getJoinInfo' do
authenticate!
# 根据repo_git_url找到repository对应的项目
rs = RepositoriesService.new
if params[:ownername] != nil and params[:reponame] != nil
owner = User.find_by_login(params[:ownername])
if owner
project = Project.find_by_user_id_name(owner.id, params[:reponame])
node_ids = BlockchainProjectClient.find_by_sql("select node_id from blockchain_project_clients where project_id='#{project.id}' and user_id='#{current_user.id}'").map(&:node_id)
result = {:node_ids => node_ids, :status => status} # 定义变量记录返回值
present result
else
# 表示没有查到用户信息
{status:1, message: '用户不存在'}
end
else # 通过repo_url定位项目信息
status, project, reponame = rs.findProjectByRepoUrl(params[:repo_url])
if status != 0
{status: status, message: '项目的git地址有误'}
else
node_ids = BlockchainProjectClient.find_by_sql("select node_id from blockchain_project_clients where project_id='#{project.id}' and user_id='#{current_user.id}'").map(&:node_id)
result = {:node_ids => node_ids, :status => status} # 定义变量记录返回值
present result
end
end
end

desc "判断client是否已经记录在表中,如果不在则记录"
params do
requires :username, type: String
requires :password, type: String
requires :repo_url, type: String
requires :ownername, type: String # 可以选择是通过repo_url来查询project,还是通过ownername, reponame定位project
requires :reponame, type: String
requires :node_id, type: String
end
post 'judgeAndInsertJoinInfo' do
authenticate!
# 根据repo_git_url找到repository对应的项目
rs = RepositoriesService.new
if params[:ownername] != nil and params[:reponame] != nil
owner = User.find_by_login(params[:ownername])
if owner
project = Project.find_by_user_id_name(owner.id, params[:reponame])
node_ids = BlockchainProjectClient.find_by_sql("select node_id from blockchain_project_clients where project_id='#{project.id}' and user_id='#{current_user.id}'").map(&:node_id)
# 判断node_id是否在node_id列表中
if node_ids.include?(params[:node_id]) == false
bpc = BlockchainProjectClient.new # 不存在,则插入数据库中
bpc.node_id = params[:node_id]
bpc.project_id = project.id
bpc.user_id = current_user.id
bpc.save
{status: 0}
else
{status: 0, message: '当前client已经注册过了'}
end
else
# 表示没有查到用户信息
{status:1, message: '用户不存在'}
end
else # 通过repo_url定位项目信息
status, project, reponame = rs.findProjectByRepoUrl(params[:repo_url])
if status != 0
{status: status, message: '项目的git地址有误'}
else
node_ids = BlockchainProjectClient.find_by_sql("select node_id from blockchain_project_clients where project_id='#{project.id}' and user_id='#{current_user.id}'").map(&:node_id)
# 判断node_id是否在node_id列表中
if node_ids.include?(params[:node_id]) == false
bpc = BlockchainProjectClient.new # 不存在,则插入数据库中
bpc.node_id = params[:node_id]
bpc.project_id = project.id
bpc.user_id = current_user.id
bpc.save
{status: 0}
else
{status: 0, message: '当前client已经注册过了'}
end
end
end
end


desc "判断用户是否注册了Trustie"
params do
requires :username, type: String
requires :password, type: String
end
post 'isRegisteredInTrustie' do
authenticate!
owner = User.find_by_login(params[:ownername])
if owner
{status:0, result:true}
else
{status:0, result:false}
end
end

end
end
end
end

+ 31
- 31
app/api/mobile/apis/blog_comments.rb View File

@@ -1,31 +1,31 @@
#coding=utf-8
module Mobile
module Apis
class BlogComments< Grape::API
resources :blog_comments do
desc "get special topic"
post ':id' do
begin
user = current_user
#0一级回复的更多 1 二级回复的更多
type = params[:type] || 0
page = params[:page] || 0
blog = BlogComment.find params[:id]
present :data, blog, with: Mobile::Entities::BlogComment,user: user,type: type,page: page
present :type, type
present :page, page
present :status, 0
rescue Exception=>e
present :status, -1
present :message, e.message
end
end
end
end
end
end
#coding=utf-8
module Mobile
module Apis
class BlogComments< Grape::API
resources :blog_comments do
desc "get special topic"
post ':id' do
begin
user = current_user
#0一级回复的更多 1 二级回复的更多
type = params[:type] || 0
page = params[:page] || 0
blog = BlogComment.find params[:id]
present :data, blog, with: Mobile::Entities::BlogComment,user: user,type: type,page: page
present :type, type
present :page, page
present :status, 0
rescue Exception=>e
present :status, -1
present :message, e.message
end
end
end
end
end
end

+ 934
- 934
app/api/mobile/apis/courses.rb
File diff suppressed because it is too large
View File


+ 157
- 157
app/api/mobile/apis/homeworks.rb View File

@@ -1,157 +1,157 @@
#coding=utf-8
module Mobile
module Apis
class Homeworks < Grape::API
def self.get_service
HomeworkService.new
end
resources :homeworks do
desc "作业详情"
params do
requires :id, type: Integer, desc: "作业ID"
end
route_param :id do
get do
homework = Homeworks.get_service.show_homework params
present :data, homework, with: Mobile::Entities::Homework
present :status, 0
end
end
desc "我的作品列表"
params do
requires :token, type: String
end
get ':user_id/homework_attachs' do
ue = Homeworks.get_service.my_homework_list params,current_user.nil? ? User.find(2):current_user
present :data, ue,with: Mobile::Entities::Course
present :status, 0
end
# desc "启动匿评"
# params do
# requires :token, type: String
# end
# post ':id/start_anonymous_comment' do
# statue = Homeworks.get_service.start_anonymous_comment params,current_user.nil? ? User.find(2):current_user
# messages = ""
# case statue
# when 1
# messages = "启动成功"
# when 2
# messages = "启动失败,作业总数大于等于2份时才能启动匿评"
# when 3
# messages = "已开启匿评,请务重复开启"
# end
# present :data,messages
# present :status, statue
# end
#
# desc "关闭匿评"
# params do
# requires :token, type: String
# end
# post ':id/stop_anonymous_comment' do
# Homeworks.get_service.stop_anonymous_comment params,current_user.nil? ? User.find(2):current_user
# present :status, 0
# end
desc "匿评作品详情"
params do
requires :token, type: String
end
get ':homework_id/anonymous_works_show' do
works,par = Homeworks.get_service.anonymous_works_show params.merge(:id => params[:homework_id]),current_user.nil? ? User.find(2):current_user
present :data, works ,with: Mobile::Entities::HomeworkAttach
present :otherdata,par,with: Mobile::Entities::AnonymousWorksParams
present :status, 0
end
desc "作品打分"
params do
requires :token, type: String
requires :is_teacher, type: String,desc: '是否为教师(匿评作品详情返回的结果中可获取此参数的值)'
requires :is_anonymous_comments, type: String, desc: '是否为匿评(匿评作品详情返回的结果中可获取此参数的值)'
optional :stars_value, type: Integer,desc: '用户给出的评分'
optional :cur_page,type: Integer,desc: '匿评作品详情返回的结果中可获取此参数的值'
optional :cur_type, type: Integer,desc: '匿评作品详情返回的结果中可获取此参数的值'
optional :user_message, type: String, desc: '用户评论'
end
post ':homework_id/scoring' do
cs_params = {
new_form: params.reject{|k,v| [:token,:is_teacher,:is_anonymous_comments,:stars_value,:cur_page,:cur_type,:homework_id].include?(k)},
token: params[:token],
is_teacher: params[:is_teacher],
is_anonymous_comments: params[:is_anonymous_comments],
stars_value: params[:stars_value],
cur_page: params[:cur_page],
cur_type: params[:cur_type],
homework_id: params[:homework_id]
}
Homeworks.get_service.add_score_and_jour cs_params,current_user
present :status, 0
end
desc '创建作业'
params do
requires :token,type:String
requires :work_name,type:String,desc:'作业名称'
requires :work_desc,type:String,desc:'作业描述'
requires :work_deadline,type:String,desc:'截止日期'
requires :is_blind_appr,type:Integer,desc:'是否匿评'
requires :blind_appr_num,type:Integer,desc:'匿评分配数'
requires :course_id,type:Integer,desc: '课程id'
end
post 'create_home_work' do
Homeworks.get_service.create_home_work params,current_user
present :status, 0
end
desc '开启匿评'
params do
requires :token,type:String
requires :course_id,type:Integer,desc:'课程id'
requires :homework_id,type:Integer,desc:'作业id'
end
post ':homework_id/start_anonymous_comment' do
hs = Homeworks.get_service
status = hs.start_anonymous_comment params,current_user
messages = ""
case status[:status]
when 1
messages = "启动成功"
when 2
messages = "启动失败,作业总数大于等于2份时才能启动匿评"
when 3
messages = "已开启匿评,请务重复开启"
when 4
messages = "没有开启匿评的权限"
when 5
messages = "截止日期之前不可启动匿评"
end
present :data,messages
present :status,0
end
desc '关闭匿评'
params do
requires :token,type:String
requires :course_id,type:Integer,desc:'课程id'
requires :homework_id,type:Integer,desc:'作业id'
end
post ':homework_id/stop_anonymous_comment' do
hs = Homeworks.get_service
hs.stop_anonymous_comment params,current_user
message = "成功关闭"
present :data, message
present :status,0
end
end
end
end
end
#coding=utf-8
module Mobile
module Apis
class Homeworks < Grape::API
def self.get_service
HomeworkService.new
end
resources :homeworks do
desc "作业详情"
params do
requires :id, type: Integer, desc: "作业ID"
end
route_param :id do
get do
homework = Homeworks.get_service.show_homework params
present :data, homework, with: Mobile::Entities::Homework
present :status, 0
end
end
desc "我的作品列表"
params do
requires :token, type: String
end
get ':user_id/homework_attachs' do
ue = Homeworks.get_service.my_homework_list params,current_user.nil? ? User.find(2):current_user
present :data, ue,with: Mobile::Entities::Course
present :status, 0
end
# desc "启动匿评"
# params do
# requires :token, type: String
# end
# post ':id/start_anonymous_comment' do
# statue = Homeworks.get_service.start_anonymous_comment params,current_user.nil? ? User.find(2):current_user
# messages = ""
# case statue
# when 1
# messages = "启动成功"
# when 2
# messages = "启动失败,作业总数大于等于2份时才能启动匿评"
# when 3
# messages = "已开启匿评,请务重复开启"
# end
# present :data,messages
# present :status, statue
# end
#
# desc "关闭匿评"
# params do
# requires :token, type: String
# end
# post ':id/stop_anonymous_comment' do
# Homeworks.get_service.stop_anonymous_comment params,current_user.nil? ? User.find(2):current_user
# present :status, 0
# end
desc "匿评作品详情"
params do
requires :token, type: String
end
get ':homework_id/anonymous_works_show' do
works,par = Homeworks.get_service.anonymous_works_show params.merge(:id => params[:homework_id]),current_user.nil? ? User.find(2):current_user
present :data, works ,with: Mobile::Entities::HomeworkAttach
present :otherdata,par,with: Mobile::Entities::AnonymousWorksParams
present :status, 0
end
desc "作品打分"
params do
requires :token, type: String
requires :is_teacher, type: String,desc: '是否为教师(匿评作品详情返回的结果中可获取此参数的值)'
requires :is_anonymous_comments, type: String, desc: '是否为匿评(匿评作品详情返回的结果中可获取此参数的值)'
optional :stars_value, type: Integer,desc: '用户给出的评分'
optional :cur_page,type: Integer,desc: '匿评作品详情返回的结果中可获取此参数的值'
optional :cur_type, type: Integer,desc: '匿评作品详情返回的结果中可获取此参数的值'
optional :user_message, type: String, desc: '用户评论'
end
post ':homework_id/scoring' do
cs_params = {
new_form: params.reject{|k,v| [:token,:is_teacher,:is_anonymous_comments,:stars_value,:cur_page,:cur_type,:homework_id].include?(k)},
token: params[:token],
is_teacher: params[:is_teacher],
is_anonymous_comments: params[:is_anonymous_comments],
stars_value: params[:stars_value],
cur_page: params[:cur_page],
cur_type: params[:cur_type],
homework_id: params[:homework_id]
}
Homeworks.get_service.add_score_and_jour cs_params,current_user
present :status, 0
end
desc '创建作业'
params do
requires :token,type:String
requires :work_name,type:String,desc:'作业名称'
requires :work_desc,type:String,desc:'作业描述'
requires :work_deadline,type:String,desc:'截止日期'
requires :is_blind_appr,type:Integer,desc:'是否匿评'
requires :blind_appr_num,type:Integer,desc:'匿评分配数'
requires :course_id,type:Integer,desc: '课程id'
end
post 'create_home_work' do
Homeworks.get_service.create_home_work params,current_user
present :status, 0
end
desc '开启匿评'
params do
requires :token,type:String
requires :course_id,type:Integer,desc:'课程id'
requires :homework_id,type:Integer,desc:'作业id'
end
post ':homework_id/start_anonymous_comment' do
hs = Homeworks.get_service
status = hs.start_anonymous_comment params,current_user
messages = ""
case status[:status]
when 1
messages = "启动成功"
when 2
messages = "启动失败,作业总数大于等于2份时才能启动匿评"
when 3
messages = "已开启匿评,请务重复开启"
when 4
messages = "没有开启匿评的权限"
when 5
messages = "截止日期之前不可启动匿评"
end
present :data,messages
present :status,0
end
desc '关闭匿评'
params do
requires :token,type:String
requires :course_id,type:Integer,desc:'课程id'
requires :homework_id,type:Integer,desc:'作业id'
end
post ':homework_id/stop_anonymous_comment' do
hs = Homeworks.get_service
hs.stop_anonymous_comment params,current_user
message = "成功关闭"
present :data, message
present :status,0
end
end
end
end
end

+ 321
- 321
app/api/mobile/apis/new_comment.rb View File

@@ -1,321 +1,321 @@
#coding=utf-8
module Mobile
module Apis
class NewComment< Grape::API
include ApplicationHelper
include ApiHelper
resources :new_comment do
desc "add a new comment"
params do
requires :type, type: String
requires :content, type: String
end
post ':id' do
unless current_user
#如果当前用户不存在 则需要根据微信昵称注册一个帐号
openid = session[:wechat_openid]
raise "无法获取到openid,请在微信中打开本页面" unless openid
us = UsersService.new
access_token = session[:access_token]
refresh_token = session[:refresh_token]
if access_token.present? && refresh_token.present?
begin
refreshinfo = Wechat.api.web_refresh_access_token(refresh_token)
rescue
info = Wechat.api.web_access_token(session[:wechat_code])
openid =info["openid"]
access_token =info["access_token"]
if access_token
session[:access_token] = access_token
end
refresh_token = info["refresh_token"]
if refresh_token
session[:refresh_token] = refresh_token
end
refreshinfo = Wechat.api.web_refresh_access_token(refresh_token)
end
access_token = refreshinfo["access_token"]
refresh_token = refreshinfo["refresh_token"]
session[:access_token] = access_token
session[:refresh_token] = refresh_token
#获取用户信息
userinfo = Wechat.api.web_userinfo(access_token,openid)
Rails.logger.info "userinfo!!!!!!!!!"
Rails.logger.info userinfo
name = userinfo["nickname"]
else
name = openid[0..3]+"***"+openid.last
end
user = us.register ({:login=>openid, :mail=>"#{openid}@163.com",
:password=>"12345678", :password_confirmation=>"12345678",
:should_confirmation_password => true})
raise user.errors.full_messages.first if user.new_record?
user.update_attributes(:lastname=>name)
#自动激活
if Setting.self_registration != '3'
user.activate
user.last_login_on = Time.now
if user.save
UserStatus.create(:user_id => user.id, :changsets_count => 0, :watchers_count => 0)
end
end
UserWechat.create!(
openid: openid,
user: user,
bindtype: 1
)
end
authenticate!
## 能进来的就是已关注
## 因为取消订阅的记录被删除了
subscribe = 1 #默认未关注
status = 0
tip = 0 #0班级1项目
type = params[:type]
result = 1
#0回复 1回复的回复
reply_type = params[:reply_type]
update_id = 0
if params[:content]!="" && current_user
case type
when "HomeworkCommon"
#如果是私有的 并且不是成员则不能回复
# is_public = homework_common.course.is_public
# if is_public == 0 && !current_user.member_of_course?(homework_common.course)
# status = -1
# tip = 0
# else
# feedback = HomeworkCommon.add_homework_jour(current_user, params[:content], params[:id])
# if (feedback.errors.empty?)
# homework_common.update_column(:updated_at, Time.now)
# result = 2
# end
# end
if reply_type == nil || reply_type == 0
homework_common = HomeworkCommon.find(params[:id])
feedback = HomeworkCommon.add_homework_jour(current_user, params[:content], params[:id], params[:id])
if (feedback.errors.empty?)
homework_common.update_column(:updated_at, Time.now)
result = 2
update_id = homework_common.id
end
else
#二级回复
reply = JournalsForMessage.find params[:id].to_i
homework_common = HomeworkCommon.find reply.jour_id
options = {:notes => params[:content], :reply_id => reply.user_id,:user_id => current_user.id,:m_parent_id => params[:id].to_i,:m_reply_id => params[:id].to_i}
feedback = HomeworkCommon.add_homework_jour(current_user, params[:content], reply.jour_id, reply.jour_id, options)
if (feedback.errors.empty?)
homework_common.update_column(:updated_at, Time.now)
result = 2
update_id = homework_common.id
end
end
when "News"
# if news.project
# if news.project.is_public == false && !current_user.member_of?(news.project)
# status = -1
# tip = 1
# end
# elsif news.course
# if news.course.is_public == 0 && !current_user.member_of_course?(news.course)
# status = -1
# tip = 0
# end
# end
if status == 0
if reply_type == nil || reply_type == 0
news = News.find(params[:id])
comment = Comment.new
comment.comments = params[:content]
comment.author = current_user
if news.comments << comment
result = 2
update_id = news.id
end
else
#二级回复
comment = Comment.find(params[:id])
news = News.find comment.commented_id
new_comment = news.comments.build(:author_id => current_user.id, :reply_id => params[:id], :comments => params[:content], :parent_id => comment.id)
if new_comment.save
result = 2
update_id = news.id
end
end
end
when "Message"
# if message.project
# if message.project.is_public == false && !current_user.member_of?(message.project)
# status = -1
# tip = 1
# end
# elsif message.course
# if message.course.is_public == 0 && !current_user.member_of_course?(message.course)
# status = -1
# tip = 0
# end
# end
if status == 0
# if reply_type == nil || reply_type == 0
message = Message.find(params[:id])
board = Board.find(message.board_id)
topic = message.root
reply = Message.new
reply.author = current_user
reply.board = board
reply.content = params[:content]
reply.parent_id = params[:id]
reply.subject = "RE: #{topic.subject}"
reply.root_id = topic.id
if message.children << reply
result = 2
update_id = topic.id
end
# else
#二级回复
# end
end
when "JournalsForMessage"
# if jour.jour_type == "Project"
# if jour.project.is_public == false && !current_user.member_of?(jour.project)
# status = -1
# tip = 1
# end
# elsif jour.jour_type == "Course"
# if jour.course.is_public == 0 && !current_user.member_of_course?(jour.course)
# status = -1
# tip = 0
# end
# end
if status == 0
# if reply_type == nil || reply_type == 0
jour = JournalsForMessage.find(params[:id]).root
parent_id = params[:id]
author_id = current_user.id
reply_user_id = jour.user_id
reply_id = params[:id]
content = params[:content]
options = {:user_id => author_id,
:status => true,
:m_parent_id => parent_id,
:m_reply_id => reply_id,
:reply_id => reply_user_id,
:root_id => jour.id,
:notes => content,
:is_readed => false}
jfm = jour.user.add_jour(nil, nil, nil, options)
if jfm.errors.empty?
(JournalsForMessage.find parent_id).update_attribute(:updated_on,Time.now)
result = 2
update_id = jour.id
end
# else
#二级回复
# end
end
when 'Issue'
# if issue.project.is_public == false && !current_user.member_of?(issue.project)
# status = -1
# tip = 1
# end
if status == 0
if reply_type == nil || reply_type == 0
issue = Issue.find params[:id]
is_jour = Journal.new
is_jour.user_id = current_user.id
is_jour.notes = params[:content]
is_jour.journalized = issue
if is_jour.save
result = 2
update_id = issue.id
end
else
#二级回复
jour = Journal.find(params[:id])
issue = jour.journalized
is_jour = Journal.new
is_jour.user_id = current_user.id
is_jour.notes = params[:content]
is_jour.reply_id = params[:id]
is_jour.parent_id = params[:id]
is_jour.journalized = issue
if is_jour.save
result = 2
update_id = issue.id
end
end
end
when 'BlogComment'
if reply_type == nil || reply_type == 0
blog = BlogComment.find(params[:id]).root
blogComment = BlogComment.new
blogComment.author = current_user
blogComment.blog = blog.blog
blogComment.content = params[:content]
blogComment.title = "RE: #{blog.title}"
blogComment.root_id = blog.id
if blog.children << blogComment
result = 2
update_id = blog.id
end
else
#二级回复
blog = BlogComment.find(params[:id]).root
blogComment = BlogComment.new
blogComment.author = current_user
blogComment.blog = blog.blog
blogComment.content = params[:content]
blogComment.title = "RE: #{blog.title}"
parent = BlogComment.find params[:id]
blogComment.parent_id = params[:id] #被回复的回复
blogComment.reply_id = parent.author.id #被回复者id
blogComment.root_id = blog.id
if parent.children << blogComment
result = 2
update_id = blog.id
end
end
end
if result == 2
update_course_activity_api(type,update_id)
update_user_activity_api(type,update_id)
update_org_activity_api(type,update_id)
update_forge_activity_api(type,update_id)
update_principal_activity_api(type,update_id)
end
else
result = 3
end
present :result, result
present :status, status
present :act_id, update_id
present :tip, tip
present :subscribe,subscribe
end
end
end
end
end
#coding=utf-8
module Mobile
module Apis
class NewComment< Grape::API
include ApplicationHelper
include ApiHelper
resources :new_comment do
desc "add a new comment"
params do
requires :type, type: String
requires :content, type: String
end
post ':id' do
unless current_user
#如果当前用户不存在 则需要根据微信昵称注册一个帐号
openid = session[:wechat_openid]
raise "无法获取到openid,请在微信中打开本页面" unless openid
us = UsersService.new
access_token = session[:access_token]
refresh_token = session[:refresh_token]
if access_token.present? && refresh_token.present?
begin
refreshinfo = Wechat.api.web_refresh_access_token(refresh_token)
rescue
info = Wechat.api.web_access_token(session[:wechat_code])
openid =info["openid"]
access_token =info["access_token"]
if access_token
session[:access_token] = access_token
end
refresh_token = info["refresh_token"]
if refresh_token
session[:refresh_token] = refresh_token
end
refreshinfo = Wechat.api.web_refresh_access_token(refresh_token)
end
access_token = refreshinfo["access_token"]
refresh_token = refreshinfo["refresh_token"]
session[:access_token] = access_token
session[:refresh_token] = refresh_token
#获取用户信息
userinfo = Wechat.api.web_userinfo(access_token,openid)
Rails.logger.info "userinfo!!!!!!!!!"
Rails.logger.info userinfo
name = userinfo["nickname"]
else
name = openid[0..3]+"***"+openid.last
end
user = us.register ({:login=>openid, :mail=>"#{openid}@163.com",
:password=>"12345678", :password_confirmation=>"12345678",
:should_confirmation_password => true})
raise user.errors.full_messages.first if user.new_record?
user.update_attributes(:lastname=>name)
#自动激活
if Setting.self_registration != '3'
user.activate
user.last_login_on = Time.now
if user.save
UserStatus.create(:user_id => user.id, :changsets_count => 0, :watchers_count => 0)
end
end
UserWechat.create!(
openid: openid,
user: user,
bindtype: 1
)
end
authenticate!
## 能进来的就是已关注
## 因为取消订阅的记录被删除了
subscribe = 1 #默认未关注
status = 0
tip = 0 #0班级1项目
type = params[:type]
result = 1
#0回复 1回复的回复
reply_type = params[:reply_type]
update_id = 0
if params[:content]!="" && current_user
case type
when "HomeworkCommon"
#如果是私有的 并且不是成员则不能回复
# is_public = homework_common.course.is_public
# if is_public == 0 && !current_user.member_of_course?(homework_common.course)
# status = -1
# tip = 0
# else
# feedback = HomeworkCommon.add_homework_jour(current_user, params[:content], params[:id])
# if (feedback.errors.empty?)
# homework_common.update_column(:updated_at, Time.now)
# result = 2
# end
# end
if reply_type == nil || reply_type == 0
homework_common = HomeworkCommon.find(params[:id])
feedback = HomeworkCommon.add_homework_jour(current_user, params[:content], params[:id], params[:id])
if (feedback.errors.empty?)
homework_common.update_column(:updated_at, Time.now)
result = 2
update_id = homework_common.id
end
else
#二级回复
reply = JournalsForMessage.find params[:id].to_i
homework_common = HomeworkCommon.find reply.jour_id
options = {:notes => params[:content], :reply_id => reply.user_id,:user_id => current_user.id,:m_parent_id => params[:id].to_i,:m_reply_id => params[:id].to_i}
feedback = HomeworkCommon.add_homework_jour(current_user, params[:content], reply.jour_id, reply.jour_id, options)
if (feedback.errors.empty?)
homework_common.update_column(:updated_at, Time.now)
result = 2
update_id = homework_common.id
end
end
when "News"
# if news.project
# if news.project.is_public == false && !current_user.member_of?(news.project)
# status = -1
# tip = 1
# end
# elsif news.course
# if news.course.is_public == 0 && !current_user.member_of_course?(news.course)
# status = -1
# tip = 0
# end
# end
if status == 0
if reply_type == nil || reply_type == 0
news = News.find(params[:id])
comment = Comment.new
comment.comments = params[:content]
comment.author = current_user
if news.comments << comment
result = 2
update_id = news.id
end
else
#二级回复
comment = Comment.find(params[:id])
news = News.find comment.commented_id
new_comment = news.comments.build(:author_id => current_user.id, :reply_id => params[:id], :comments => params[:content], :parent_id => comment.id)
if new_comment.save
result = 2
update_id = news.id
end
end
end
when "Message"
# if message.project
# if message.project.is_public == false && !current_user.member_of?(message.project)
# status = -1
# tip = 1
# end
# elsif message.course
# if message.course.is_public == 0 && !current_user.member_of_course?(message.course)
# status = -1
# tip = 0
# end
# end
if status == 0
# if reply_type == nil || reply_type == 0
message = Message.find(params[:id])
board = Board.find(message.board_id)
topic = message.root
reply = Message.new
reply.author = current_user
reply.board = board
reply.content = params[:content]
reply.parent_id = params[:id]
reply.subject = "RE: #{topic.subject}"
reply.root_id = topic.id
if message.children << reply
result = 2
update_id = topic.id
end
# else
#二级回复
# end
end
when "JournalsForMessage"
# if jour.jour_type == "Project"
# if jour.project.is_public == false && !current_user.member_of?(jour.project)
# status = -1
# tip = 1
# end
# elsif jour.jour_type == "Course"
# if jour.course.is_public == 0 && !current_user.member_of_course?(jour.course)
# status = -1
# tip = 0
# end
# end
if status == 0
# if reply_type == nil || reply_type == 0
jour = JournalsForMessage.find(params[:id]).root
parent_id = params[:id]
author_id = current_user.id
reply_user_id = jour.user_id
reply_id = params[:id]
content = params[:content]
options = {:user_id => author_id,
:status => true,
:m_parent_id => parent_id,
:m_reply_id => reply_id,
:reply_id => reply_user_id,
:root_id => jour.id,
:notes => content,
:is_readed => false}
jfm = jour.user.add_jour(nil, nil, nil, options)
if jfm.errors.empty?
(JournalsForMessage.find parent_id).update_attribute(:updated_on,Time.now)
result = 2
update_id = jour.id
end
# else
#二级回复
# end
end
when 'Issue'
# if issue.project.is_public == false && !current_user.member_of?(issue.project)
# status = -1
# tip = 1
# end
if status == 0
if reply_type == nil || reply_type == 0
issue = Issue.find params[:id]
is_jour = Journal.new
is_jour.user_id = current_user.id
is_jour.notes = params[:content]
is_jour.journalized = issue
if is_jour.save
result = 2
update_id = issue.id
end
else
#二级回复
jour = Journal.find(params[:id])
issue = jour.journalized
is_jour = Journal.new
is_jour.user_id = current_user.id
is_jour.notes = params[:content]
is_jour.reply_id = params[:id]
is_jour.parent_id = params[:id]
is_jour.journalized = issue
if is_jour.save
result = 2
update_id = issue.id
end
end
end
when 'BlogComment'
if reply_type == nil || reply_type == 0
blog = BlogComment.find(params[:id]).root
blogComment = BlogComment.new
blogComment.author = current_user
blogComment.blog = blog.blog
blogComment.content = params[:content]
blogComment.title = "RE: #{blog.title}"
blogComment.root_id = blog.id
if blog.children << blogComment
result = 2
update_id = blog.id
end
else
#二级回复
blog = BlogComment.find(params[:id]).root
blogComment = BlogComment.new
blogComment.author = current_user
blogComment.blog = blog.blog
blogComment.content = params[:content]
blogComment.title = "RE: #{blog.title}"
parent = BlogComment.find params[:id]
blogComment.parent_id = params[:id] #被回复的回复
blogComment.reply_id = parent.author.id #被回复者id
blogComment.root_id = blog.id
if parent.children << blogComment
result = 2
update_id = blog.id
end
end
end
if result == 2
update_course_activity_api(type,update_id)
update_user_activity_api(type,update_id)
update_org_activity_api(type,update_id)
update_forge_activity_api(type,update_id)
update_principal_activity_api(type,update_id)
end
else
result = 3
end
present :result, result
present :status, status
present :act_id, update_id
present :tip, tip
present :subscribe,subscribe
end
end
end
end
end

+ 41
- 41
app/api/mobile/apis/praise.rb View File

@@ -1,42 +1,42 @@
#coding=utf-8
module Mobile
module Apis
class Praise< Grape::API
include ApiHelper
resources :praise do
desc "praise an activity"
params do
requires :type, type: String
requires :token, type: String
end
post ':id' do
authenticate!
obj_id = params[:id]
obj_type = params[:type]
user = current_user
pts = PraiseTread.where("praise_tread_object_id=? and praise_tread_object_type=? and user_id=?",obj_id,obj_type.to_s,user.id).first
if pts.blank?
praise_or_cancel(obj_type,obj_id,user,1)
obj = PraiseTreadCache.where("object_id=? and object_type=?",obj_id,obj_type.to_s).first
num = get_activity_praise_num(obj) if !obj.blank?
else
pts.destroy if !pts.blank?
#再更新praise_tread_cache表 使相应的记录减1 当为0时删除
ptc = PraiseTreadCache.where("object_id=? and object_type=?",obj_id,obj_type.to_s).first
ptc.praise_minus(1) if !ptc.blank?
if ptc.praise_num == 0
ptc.delete
end
obj = PraiseTreadCache.where("object_id=? and object_type=?",obj_id,obj_type.to_s).first
num = !obj.blank? ? get_activity_praise_num(obj) : 0
end
present :data, num
present :status, 0
end
end
end
end
#coding=utf-8
module Mobile
module Apis
class Praise< Grape::API
include ApiHelper
resources :praise do
desc "praise an activity"
params do
requires :type, type: String
requires :token, type: String
end
post ':id' do
authenticate!
obj_id = params[:id]
obj_type = params[:type]
user = current_user
pts = PraiseTread.where("praise_tread_object_id=? and praise_tread_object_type=? and user_id=?",obj_id,obj_type.to_s,user.id).first
if pts.blank?
praise_or_cancel(obj_type,obj_id,user,1)
obj = PraiseTreadCache.where("object_id=? and object_type=?",obj_id,obj_type.to_s).first
num = get_activity_praise_num(obj) if !obj.blank?
else
pts.destroy if !pts.blank?
#再更新praise_tread_cache表 使相应的记录减1 当为0时删除
ptc = PraiseTreadCache.where("object_id=? and object_type=?",obj_id,obj_type.to_s).first
ptc.praise_minus(1) if !ptc.blank?
if ptc.praise_num == 0
ptc.delete
end
obj = PraiseTreadCache.where("object_id=? and object_type=?",obj_id,obj_type.to_s).first
num = !obj.blank? ? get_activity_praise_num(obj) : 0
end
present :data, num
present :status, 0
end
end
end
end
end end

+ 349
- 349
app/api/mobile/apis/projects.rb View File

@@ -1,350 +1,350 @@
#coding=utf-8
module Mobile
module Apis
class Projects < Grape::API
resources :projects do
desc "获取项目列表"
params do
requires :token, type: String
end
get do
authenticate!
ps = ProjectsService.new
projects = ps.user_projects(current_user)
present :data, projects, with: Mobile::Entities::Project,user: current_user
present :status, 0
end
desc "返回单个项目"
params do
requires :id, type: Integer
requires :token,type:String
end
route_param :id do
get do
# course = Course.find(params[:id])
ps = ProjectsService.new
project = ps.show_project(params,current_user)
if project[:status] == 9
{status:-1, message: '该项目不存在或已被删除啦' }
else
present :data, project, with: Mobile::Entities::Project,user: current_user
present :status, 0
end
end
end
desc "获取项目动态"
params do
requires :id, type: Integer
requires :token, type: String
end
post 'activities' do
authenticate!
user = current_user
project_types = "('Message','Issue','Project')"
activities = UserActivity.where("(container_type = 'Project' and container_id = #{params[:id]} and act_type in #{project_types})").order('updated_at desc')
page = params[:page] ? params[:page] : 0
all_count = activities.count
activities = activities.limit(10).offset(page * 10)
count = activities.count
present :data, activities, with: Mobile::Entities::Activity,user: user
present :all_count, all_count
present :count, count
present :page, page
present :status, 0
end
desc "获取项目成员"
params do
requires :id, type: Integer
requires :token, type: String
end
post 'members' do
authenticate!
project = Project.find("#{params[:id]}")
members = project.member_principals
master_members = project.member_principals.includes(:roles, :principal).where("member_roles.role_id=3").all.sort
master_members.each do |m|
if m.user_id == project.user_id
master_members.delete(m)
master_members.insert(0,m)
break
end
end
develop_members = project.member_principals.includes(:roles, :principal).where("member_roles.role_id=4").all.sort
report_members = project.member_principals.includes(:roles, :principal).where("member_roles.role_id=5").all.sort
review_master_members = []
review_develop_members = []
my_member = project.member_principals.where("users.id=#{current_user.id}").first
if my_member && my_member.roles[0] && my_member.roles[0].id == 3
ps = ProjectsService.new
user = current_user
review_master_members = ps.get_project_review_members(project,3,user)
review_develop_members = ps.get_project_review_members(project,4,user)
end
present :master_members,master_members, with: Mobile::Entities::ProjectMember
present :develop_members,develop_members, with: Mobile::Entities::ProjectMember
present :report_members,report_members, with: Mobile::Entities::ProjectMember
present :review_master_members,review_master_members
present :review_develop_members,review_develop_members
present :status, 0
end
desc "获取项目某成员角色信息"
params do
requires :id, type: Integer
requires :token, type: String
requires :user_id, type: Integer
end
post 'get_member_info' do
authenticate!
project = Project.find("#{params[:id]}")
my_member = project.member_principals.where("users.id=#{params[:user_id]}").first
if my_member && my_member.roles[0]
present :project_id,params[:id]
present :user_id,params[:user_id]
present :member_info,my_member, with: Mobile::Entities::ProjectMember
present :status, 0
else
present :status, -1
present :message, "该用户已不在项目中"
end
end
desc "修改项目某成员角色信息"
params do
requires :id, type: Integer
requires :token, type: String
requires :user_id, type: Integer
requires :role_id, type: Integer
end
post 'edit_member_role' do
authenticate!
project = Project.find("#{params[:id]}")
my_member = project.member_principals.where("users.id=#{current_user.id}").first
#3管理 4开发 5报告
if !(my_member && my_member.roles[0] && my_member.roles[0].id == 3 ) || project.user_id == params[:user_id] || !(params[:role_id] == 3 || params[:role_id] == 4 || params[:role_id] == 5)
present :status, -1
else
ps = ProjectsService.new
status = ps.modify_user_project_role params
present :status, status
end
end
desc "新建项目"
params do
requires :token, type: String
requires :name, type: String, desc: '项目名称'
end
post 'create' do
authenticate!
ps = ProjectsService.new
status = ps.createNewProject params,current_user
present :status, 0
end
desc "加入项目"
params do
requires :token, type: String
requires :invite_code, type: String, desc: '邀请码'
requires :role_id, type: Integer, desc: '身份'
end
post "join_project" do
authenticate!
role_id = params[:role_id]
if role_id != 3 && role_id != 4 && role_id != 5
{status:-1,message:"请至少选择一个角色"}
else
ps = ProjectsService.new
status = ps.join_project({role: role_id, openid: params[:openid], invite_code: params[:invite_code]}, current_user)
{status:status, message:ProjectsService::JoinProjectError.message(status)}
end
# {status:-1, message: '该功能将在近日开放,敬请期待!' }
end
desc "项目单个未审核用户信息"
params do
requires :token, type: String
requires :project_id, type: Integer, desc: "项目id"
requires :user_id, type: Integer, desc: "用户id"
end
post 'review_member_info' do
authenticate!
ps = ProjectsService.new
result = ps.get_reviewer_info(params,current_user)
present :data, result[:reviewer], with: Mobile::Entities::User
present :status, result[:status]
end
desc "处理管理或开发的身份申请"
params do
requires :token, type: String
requires :project_id, type: Integer, desc: "项目id"
requires :user_id, type: Integer, desc: "用户id"
requires :type, type: Integer, desc: "同意或拒绝"
end
post 'deal_join_apply' do
authenticate!
ps = ProjectsService.new
result = ps.deal_join_apply(params,current_user)
present :status, result[:status]
present :message, result[:message]
end
desc "发布项目帖子"
params do
requires :id, type: Integer
requires :token, type: String
requires :text, type: String
end
post ':id/publishnote' do
authenticate!
project = Project.find("#{params[:id]}")
boards = project.boards.includes(:last_message => :author).all
if project.boards.empty?
board = project.boards.build
board.name = "项目讨论区"
board.description = project.name.to_s
board.course_id = -1
if board.save
boards = project.boards.includes(:last_message => :author).all
end
end
board = boards.first
message = Message.new
message.author = current_user
message.board = board
tmpparams = {}
tmpparams['subject'] = params[:title]
tmpparams['content'] = params[:text]
message.safe_attributes = tmpparams
message.save!
present :status, 0
end
desc "删除项目成员"
params do
requires :id, type: Integer
requires :token, type: String
requires :user_id, type: Integer
end
post ':id/deletemember' do
authenticate!
status = -1
if(current_user.id != params[:user_id].to_i)
#权限
project = Project.find("#{params[:id]}")
if project.user_id != params[:user_id].to_i
my_member = project.member_principals.where("users.id=#{current_user.id}").first
roles_ids = []
my_member.roles.each do |role|
roles_ids << role.id
end
if my_member && roles_ids.include?(3)
#删除该成员
ps = ProjectsService.new
status = ps.project_delete_member(project,params[:user_id].to_i,current_user)
else
status = -2
end
else
status = -3
end
else
status = -4
end
out = {status: status}
message = case status
when 0; "删除成功"
when 1; "该用户不在该项目中"
when -1; "您还未登录"
when -2; "您没有权限"
when -3; "不能删除项目创建者"
when -4; "不能删除自己"
else; "未知错误,请稍后再试"
end
out.merge(message: message)
end
desc "退出项目"
params do
requires :id, type: Integer
requires :token, type: String
end
post ':id/quit' do
authenticate!
project = Project.find("#{params[:id]}")
ps = ProjectsService.new
status = ps.exit_project(project,current_user)
out = {status: status}
message = case status
when 0; "退出项目成功"
when -3; "您不是该项目成员"
when -1; "您还未登录"
when -2; "项目创建者不能退出项目"
else; "未知错误,请稍后再试"
end
out.merge(message: message)
end
end
end
end
#coding=utf-8
module Mobile
module Apis
class Projects < Grape::API
resources :projects do
desc "获取项目列表"
params do
requires :token, type: String
end
get do
authenticate!
ps = ProjectsService.new
projects = ps.user_projects(current_user)
present :data, projects, with: Mobile::Entities::Project,user: current_user
present :status, 0
end
desc "返回单个项目"
params do
requires :id, type: Integer
requires :token,type:String
end
route_param :id do
get do
# course = Course.find(params[:id])
ps = ProjectsService.new
project = ps.show_project(params,current_user)
if project[:status] == 9
{status:-1, message: '该项目不存在或已被删除啦' }
else
present :data, project, with: Mobile::Entities::Project,user: current_user
present :status, 0
end
end
end
desc "获取项目动态"
params do
requires :id, type: Integer
requires :token, type: String
end
post 'activities' do
authenticate!
user = current_user
project_types = "('Message','Issue','Project')"
activities = UserActivity.where("(container_type = 'Project' and container_id = #{params[:id]} and act_type in #{project_types})").order('updated_at desc')
page = params[:page] ? params[:page] : 0
all_count = activities.count
activities = activities.limit(10).offset(page * 10)
count = activities.count
present :data, activities, with: Mobile::Entities::Activity,user: user
present :all_count, all_count
present :count, count
present :page, page
present :status, 0
end
desc "获取项目成员"
params do
requires :id, type: Integer
requires :token, type: String
end
post 'members' do
authenticate!
project = Project.find("#{params[:id]}")
members = project.member_principals
master_members = project.member_principals.includes(:roles, :principal).where("member_roles.role_id=3").all.sort
master_members.each do |m|
if m.user_id == project.user_id
master_members.delete(m)
master_members.insert(0,m)
break
end
end
develop_members = project.member_principals.includes(:roles, :principal).where("member_roles.role_id=4").all.sort
report_members = project.member_principals.includes(:roles, :principal).where("member_roles.role_id=5").all.sort
review_master_members = []
review_develop_members = []
my_member = project.member_principals.where("users.id=#{current_user.id}").first
if my_member && my_member.roles[0] && my_member.roles[0].id == 3
ps = ProjectsService.new
user = current_user
review_master_members = ps.get_project_review_members(project,3,user)
review_develop_members = ps.get_project_review_members(project,4,user)
end
present :master_members,master_members, with: Mobile::Entities::ProjectMember
present :develop_members,develop_members, with: Mobile::Entities::ProjectMember
present :report_members,report_members, with: Mobile::Entities::ProjectMember
present :review_master_members,review_master_members
present :review_develop_members,review_develop_members
present :status, 0
end
desc "获取项目某成员角色信息"
params do
requires :id, type: Integer
requires :token, type: String
requires :user_id, type: Integer
end
post 'get_member_info' do
authenticate!
project = Project.find("#{params[:id]}")
my_member = project.member_principals.where("users.id=#{params[:user_id]}").first
if my_member && my_member.roles[0]
present :project_id,params[:id]
present :user_id,params[:user_id]
present :member_info,my_member, with: Mobile::Entities::ProjectMember
present :status, 0
else
present :status, -1
present :message, "该用户已不在项目中"
end
end
desc "修改项目某成员角色信息"
params do
requires :id, type: Integer
requires :token, type: String
requires :user_id, type: Integer
requires :role_id, type: Integer
end
post 'edit_member_role' do
authenticate!
project = Project.find("#{params[:id]}")
my_member = project.member_principals.where("users.id=#{current_user.id}").first
#3管理 4开发 5报告
if !(my_member && my_member.roles[0] && my_member.roles[0].id == 3 ) || project.user_id == params[:user_id] || !(params[:role_id] == 3 || params[:role_id] == 4 || params[:role_id] == 5)
present :status, -1
else
ps = ProjectsService.new
status = ps.modify_user_project_role params
present :status, status
end
end
desc "新建项目"
params do
requires :token, type: String
requires :name, type: String, desc: '项目名称'
end
post 'create' do
authenticate!
ps = ProjectsService.new
status = ps.createNewProject params,current_user
present :status, 0
end
desc "加入项目"
params do
requires :token, type: String
requires :invite_code, type: String, desc: '邀请码'
requires :role_id, type: Integer, desc: '身份'
end
post "join_project" do
authenticate!
role_id = params[:role_id]
if role_id != 3 && role_id != 4 && role_id != 5
{status:-1,message:"请至少选择一个角色"}
else
ps = ProjectsService.new
status = ps.join_project({role: role_id, openid: params[:openid], invite_code: params[:invite_code]}, current_user)
{status:status, message:ProjectsService::JoinProjectError.message(status)}
end
# {status:-1, message: '该功能将在近日开放,敬请期待!' }
end
desc "项目单个未审核用户信息"
params do
requires :token, type: String
requires :project_id, type: Integer, desc: "项目id"
requires :user_id, type: Integer, desc: "用户id"
end
post 'review_member_info' do
authenticate!
ps = ProjectsService.new
result = ps.get_reviewer_info(params,current_user)
present :data, result[:reviewer], with: Mobile::Entities::User
present :status, result[:status]
end
desc "处理管理或开发的身份申请"
params do
requires :token, type: String
requires :project_id, type: Integer, desc: "项目id"
requires :user_id, type: Integer, desc: "用户id"
requires :type, type: Integer, desc: "同意或拒绝"
end
post 'deal_join_apply' do
authenticate!
ps = ProjectsService.new
result = ps.deal_join_apply(params,current_user)
present :status, result[:status]
present :message, result[:message]
end
desc "发布项目帖子"
params do
requires :id, type: Integer
requires :token, type: String
requires :text, type: String
end
post ':id/publishnote' do
authenticate!
project = Project.find("#{params[:id]}")
boards = project.boards.includes(:last_message => :author).all
if project.boards.empty?
board = project.boards.build
board.name = "项目讨论区"
board.description = project.name.to_s
board.course_id = -1
if board.save
boards = project.boards.includes(:last_message => :author).all
end
end
board = boards.first
message = Message.new
message.author = current_user
message.board = board
tmpparams = {}
tmpparams['subject'] = params[:title]
tmpparams['content'] = params[:text]
message.safe_attributes = tmpparams
message.save!
present :status, 0
end
desc "删除项目成员"
params do
requires :id, type: Integer
requires :token, type: String
requires :user_id, type: Integer
end
post ':id/deletemember' do
authenticate!
status = -1
if(current_user.id != params[:user_id].to_i)
#权限
project = Project.find("#{params[:id]}")
if project.user_id != params[:user_id].to_i
my_member = project.member_principals.where("users.id=#{current_user.id}").first
roles_ids = []
my_member.roles.each do |role|
roles_ids << role.id
end
if my_member && roles_ids.include?(3)
#删除该成员
ps = ProjectsService.new
status = ps.project_delete_member(project,params[:user_id].to_i,current_user)
else
status = -2
end
else
status = -3
end
else
status = -4
end
out = {status: status}
message = case status
when 0; "删除成功"
when 1; "该用户不在该项目中"
when -1; "您还未登录"
when -2; "您没有权限"
when -3; "不能删除项目创建者"
when -4; "不能删除自己"
else; "未知错误,请稍后再试"
end
out.merge(message: message)
end
desc "退出项目"
params do
requires :id, type: Integer
requires :token, type: String
end
post ':id/quit' do
authenticate!
project = Project.find("#{params[:id]}")
ps = ProjectsService.new
status = ps.exit_project(project,current_user)
out = {status: status}
message = case status
when 0; "退出项目成功"
when -3; "您不是该项目成员"
when -1; "您还未登录"
when -2; "项目创建者不能退出项目"
else; "未知错误,请稍后再试"
end
out.merge(message: message)
end
end
end
end
end end

+ 118
- 118
app/api/mobile/apis/resources.rb View File

@@ -1,119 +1,119 @@
#coding=utf-8
module Mobile
module Apis
class Resources < Grape::API
resource :resources do
desc '获取所有课件'
params do
requires :token, type: String
requires :page, type: Integer
end
post do
authenticate!
page = params[:page] ? params[:page] : 0
rs = ResourcesService.new
# data = current_user.course_attachments
data = rs.all_course_attachments current_user
all_count = data.count
data = data.limit(10).offset(page * 10)
count = data.count
present :data, data, with: Mobile::Entities::Attachment,user: current_user
present :all_count, all_count
present :count, count
present :page, page
present :status, 0
end
desc '获取所有作业'
params do
requires :token, type: String
requires :page, type: Integer
end
post 'homeworks' do
authenticate!
page = params[:page] ? params[:page] : 0
rs = ResourcesService.new
homeworks = rs.all_homework_commons current_user
all_count = homeworks.count
homeworks = homeworks.limit(10).offset(page * 10)
count = homeworks.count
present :data, homeworks, with: Mobile::Entities::Homework,user: current_user
present :all_count, all_count
present :count, count
present :page, page
present :status, 0
end
desc '获取所有测验'
params do
requires :token, type: String
requires :page, type: Integer
end
post 'exercises' do
authenticate!
page = params[:page] ? params[:page] : 0
rs = ResourcesService.new
exercises = rs.all_exercises current_user
all_count = exercises.count
exercises = exercises.limit(10).offset(page * 10)
count = exercises.count
present :data, exercises, with: Mobile::Entities::Exercise,user: current_user
present :all_count, all_count
present :count, count
present :page, page
present :status, 0
end
desc '发送资源'
params do
requires :token, type: String
requires :course_ids, type: Array[Integer]
requires :send_id, type: Integer
requires :send_type, type: Integer
end
post 'send' do
authenticate!
rs = ResourcesService.new
ori = nil
flag = false
save_message = nil
case params[:send_type]
when 1
ori, flag, save_message = rs.send_resource_to_course(current_user,params)
when 2
ori, flag, save_message = rs.send_homework_to_course(current_user,params)
when 3
ori, flag, save_message = rs.send_exercise_to_course(current_user,params)
end
if flag
present :status, 0
else
{status: -1, message: save_message.first}
end
end
end
end
end
#coding=utf-8
module Mobile
module Apis
class Resources < Grape::API
resource :resources do
desc '获取所有课件'
params do
requires :token, type: String
requires :page, type: Integer
end
post do
authenticate!
page = params[:page] ? params[:page] : 0
rs = ResourcesService.new
# data = current_user.course_attachments
data = rs.all_course_attachments current_user
all_count = data.count
data = data.limit(10).offset(page * 10)
count = data.count
present :data, data, with: Mobile::Entities::Attachment,user: current_user
present :all_count, all_count
present :count, count
present :page, page
present :status, 0
end
desc '获取所有作业'
params do
requires :token, type: String
requires :page, type: Integer
end
post 'homeworks' do
authenticate!
page = params[:page] ? params[:page] : 0
rs = ResourcesService.new
homeworks = rs.all_homework_commons current_user
all_count = homeworks.count
homeworks = homeworks.limit(10).offset(page * 10)
count = homeworks.count
present :data, homeworks, with: Mobile::Entities::Homework,user: current_user
present :all_count, all_count
present :count, count
present :page, page
present :status, 0
end
desc '获取所有测验'
params do
requires :token, type: String
requires :page, type: Integer
end
post 'exercises' do
authenticate!
page = params[:page] ? params[:page] : 0
rs = ResourcesService.new
exercises = rs.all_exercises current_user
all_count = exercises.count
exercises = exercises.limit(10).offset(page * 10)
count = exercises.count
present :data, exercises, with: Mobile::Entities::Exercise,user: current_user
present :all_count, all_count
present :count, count
present :page, page
present :status, 0
end
desc '发送资源'
params do
requires :token, type: String
requires :course_ids, type: Array[Integer]
requires :send_id, type: Integer
requires :send_type, type: Integer
end
post 'send' do
authenticate!
rs = ResourcesService.new
ori = nil
flag = false
save_message = nil
case params[:send_type]
when 1
ori, flag, save_message = rs.send_resource_to_course(current_user,params)
when 2
ori, flag, save_message = rs.send_homework_to_course(current_user,params)
when 3
ori, flag, save_message = rs.send_exercise_to_course(current_user,params)
end
if flag
present :status, 0
else
{status: -1, message: save_message.first}
end
end
end
end
end
end end

+ 102
- 102
app/api/mobile/apis/syllabuses.rb View File

@@ -1,103 +1,103 @@
#coding=utf-8
module Mobile
module Apis
class Syllabuses < Grape::API
resources :syllabuses do
desc "获取大纲列表"
params do
requires :token, type: String
end
get do
authenticate!
cs = SyllabusesService.new
courses = cs.user_syllabus(current_user)
present :data, courses, with: Mobile::Entities::Syllabus,user: current_user
present :status, 0
end
desc "获取某个大纲"
params do
requires :token, type: String
end
get ':id' do
authenticate!
ss = SyllabusesService.new
sy = ::Syllabus.find(params[:id])
result = {:title=>sy.title, :id=>sy.id , :user_id=>sy.user_id,:courses=>sy.courses.not_deleted}
present :data, result, with: Mobile::Entities::Syllabus,user: current_user
present :status, 0
end
desc "获取新建大纲的权限"
params do
requires :token, type: String
end
post 'auth' do
authenticate!
auth = 0
if (current_user.user_extensions && current_user.user_extensions.identity == 0 && current_user.allowed_to?(:add_course, nil, :global => true))
auth = 1
end
present :auth, auth
end
desc "新建大纲"
params do
requires :token, type: String
requires :title, type: String, desc: '大纲标题'
requires :courses, type: Array[String], desc: '课程名'
end
post do
authenticate!
ss = SyllabusesService.new
sy = ss.create(current_user, params[:title],
params[:courses].map{|c| {name: c} })
if sy.new_record?
{status:-1, message: '创建大纲失败' }
else
present :data, sy, with: Mobile::Entities::Syllabus,user: current_user
present :status, 0
end
end
desc '编辑大纲'
params do
requires :token, type: String
requires :title, type: String, desc: '大纲标题'
# requires :add_courses, type: Array[String], desc: '课程名'
# requires :modify_courses, type: Array[Integer,String], desc: '课程名'
end
post ':id/edit' do
authenticate!
ss = SyllabusesService.new
#修改课程大纲
status = ss.edit(current_user, params)
if status == -1
{status:status, message: '修改课程信息失败' }
else
present :status, status
end
end
end
end
end
#coding=utf-8
module Mobile
module Apis
class Syllabuses < Grape::API
resources :syllabuses do
desc "获取大纲列表"
params do
requires :token, type: String
end
get do
authenticate!
cs = SyllabusesService.new
courses = cs.user_syllabus(current_user)
present :data, courses, with: Mobile::Entities::Syllabus,user: current_user
present :status, 0
end
desc "获取某个大纲"
params do
requires :token, type: String
end
get ':id' do
authenticate!
ss = SyllabusesService.new
sy = ::Syllabus.find(params[:id])
result = {:title=>sy.title, :id=>sy.id , :user_id=>sy.user_id,:courses=>sy.courses.not_deleted}
present :data, result, with: Mobile::Entities::Syllabus,user: current_user
present :status, 0
end
desc "获取新建大纲的权限"
params do
requires :token, type: String
end
post 'auth' do
authenticate!
auth = 0
if (current_user.user_extensions && current_user.user_extensions.identity == 0 && current_user.allowed_to?(:add_course, nil, :global => true))
auth = 1
end
present :auth, auth
end
desc "新建大纲"
params do
requires :token, type: String
requires :title, type: String, desc: '大纲标题'
requires :courses, type: Array[String], desc: '课程名'
end
post do
authenticate!
ss = SyllabusesService.new
sy = ss.create(current_user, params[:title],
params[:courses].map{|c| {name: c} })
if sy.new_record?
{status:-1, message: '创建大纲失败' }
else
present :data, sy, with: Mobile::Entities::Syllabus,user: current_user
present :status, 0
end
end
desc '编辑大纲'
params do
requires :token, type: String
requires :title, type: String, desc: '大纲标题'
# requires :add_courses, type: Array[String], desc: '课程名'
# requires :modify_courses, type: Array[Integer,String], desc: '课程名'
end
post ':id/edit' do
authenticate!
ss = SyllabusesService.new
#修改课程大纲
status = ss.edit(current_user, params)
if status == -1
{status:status, message: '修改课程信息失败' }
else
present :status, status
end
end
end
end
end
end end

+ 29
- 29
app/api/mobile/apis/upgrade.rb View File

@@ -1,29 +1,29 @@
#coding=utf-8
module Mobile
module Apis
class Upgrade < Grape::API
include ApplicationHelper
resource :upgrade do
desc "get update info"
params do
requires :platform, type: String, desc: '平台名,android, ios'
end
get do
@current_version = ::PhoneAppVersion.reorder('created_at desc').first
attachment = @current_version.attachments.first
if attachment.nil?
raise '未发现客户端!'
end
url = "http://" + Setting.host_name + "/attachments/download/" + attachment.id.to_s + "/" + attachment.filename
{
version: @current_version.version,
url: url,
desc: @current_version.description
}
end
end
end
end
end
#coding=utf-8
module Mobile
module Apis
class Upgrade < Grape::API
include ApplicationHelper
resource :upgrade do
desc "get update info"
params do
requires :platform, type: String, desc: '平台名,android, ios'
end
get do
@current_version = ::PhoneAppVersion.reorder('created_at desc').first
attachment = @current_version.attachments.first
if attachment.nil?
raise '未发现客户端!'
end
url = "http://" + Setting.host_name + "/attachments/download/" + attachment.id.to_s + "/" + attachment.filename
{
version: @current_version.version,
url: url,
desc: @current_version.description
}
end
end
end
end
end

+ 320
- 320
app/api/mobile/apis/users.rb View File

@@ -1,320 +1,320 @@
#coding=utf-8
module Mobile
module Apis
class Users < Grape::API
resource :users do
desc "我的资料"
params do
requires :token, type: String
end
get 'get_userinfo' do
authenticate!
present :data, current_user, with: Mobile::Entities::User
present :status, 0
end
desc "上传头像"
params do
requires :token, type: String
requires :imgdata, type: String
end
post 'upload_head' do
authenticate!
#直接生成头像
dirPath = "public/images/avatars/User"
fileDir = dirPath + "/"+current_user.id.to_s
imgdata = Base64.decode64(params[:imgdata].split(",")[1])
if imgdata.length > 1024*1024
present :message,"上传图片不能超过1M"
present :status, -1
else
begin
File.open(fileDir,'wb'){ |f| f.write(imgdata) }
present :status, 0
rescue
present :message,"上传失败"
present :status, -1
end
end
end
desc "解除绑定"
params do
requires :token, type: String
end
post 'user_unbind' do
authenticate!
user = current_user
uw = user.user_wechat
us = UsersService.new
us.wechat_unbind user.user_wechat
present :status, 0
end
desc "查询是否已绑定"
params do
requires :openid, type: String, desc: 'wechat openid'
end
post 'isbind' do
openid = params[:openid]
uw = UserWechat.where(openid: openid).first
raise "还未绑定trustie帐户" unless uw
user = uw.user
::ApiKey.delete_all(user_id: user.id)
key = ::ApiKey.create!(user_id: user.id)
present status: 0, token: key.access_token
end
desc "绑定微信用户"
params do
requires :login, type: String, desc: 'username'
requires :password, type: String, desc: 'password'
end
post 'wxbind' do
openid = session[:wechat_openid]
logger.debug "openid ============== #{openid}"
raise "无法获取到openid,请在微信中打开本页面" unless openid
uw = UserWechat.where(openid: openid).first
raise "此微信号已绑定用户(#{uw.user.login}), 不能重复绑定" if uw && uw.real?
user, last_login_on = User.try_to_login(params[:login], params[:password])
raise "用户名或密码错误,请重新输入" unless user
#补全用户信息
raise "此用户已经绑定过公众号, 请换一个帐户试试" if user.user_wechat
if uw && !uw.real?
uw.migrate_user(user)
else
UserWechat.create!(
openid: openid,
user: user
)
end
ws = WechatService.new
ws.binding_succ_notice(user.id, "您已成功绑定Trustie平台。", user.show_name+"("+user.login+")", Time.now.strftime("%Y-%m-%d"))
present status: 0, message: '您已成功绑定Trustie平台'
end
desc "注册用户"
params do
requires :login, type: String, desc: 'username'
requires :mail, type: String, desc: 'mail'
requires :password, type: String, desc: 'password'
end
post do
openid = session[:wechat_openid]
logger.debug "openid ============== #{openid}"
raise "无法获取到openid,请在微信中打开本页面" unless openid
uw = UserWechat.where(openid: openid).first
raise "此微信号已绑定用户(#{uw.user.login}), 不能重复绑定" if uw && uw.real?
us = UsersService.new
user = us.register params.merge(:password_confirmation => params[:password],
:should_confirmation_password => true)
raise user.errors.full_messages.first if user.new_record?
#自动激活
if Setting.self_registration != '3'
# user = automatically_register(user)
user.activate
user.last_login_on = Time.now
if user.save
UserStatus.create(:user_id => user.id, :changsets_count => 0, :watchers_count => 0)
end
end
if uw && !uw.real?
user.update_attributes(:lastname=>uw.user[:lastname])
uw.migrate_user(user)
else
UserWechat.create!(
openid: openid,
user: user
)
end
ws = WechatService.new
ws.binding_succ_notice(user.id, "您已成功绑定Trustie平台。", user.show_name+"("+user.login+")", Time.now.strftime("%Y-%m-%d"))
present :data, user, with: Mobile::Entities::User
present :status, 0
end
desc "显示用户"
params do
requires :id, type: Integer
end
route_param :id do
get do
us = UsersService.new
ue = us.show_user params
present :data, ue,with: Mobile::Entities::User
present :status, 0
end
end
desc "修改用户"
params do
requires :token, type: String
#optional :file, type: File, desc: 'avatar'
optional :occupation, type: String
optional :brief_introduction, type: String
optional :province, type: String
optional :city, type: String
optional :gender, type: Integer
end
put ':id' do
authenticate!
us = UsersService.new
ue = us.edit_user params.merge(id: current_user.id)
present :data, ue,with: Mobile::Entities::User
present :status, 0
end
desc '获取用户课程'
params do
optional :token, type: String
end
get ':id/courses' do
us = UsersService.new
ue = us.user_courses_list params,current_user.nil? ? User.find(2):current_user
present :data, ue,with: Mobile::Entities::Course
present :status, 0
end
desc '修改密码'
params do
requires :token, type: String
requires :password, type:String , desc: '原密码'
requires :new_password, type: String, desc: '新密码'
end
post 'password' do
authenticate!
us = UsersService.new
user = us.change_password params.merge(current_user_id: current_user.id,
new_password_confirmation: params[:new_password])
present :data, user, with: Mobile::Entities::User
present :status, 0
end
desc "用户搜索"
params do
requires :name, type: String, desc: '用户名关键字'
requires :search_by, type: String,desc: '搜索依据:0 登录名,1 用户名,2 邮箱,3 登录名和姓名'
optional :is_search_assitant,type:Integer,desc:'是否搜索注册用户来作为助教'
optional :course_id,type:Integer,desc: '课程id,搜索注册用户不为该课程教师的其他用户'
optional :user_id,type:Integer,desc:'用户id'
end
get 'search/search_user' do
us = UsersService.new
user = us.search_user params
present :data, user, with: Mobile::Entities::User
present :status, 0
end
desc "用户留言"
params do
requires :token, type: String
requires :user_id, type: Integer,desc: '被留言的用户id'
requires :page,type:Integer,desc:'请求数据的页码'
end
get ':user_id/messages' do
us = UsersService.new
jours = us.get_all_messages params
present :data,jours,with:Mobile::Entities::Jours
present :status,0
end
desc "回复用户留言"
params do
requires :token, type: String
requires :user_id, type: Integer,desc: '被留言的用户id'
requires :content,type:String,desc:'留言内容'
requires :ref_user_id,type:Integer,desc:'被回复的用户id'
requires :parent_id,type:Integer,desc:'留言父id'
requires :ref_message_id,type:Integer,desc:'引用消息id'
optional :type,type:Integer,desc:'回复类型'
optional :course_id,type:Integer,desc:'课程id'
end
post ':user_id/reply_message' do
us = UsersService.new
jours = us.reply_user_messages params,current_user
present :status,0
end
desc "给用户留言"
params do
requires :token, type: String
requires :user_id, type: Integer,desc:'被留言的用户id'
requires :content, type: String,desc:'留言内容'
end
post ':user_id/leave_message' do
us = UsersService.new
us.leave_message params,current_user
present :data,0
end
desc "与我相关"
params do
requires :token, type: String
requires :page,type:Integer,desc:'页码'
end
get ':user_id/all_my_dynamic' do
us = UsersService.new
my_jours = us.reply_my_messages params,current_user
present :data,my_jours,with:Mobile::Entities::Jours
present :status,0
end
desc "修改我的资料"
params do
requires :token, type: String
requires :lastname, type: String
requires :sex, type: Integer
end
post 'edit_userinfo' do
authenticate!
user = current_user
status = 0
message = ""
#昵称 不能超过30个字符
if params[:lastname].length > 30 then
message = "姓名不能超过30个字符!"
status = -1
end
if status == 0
user.lastname = params[:lastname]
user.update_attribute(:lastname, params[:lastname])
se = user.extensions
se.update_attribute(:gender, params[:sex])
end
if status == 0
present :data, current_user, with: Mobile::Entities::User
present :status, 0
else
present :status, -1
present :message, message
end
end
end
end
end
end
#coding=utf-8
module Mobile
module Apis
class Users < Grape::API
resource :users do
desc "我的资料"
params do
requires :token, type: String
end
get 'get_userinfo' do
authenticate!
present :data, current_user, with: Mobile::Entities::User
present :status, 0
end
desc "上传头像"
params do
requires :token, type: String
requires :imgdata, type: String
end
post 'upload_head' do
authenticate!
#直接生成头像
dirPath = "public/images/avatars/User"
fileDir = dirPath + "/"+current_user.id.to_s
imgdata = Base64.decode64(params[:imgdata].split(",")[1])
if imgdata.length > 1024*1024
present :message,"上传图片不能超过1M"
present :status, -1
else
begin
File.open(fileDir,'wb'){ |f| f.write(imgdata) }
present :status, 0
rescue
present :message,"上传失败"
present :status, -1
end
end
end
desc "解除绑定"
params do
requires :token, type: String
end
post 'user_unbind' do
authenticate!
user = current_user
uw = user.user_wechat
us = UsersService.new
us.wechat_unbind user.user_wechat
present :status, 0
end
desc "查询是否已绑定"
params do
requires :openid, type: String, desc: 'wechat openid'
end
post 'isbind' do
openid = params[:openid]
uw = UserWechat.where(openid: openid).first
raise "还未绑定trustie帐户" unless uw
user = uw.user
::ApiKey.delete_all(user_id: user.id)
key = ::ApiKey.create!(user_id: user.id)
present status: 0, token: key.access_token
end
desc "绑定微信用户"
params do
requires :login, type: String, desc: 'username'
requires :password, type: String, desc: 'password'
end
post 'wxbind' do
openid = session[:wechat_openid]
logger.debug "openid ============== #{openid}"
raise "无法获取到openid,请在微信中打开本页面" unless openid
uw = UserWechat.where(openid: openid).first
raise "此微信号已绑定用户(#{uw.user.login}), 不能重复绑定" if uw && uw.real?
user, last_login_on = User.try_to_login(params[:login], params[:password])
raise "用户名或密码错误,请重新输入" unless user
#补全用户信息
raise "此用户已经绑定过公众号, 请换一个帐户试试" if user.user_wechat
if uw && !uw.real?
uw.migrate_user(user)
else
UserWechat.create!(
openid: openid,
user: user
)
end
ws = WechatService.new
ws.binding_succ_notice(user.id, "您已成功绑定Trustie平台。", user.show_name+"("+user.login+")", Time.now.strftime("%Y-%m-%d"))
present status: 0, message: '您已成功绑定Trustie平台'
end
desc "注册用户"
params do
requires :login, type: String, desc: 'username'
requires :mail, type: String, desc: 'mail'
requires :password, type: String, desc: 'password'
end
post do
openid = session[:wechat_openid]
logger.debug "openid ============== #{openid}"
raise "无法获取到openid,请在微信中打开本页面" unless openid
uw = UserWechat.where(openid: openid).first
raise "此微信号已绑定用户(#{uw.user.login}), 不能重复绑定" if uw && uw.real?
us = UsersService.new
user = us.register params.merge(:password_confirmation => params[:password],
:should_confirmation_password => true)
raise user.errors.full_messages.first if user.new_record?
#自动激活
if Setting.self_registration != '3'
# user = automatically_register(user)
user.activate
user.last_login_on = Time.now
if user.save
UserStatus.create(:user_id => user.id, :changsets_count => 0, :watchers_count => 0)
end
end
if uw && !uw.real?
user.update_attributes(:lastname=>uw.user[:lastname])
uw.migrate_user(user)
else
UserWechat.create!(
openid: openid,
user: user
)
end
ws = WechatService.new
ws.binding_succ_notice(user.id, "您已成功绑定Trustie平台。", user.show_name+"("+user.login+")", Time.now.strftime("%Y-%m-%d"))
present :data, user, with: Mobile::Entities::User
present :status, 0
end
desc "显示用户"
params do
requires :id, type: Integer
end
route_param :id do
get do
us = UsersService.new
ue = us.show_user params
present :data, ue,with: Mobile::Entities::User
present :status, 0
end
end
desc "修改用户"
params do
requires :token, type: String
#optional :file, type: File, desc: 'avatar'
optional :occupation, type: String
optional :brief_introduction, type: String
optional :province, type: String
optional :city, type: String
optional :gender, type: Integer
end
put ':id' do
authenticate!
us = UsersService.new
ue = us.edit_user params.merge(id: current_user.id)
present :data, ue,with: Mobile::Entities::User
present :status, 0
end
desc '获取用户课程'
params do
optional :token, type: String
end
get ':id/courses' do
us = UsersService.new
ue = us.user_courses_list params,current_user.nil? ? User.find(2):current_user
present :data, ue,with: Mobile::Entities::Course
present :status, 0
end
desc '修改密码'
params do
requires :token, type: String
requires :password, type:String , desc: '原密码'
requires :new_password, type: String, desc: '新密码'
end
post 'password' do
authenticate!
us = UsersService.new
user = us.change_password params.merge(current_user_id: current_user.id,
new_password_confirmation: params[:new_password])
present :data, user, with: Mobile::Entities::User
present :status, 0
end
desc "用户搜索"
params do
requires :name, type: String, desc: '用户名关键字'
requires :search_by, type: String,desc: '搜索依据:0 登录名,1 用户名,2 邮箱,3 登录名和姓名'
optional :is_search_assitant,type:Integer,desc:'是否搜索注册用户来作为助教'
optional :course_id,type:Integer,desc: '课程id,搜索注册用户不为该课程教师的其他用户'
optional :user_id,type:Integer,desc:'用户id'
end
get 'search/search_user' do
us = UsersService.new
user = us.search_user params
present :data, user, with: Mobile::Entities::User
present :status, 0
end
desc "用户留言"
params do
requires :token, type: String
requires :user_id, type: Integer,desc: '被留言的用户id'
requires :page,type:Integer,desc:'请求数据的页码'
end
get ':user_id/messages' do
us = UsersService.new
jours = us.get_all_messages params
present :data,jours,with:Mobile::Entities::Jours
present :status,0
end
desc "回复用户留言"
params do
requires :token, type: String
requires :user_id, type: Integer,desc: '被留言的用户id'
requires :content,type:String,desc:'留言内容'
requires :ref_user_id,type:Integer,desc:'被回复的用户id'
requires :parent_id,type:Integer,desc:'留言父id'
requires :ref_message_id,type:Integer,desc:'引用消息id'
optional :type,type:Integer,desc:'回复类型'
optional :course_id,type:Integer,desc:'课程id'
end
post ':user_id/reply_message' do
us = UsersService.new
jours = us.reply_user_messages params,current_user
present :status,0
end
desc "给用户留言"
params do
requires :token, type: String
requires :user_id, type: Integer,desc:'被留言的用户id'
requires :content, type: String,desc:'留言内容'
end
post ':user_id/leave_message' do
us = UsersService.new
us.leave_message params,current_user
present :data,0
end
desc "与我相关"
params do
requires :token, type: String
requires :page,type:Integer,desc:'页码'
end
get ':user_id/all_my_dynamic' do
us = UsersService.new
my_jours = us.reply_my_messages params,current_user
present :data,my_jours,with:Mobile::Entities::Jours
present :status,0
end
desc "修改我的资料"
params do
requires :token, type: String
requires :lastname, type: String
requires :sex, type: Integer
end
post 'edit_userinfo' do
authenticate!
user = current_user
status = 0
message = ""
#昵称 不能超过30个字符
if params[:lastname].length > 30 then
message = "姓名不能超过30个字符!"
status = -1
end
if status == 0
user.lastname = params[:lastname]
user.update_attribute(:lastname, params[:lastname])
se = user.extensions
se.update_attribute(:gender, params[:sex])
end
if status == 0
present :data, current_user, with: Mobile::Entities::User
present :status, 0
else
present :status, -1
present :message, message
end
end
end
end
end
end

+ 49
- 49
app/api/mobile/apis/watches.rb View File

@@ -1,49 +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
#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

+ 138
- 138
app/api/mobile/entities/blog_comment.rb View File

@@ -1,139 +1,139 @@
module Mobile
module Entities
class BlogComment < Grape::Entity
include ApplicationHelper
include ApiHelper
def self.blog_comment_expose(f)
expose f do |u,opt|
if u.is_a?(Hash) && u.key?(f)
u[f]
elsif u.is_a?(::BlogComment)
if u.respond_to?(f)
if f == :created_at
format_time( u.send(f))
else
u.send(f)
end
else
case f
when :praise_count
get_activity_praise_num(u)
when :lasted_comment
time_from_now(u.created_at)
when :act_type
'BlogComment'
when :act_id
u.id
when :comment_count
# u.children.count
all_comments = []
get_all_children(all_comments, u).count
end
end
end
end
end
expose :user, using: Mobile::Entities::User do |c, opt|
if c.is_a?(::BlogComment)
c.author
end
end
blog_comment_expose :act_type
blog_comment_expose :act_id
blog_comment_expose :blog_id
blog_comment_expose :title
blog_comment_expose :content
blog_comment_expose :comment_count
blog_comment_expose :created_at
blog_comment_expose :lasted_comment
blog_comment_expose :id
blog_comment_expose :locked
blog_comment_expose :praise_count
expose :all_children, using:Mobile::Entities::BlogComment do |c,opt|
if c.is_a? (::BlogComment)
if !opt[:children]
if c.parent.nil? && opt[:type] == 0
opt[:children] = true
all_comments = []
tStart = opt[:page]*5
tEnd = (opt[:page]+1)*5 - 1
all_comments = get_all_children(all_comments, c)[tStart..tEnd]
all_comments
end
end
end
end
expose :has_praise, if: lambda { |instance, options| options[:user] } do |instance, options|
has_praise = false
current_user = options[:user]
obj = PraiseTread.where("praise_tread_object_id=? and praise_tread_object_type=? and user_id=?",instance.id,instance.class.to_s,current_user.id)
has_praise = obj.empty? ? false : true
has_praise
end
expose :parents_count, if: lambda { |instance, options| options[:user] } do |instance, options|
parents_reply = []
parents_reply = get_reply_parents_no_root(parents_reply, instance)
parents_reply.count
end
expose :parents_reply_bottom, using:Mobile::Entities::BlogComment do |c,opt|
if c.is_a? (::BlogComment)
#取二级回复的底楼层
parents_reply = []
parents_reply = get_reply_parents_no_root(parents_reply, c)
if parents_reply.count > 0 && !opt[:bottom]
if opt[:type] == 1
# opt[:bottom] = true
# parents_reply[opt[:page]..opt[:page]]
else
opt[:bottom] = true
parents_reply[0..0]
end
else
[]
end
end
end
expose :parents_reply_top, using:Mobile::Entities::BlogComment do |c,opt|
if c.is_a? (::BlogComment)
#取二级回复的顶楼层
parents_reply = []
parents_reply = get_reply_parents_no_root(parents_reply, c)
if parents_reply.count > 2 && !opt[:top]
if opt[:type] == 1
opt[:top] = true
tStart = (opt[:page]-1)*5+2
tEnd = (opt[:page])*5+2 - 1
if tEnd >= parents_reply.count - 1
tEnd = parents_reply.count - 2
end
if tStart <= parents_reply.count - 2
parents_reply = parents_reply.reverse[tStart..tEnd]
parents_reply.reverse
else
[]
end
else
opt[:top] = true
parents_reply = parents_reply.reverse[0..1]
parents_reply.reverse
end
elsif parents_reply.count == 2 && !opt[:top]
opt[:top] = true
parents_reply = parents_reply.reverse[0..0]
parents_reply.reverse
else
[]
end
end
end
end
end
module Mobile
module Entities
class BlogComment < Grape::Entity
include ApplicationHelper
include ApiHelper
def self.blog_comment_expose(f)
expose f do |u,opt|
if u.is_a?(Hash) && u.key?(f)
u[f]
elsif u.is_a?(::BlogComment)
if u.respond_to?(f)
if f == :created_at
format_time( u.send(f))
else
u.send(f)
end
else
case f
when :praise_count
get_activity_praise_num(u)
when :lasted_comment
time_from_now(u.created_at)
when :act_type
'BlogComment'
when :act_id
u.id
when :comment_count
# u.children.count
all_comments = []
get_all_children(all_comments, u).count
end
end
end
end
end
expose :user, using: Mobile::Entities::User do |c, opt|
if c.is_a?(::BlogComment)
c.author
end
end
blog_comment_expose :act_type
blog_comment_expose :act_id
blog_comment_expose :blog_id
blog_comment_expose :title
blog_comment_expose :content
blog_comment_expose :comment_count
blog_comment_expose :created_at
blog_comment_expose :lasted_comment
blog_comment_expose :id
blog_comment_expose :locked
blog_comment_expose :praise_count
expose :all_children, using:Mobile::Entities::BlogComment do |c,opt|
if c.is_a? (::BlogComment)
if !opt[:children]
if c.parent.nil? && opt[:type] == 0
opt[:children] = true
all_comments = []
tStart = opt[:page]*5
tEnd = (opt[:page]+1)*5 - 1
all_comments = get_all_children(all_comments, c)[tStart..tEnd]
all_comments
end
end
end
end
expose :has_praise, if: lambda { |instance, options| options[:user] } do |instance, options|
has_praise = false
current_user = options[:user]
obj = PraiseTread.where("praise_tread_object_id=? and praise_tread_object_type=? and user_id=?",instance.id,instance.class.to_s,current_user.id)
has_praise = obj.empty? ? false : true
has_praise
end
expose :parents_count, if: lambda { |instance, options| options[:user] } do |instance, options|
parents_reply = []
parents_reply = get_reply_parents_no_root(parents_reply, instance)
parents_reply.count
end
expose :parents_reply_bottom, using:Mobile::Entities::BlogComment do |c,opt|
if c.is_a? (::BlogComment)
#取二级回复的底楼层
parents_reply = []
parents_reply = get_reply_parents_no_root(parents_reply, c)
if parents_reply.count > 0 && !opt[:bottom]
if opt[:type] == 1
# opt[:bottom] = true
# parents_reply[opt[:page]..opt[:page]]
else
opt[:bottom] = true
parents_reply[0..0]
end
else
[]
end
end
end
expose :parents_reply_top, using:Mobile::Entities::BlogComment do |c,opt|
if c.is_a? (::BlogComment)
#取二级回复的顶楼层
parents_reply = []
parents_reply = get_reply_parents_no_root(parents_reply, c)
if parents_reply.count > 2 && !opt[:top]
if opt[:type] == 1
opt[:top] = true
tStart = (opt[:page]-1)*5+2
tEnd = (opt[:page])*5+2 - 1
if tEnd >= parents_reply.count - 1
tEnd = parents_reply.count - 2
end
if tStart <= parents_reply.count - 2
parents_reply = parents_reply.reverse[tStart..tEnd]
parents_reply.reverse
else
[]
end
else
opt[:top] = true
parents_reply = parents_reply.reverse[0..1]
parents_reply.reverse
end
elsif parents_reply.count == 2 && !opt[:top]
opt[:top] = true
parents_reply = parents_reply.reverse[0..0]
parents_reply.reverse
else
[]
end
end
end
end
end
end end

+ 114
- 114
app/api/mobile/entities/course.rb View File

@@ -1,114 +1,114 @@
module Mobile
module Entities
class Course < Grape::Entity
include Redmine::I18n
include ApplicationHelper
include ApiHelper
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))
elsif field == :member_count
::Course===c ? c.members.count : 0
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 :invite_code
course_expose :qrcode
course_expose :updated_at
course_expose :course_student_num
course_expose :member_count
course_expose :groupnum
expose :can_setting, if: lambda { |instance, options| options[:user] } do |instance, options|
current_user = options[:user]
can_setting = false
if instance[:course]
course = instance[:course]
else
course = instance
end
member = course.members.where("user_id=#{current_user.id} and course_id=#{course.id}")[0]
role_ids = member.role_ids if member
if role_ids && (role_ids.include?(7) || role_ids.include?(9) )
can_setting = true
end
if course.tea_id == current_user.id
can_setting = true
end
can_setting
end
expose :is_member, if: lambda { |instance, options| options[:user] } do |instance, options|
current_user = options[:user]
if instance[:course]
course = instance[:course]
else
course = instance
end
current_user.member_of_course?(course)
end
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
expose :is_creator, if: lambda { |instance, options| options[:user] } do |instance, options|
if instance[:course]
course = instance[:course]
else
course = instance
end
current_user = options[:user]
course.tea_id == current_user.id
end
course_expose :current_user_is_member
course_expose :current_user_is_teacher
course_expose :work_unit
course_expose :syllabus_title
end
end
end
module Mobile
module Entities
class Course < Grape::Entity
include Redmine::I18n
include ApplicationHelper
include ApiHelper
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))
elsif field == :member_count
::Course===c ? c.members.count : 0
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 :invite_code
course_expose :qrcode
course_expose :updated_at
course_expose :course_student_num
course_expose :member_count
course_expose :groupnum
expose :can_setting, if: lambda { |instance, options| options[:user] } do |instance, options|
current_user = options[:user]
can_setting = false
if instance[:course]
course = instance[:course]
else
course = instance
end
member = course.members.where("user_id=#{current_user.id} and course_id=#{course.id}")[0]
role_ids = member.role_ids if member
if role_ids && (role_ids.include?(7) || role_ids.include?(9) )
can_setting = true
end
if course.tea_id == current_user.id
can_setting = true
end
can_setting
end
expose :is_member, if: lambda { |instance, options| options[:user] } do |instance, options|
current_user = options[:user]
if instance[:course]
course = instance[:course]
else
course = instance
end
current_user.member_of_course?(course)
end
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
expose :is_creator, if: lambda { |instance, options| options[:user] } do |instance, options|
if instance[:course]
course = instance[:course]
else
course = instance
end
current_user = options[:user]
course.tea_id == current_user.id
end
course_expose :current_user_is_member
course_expose :current_user_is_teacher
course_expose :work_unit
course_expose :syllabus_title
end
end
end

+ 19
- 19
app/api/mobile/entities/course_group.rb View File

@@ -1,19 +1,19 @@
module Mobile
module Entities
class CourseGroup < Grape::Entity
include Redmine::I18n
include ApplicationHelper
include ApiHelper
def self.course_group_expose(f)
expose f do |u,opt|
if u.is_a?(Hash) && u.key?(f)
u[f]
end
end
end
expose :id
expose :name
expose :users, using: Mobile::Entities::User
end
end
end
module Mobile
module Entities
class CourseGroup < Grape::Entity
include Redmine::I18n
include ApplicationHelper
include ApiHelper
def self.course_group_expose(f)
expose f do |u,opt|
if u.is_a?(Hash) && u.key?(f)
u[f]
end
end
end
expose :id
expose :name
expose :users, using: Mobile::Entities::User
end
end
end

+ 43
- 43
app/api/mobile/entities/exercise.rb View File

@@ -1,43 +1,43 @@
module Mobile
module Entities
class Exercise < Grape::Entity
include Redmine::I18n
include ApplicationHelper
include ApiHelper
def self.exercise_expose(field)
expose field do |f,opt|
if f.is_a?(Hash) && f.key?(field)
if field == :created_on
format_time(f[field])
else
f[field]
end
elsif f.is_a?(::Exercise)
if f.respond_to?(field)
f.send(field)
else
case field
when :coursename
f.course.nil? ? "" : f.course.name
when :syllabus_title
f.course.nil? ? "" : f.course.syllabus.nil? ? "" : f.course.syllabus.title
end
end
end
end
end
expose :exercise_name
expose :exercise_description
exercise_expose :coursename #所属班级名
exercise_expose :syllabus_title
expose :current_user_is_teacher, if: lambda { |instance, options| options[:user] } do |instance, options|
current_user = options[:user]
current_user_is_teacher = false
current_user_is_teacher = is_course_teacher(current_user,instance.course)
current_user_is_teacher
end
end
end
end
module Mobile
module Entities
class Exercise < Grape::Entity
include Redmine::I18n
include ApplicationHelper
include ApiHelper
def self.exercise_expose(field)
expose field do |f,opt|
if f.is_a?(Hash) && f.key?(field)
if field == :created_on
format_time(f[field])
else
f[field]
end
elsif f.is_a?(::Exercise)
if f.respond_to?(field)
f.send(field)
else
case field
when :coursename
f.course.nil? ? "" : f.course.name
when :syllabus_title
f.course.nil? ? "" : f.course.syllabus.nil? ? "" : f.course.syllabus.title
end
end
end
end
end
expose :exercise_name
expose :exercise_description
exercise_expose :coursename #所属班级名
exercise_expose :syllabus_title
expose :current_user_is_teacher, if: lambda { |instance, options| options[:user] } do |instance, options|
current_user = options[:user]
current_user_is_teacher = false
current_user_is_teacher = is_course_teacher(current_user,instance.course)
current_user_is_teacher
end
end
end
end

+ 17
- 17
app/api/mobile/entities/homeworkscore.rb View File

@@ -1,18 +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
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 end

+ 43
- 43
app/api/mobile/entities/journal.rb View File

@@ -1,44 +1,44 @@
module Mobile
module Entities
class Journal <Grape::Entity
include Redmine::I18n
=begin
include Redmine::I18n
include ApplicationHelper
include ApiHelper
include IssuesHelper
include ActionView::Helpers::TagHelper
include ActionView::Helpers::UrlHelper
=end
def self.journal_expose(f)
expose f do |journal, opt|
if journal.is_a?(Hash) && journal.key?(f)
journal[f]
elsif journal.is_a?(::Journal)
if journal.respond_to?(f)
if f == :created_on
time_from_now(journal.send(f))
else
journal.send(f)
end
else
case f
when :detail_journal
if journal.details.any?
details_to_strings(journal.details)
end
end
end
end
end
end
expose :notes
journal_expose :created_on
expose :user,using: Mobile::Entities::User do |f, opt|
f.user
end
#journal_expose :detail_journal
end
end
module Mobile
module Entities
class Journal <Grape::Entity
include Redmine::I18n
=begin
include Redmine::I18n
include ApplicationHelper
include ApiHelper
include IssuesHelper
include ActionView::Helpers::TagHelper
include ActionView::Helpers::UrlHelper
=end
def self.journal_expose(f)
expose f do |journal, opt|
if journal.is_a?(Hash) && journal.key?(f)
journal[f]
elsif journal.is_a?(::Journal)
if journal.respond_to?(f)
if f == :created_on
time_from_now(journal.send(f))
else
journal.send(f)
end
else
case f
when :detail_journal
if journal.details.any?
details_to_strings(journal.details)
end
end
end
end
end
end
expose :notes
journal_expose :created_on
expose :user,using: Mobile::Entities::User do |f, opt|
f.user
end
#journal_expose :detail_journal
end
end
end end

+ 33
- 33
app/api/mobile/entities/member.rb View File

@@ -1,34 +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
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 end

+ 153
- 153
app/api/mobile/entities/message.rb View File

@@ -1,154 +1,154 @@
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 :course_project_name
if u.board.project_id == -1
u.course.name
else
u.project.name
end
when :syllabus_title
if u.board.project_id == -1
u.course.syllabus.nil? ? "" : u.course.syllabus.title
end
when :lasted_comment
time_from_now u.created_on
when :praise_count
get_activity_praise_num(u)
when :act_type
'Message'
when :act_id
u.id
when :comment_count
all_comments = []
get_all_children(all_comments, u).count
when :title
u.subject
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 :act_type
message_expose :act_id
message_expose :course_project_name
message_expose :syllabus_title
message_expose :board_id
message_expose :subject
message_expose :title
message_expose :content
message_expose :comment_count
message_expose :praise_count
message_expose :created_on
message_expose :locked
message_expose :id
message_expose :lasted_comment
expose :all_children,using:Mobile::Entities::Message do |c,opt|
if c.is_a? (::Message)
# c.children.reverse
if !opt[:children]
if c.parent.nil? && opt[:type] == 0
opt[:children] = true
all_comments = []
tStart = opt[:page]*5
tEnd = (opt[:page]+1)*5 - 1
all_comments = get_all_children(all_comments, c)[tStart..tEnd]
all_comments
end
end
end
end
expose :has_praise , if: lambda { |instance, options| options[:user] } do |instance, options|
has_praise = false
current_user = options[:user]
obj = PraiseTread.where("praise_tread_object_id=? and praise_tread_object_type=? and user_id=?",instance.id,instance.class.to_s,current_user.id)
has_praise = obj.empty? ? false : true
has_praise
end
expose :parents_count, if: lambda { |instance, options| options[:user] } do |instance, options|
parents_reply = []
parents_reply = get_reply_parents_no_root(parents_reply, instance)
parents_reply.count
end
expose :parents_reply_bottom, using:Mobile::Entities::Message do |c,opt|
if c.is_a? (::Message)
#取二级回复的底楼层
parents_reply = []
parents_reply = get_reply_parents_no_root(parents_reply, c)
if parents_reply.count > 0 && !opt[:bottom]
if opt[:type] == 1
# opt[:bottom] = true
# parents_reply[opt[:page]..opt[:page]]
else
opt[:bottom] = true
parents_reply[0..0]
end
else
[]
end
end
end
expose :parents_reply_top, using:Mobile::Entities::Message do |c,opt|
if c.is_a? (::Message)
#取二级回复的顶楼层
parents_reply = []
parents_reply = get_reply_parents_no_root(parents_reply, c)
if parents_reply.count > 2 && !opt[:top]
if opt[:type] == 1
opt[:top] = true
tStart = (opt[:page]-1)*5+2
tEnd = (opt[:page])*5+2 - 1
if tEnd >= parents_reply.count - 1
tEnd = parents_reply.count - 2
end
if tStart <= parents_reply.count - 2
parents_reply = parents_reply.reverse[tStart..tEnd]
parents_reply.reverse
else
[]
end
else
opt[:top] = true
parents_reply = parents_reply.reverse[0..1]
parents_reply.reverse
end
elsif parents_reply.count == 2 && !opt[:top]
opt[:top] = true
parents_reply = parents_reply.reverse[0..0]
parents_reply.reverse
else
[]
end
end
end
end
end
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 :course_project_name
if u.board.project_id == -1
u.course.name
else
u.project.name
end
when :syllabus_title
if u.board.project_id == -1
u.course.syllabus.nil? ? "" : u.course.syllabus.title
end
when :lasted_comment
time_from_now u.created_on
when :praise_count
get_activity_praise_num(u)
when :act_type
'Message'
when :act_id
u.id
when :comment_count
all_comments = []
get_all_children(all_comments, u).count
when :title
u.subject
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 :act_type
message_expose :act_id
message_expose :course_project_name
message_expose :syllabus_title
message_expose :board_id
message_expose :subject
message_expose :title
message_expose :content
message_expose :comment_count
message_expose :praise_count
message_expose :created_on
message_expose :locked
message_expose :id
message_expose :lasted_comment
expose :all_children,using:Mobile::Entities::Message do |c,opt|
if c.is_a? (::Message)
# c.children.reverse
if !opt[:children]
if c.parent.nil? && opt[:type] == 0
opt[:children] = true
all_comments = []
tStart = opt[:page]*5
tEnd = (opt[:page]+1)*5 - 1
all_comments = get_all_children(all_comments, c)[tStart..tEnd]
all_comments
end
end
end
end
expose :has_praise , if: lambda { |instance, options| options[:user] } do |instance, options|
has_praise = false
current_user = options[:user]
obj = PraiseTread.where("praise_tread_object_id=? and praise_tread_object_type=? and user_id=?",instance.id,instance.class.to_s,current_user.id)
has_praise = obj.empty? ? false : true
has_praise
end
expose :parents_count, if: lambda { |instance, options| options[:user] } do |instance, options|
parents_reply = []
parents_reply = get_reply_parents_no_root(parents_reply, instance)
parents_reply.count
end
expose :parents_reply_bottom, using:Mobile::Entities::Message do |c,opt|
if c.is_a? (::Message)
#取二级回复的底楼层
parents_reply = []
parents_reply = get_reply_parents_no_root(parents_reply, c)
if parents_reply.count > 0 && !opt[:bottom]
if opt[:type] == 1
# opt[:bottom] = true
# parents_reply[opt[:page]..opt[:page]]
else
opt[:bottom] = true
parents_reply[0..0]
end
else
[]
end
end
end
expose :parents_reply_top, using:Mobile::Entities::Message do |c,opt|
if c.is_a? (::Message)
#取二级回复的顶楼层
parents_reply = []
parents_reply = get_reply_parents_no_root(parents_reply, c)
if parents_reply.count > 2 && !opt[:top]
if opt[:type] == 1
opt[:top] = true
tStart = (opt[:page]-1)*5+2
tEnd = (opt[:page])*5+2 - 1
if tEnd >= parents_reply.count - 1
tEnd = parents_reply.count - 2
end
if tStart <= parents_reply.count - 2
parents_reply = parents_reply.reverse[tStart..tEnd]
parents_reply.reverse
else
[]
end
else
opt[:top] = true
parents_reply = parents_reply.reverse[0..1]
parents_reply.reverse
end
elsif parents_reply.count == 2 && !opt[:top]
opt[:top] = true
parents_reply = parents_reply.reverse[0..0]
parents_reply.reverse
else
[]
end
end
end
end
end
end end

+ 43
- 43
app/api/mobile/entities/project.rb View File

@@ -1,43 +1,43 @@
module Mobile
module Entities
class Project < Grape::Entity
expose :name
expose :id
expose :is_public
expose :user_id
expose :invite_code
expose :qrcode
expose :can_setting, if: lambda { |instance, options| options[:user] } do |instance, options|
current_user = options[:user]
my_member = instance.member_principals.where("users.id=#{current_user.id}").first
can_setting = false
if my_member && my_member.roles[0] && my_member.roles[0].id == 3
can_setting = true
end
can_setting
end
expose :is_creator, if: lambda { |instance, options| options[:user] } do |instance, options|
current_user = options[:user]
current_user.id == instance.user_id
end
expose :is_member, if: lambda { |instance, options| options[:user] } do |instance, options|
current_user = options[:user]
if instance[:project]
project = instance[:project]
else
project = instance
end
current_user.member_of?(project)
end
expose :member_count, if: lambda { |instance, options| options[:user] } do |instance, options|
instance.members.count
end
end
end
end
module Mobile
module Entities
class Project < Grape::Entity
expose :name
expose :id
expose :is_public
expose :user_id
expose :invite_code
expose :qrcode
expose :can_setting, if: lambda { |instance, options| options[:user] } do |instance, options|
current_user = options[:user]
my_member = instance.member_principals.where("users.id=#{current_user.id}").first
can_setting = false
if my_member && my_member.roles[0] && my_member.roles[0].id == 3
can_setting = true
end
can_setting
end
expose :is_creator, if: lambda { |instance, options| options[:user] } do |instance, options|
current_user = options[:user]
current_user.id == instance.user_id
end
expose :is_member, if: lambda { |instance, options| options[:user] } do |instance, options|
current_user = options[:user]
if instance[:project]
project = instance[:project]
else
project = instance
end
current_user.member_of?(project)
end
expose :member_count, if: lambda { |instance, options| options[:user] } do |instance, options|
instance.members.count
end
end
end
end

+ 35
- 35
app/api/mobile/entities/project_member.rb View File

@@ -1,35 +1,35 @@
module Mobile
module Entities
class ProjectMember < Grape::Entity
include Redmine::I18n
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 :roles_id
# u.roles[0].id
u.roles.map {|r| r.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 :roles_id
end
end
end
module Mobile
module Entities
class ProjectMember < Grape::Entity
include Redmine::I18n
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 :roles_id
# u.roles[0].id
u.roles.map {|r| r.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 :roles_id
end
end
end

+ 44
- 44
app/api/mobile/entities/student_work.rb View File

@@ -1,45 +1,45 @@
module Mobile
module Entities
class StudentWork < Grape::Entity
include ApplicationHelper
include ApiHelper
def self.student_work_expose(f)
expose f do |u,opt|
if u.is_a?(Hash) && u.key?(f)
u[f]
elsif u.is_a?(::StudentWork)
if u.respond_to?(f)
if f == :created_at
format_time(u.send(:created_at))
else
u.send(f)
end
else
case f
when :student_id
u.user.user_extensions.student_id
end
end
end
end
end
expose :user, using: Mobile::Entities::User do |c, opt|
if c.is_a?(::StudentWork)
c.user
end
end
student_work_expose :student_id
student_work_expose :id
student_work_expose :name
student_work_expose :description
student_work_expose :final_score
student_work_expose :teacher_score
student_work_expose :student_score
student_work_expose :teacher_asistant_score
student_work_expose :created_at
end
end
module Mobile
module Entities
class StudentWork < Grape::Entity
include ApplicationHelper
include ApiHelper
def self.student_work_expose(f)
expose f do |u,opt|
if u.is_a?(Hash) && u.key?(f)
u[f]
elsif u.is_a?(::StudentWork)
if u.respond_to?(f)
if f == :created_at
format_time(u.send(:created_at))
else
u.send(f)
end
else
case f
when :student_id
u.user.user_extensions.student_id
end
end
end
end
end
expose :user, using: Mobile::Entities::User do |c, opt|
if c.is_a?(::StudentWork)
c.user
end
end
student_work_expose :student_id
student_work_expose :id
student_work_expose :name
student_work_expose :description
student_work_expose :final_score
student_work_expose :teacher_score
student_work_expose :student_score
student_work_expose :teacher_asistant_score
student_work_expose :created_at
end
end
end end

+ 15
- 15
app/api/mobile/entities/syllabus.rb View File

@@ -1,15 +1,15 @@
module Mobile
module Entities
class Syllabus < Grape::Entity
expose :title
expose :id
expose :can_setting, if: lambda { |instance, options| options[:user] } do |instance, options|
current_user = options[:user]
can_setting = instance[:user_id] == current_user.id ? true : false
can_setting = false if instance[:id].nil?
can_setting
end
expose :courses, using: Mobile::Entities::Course
end
end
end
module Mobile
module Entities
class Syllabus < Grape::Entity
expose :title
expose :id
expose :can_setting, if: lambda { |instance, options| options[:user] } do |instance, options|
current_user = options[:user]
can_setting = instance[:user_id] == current_user.id ? true : false
can_setting = false if instance[:id].nil?
can_setting
end
expose :courses, using: Mobile::Entities::Course
end
end
end

+ 87
- 87
app/api/mobile/entities/user.rb View File

@@ -1,87 +1,87 @@
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
"/images/#{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
when :student_num
u.nil? || u.user_extensions.nil? ? "" : u.user_extensions.student_id
when :real_name
u.nil? ? "" : get_user_realname(u).gsub(/\s*/,"");
when :name
u.nil? ? "" : u.show_name
when :roles_id
u[:roles_id].nil? ? nil : u.roles_id
when :login
u.login
when :lastname
u.lastname
when :mail
u.mail
when :is_me
defined? u.is_me ? u.is_me : 0
end
end
end
end
end
expose :id
#头像
user_expose :login
user_expose :lastname
#邮箱地址
user_expose :mail
expose :nickname
#真名
user_expose :img_url
#昵称
expose :realname
#昵称
user_expose :real_name
#性别
user_expose :gender
#我的二维码
#工作单位
user_expose :work_unit
#地区
user_expose :location
#签名
user_expose :brief_introduction
#总成绩
user_expose :score
#学号
user_expose :student_num
# 活跃值
user_expose :active_count
user_expose :role_name
user_expose :roles_id
user_expose :name
user_expose :is_me
end
end
end
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
"/images/#{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
when :student_num
u.nil? || u.user_extensions.nil? ? "" : u.user_extensions.student_id
when :real_name
u.nil? ? "" : get_user_realname(u).gsub(/\s*/,"");
when :name
u.nil? ? "" : u.show_name
when :roles_id
u[:roles_id].nil? ? nil : u.roles_id
when :login
u.login
when :lastname
u.lastname
when :mail
u.mail
when :is_me
defined? u.is_me ? u.is_me : 0
end
end
end
end
end
expose :id
#头像
user_expose :login
user_expose :lastname
#邮箱地址
user_expose :mail
expose :nickname
#真名
user_expose :img_url
#昵称
expose :realname
#昵称
user_expose :real_name
#性别
user_expose :gender
#我的二维码
#工作单位
user_expose :work_unit
#地区
user_expose :location
#签名
user_expose :brief_introduction
#总成绩
user_expose :score
#学号
user_expose :student_num
# 活跃值
user_expose :active_count
user_expose :role_name
user_expose :roles_id
user_expose :name
user_expose :is_me
end
end
end

+ 118
- 118
app/api/mobile/entities/whomework.rb View File

@@ -1,119 +1,119 @@
# encoding: utf-8
module Mobile
module Entities
class Whomework <Grape::Entity
include ApiHelper
include ApplicationHelper
include Redmine::I18n
def self.whomework_expose(f)
expose f do |wh, opt|
if wh.is_a?(Hash) && wh.key?(f)
wh[f]
elsif wh.is_a?(::HomeworkCommon)
if wh.respond_to?(f)
if f == :created_at
format_time(wh.send(f))
else
wh.send(f)
end
else
case f
when :absence_penalty
wh.nil? || wh.homework_detail_manual.nil? ? 0 : wh.homework_detail_manual.absence_penalty
when :evaluation_start
wh.nil? || wh.homework_detail_manual.nil? ? nil : convert_to_time(wh.homework_detail_manual.evaluation_start, 0)
when :evaluation_end
wh.nil? || wh.homework_detail_manual.nil? ? nil : convert_to_time(wh.homework_detail_manual.evaluation_end, 1)
when :praise_count
get_activity_praise_num(wh)
when :comment_count
wh.journals_for_messages.count
when :course_name
wh.course.name
when :syllabus_title
wh.course.syllabus.nil? ? "" : wh.course.syllabus.title
when :act_type
'HomeworkCommon'
when :act_id
wh.id
when :title
wh.name
when :homework_commit_count
wh.student_works.has_committed.count
when :last_commit_info
if wh.student_works.has_committed.count > 0
lc = wh.student_works.has_committed.reorder("commit_time desc").first
{:lasttime=>time_from_now(lc.commit_time), :lastname=>lc.user.show_name}
end
when :last_score_info
if wh.student_works.has_committed.count > 0
sw_id = "("+wh.student_works.map{|sw| sw.id}.join(",")+")"
student_work_scores = StudentWorksScore.where("student_work_id in #{sw_id} and score is not null").reorder("created_at desc")
unless student_work_scores.empty?
last_score = student_work_scores.first
{:lasttime=>time_from_now(last_score.created_at), :lastname=>last_score.user.show_name}
end
end
end
end
end
end
end
expose :author, using: Mobile::Entities::User do |w, opt|
if w.is_a?(::HomeworkCommon)
w.user
end
end
expose :current_user, using: Mobile::Entities::User do |w, opt|
current_user
end
expose :name
expose :description
expose :publish_time
expose :end_time
expose :homework_type
expose :late_penalty
expose :course_id
expose :anonymous_comment
expose :quotes
expose :is_open
expose :id
whomework_expose :title
whomework_expose :act_type
whomework_expose :act_id
whomework_expose :course_name
whomework_expose :syllabus_title
whomework_expose :created_at
whomework_expose :absence_penalty
whomework_expose :evaluation_start
whomework_expose :evaluation_end
whomework_expose :praise_count
whomework_expose :comment_count
whomework_expose :homework_commit_count #作品提交数
whomework_expose :last_commit_info #最近提交信息
whomework_expose :last_score_info #最近评阅信息
expose :all_children, using: Mobile::Entities::Jours do |f, opt|
#f[:journals_for_messages] if f.is_a?(Hash) && f.key?(:journals_for_messages)
if f.is_a?(::HomeworkCommon)
# f.journals_for_messages.reverse
if !opt[:children] && opt[:type] == 0
opt[:children] = true
tStart = opt[:page]*5
tEnd = (opt[:page]+1)*5 - 1
all_comments = f.journals_for_messages.reorder("created_on desc")
all_comments[tStart..tEnd]
end
end
end
expose :has_praise , if: lambda { |instance, options| options[:user] } do |instance, options|
has_praise = false
current_user = options[:user]
obj = PraiseTread.where("praise_tread_object_id=? and praise_tread_object_type=? and user_id=?",instance.id,instance.class.to_s,current_user.id)
has_praise = obj.empty? ? false : true
has_praise
end
end
end
# encoding: utf-8
module Mobile
module Entities
class Whomework <Grape::Entity
include ApiHelper
include ApplicationHelper
include Redmine::I18n
def self.whomework_expose(f)
expose f do |wh, opt|
if wh.is_a?(Hash) && wh.key?(f)
wh[f]
elsif wh.is_a?(::HomeworkCommon)
if wh.respond_to?(f)
if f == :created_at
format_time(wh.send(f))
else
wh.send(f)
end
else
case f
when :absence_penalty
wh.nil? || wh.homework_detail_manual.nil? ? 0 : wh.homework_detail_manual.absence_penalty
when :evaluation_start
wh.nil? || wh.homework_detail_manual.nil? ? nil : convert_to_time(wh.homework_detail_manual.evaluation_start, 0)
when :evaluation_end
wh.nil? || wh.homework_detail_manual.nil? ? nil : convert_to_time(wh.homework_detail_manual.evaluation_end, 1)
when :praise_count
get_activity_praise_num(wh)
when :comment_count
wh.journals_for_messages.count
when :course_name
wh.course.name
when :syllabus_title
wh.course.syllabus.nil? ? "" : wh.course.syllabus.title
when :act_type
'HomeworkCommon'
when :act_id
wh.id
when :title
wh.name
when :homework_commit_count
wh.student_works.has_committed.count
when :last_commit_info
if wh.student_works.has_committed.count > 0
lc = wh.student_works.has_committed.reorder("commit_time desc").first
{:lasttime=>time_from_now(lc.commit_time), :lastname=>lc.user.show_name}
end
when :last_score_info
if wh.student_works.has_committed.count > 0
sw_id = "("+wh.student_works.map{|sw| sw.id}.join(",")+")"
student_work_scores = StudentWorksScore.where("student_work_id in #{sw_id} and score is not null").reorder("created_at desc")
unless student_work_scores.empty?
last_score = student_work_scores.first
{:lasttime=>time_from_now(last_score.created_at), :lastname=>last_score.user.show_name}
end
end
end
end
end
end
end
expose :author, using: Mobile::Entities::User do |w, opt|
if w.is_a?(::HomeworkCommon)
w.user
end
end
expose :current_user, using: Mobile::Entities::User do |w, opt|
current_user
end
expose :name
expose :description
expose :publish_time
expose :end_time
expose :homework_type
expose :late_penalty
expose :course_id
expose :anonymous_comment
expose :quotes
expose :is_open
expose :id
whomework_expose :title
whomework_expose :act_type
whomework_expose :act_id
whomework_expose :course_name
whomework_expose :syllabus_title
whomework_expose :created_at
whomework_expose :absence_penalty
whomework_expose :evaluation_start
whomework_expose :evaluation_end
whomework_expose :praise_count
whomework_expose :comment_count
whomework_expose :homework_commit_count #作品提交数
whomework_expose :last_commit_info #最近提交信息
whomework_expose :last_score_info #最近评阅信息
expose :all_children, using: Mobile::Entities::Jours do |f, opt|
#f[:journals_for_messages] if f.is_a?(Hash) && f.key?(:journals_for_messages)
if f.is_a?(::HomeworkCommon)
# f.journals_for_messages.reverse
if !opt[:children] && opt[:type] == 0
opt[:children] = true
tStart = opt[:page]*5
tEnd = (opt[:page]+1)*5 - 1
all_comments = f.journals_for_messages.reorder("created_on desc")
all_comments[tStart..tEnd]
end
end
end
expose :has_praise , if: lambda { |instance, options| options[:user] } do |instance, options|
has_praise = false
current_user = options[:user]
obj = PraiseTread.where("praise_tread_object_id=? and praise_tread_object_type=? and user_id=?",instance.id,instance.class.to_s,current_user.id)
has_praise = obj.empty? ? false : true
has_praise
end
end
end
end end

+ 13
- 13
app/api/mobile/exceptions/auth_exception.rb View File

@@ -1,13 +1,13 @@
#coding=utf-8
#
module Mobile
module Exceptions
class AuthException < StandardError
attr_reader :err_code, :msg
def initialize(code, msg)
@err_code = code
@msg = msg
end
end
end
end
#coding=utf-8
#
module Mobile
module Exceptions
class AuthException < StandardError
attr_reader :err_code, :msg
def initialize(code, msg)
@err_code = code
@msg = msg
end
end
end
end

+ 26
- 26
app/api/mobile/middleware/error_handler.rb View File

@@ -1,26 +1,26 @@
#coding=utf-8
module Mobile
module Middleware
class ErrorHandler < Grape::Middleware::Base
def call!(env)
@env = env
begin
@app.call(@env)
rescue =>e
code = 1
message = {status: code, message: e.message }.to_json
Rails.logger.error e.inspect
Rails.logger.error e.backtrace.join("\n")
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
#coding=utf-8
module Mobile
module Middleware
class ErrorHandler < Grape::Middleware::Base
def call!(env)
@env = env
begin
@app.call(@env)
rescue =>e
code = 1
message = {status: code, message: e.message }.to_json
Rails.logger.error e.inspect
Rails.logger.error e.backtrace.join("\n")
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

+ 2
- 2
app/assets/javascripts/applied_project.js View File

@@ -1,2 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

+ 2
- 2
app/assets/javascripts/apply_project_masters.js View File

@@ -1,2 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

+ 3
- 3
app/assets/javascripts/article_homepages.js.coffee View File

@@ -1,3 +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/
# 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/

+ 2
- 2
app/assets/javascripts/attachment_type_edit.js View File

@@ -1,2 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

+ 3
- 3
app/assets/javascripts/contest_members.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/contestant_works.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/contests.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/cooperation.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/enterprises.js.coffee View File

@@ -1,3 +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/
# 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/

+ 2
- 2
app/assets/javascripts/forums.js View File

@@ -1,2 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

+ 3
- 3
app/assets/javascripts/homepages.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/main_categories.js.coffee View File

@@ -1,3 +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/
# 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/

+ 2
- 2
app/assets/javascripts/memos.js View File

@@ -1,2 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

+ 2
- 2
app/assets/javascripts/no_uses.js View File

@@ -1,2 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

+ 3
- 3
app/assets/javascripts/notificationcomments.js.coffee View File

@@ -1,3 +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/
# 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/

+ 2
- 2
app/assets/javascripts/open_source_projects.js View File

@@ -1,2 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

+ 3
- 3
app/assets/javascripts/org_courses.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/org_document_comment.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/org_member.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/org_projects.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/org_subfields.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/organizations.js.coffee View File

@@ -1,3 +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/
# 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/

+ 2
- 2
app/assets/javascripts/praise_tread.js View File

@@ -1,2 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

+ 3
- 3
app/assets/javascripts/pull_requests.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/quality_analyses.js.coffee View File

@@ -1,3 +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/
# 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/

+ 2
- 2
app/assets/javascripts/school.js View File

@@ -1,2 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

+ 2
- 2
app/assets/javascripts/shares.js View File

@@ -1,2 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

+ 3
- 3
app/assets/javascripts/shield_activities.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/shield_wechat_messages.js.coffee View File

@@ -1,3 +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/
# 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/

+ 2
- 2
app/assets/javascripts/softapplications.js View File

@@ -1,2 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

+ 3
- 3
app/assets/javascripts/statistics.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/sub_categories.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/sub_document_comments.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/sub_domains.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/subfield_subdomain_dirs.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/syllabus_member.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/syllabuses.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/system_log.js.coffee View File

@@ -1,3 +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/
# 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/

+ 3
- 3
app/assets/javascripts/system_messages.js.coffee View File

@@ -1,3 +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/
# 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/

+ 2
- 2
app/assets/javascripts/teachers.js View File

@@ -1,2 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

+ 3
- 3
app/assets/javascripts/works.js.coffee View File

@@ -1,3 +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/
# 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/

+ 2
- 2
app/assets/javascripts/zipdown.js View File

@@ -1,2 +1,2 @@
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.
// Place all the behaviors and hooks related to the matching controller here.
// All this logic will automatically be available in application.js.

+ 4
- 4
app/assets/stylesheets/applied_project.css View File

@@ -1,4 +1,4 @@
/*
Place all the styles related to the matching controller here.
They will automatically be included in application.css.
*/
/*
Place all the styles related to the matching controller here.
They will automatically be included in application.css.
*/

+ 4
- 4
app/assets/stylesheets/apply_project_masters.css View File

@@ -1,4 +1,4 @@
/*
Place all the styles related to the matching controller here.
They will automatically be included in application.css.
*/
/*
Place all the styles related to the matching controller here.
They will automatically be included in application.css.
*/

+ 3
- 3
app/assets/stylesheets/article_homepages.css.scss View File

@@ -1,3 +1,3 @@
// Place all the styles related to the ArticleHomepages controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
// Place all the styles related to the ArticleHomepages controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

+ 4
- 4
app/assets/stylesheets/attachment_type_edit.css View File

@@ -1,4 +1,4 @@
/*
Place all the styles related to the matching controller here.
They will automatically be included in application.css.
*/
/*
Place all the styles related to the matching controller here.
They will automatically be included in application.css.
*/

+ 3
- 3
app/assets/stylesheets/contest_members.css.scss View File

@@ -1,3 +1,3 @@
// Place all the styles related to the contest_members controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
// Place all the styles related to the contest_members controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

+ 3
- 3
app/assets/stylesheets/contestant_works.css.scss View File

@@ -1,3 +1,3 @@
// Place all the styles related to the contestant_works controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
// Place all the styles related to the contestant_works controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

+ 3
- 3
app/assets/stylesheets/contests.css.scss View File

@@ -1,3 +1,3 @@
// Place all the styles related to the contests controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
// Place all the styles related to the contests controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

+ 3
- 3
app/assets/stylesheets/cooperation.css.scss View File

@@ -1,3 +1,3 @@
// Place all the styles related to the cooperation controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
// Place all the styles related to the cooperation controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

+ 3
- 3
app/assets/stylesheets/enterprises.css.scss View File

@@ -1,3 +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/
// 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/

+ 4
- 4
app/assets/stylesheets/forums.css View File

@@ -1,4 +1,4 @@
/*
Place all the styles related to the matching controller here.
They will automatically be included in application.css.
*/
/*
Place all the styles related to the matching controller here.
They will automatically be included in application.css.
*/

+ 3
- 3
app/assets/stylesheets/homepages.css.scss View File

@@ -1,3 +1,3 @@
// Place all the styles related to the Homepages controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
// Place all the styles related to the Homepages controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

+ 3
- 3
app/assets/stylesheets/main_categories.css.scss View File

@@ -1,3 +1,3 @@
// Place all the styles related to the main_categories controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
// Place all the styles related to the main_categories controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

+ 4
- 4
app/assets/stylesheets/memos.css View File

@@ -1,4 +1,4 @@
/*
Place all the styles related to the matching controller here.
They will automatically be included in application.css.
*/
/*
Place all the styles related to the matching controller here.
They will automatically be included in application.css.
*/

+ 4
- 4
app/assets/stylesheets/no_uses.css View File

@@ -1,4 +1,4 @@
/*
Place all the styles related to the matching controller here.
They will automatically be included in application.css.
*/
/*
Place all the styles related to the matching controller here.
They will automatically be included in application.css.
*/

+ 3
- 3
app/assets/stylesheets/notificationcomments.css.scss View File

@@ -1,3 +1,3 @@
// Place all the styles related to the notificationcomments controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/
// Place all the styles related to the notificationcomments controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

+ 4
- 4
app/assets/stylesheets/open_source_projects.css View File

@@ -1,4 +1,4 @@
/*
Place all the styles related to the matching controller here.
They will automatically be included in application.css.
*/
/*
Place all the styles related to the matching controller here.
They will automatically be included in application.css.
*/

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save