You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

admin_controller.rb 20 kB

​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
10 years ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. # Redmine - project management software
  2. # Copyright (C) 2006-2013 Jean-Philippe Lang
  3. #
  4. # This program is free software; you can redistribute it and/or
  5. # modify it under the terms of the GNU General Public License
  6. # as published by the Free Software Foundation; either version 2
  7. # of the License, or (at your option) any later version.
  8. #
  9. # This program is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. # GNU General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU General Public License
  15. # along with this program; if not, write to the Free Software
  16. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  17. class AdminController < ApplicationController
  18. layout 'admin'
  19. menu_item :projects, :only => :projects
  20. menu_item :plugins, :only => :plugins
  21. menu_item :info, :only => :info
  22. before_filter :require_admin
  23. helper :sort
  24. helper :Users
  25. helper :Settings,SchoolHelper
  26. include SortHelper
  27. def index
  28. @no_configuration_data = Redmine::DefaultData::Loader::no_data?
  29. end
  30. def projects
  31. =begin
  32. @status = params[:status] || 1
  33. scope = Project.status(@status)
  34. scope = scope.like(params[:name]) if params[:name].present?
  35. @projects = scope.where(project_type: Project::ProjectType_project).reorder("created_on desc").all
  36. =end
  37. @projects = Project.like(@name).order('created_on desc')
  38. @projects = paginateHelper @projects,30
  39. @page = (params['page'] || 1).to_i - 1
  40. render :action => "projects", :layout => false if request.xhr?
  41. end
  42. def courses
  43. @name = params[:name]
  44. @courses = Course.like(@name).order('created_at desc')
  45. @courses = paginateHelper @courses,30
  46. @page = (params['page'] || 1).to_i - 1
  47. respond_to do |format|
  48. format.html
  49. end
  50. end
  51. #管理员界面精品课程列表
  52. def excellent_courses
  53. @courses = Course.where("is_excellent =? or excellent_option =?", 1, 1 )
  54. respond_to do |format|
  55. format.html
  56. end
  57. end
  58. #管理员界面课程资源列表
  59. def course_resource_list
  60. if params[:sort] == 'file_size'
  61. @resource = Attachment.where(:container_type => 'Course').order("filesize desc")
  62. elsif params[:sort] == 'file_upload'
  63. @resource = Attachment.where(:container_type => 'Course').order("created_on desc")
  64. elsif params[:sort] == 'file_download_times'
  65. @resource = Attachment.where(:container_type => 'Course').order("downloads desc")
  66. else
  67. @resource = Attachment.where(:container_type => 'Course').order("created_on desc")
  68. end
  69. @resource = paginateHelper @resource,30
  70. @page = (params['page'] || 1).to_i - 1
  71. respond_to do |format|
  72. format.html
  73. end
  74. end
  75. #管理员界面項目资源列表
  76. def project_resource_list
  77. if params[:sort] == 'file_size'
  78. @pro_resource = Attachment.where(:container_type => 'Project').order("filesize desc")
  79. elsif params[:sort] == 'file_upload'
  80. @pro_resource = Attachment.where(:container_type => 'Project').order("created_on desc")
  81. elsif params[:sort] == 'file_download_times'
  82. @pro_resource = Attachment.where(:container_type => 'Project').order("downloads desc")
  83. else
  84. @pro_resource = Attachment.where(:container_type => 'Project').order("created_on desc")
  85. end
  86. @pro_resource = paginateHelper @pro_resource,30
  87. @page = (params['page'] || 1).to_i - 1
  88. respond_to do |format|
  89. format.html
  90. end
  91. end
  92. def users
  93. sort_init 'login', 'asc'
  94. sort_update %w(login firstname lastname mail admin created_on last_login_on)
  95. case params[:format]
  96. when 'xml', 'json'
  97. @offset, @limit = api_offset_and_limit({:limit => 50})
  98. else
  99. @limit = 50 #per_page_option
  100. end
  101. @status = params[:status] || 1
  102. scope = User.logged.status(@status)
  103. scope = User.like(params[:name]) if params[:name].present?
  104. scope = scope.in_group(params[:group_id]) if params[:group_id].present?
  105. @user_count = scope.count
  106. @user_pages = Paginator.new @user_count, @limit, params['page']
  107. @offset ||= @user_pages.offset
  108. @users = scope.order(sort_clause).limit(@limit).offset(@offset).all
  109. respond_to do |format|
  110. format.html {
  111. @groups = Group.all.sort
  112. }
  113. format.api
  114. end
  115. end
  116. # 系统消息
  117. def messages
  118. @admin_messages = SystemMessage.new
  119. end
  120. def plugins
  121. @plugins = Redmine::Plugin.all
  122. end
  123. # Loads the default configuration
  124. # (roles, trackers, statuses, workflow, enumerations)
  125. def default_configuration
  126. if request.post?
  127. begin
  128. Redmine::DefaultData::Loader::load(params[:lang])
  129. flash[:notice] = l(:notice_default_data_loaded)
  130. rescue Exception => e
  131. flash[:error] = l(:error_can_t_load_default_data, e.message)
  132. end
  133. end
  134. redirect_to admin_url
  135. end
  136. def test_email
  137. raise_delivery_errors = ActionMailer::Base.raise_delivery_errors
  138. # Force ActionMailer to raise delivery errors so we can catch it
  139. ActionMailer::Base.raise_delivery_errors = true
  140. begin
  141. @test = Mailer.test_email(User.current).deliver
  142. flash[:notice] = l(:notice_email_sent, User.current.mail)
  143. rescue Exception => e
  144. flash[:error] = l(:notice_email_error, e.message)
  145. end
  146. ActionMailer::Base.raise_delivery_errors = raise_delivery_errors
  147. redirect_to settings_url(:tab => 'notifications')
  148. end
  149. def info
  150. @db_adapter_name = ActiveRecord::Base.connection.adapter_name
  151. @checklist = [
  152. [:text_default_administrator_account_changed, User.default_admin_account_changed?],
  153. [:text_file_repository_writable, File.writable?(Attachment.storage_path)],
  154. [:text_plugin_assets_writable, File.writable?(Redmine::Plugin.public_directory)],
  155. [:text_rmagick_available, Object.const_defined?(:Magick)]
  156. ]
  157. end
  158. #管理功能用户列表的搜索
  159. def search
  160. sort_init 'login', 'asc'
  161. sort_update %w(login firstname lastname mail admin created_on last_login_on)
  162. case params[:format]
  163. when 'xml', 'json'
  164. @offset, @limit = api_offset_and_limit({:limit => 15})
  165. else
  166. @limit = 15#per_page_option
  167. end
  168. @status = params[:status] || 1
  169. scope = User.logged.status(@status)
  170. scope = scope.like(params[:name],params[:search_by][:id]) if params[:name].present?
  171. @user_count = scope.count
  172. @user_pages = Paginator.new @user_count, @limit, params['page']
  173. @user_base_tag = params[:id] ? 'base_users':'base'
  174. @users = scope.offset(@user_pages.offset).limit(@user_pages.per_page)
  175. respond_to do |format|
  176. format.html {
  177. @groups = Group.all.sort
  178. }
  179. format.api
  180. end
  181. end
  182. #首页定制
  183. def first_page_made
  184. if request.get?
  185. @first_page = FirstPage.find_by_page_type('project')
  186. elsif request.post?
  187. @first_page = FirstPage.find_by_page_type('project')
  188. @first_page.web_title = params[:web_title]
  189. @first_page.description = params[:first_page][:description]
  190. #@first_page.title = params[:title]
  191. @first_page.image_width = params[:image_width]
  192. @first_page.image_height = params[:image_height]
  193. @first_page.sort_type = params[:sort_type]
  194. @first_page.show_course = params[:show_course]
  195. @first_page.show_contest = params[:show_contest]
  196. if @first_page.save
  197. respond_to do |format|
  198. flash[:notice] = l(:notice_successful_update)
  199. format.html {
  200. redirect_to first_page_made_url
  201. }
  202. format.api { render_api_ok }
  203. #format.json { render json: @first_page, status: :created, location: @first_page }
  204. end
  205. else
  206. respond_to do |format|
  207. flash.now[:error] = "#{l :label_first_page_create_fail}: #{@first_page.errors.full_messages[0]}"
  208. format.html {
  209. render :action => 'first_page_made'
  210. }
  211. format.api { render_validation_errors(@first_page) }
  212. #format.json { render json: @first_page.errors, status: :unprocessable_entity }
  213. end
  214. end
  215. end
  216. end
  217. def course_page_made
  218. if request.get?
  219. @course_page = FirstPage.find_by_page_type('course')
  220. @first_page = FirstPage.find_by_page_type('project')
  221. elsif request.post?
  222. @first_page = FirstPage.find_by_page_type('project')
  223. @course_page = FirstPage.find_by_page_type('course')
  224. @first_page.web_title = params[:web_title]
  225. @course_page.web_title = params[:web_title]
  226. @course_page.title = params[:course_title]
  227. @course_page.image_width = params[:image_width]
  228. @course_page.image_height = params[:image_height]
  229. @course_page.description = params[:course_description]
  230. if @first_page.save && @course_page.save
  231. respond_to do |format|
  232. format.html {
  233. flash[:notice] = l(:notice_successful_update)
  234. redirect_to course_page_made_url
  235. }
  236. format.api { render_api_ok }
  237. end
  238. else
  239. respond_to do |format|
  240. flash.now[:error] = "#{l :label_first_page_create_fail}: #{@first_page.errors.full_messages[0]}\n\t#{@course_page.errors.full_messages[0]}"
  241. #flash.now[:error] = "#{l :label_first_page_create_fail}: #{@course_page.errors.full_messages[0]}"
  242. format.html {
  243. render :action => 'course_page_made'
  244. }
  245. format.api { render_validation_errors(@first_page) }
  246. format.api { render_validation_errors(@course_page) }
  247. end
  248. end
  249. end
  250. end
  251. def contest_page_made
  252. if request.get?
  253. @contest_page = FirstPage.find_by_page_type('contest')
  254. @first_page = FirstPage.find_by_page_type('project')
  255. elsif request.post?
  256. @first_page = FirstPage.find_by_page_type('project')
  257. @contest_page = FirstPage.find_by_page_type('contest')
  258. @first_page.web_title = params[:web_title]
  259. @contest_page.web_title = params[:web_title]
  260. @contest_page.title = params[:contest_title]
  261. @contest_page.image_width = params[:image_width]
  262. @contest_page.image_height = params[:image_height]
  263. @contest_page.description = params[:contest_description]
  264. if @first_page.save && @contest_page.save
  265. respond_to do |format|
  266. format.html {
  267. flash[:notice] = l(:notice_successful_update)
  268. redirect_to contest_page_made_url
  269. }
  270. format.api { render_api_ok }
  271. end
  272. else
  273. respond_to do |format|
  274. flash.now[:error] = "#{l :label_first_page_create_fail}: #{@first_page.errors.full_messages[0]}\n\t#{@contest_page.errors.full_messages[0]}\n\t#{@notification.errors.full_messages[0]}"
  275. format.html {
  276. render :action => 'contest_page_made'
  277. }
  278. format.api { render_validation_errors(@first_page) }
  279. format.api { render_validation_errors(@contest_page) }
  280. end
  281. end
  282. end
  283. end
  284. def web_footer_made
  285. if request.get?
  286. @organizer = WebFooterOranizer.first
  287. @first_page = FirstPage.find_by_page_type('project')
  288. #@notification = ContestNotification.all.first;
  289. elsif request.post?
  290. @first_page = FirstPage.find_by_page_type('project')
  291. @first_page.web_title = params[:web_title]
  292. @organizer = WebFooterOranizer.first
  293. if @organizer.nil?
  294. @organizer = WebFooterOranizer.new
  295. end
  296. @organizer.name = params[:organizer_name]
  297. @organizer.description = params[:web_footer_oranizer][:description]
  298. if @first_page.save && @organizer.save
  299. respond_to do |format|
  300. format.html {
  301. flash[:notice] = l(:notice_successful_update)
  302. redirect_to web_footer_made_url
  303. }
  304. format.api { render_api_ok }
  305. end
  306. else
  307. respond_to do |format|
  308. flash.now[:error] = "#{l :label_first_page_create_fail}: #{@first_page.errors.full_messages[0]}\n\t#{@organizer.errors.full_messages[0]}}"
  309. format.html {
  310. render :action => 'web_footer_made'
  311. }
  312. format.api { render_validation_errors(@first_page) }
  313. format.api { render_validation_errors(@contest_page) }
  314. end
  315. end
  316. end
  317. end
  318. #企业主页定制
  319. def enterprise_page_made
  320. @enterprise_page = FirstPage.find_by_page_type('enterprise')
  321. if @enterprise_page.nil?
  322. @enterprise_page = FirstPage.new
  323. @enterprise_page.page_type = 'enterprise'
  324. end
  325. if request.get?
  326. @first_page = FirstPage.find_by_page_type('project')
  327. elsif request.post?
  328. @first_page = FirstPage.find_by_page_type('project')
  329. @first_page.web_title = params[:web_title]
  330. @enterprise_page.web_title = params[:web_title]
  331. @enterprise_page.title = params[:course_title]
  332. @enterprise_page.image_width = params[:image_width]
  333. @enterprise_page.image_height = params[:image_height]
  334. @enterprise_page.description = params[:course_description]
  335. if @first_page.save && @enterprise_page.save
  336. respond_to do |format|
  337. format.html {
  338. flash[:notice] = l(:notice_successful_update)
  339. redirect_to enterprise_page_made_url
  340. }
  341. format.api { render_api_ok }
  342. end
  343. else
  344. respond_to do |format|
  345. flash.now[:error] = "#{l :label_first_page_create_fail}: #{@first_page.errors.full_messages[0]}\n\t#{@enterprise_page.errors.full_messages[0]}"
  346. #flash.now[:error] = "#{l :label_first_page_create_fail}: #{@course_page.errors.full_messages[0]}"
  347. format.html {
  348. render :action => 'enterprise_page_made'
  349. }
  350. format.api { render_validation_errors(@first_page) }
  351. format.api { render_validation_errors(@enterprise_page) }
  352. end
  353. end
  354. end
  355. end
  356. #组织
  357. def organization
  358. @organizations = Organization.find_by_sql("SELECT * FROM organizations ORDER BY created_at DESC")
  359. #@organizations = Organization.all.order("created_at desc")
  360. @organization_count = @organizations.count
  361. @organization_pages = Paginator.new @organization_count, 30, params['page'] || 1
  362. @organizations = paginateHelper @organizations,30
  363. @page = (params['page'] || 1).to_i - 1
  364. respond_to do |format|
  365. format.html
  366. end
  367. end
  368. #学校列表
  369. def schools
  370. @schools = School.find_by_sql("SELECT * FROM schools ORDER BY created_at DESC")
  371. @school_count = @schools.count
  372. @school_pages = Paginator.new @school_count, 30, params['page'] || 1
  373. @schools = paginateHelper @schools,30
  374. @page = (params['page'] || 1).to_i - 1
  375. respond_to do |format|
  376. format.html
  377. end
  378. end
  379. #移动端版本管理
  380. def mobile_version
  381. @versions = PhoneAppVersion.reorder('created_at desc')
  382. @new_version = PhoneAppVersion.new
  383. end
  384. def create_version
  385. @versions = PhoneAppVersion.reorder('created_at desc')
  386. @new_version = PhoneAppVersion.new
  387. @new_version.version = params[:version]
  388. @new_version.description = params[:description]
  389. if params[:attachments][:dummy][:file].nil? || params[:attachments][:dummy][:file] == ""
  390. respond_to do |format|
  391. flash.now[:error] = "#{l :label_version_create_fail}: #{l(:label_client_need)}"
  392. #flash.now[:error] = "#{l :label_first_page_create_fail}: #{@course_page.errors.full_messages[0]}"
  393. format.html {
  394. render :action => 'mobile_version'
  395. }
  396. format.api { render_validation_errors(@new_version) }
  397. end
  398. else
  399. @new_version.save_attachments(params[:attachments] || (params[:version] && params[:version][:uploads]))
  400. if @new_version.save
  401. respond_to do |format|
  402. format.html {
  403. flash[:notice] = l(:notice_successful_create)
  404. redirect_to mobile_version_url
  405. }
  406. format.api { render_api_ok }
  407. end
  408. else
  409. respond_to do |format|
  410. flash.now[:error] = "#{l :label_version_create_fail}: #{@new_version.errors.full_messages[0]}"
  411. #flash.now[:error] = "#{l :label_first_page_create_fail}: #{@course_page.errors.full_messages[0]}"
  412. format.html {
  413. render :action => 'mobile_version'
  414. }
  415. format.api { render_validation_errors(@new_version) }
  416. end
  417. end
  418. end
  419. end
  420. #留言列表
  421. def leave_messages
  422. @jour = JournalsForMessage.find_by_sql("SELECT * FROM journals_for_messages AS j1
  423. WHERE j1.jour_type IN ('Course','Principal') AND (j1.m_parent_id IS NULL OR (j1.m_parent_id IN (SELECT id FROM journals_for_messages WHERE jour_type IN ('Course','Principal')))) order by created_on desc")
  424. @jour = paginateHelper @jour,30
  425. @page = (params['page'] || 1).to_i - 1
  426. respond_to do |format|
  427. format.html
  428. end
  429. end
  430. #帖子
  431. def messages_list
  432. @memo = Memo.reorder("created_at desc")
  433. @memo = paginateHelper @memo,30
  434. @page = (params['page'] || 1).to_i - 1
  435. respond_to do |format|
  436. format.html
  437. end
  438. end
  439. #课程讨论区的帖子
  440. def course_messages
  441. @course_ms=Message.joins("join boards on messages.board_id=boards.id where boards.course_id is not NULL").reorder('created_on desc')
  442. @course_ms = paginateHelper @course_ms,30
  443. @page = (params['page'] || 1).to_i - 1
  444. respond_to do |format|
  445. format.html
  446. end
  447. end
  448. #项目讨论区的帖子
  449. def project_messages
  450. @project_ms=Message.joins("join boards on messages.board_id=boards.id where boards.project_id != -1").reorder('created_on desc')
  451. @project_ms = paginateHelper @project_ms,30
  452. @page = (params['page'] || 1).to_i - 1
  453. respond_to do |format|
  454. format.html
  455. end
  456. end
  457. #通知
  458. def notices
  459. @news = News.where('course_id is not NULL').order('created_on desc')
  460. @news = paginateHelper @news,30
  461. @page = (params['page'] || 1).to_i - 1
  462. respond_to do |format|
  463. format.html
  464. end
  465. end
  466. #最近登录用户列表
  467. def latest_login_users
  468. scope = User.order('last_login_on desc')
  469. scope = scope.where("last_login_on>= '#{params[:startdate]} 00:00:00'") if params[:startdate].present?
  470. scope =scope.where("last_login_on <= '#{params[:enddate]} 23:59:59'") if params[:enddate].present?
  471. @users = scope
  472. @users = paginateHelper @users,30
  473. @page = (params['page'] || 1).to_i - 1
  474. respond_to do |format|
  475. format.html
  476. end
  477. end
  478. #最近登录老师列表
  479. def latest_login_teachers
  480. scope = User.find_by_sql("SELECT * FROM users,user_extensions WHERE users.id = user_extensions.user_id AND user_extensions.identity=0 ORDER BY last_login_on DESC")
  481. if params[:startdate].present?
  482. scope = User.find_by_sql("SELECT * FROM users,user_extensions WHERE users.id = user_extensions.user_id AND user_extensions.identity=0 and last_login_on>= '#{params[:startdate]} 00:00:00' ORDER BY last_login_on DESC")
  483. end
  484. if params[:enddate].present?
  485. scope = User.find_by_sql("SELECT * FROM users,user_extensions WHERE users.id = user_extensions.user_id AND user_extensions.identity=0 and last_login_on <= '#{params[:enddate]} 23:59:59' ORDER BY last_login_on DESC")
  486. end
  487. @teachers = scope
  488. @teachers = paginateHelper @teachers,30
  489. @page = (params['page'] || 1).to_i - 1
  490. respond_to do |format|
  491. format.html
  492. end
  493. end
  494. #作业
  495. def homework
  496. @homework = HomeworkCommon.order('end_time desc')
  497. @homework = paginateHelper @homework,30
  498. @page = (params['page'] || 1).to_i - 1
  499. respond_to do |format|
  500. format.html
  501. end
  502. end
  503. end

软件技术创新是当今国家整体创新能力的重要基础和发展引擎。近年来,大众参与的软件创新与创业活动已经成为网络时代软件开发和应用的新形态,正在快速改变着全球软件创新模式和软件产业格局。 ...