From 0c25e3b13d8026f8179e025ca66ee7dde3377cbf Mon Sep 17 00:00:00 2001 From: huang Date: Mon, 13 Jun 2016 15:21:29 +0800 Subject: [PATCH 001/216] =?UTF-8?q?=E7=89=88=E6=9C=AC=E5=BA=93=E8=B4=A8?= =?UTF-8?q?=E9=87=8F=E5=88=86=E6=9E=90=20ssh=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 2 + app/controllers/repositories_controller.rb | 44 ++++++++++++++++++- .../repositories/quality_analyses.html.erb | 1 + app/views/repositories/show.html.erb | 1 + config/routes.rb | 2 + 5 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 app/views/repositories/quality_analyses.html.erb diff --git a/Gemfile b/Gemfile index d392c6561..789c2011e 100644 --- a/Gemfile +++ b/Gemfile @@ -6,6 +6,8 @@ unless RUBY_PLATFORM =~ /w32/ gem 'iconv' end +gem 'net-ssh' + gem 'certified' gem 'wechat',path: 'lib/wechat' diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 857f98afc..b2bf7b42d 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -30,11 +30,11 @@ class RepositoriesController < ApplicationController menu_item :settings, :only => [:new, :create, :edit, :update, :destroy, :committers] default_search_scope :changesets - before_filter :find_project_by_project_id, :only => [:new, :create, :newrepo, :stats] + before_filter :find_project_by_project_id, :only => [:new, :create, :newrepo, :stats, :quality_analyses] before_filter :find_repository, :only => [:edit, :update, :destroy, :committers] before_filter :find_project_repository, :except => [:new, :create, :newcreate, :edit, :update, :destroy, :committers, :newrepo, :to_gitlab, :forked, :project_archive] before_filter :find_changeset, :only => [:revision, :add_related_issue, :remove_related_issue] - before_filter :authorize , :except => [:newrepo,:newcreate,:fork, :to_gitlab, :forked, :commit_diff, :project_archive] + before_filter :authorize , :except => [:newrepo,:newcreate,:fork, :to_gitlab, :forked, :commit_diff, :project_archive, :quality_analyses] accept_rss_auth :revisions # hidden repositories filter // 隐藏代码过滤器 before_filter :check_hidden_repo, :only => [:show, :stats, :revisions, :revision, :diff ] @@ -43,6 +43,7 @@ class RepositoriesController < ApplicationController helper :project_score #@root_path = RepositoriesHelper::ROOT_PATH $g=Gitlab.client + require 'net/ssh' rescue_from Redmine::Scm::Adapters::CommandFailed, :with => :show_error_command_failed def new @@ -306,6 +307,27 @@ update end end + def quality_analyses + host = "192.168.0.200" + port = "1125" + username = "git" + password = "123123" + ##显示文件和系统版本 + server_cmd1 = 'll' + server_cmd2 = 'cat /etc/issue' + # 连接到远程主机 foobar + ssh = Net::SSH.start(host, username, :port => port, :password => password) do |ssh| + result = ssh.exec!(server_cmd1) + logger.error("#################") + puts result + result = ssh.exec!(server_cmd2) + puts result + end + respond_to do |format| + format.html + end + end + def destroy DestroyRepositoryTask.new.destroy(User.current.id, @repository.id) @repository.hidden = true @@ -557,6 +579,24 @@ update render 404 return end + host = "http://192.168.0.200:8893" + username = "git" + password = "123123" + +##显示文件和系统版本 + server_cmd1 = 'ls -l' + server_cmd2 = 'cat /etc/issue' + + +# 连接到远程主机 foobar + ssh = Net::SSH.start(host, username, :password => password) do |ssh| + result = ssh.exec!(server_cmd1) + puts result + result = ssh.exec!(server_cmd2) + puts result + end + + project_id = @project.gpid # @repository_id = @repository.identifier # creator = params[:creator] diff --git a/app/views/repositories/quality_analyses.html.erb b/app/views/repositories/quality_analyses.html.erb new file mode 100644 index 000000000..30d74d258 --- /dev/null +++ b/app/views/repositories/quality_analyses.html.erb @@ -0,0 +1 @@ +test \ No newline at end of file diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index 43be57760..bbcb48bdf 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -2,6 +2,7 @@

<%= render :partial => 'breadcrumbs', :locals => {:path => @path, :kind => 'dir', :revision => @rev} %>

ZIP下载 + <%= link_to "质量分析", quality_analyses_path(:id => @project.id, :repository_id => @repository.identifier) %>
diff --git a/config/routes.rb b/config/routes.rb index e4b462d93..438925878 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -902,6 +902,7 @@ RedmineApp::Application.routes.draw do # repositories routes get 'projects/:id/repository/:repository_id/statistics', :to => 'repositories#stats', :as => "stats_repository_project" + get 'projects/:id/repository/:repository_id/quality_analyses', :to => 'repositories#quality_analyses', :as => "quality_analyses" get 'projects/:id/repository/:repository_id/graph', :to => 'repositories#graph' get 'projects/:id/repository/:repository_id/changes(/*path(.:ext))', :to => 'repositories#changes' @@ -920,6 +921,7 @@ RedmineApp::Application.routes.draw do } get 'projects/:id/repository/statistics', :to => 'repositories#stats' + get 'projects/:id/repository/graph', :to => 'repositories#graph' get 'projects/:id/repository/changes(/*path(.:ext))', :to => 'repositories#changes' From 8bbdf3688cb91ebe8aad41f942d66a305915bac0 Mon Sep 17 00:00:00 2001 From: txz Date: Mon, 13 Jun 2016 15:25:26 +0800 Subject: [PATCH 002/216] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=8A=A0=E5=85=A5?= =?UTF-8?q?=E7=8F=AD=E7=BA=A7css=E6=96=B0=E5=A2=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/stylesheets/weui/weixin.css | 48 ++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/public/stylesheets/weui/weixin.css b/public/stylesheets/weui/weixin.css index 6cccb3615..4c7439308 100644 --- a/public/stylesheets/weui/weixin.css +++ b/public/stylesheets/weui/weixin.css @@ -3,7 +3,7 @@ /*基本样式*/ body,table,input,textarea,select,button { font-family: "微软雅黑","宋体";} -h1,h2,h3,h4,h5,p,pre {padding:0px; margin:0px;} +body, h1,h2,h3,h4,h5,p,pre {padding:0px; margin:0px;} img {max-width:100%;} blockquote {border:1px solid #d4d4d4; padding: 0.6em; margin-left: 1.4em; margin-right: 0.4em; border-radius: 4px; font-family: "Microsoft YaHei"; background-size: 100% 100%; margin-top:5px;} .text-control {word-break:normal; word-wrap:break-word;} @@ -12,10 +12,12 @@ blockquote {border:1px solid #d4d4d4; padding: 0.6em; margin-left: 1.4em; margin .f15 {font-size:15px;} .fb {font-weight:bold;} .mt2 {margin-top:2px;} +.mt4 {margin-top:4px;} .mt5 {margin-top:5px;} .mt10 {margin-top:10px;} .mb5 {margin-bottom:5px;} .mb10 {margin-bottom:10px;} +.mb20 {margin-bottom:20px;} .ml10 {margin-left:10px;} .mr5 {margin-right:5px;} .mr10 {margin-right:10px;} @@ -29,12 +31,15 @@ blockquote {border:1px solid #d4d4d4; padding: 0.6em; margin-left: 1.4em; margin .c-grey {color:#9a9a9a;} .c-grey2 {color:#707070;} .c-grey3 {color:#555555;} +.c-grey4 {color:#888888;} +.c-blue {color:#3b94d6;} a {color:#707070;} a.c-grey {color:#707070;} a.c-grey2 {color:#9a9a9a;} a:link,a:visited{text-decoration:none;} a:hover,a:active{cursor:pointer;} a.link-blue {color:#269ac9;} +a.link-blue2 {color:#3b94d6;} a.underline {text-decoration:underline;} .border-radius {border-radius:5px;} .w36 {width:36px;} @@ -42,9 +47,14 @@ a.underline {text-decoration:underline;} .max-width-130 {max-width:130px;} .hidden {overflow:hidden; white-space:nowrap; text-overflow:ellipsis;} .inline-block {display:inline-block;} +.dis {display:block;} .undis {display:none;} .text-nowrap {white-space:nowrap;} .v-top {vertical-align:top;} +.tac {text-align:center;} + +/*背景色*/ +.bg-grey {background-color:#c1c1c1;} /*动态样式*/ .post-container {width:100%;} @@ -88,4 +98,38 @@ a.underline {text-decoration:underline;} /*帖子锁定样式*/ .locked_btn_cir {background: url("/images/locked.png") 0 0 no-repeat; cursor: default;} -.bg-grey {background-color:#c1c1c1;} +/*20150612加入班级样式*/ +.add-class-box {width:80%; max-width:300px; min-width:240px; height:150px; font-size:15px; color:#444; background-color:#fff; margin:0 auto; box-shadow: 0px 2px 8px rgba(146, 153, 169, 0.5); border-radius:5px; margin-top:100px;} +.add-class-tip {padding-top:20px; padding-bottom:20px;} +.class-number-input {width:80%; max-width:240px; height:28px; border:1px solid #ccc; padding-left:5px; margin:0 auto; display:block;} +.cancel-btn {width:49%; height:37px; line-height:37px; text-align:center; vertical-align:middle; border-top:1px solid #ccc;} +.submit-btn {width:49%; height:37px; line-height:37px; text-align:center; vertical-align:middle; border-top:1px solid #ccc;} +.slice {width:2%; text-align:center; border-top:1px solid #ccc;} +.slice-line {width:1px; height:37px; margin:auto; background:#ccc;} + +/*20160613邀请码样式*/ +.qr-code-wrap {width:100%; padding:40px 0; background-color:#3b94d6;} +.qr-code-box {width:225px; height:332px; background-color:#fff; border-radius:3px; margin:0 auto;} +.share-class-name {font-size:18px; color:#3b3b3b; text-align:center; padding:12px; border-bottom:1px solid #cccccc; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;} +.qr-img-wrap {width:100%; border-bottom:1px dashed #ccc;} +.qr-code-img {margin:36px auto; display:block;} +.invitation-code-wrap {text-align:center; font-size:18px; color:#3b3b3b; padding:16px;} +.share-code-wrap {width:100%; background-color:#efeff4;} +.share-code-btn {width:145px; height:40px; color:#fff; font-size:15px; line-height:40px; text-align:center; vertical-align:middle; background-color:#ff7239; margin:18px auto 20px auto; border-radius:50px; display:block;} +.share-code-instruction {max-width:228px; font-size:12px; color:#666; line-height:20px; margin:0 auto;} + +/*20160613班级详情*/ +.class-detail-name {width:100%; height:45px; line-height:45px; vertical-align:middle; background-color:#3b94d6; color:#fff; font-size:18px; text-align:center;} +.slice2 {width:2%; text-align:center; background-color:#fff; border-bottom:1px solid #ccc;} +.slice3 {width:1%; height:38px; text-align:center; background-color:#fff; border-bottom:1px solid #ccc;} +.slice-line2 {width:1px; height:38px; margin:auto; background:#ccc;} +.class-detail-tab {width:23%; height:38px; line-height:38px; font-size:13px; color:#444; background-color:#fff; float:left; text-align:center; vertical-align:middle; border-bottom:1px solid #ccc;} +.class-tab-active {border-bottom:1px solid #3b94d6;} +.class-search-wrap {padding:8px 12px; position:relative;} +.class-search-inner {padding:0 30px; background-color:#fff;} +.class-search-icon {position:absolute; top:16px; left:16px;} +.class-detail-search {width:100%; height:33px; color:#999; background-color:#fff; border:none; outline:none;} +.border-top {border-top:1px solid #ccc;} +.class-detail-row {width:100%; height:38px; line-height:38px; vertical-align:middle; border-bottom:1px solid #ccc; background-color:#fff;} +.class-test-tip {text-align:center; font-size:13px; color:#444; padding-top:40px;} +.img-circle {border-radius:50%;} \ No newline at end of file From 962470c5826e91e47e59dd055df5449f819f8042 Mon Sep 17 00:00:00 2001 From: txz Date: Mon, 13 Jun 2016 17:23:35 +0800 Subject: [PATCH 003/216] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=96=87=E5=AD=97?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=85=A8bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/assets/wechat/activities.html | 4 ++-- public/stylesheets/weui/weixin.css | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/public/assets/wechat/activities.html b/public/assets/wechat/activities.html index 69ea8f1fa..2ab2e2d61 100644 --- a/public/assets/wechat/activities.html +++ b/public/assets/wechat/activities.html @@ -20,7 +20,7 @@
-
+
迟交扣分:{{act.homework_common_detail.late_penalty}}分 匿评开启时间:{{act.homework_common_detail.evaluation_start}}
缺评扣分:{{act.homework_common_detail.absence_penalty}}分/作品 匿评关闭时间:{{act.homework_common_detail.evaluation_end}}
@@ -127,7 +127,7 @@
-
+
状态:{{act.issue_detail.issue_status}} 优先级:{{act.issue_detail.issue_priority}}
指派给:{{act.issue_detail.issue_assigned_to}} 完成度:{{act.issue_detail.done_ratio}}%
diff --git a/public/stylesheets/weui/weixin.css b/public/stylesheets/weui/weixin.css index 4c7439308..cc4db7e17 100644 --- a/public/stylesheets/weui/weixin.css +++ b/public/stylesheets/weui/weixin.css @@ -66,7 +66,7 @@ a.underline {text-decoration:underline;} .fl {float:left;} .fr {float:right;} .cl {clear:both; overflow:hidden;} -.post-content {width:100%; font-size:13px; line-height:18px; height:95px; overflow:hidden; word-break:break-all; word-wrap:break-word;} +.post-content {width:100%; font-size:13px; line-height:18px; height:90px; overflow:hidden; word-break:break-all; word-wrap:break-word;} .post-interactive {width:100%; height:35px; line-height:35px; vertical-align:middle; border-top:1px solid #e6e6e6; background-color:#f8f9fb;} .post-interactive-column, .post-interactive-reply, From a2450defc67252920bf39984187c23e3cc2e7f40 Mon Sep 17 00:00:00 2001 From: txz Date: Mon, 13 Jun 2016 17:32:51 +0800 Subject: [PATCH 004/216] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E7=B1=BB=E5=88=AB=E6=96=87=E5=AD=97=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/assets/wechat/homework_detail.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/assets/wechat/homework_detail.html b/public/assets/wechat/homework_detail.html index 0fc39c735..4de1c7b37 100644 --- a/public/assets/wechat/homework_detail.html +++ b/public/assets/wechat/homework_detail.html @@ -18,9 +18,9 @@ 类   别: - 普通作业 - 编程作业 - 分组作业 + 普通作业 + 编程作业 + 分组作业 From 9029fd91e0148cf8f1edd13929836d01556c96c2 Mon Sep 17 00:00:00 2001 From: huang Date: Tue, 14 Jun 2016 09:57:29 +0800 Subject: [PATCH 005/216] =?UTF-8?q?rails=20=E4=BB=A3=E7=A0=81=E4=B8=AD?= =?UTF-8?q?=E8=B0=83=E7=94=A8shell=E5=91=BD=E4=BB=A4=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/repositories_controller.rb | 36 +++++++--------------- 1 file changed, 11 insertions(+), 25 deletions(-) diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index b2bf7b42d..555b46051 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -313,18 +313,22 @@ update username = "git" password = "123123" ##显示文件和系统版本 - server_cmd1 = 'll' - server_cmd2 = 'cat /etc/issue' + user_name = User.find(@project.user_id).try(:login) + rep_name = params[:repository_id] + server_cmd1 = "sh gitclone.sh" + " " + user_name + " " + rep_name # 连接到远程主机 foobar ssh = Net::SSH.start(host, username, :port => port, :password => password) do |ssh| result = ssh.exec!(server_cmd1) - logger.error("#################") - puts result - result = ssh.exec!(server_cmd2) - puts result + path = "/home/git/repo/" + user_name + "/" + rep_name + # sonar 分析 + # server_cmd2 + # 删除clone的版本库 + # server_cmd3 end respond_to do |format| - format.html + format.html{ + render :layout => "base_projects" + } end end @@ -579,24 +583,6 @@ update render 404 return end - host = "http://192.168.0.200:8893" - username = "git" - password = "123123" - -##显示文件和系统版本 - server_cmd1 = 'ls -l' - server_cmd2 = 'cat /etc/issue' - - -# 连接到远程主机 foobar - ssh = Net::SSH.start(host, username, :password => password) do |ssh| - result = ssh.exec!(server_cmd1) - puts result - result = ssh.exec!(server_cmd2) - puts result - end - - project_id = @project.gpid # @repository_id = @repository.identifier # creator = params[:creator] From c6bd5e6d311c5626975dcdd75d2f4a31e8a90553 Mon Sep 17 00:00:00 2001 From: huang Date: Tue, 14 Jun 2016 09:57:53 +0800 Subject: [PATCH 006/216] =?UTF-8?q?=E9=A5=BC=E7=8A=B6=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repositories/quality_analyses.html.erb | 77 ++++++++++++++++++- config/locales/en.yml | 1 + config/locales/zh.yml | 1 + 3 files changed, 78 insertions(+), 1 deletion(-) diff --git a/app/views/repositories/quality_analyses.html.erb b/app/views/repositories/quality_analyses.html.erb index 30d74d258..69dae2629 100644 --- a/app/views/repositories/quality_analyses.html.erb +++ b/app/views/repositories/quality_analyses.html.erb @@ -1 +1,76 @@ -test \ No newline at end of file +<%= javascript_include_tag 'highcharts','highcharts-more' %> +
+

<%= l(:label_quality_analyses) %>

+
+ +
+ <%#= render :partial => 'navigation' %> +
+
+ +
+
+
+
+ + + +

<%= link_to l(:button_back), :action => 'show', :id => @project %>

+<% html_title(l(:label_repository), l(:label_statistics)) -%> \ No newline at end of file diff --git a/config/locales/en.yml b/config/locales/en.yml index 033f12ad2..98d02cdb6 100644 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -602,6 +602,7 @@ en: label_time_tracking: Time tracking label_change_plural: Changes label_statistics: Statistics + label_quality_analyses: Quality Analyses label_commits_per_month: Commits per month label_commits_per_author: Commits per author label_diff: diff diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 94be8af6d..4c0f531a5 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -732,6 +732,7 @@ zh: label_time_tracking: 时间跟踪 label_change_plural: 变更 label_statistics: 统计 + label_quality_analyses: 质量分析 label_commits_per_month: 每月提交次数 label_commits_per_author: 每用户提交次数 From 270399c5dade14b39ef3893f93e2402fd4ad9726 Mon Sep 17 00:00:00 2001 From: txz Date: Tue, 14 Jun 2016 14:04:39 +0800 Subject: [PATCH 007/216] =?UTF-8?q?=E7=82=B9=E8=B5=9E=E6=97=B6=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=E7=A7=BB=E5=8A=A8=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/assets/wechat/activities.html | 54 ++++++++++++++-------------- public/stylesheets/weui/weixin.css | 1 + 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/public/assets/wechat/activities.html b/public/assets/wechat/activities.html index 2ab2e2d61..476ae3690 100644 --- a/public/assets/wechat/activities.html +++ b/public/assets/wechat/activities.html @@ -33,9 +33,9 @@ {{act.latest_update}} 回复 {{act.reply_count}} -
-
{{act.praise_count}}
-
{{act.praise_count}}
+
+
{{act.praise_count}}
+
{{act.praise_count}}
@@ -59,12 +59,12 @@
{{act.activity_type_name}} - {{act.latest_update}} + {{act.latest_update}} 回复 {{act.reply_count}} -
-
{{act.praise_count}}
-
{{act.praise_count}}
+
+
{{act.praise_count}}
+
{{act.praise_count}}
@@ -88,12 +88,12 @@
{{act.activity_type_name}} - {{act.latest_update}} + {{act.latest_update}} 回复 {{act.reply_count}} -
-
{{act.praise_count}}
-
{{act.praise_count}}
+
+
{{act.praise_count}}
+
{{act.praise_count}}
@@ -135,12 +135,12 @@
{{act.activity_type_name}} - {{act.latest_update}} + {{act.latest_update}} 回复 {{act.reply_count}} -
-
{{act.praise_count}}
-
{{act.praise_count}}
+
+
{{act.praise_count}}
+
{{act.praise_count}}
@@ -165,12 +165,12 @@
{{act.activity_type_name}} - {{act.latest_update}} + {{act.latest_update}} 回复 {{act.reply_count}} -
-
{{act.praise_count}}
-
{{act.praise_count}}
+
+
{{act.praise_count}}
+
{{act.praise_count}}
@@ -208,12 +208,12 @@
- {{act.latest_update}} + {{act.latest_update}} 回复 {{act.reply_count}} -
-
{{act.praise_count}}
-
{{act.praise_count}}
+
+
{{act.praise_count}}
+
{{act.praise_count}}
@@ -237,12 +237,12 @@
- {{act.latest_update}} + {{act.latest_update}} 回复 {{act.reply_count}} -
-
{{act.praise_count}}
-
{{act.praise_count}}
+
+
{{act.praise_count}}
+
{{act.praise_count}}
diff --git a/public/stylesheets/weui/weixin.css b/public/stylesheets/weui/weixin.css index cc4db7e17..514cb92aa 100644 --- a/public/stylesheets/weui/weixin.css +++ b/public/stylesheets/weui/weixin.css @@ -88,6 +88,7 @@ a.underline {text-decoration:underline;} .reply-icon {background:url(/images/wechat/icon_list.gif) -150px -155px no-repeat; width:20px; height:20px; display:inline-block; vertical-align:middle;} .praise-icon {background:url(/images/wechat/icon_list.gif) -36px -88px no-repeat; width:20px; height:20px; display:inline-block; vertical-align:middle;} .praised-icon {background:url(/images/wechat/icon_list.gif) -152px -86px no-repeat; width:20px; height:20px; display:inline-block; vertical-align:middle;} +.num-block {width:12px; text-align:center; display:inline-block; vertical-align:top;} /* loading 弹框*/ .loading-bg {position:fixed; width:100%; height:100%; left:0; top:0; z-index:99; background:rgba(206, 206, 206, 0.3); overflow:hidden;} From d21df48961a15f8ffa412c1b543dc4d76c542c29 Mon Sep 17 00:00:00 2001 From: huang Date: Tue, 14 Jun 2016 14:10:33 +0800 Subject: [PATCH 008/216] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= =?UTF-8?q?=E5=88=86=E6=9E=90=E5=BC=B9=E6=A1=86=E5=8F=8A=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E4=BC=A0=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/repositories_controller.rb | 8 +++++--- app/views/repositories/_quality_analyses.html.erb | 5 +++++ app/views/repositories/quality_analyses.js.erb | 8 ++++++++ app/views/repositories/show.html.erb | 5 ++--- 4 files changed, 20 insertions(+), 6 deletions(-) create mode 100644 app/views/repositories/_quality_analyses.html.erb create mode 100644 app/views/repositories/quality_analyses.js.erb diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 555b46051..9dbf7cfd7 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -308,13 +308,15 @@ update end def quality_analyses + language = params[:language] + branch = params[:branch] + path = params[:path] + user_name = User.find(@project.user_id).try(:login) + rep_name = params[:repository_id] host = "192.168.0.200" port = "1125" username = "git" password = "123123" - ##显示文件和系统版本 - user_name = User.find(@project.user_id).try(:login) - rep_name = params[:repository_id] server_cmd1 = "sh gitclone.sh" + " " + user_name + " " + rep_name # 连接到远程主机 foobar ssh = Net::SSH.start(host, username, :port => port, :password => password) do |ssh| diff --git a/app/views/repositories/_quality_analyses.html.erb b/app/views/repositories/_quality_analyses.html.erb new file mode 100644 index 000000000..7424e0369 --- /dev/null +++ b/app/views/repositories/_quality_analyses.html.erb @@ -0,0 +1,5 @@ +<%= form_tag( url_for(:controller => 'repositories', :action => 'quality_analyses'), :remote => true , :method => 'post', :class => 'resourcesSearchloadBox mt10', :id => 'resource_search_form') do %> + + <%= select_tag :branch, options_for_select(["#{@gitlab_default_branch}"]+ @branch_names, @rev), :id => 'branch' %> + <%= select_tag :language, options_for_select(["Java","C"]), :id => 'branch' %> +<% end %> \ No newline at end of file diff --git a/app/views/repositories/quality_analyses.js.erb b/app/views/repositories/quality_analyses.js.erb new file mode 100644 index 000000000..89d8685cf --- /dev/null +++ b/app/views/repositories/quality_analyses.js.erb @@ -0,0 +1,8 @@ +$('#ajax-modal').html('<%= escape_javascript( render :partial => 'repositories/quality_analyses', :locals => {}) %>'); +showModal('ajax-modal', '615px'); +$('#ajax-modal').siblings().remove(); +$('#ajax-modal').before(""); +$('#ajax-modal').parent().css("top","20%").css("left","42%").css("border","3px solid #269ac9"); +$('#ajax-modal').parent().addClass("popbox_polls"); + + diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index bbcb48bdf..d1c041d73 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -2,7 +2,7 @@

<%= render :partial => 'breadcrumbs', :locals => {:path => @path, :kind => 'dir', :revision => @rev} %>

ZIP下载 - <%= link_to "质量分析", quality_analyses_path(:id => @project.id, :repository_id => @repository.identifier) %> + <%= link_to "质量分析", quality_analyses_path(:id => @project.id, :repository_id => @repository.identifier), :remote => true, :class => "btn_zipdown fr" %>
@@ -46,7 +46,7 @@
<%= @changesets_latest_coimmit.message %>
<% else %> - +
提交于<%= time_tag(@changesets_latest_coimmit.created_at) %>:
<%= @changesets_latest_coimmit.message %>
@@ -58,7 +58,6 @@ <%=link_to @changesets_all_count, {:action => 'changes', :path => to_path_param(@path), :id => @project, :repository_id => @repository.identifier_param, :rev => @rev,:page=>1 ,:commit_count =>"#{@changesets_all_count}"} %> 提交 -
<% end %> From b1791f4531db9be1648c5e5fb9748d2f1116b256 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Tue, 14 Jun 2016 14:24:39 +0800 Subject: [PATCH 009/216] =?UTF-8?q?wechat=E7=BB=93=E6=9E=84=E5=88=86?= =?UTF-8?q?=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/assets/wechat/add_class.html | 13 + public/assets/wechat/app.html | 14 + public/javascripts/wechat/CommentBox.jsx | 108 ---- public/javascripts/wechat/app.js | 544 +----------------- public/javascripts/wechat/auth.js | 36 -- public/javascripts/wechat/blog_detail.js | 95 --- .../wechat/controllers/activity.js | 66 +++ .../wechat/controllers/add_class.js | 4 + public/javascripts/wechat/controllers/blog.js | 38 ++ .../wechat/controllers/course_notice.js | 35 ++ .../wechat/controllers/discussion.js | 36 ++ .../wechat/controllers/homework.js | 36 ++ .../javascripts/wechat/controllers/issue.js | 36 ++ .../wechat/controllers/journals.js | 37 ++ .../javascripts/wechat/course_discussion.js | 102 ---- public/javascripts/wechat/course_notice.js | 101 ---- .../wechat/directives/input_auto.js | 19 + .../wechat/directives/loading_spinner.js | 7 + public/javascripts/wechat/gulpfile.js | 7 + public/javascripts/wechat/homework_detail.js | 104 ---- public/javascripts/wechat/issue_detail.js | 108 ---- public/javascripts/wechat/message_detail.js | 95 --- public/javascripts/wechat/others/factory.js | 120 ++++ public/javascripts/wechat/others/filter.js | 5 + public/javascripts/wechat/others/routes.js | 70 +++ .../javascripts/wechat/project_discussion.js | 105 ---- 26 files changed, 546 insertions(+), 1395 deletions(-) create mode 100644 public/assets/wechat/add_class.html delete mode 100644 public/javascripts/wechat/CommentBox.jsx delete mode 100644 public/javascripts/wechat/auth.js delete mode 100644 public/javascripts/wechat/blog_detail.js create mode 100644 public/javascripts/wechat/controllers/activity.js create mode 100644 public/javascripts/wechat/controllers/add_class.js create mode 100644 public/javascripts/wechat/controllers/blog.js create mode 100644 public/javascripts/wechat/controllers/course_notice.js create mode 100644 public/javascripts/wechat/controllers/discussion.js create mode 100644 public/javascripts/wechat/controllers/homework.js create mode 100644 public/javascripts/wechat/controllers/issue.js create mode 100644 public/javascripts/wechat/controllers/journals.js delete mode 100644 public/javascripts/wechat/course_discussion.js delete mode 100644 public/javascripts/wechat/course_notice.js create mode 100644 public/javascripts/wechat/directives/input_auto.js create mode 100644 public/javascripts/wechat/directives/loading_spinner.js delete mode 100644 public/javascripts/wechat/homework_detail.js delete mode 100644 public/javascripts/wechat/issue_detail.js delete mode 100644 public/javascripts/wechat/message_detail.js create mode 100644 public/javascripts/wechat/others/factory.js create mode 100644 public/javascripts/wechat/others/filter.js create mode 100644 public/javascripts/wechat/others/routes.js delete mode 100644 public/javascripts/wechat/project_discussion.js diff --git a/public/assets/wechat/add_class.html b/public/assets/wechat/add_class.html new file mode 100644 index 000000000..2543d5cc4 --- /dev/null +++ b/public/assets/wechat/add_class.html @@ -0,0 +1,13 @@ +
+
+

输入班级邀请码,即刻加入班级!

+
+ +
+ 取消 +
+
+
+ 确定 +
+
diff --git a/public/assets/wechat/app.html b/public/assets/wechat/app.html index 5059c41ab..d88efe50f 100644 --- a/public/assets/wechat/app.html +++ b/public/assets/wechat/app.html @@ -18,7 +18,21 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/javascripts/wechat/CommentBox.jsx b/public/javascripts/wechat/CommentBox.jsx deleted file mode 100644 index 7f30b38b1..000000000 --- a/public/javascripts/wechat/CommentBox.jsx +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Created by guange on 16/3/19. - */ - - - - -var CommentBox = React.createClass({ - - loadFromServer: function(){ - $.ajax({ - url: this.props.url, - dataType: 'json', - success: function(data){ - this.setState({data: data}); - }.bind(this), - error: function(xhr,status,err){ - console.error(this.props.url, status, err.toString()); - }.bind(this) - }); - }, - onCommentSubmit: function(comment){ - console.log(comment); - }, - getInitialState: function(){ - return {data: []}; - }, - componentDidMount: function(){ - this.loadFromServer(); - setInterval(this.loadFromServer, 2000); - }, - render: function(){ - return( -
- - -
- ); - } -}); - -var CommentList = React.createClass({ - render: function(){ - - var commentNodes = this.props.data.map(function(comment){ - return ( - - {comment.text} - - ) - }); - - return ( -
- {commentNodes} -
- ); - } -}); - -var CommentForm = React.createClass({ - handleSubmit: function(e){ - e.preventDefault(); - - var author = this.refs.author.value.trim(); - var text = this.refs.text.value.trim(); - if(!text || !author){ - return; - } - - this.props.onCommentSubmit({author: author, text: text}); - - this.refs.author.value = ''; - this.refs.text.value = ''; - return; - }, - render: function(){ - return ( -
- - - -
- ); - } -}); - - -var Comment = React.createClass({ - - rawMarkup: function() { - var rawMarkup = marked(this.props.children.toString(), {sanitize: true}); - return { __html: rawMarkup }; - }, - - render: function(){ - return ( -
-

- {this.props.author} -

- -
- ) - } -}) - -React.render(, document.getElementById("example")); \ No newline at end of file diff --git a/public/javascripts/wechat/app.js b/public/javascripts/wechat/app.js index ca9682db2..adf445b51 100644 --- a/public/javascripts/wechat/app.js +++ b/public/javascripts/wechat/app.js @@ -1,546 +1,8 @@ var app = angular.module('wechat', ['ngRoute']); var apiUrl = '/api/v1/'; -var debug = false; //调试标志,如果在本地请置为true +var debug = true; //调试标志,如果在本地请置为true if(debug===true){ - //apiUrl = 'http://localhost:3000/api/v1/'; - apiUrl = 'http://www.trustie.net/api/v1/'; + apiUrl = 'http://localhost:3000/api/v1/'; + //apiUrl = 'http://www.trustie.net/api/v1/'; } - - -app.factory('auth', function($http,$routeParams, $q){ - var _openid = ''; - - if(typeof g_openid !== 'undefined'){ - _openid = g_openid; - } - - if(debug===true){ - _openid = "orgVLv8TlS6e7FDiI6xdTGHRaaRo"; //guange的帐号 - } - - var getOpenId = function() { - var deferred = $q.defer(); - if (typeof _openid !== 'undefined' && _openid.length > 0){ - deferred.resolve(_openid); - } else { - var code = $routeParams.code; - $http({ - url: '/wechat/get_open_id', - data: {code: code}, - method: 'POST' - }).then(function successCallback(response) { - _openid = response.data.openid; - deferred.resolve(_openid); - }, function errorCallback(response) { - deferred.reject(response); - }); - } - return deferred.promise; - }; - var openid = function(){ - return _openid; - }; - return {getOpenId: getOpenId, openid: openid}; -}); - - -app.factory('rms', function(){ - var _saveStorage = {}; - var save = function(key, value){ - _saveStorage[key] = value; - }; - - var get = function(key){ - return _saveStorage[key]; - }; - - return {save: save, get: get}; -}); - -app.controller('ActivityController',function($anchorScroll, $location,$scope, $http, $timeout, auth, rms, common){ - $scope.replaceUrl = function(url){ - return url; - }; - - console.log("ActivityController load"); - - $scope.page = rms.get('page') || 0; - $scope.activities = rms.get("activities") || []; - $scope.has_more = rms.get("has_more"); - - $scope.loadActData = function(page){ - - $scope.page = page; - $http({ - method: 'POST', - url: apiUrl+ "activities", - data: {openid: auth.openid(), page: page} - }).then(function successCallback(response) { - if(response.data.page >0) { - $scope.activities = $scope.activities.concat(response.data.data); - } else { - $scope.activities = response.data.data; - } - - rms.save("activities", $scope.activities); - $scope.has_more = (response.data.count + response.data.page * 10) < response.data.all_count; - rms.save('has_more', $scope.has_more); - rms.save('page', response.data.page); - - console.log(response.data); - - }, function errorCallback(response) { - }); - }; - - if($scope.activities.length<=0){ - auth.getOpenId().then( - function successCallback(response){ - $scope.loadActData(0); - }, function errorCallback(response) { - alert("获取openid出错:"+response); - } - ); - } else { - $timeout(function(){ - window.scrollTo(0, rms.get("yoffset")); - }); - - } - - //跳到详情页 - $scope.goDetail = function(type, act_id,id){ - rms.save("yoffset", window.document.body.scrollTop); - $location.path('/'+type+'/'+act_id); - } - - $scope.addPraise = function(act){ - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - common.decreaseCommonPraise(act); - }; -}); - -app.factory('common', function($http, auth, $routeParams){ - var addCommonReply = function(id, type, data, cb){ - - if(!data.comment || data.comment.length<=0){ - return; - } - - var temp = data.comment.replace(/\n/g,'
'); - - var userInfo = { - type: type, - content: temp, - openid: auth.openid() - }; - //回复按钮禁用 - data.disabled = true; - - $http({ - method: 'POST', - url: apiUrl+ "new_comment/"+id, - data: userInfo - }).then(function successCallback(response) { - //alert("提交成功"); - //数据提交完成,回复按钮启用 - data.disabled = false; - if(typeof cb === 'function'){ - cb(); - } - }, function errorCallback(response) { - }); - }; - - var loadCommonData = function(id, type){ - return $http({ - method: 'GET', - url: apiUrl+ type + "/" + id+"?openid="+auth.openid() - }) - }; - - var addCommonPraise = function(act){ - act.praise_count += 1; - act.has_praise = true; - - $http({ - method: 'POST', - url: apiUrl + "praise/" + act.act_id, - data:{openid:auth.openid(),type:act.act_type} - }).then(function successCallback(response) { - console.log(response.data); - }, function errorCallback(response) { - }); - - }; - - var decreaseCommonPraise = function(act){ - act.praise_count -= 1; - act.has_praise = false; - - $http({ - method: 'POST', - url: apiUrl + "praise/" + act.act_id, - data:{openid:auth.openid(),type:act.act_type} - }).then(function successCallback(response) { - console.log(response.data); - }, function errorCallback(response) { - }); - }; - - return {addCommonReply: addCommonReply, loadCommonData: loadCommonData, addCommonPraise: addCommonPraise, decreaseCommonPraise: decreaseCommonPraise}; -}); - -app.controller('IssueController', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - - var loadData = function(id){ - common.loadCommonData(id, 'issues').then(function successCallback(response) { - console.log(response.data); - $scope.issue = response.data.data; - }, function errorCallback(response) { - }); - }; - - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); - } - ); - - $scope.addIssueReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'Issue', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - }); - - }; - - $scope.addPraise = function(act){ - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - common.decreaseCommonPraise(act); - }; -}); - -app.controller('HomeworkController', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - - var loadData = function(id){ - common.loadCommonData(id, 'whomeworks').then(function successCallback(response) { - console.log(response.data); - $scope.homework = response.data.data; - }, function errorCallback(response) { - }); - }; - - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); - } - ); - - $scope.addHomeworkReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'HomeworkCommon', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - }); - }; - - $scope.addPraise = function(act){ - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - common.decreaseCommonPraise(act); - }; -}); - -app.controller('CourseNoticeController', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - - var loadData = function(id){ - common.loadCommonData(id, 'newss').then(function successCallback(response) { - console.log(response.data); - $scope.news = response.data.data; - }, function errorCallback(response) { - }); - }; - - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); - } - ); - - $scope.addNoticeReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'News', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - }); - }; - - $scope.addPraise = function(act){ - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - common.decreaseCommonPraise(act); - }; -}); - -app.controller('DiscussionController', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - - var loadData = function(id){ - common.loadCommonData(id, 'messages').then(function successCallback(response) { - console.log(response.data); - $scope.discussion = response.data.data; - }, function errorCallback(response) { - }); - }; - - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); - } - ); - - $scope.addDiscussionReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'Message', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - }); - }; - - $scope.addPraise = function(act){ - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - common.decreaseCommonPraise(act); - }; -}); - -app.controller('JournalsController', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - - var loadData = function(id){ - common.loadCommonData(id, 'journal_for_messages').then(function successCallback(response) { - console.log(response.data); - $scope.message = response.data.data; - }, function errorCallback(response) { - }); - }; - - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); - } - ); - - $scope.addJournalReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'JournalsForMessage', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - }); - }; - - $scope.addPraise = function(act){ - console.log(act); - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - console.log(act); - common.decreaseCommonPraise(act); - }; -}); - -app.controller('BlogController', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - - var loadData = function(id){ - common.loadCommonData(id, 'blog_comments').then(function successCallback(response) { - console.log(response.data); - $scope.blog = response.data.data; - }, function errorCallback(response) { - }); - }; - - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); - } - ); - - $scope.addBlogReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'BlogComment', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - }); - }; - - $scope.addPraise = function(act){ - console.log(act); - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - console.log(act); - common.decreaseCommonPraise(act); - }; -}); - -app.filter('safeHtml', function ($sce) { - return function (input) { - return $sce.trustAsHtml(input); - } -}); - -//app.directive('textAutoHeight', function($timeout){ -// return { -// restrict: 'A', -// scope: {}, -// link: function(scope, element, attr){ -// scope.text = '点击展开'; -// $timeout(function(){ -// var e = element.parent().children().eq(5); -// var height = e[0].scrollHeight; -// if(height>90){ -// element.css('display', 'block'); -// element.on('click', function(){ -// if(element.text() == "点击展开"){ -// e.css("height", height+'px'); -// element.text("点击隐藏"); -// } else { -// e.css("height", '90px'); -// element.text("点击展开"); -// } -// -// }); -// } -// }, false); -// -// } -// } -//}); - -app.directive('inputAuto',function(){ - return{ - restrict: 'A', - scope: {}, - link: function(scope, element){ - var copyContainer = element.parent().children().eq(0); - var sendButton = element.parent().next(); - element.on('input',function(){ - console.log(sendButton); - copyContainer.html(element[0].value); - var textHeight = copyContainer[0].scrollHeight; - element.css('height', textHeight + 'px'); - }); - sendButton.on('click',function(){ - element.css('height','28px'); - }); - } - } -}); - -app.directive('loadingSpinner', ['$http', function ($http) { - return { - restrict: 'A', - replace: true, - template: '
加载中...
', - }; -}]); - -app.config(['$routeProvider',"$httpProvider", "$locationProvider",function ($routeProvider, $httpProvider, $locationProvider) { - var rootPath = '/assets/wechat/' - //$locationProvider.html5Mode(true); - $routeProvider - .when('/activites', { - templateUrl: rootPath + 'activities.html', - controller: 'ActivityController' - }) - .when('/issues/:id', { - templateUrl: rootPath + 'issue_detail.html', - controller: 'IssueController' - }) - .when('/project_discussion/:id', { - templateUrl: rootPath + 'project_discussion.html', - controller: 'DiscussionController' - }) - .when('/homework/:id', { - templateUrl: rootPath + 'homework_detail.html', - controller: 'HomeworkController' - }) - .when('/course_notice/:id', { - templateUrl: rootPath + 'course_notice.html', - controller: 'CourseNoticeController' - }) - .when('/course_discussion/:id', { - templateUrl: rootPath + 'course_discussion.html', - controller: 'DiscussionController' - }) - .when('/journal_for_message/:id', { - templateUrl: rootPath + 'jour_message_detail.html', - controller: 'JournalsController' - }) - .when('/blog_comment/:id', { - templateUrl: rootPath + 'blog_detail.html', - controller: 'BlogController' - }) - .otherwise({ - redirectTo: '/activites' - }); - - //监听异步请求,实现加载中显隐标记 - $httpProvider.interceptors.push(function ($q, $rootScope) { - if ($rootScope.activeCalls == undefined) { - $rootScope.activeCalls = 0; - } - - return { - request: function (config) { - $rootScope.activeCalls += 1; - return config; - }, - requestError: function (rejection) { - $rootScope.activeCalls -= 1; - return rejection; - }, - response: function (response) { - $rootScope.activeCalls -= 1; - return response; - }, - responseError: function (rejection) { - $rootScope.activeCalls -= 1; - return rejection; - } - }; - }); -}]); diff --git a/public/javascripts/wechat/auth.js b/public/javascripts/wechat/auth.js deleted file mode 100644 index f9c2917fc..000000000 --- a/public/javascripts/wechat/auth.js +++ /dev/null @@ -1,36 +0,0 @@ -$(function(){ - //获取url中的参数 - function getUrlParam(name) { - var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)"); //构造一个含有目标参数的正则表达式对象 - var r = window.location.search.substr(1).match(reg); //匹配目标参数 - if (r != null) return unescape(r[2]); return null; //返回参数值 - } - - - var debug = false; - - var g_openid = ""; - if(debug){ - g_openid = "填写要调试的openid即可"; - } - - window.getOpenId = function(cb){ - if (g_openid.length>0){ - cb(g_openid); - } - var code = getUrlParam("code"); - $.ajax({ - url: '/wechat/get_open_id', - data: {code: code}, - type: 'post', - dataType: 'json', - success: function(data){ - g_openid = data.openid; - cb(g_openid); - }, - error: function(xhr,err){ - alert("认证失败: "+err); - } - }); - } -}); \ No newline at end of file diff --git a/public/javascripts/wechat/blog_detail.js b/public/javascripts/wechat/blog_detail.js deleted file mode 100644 index 44121f83c..000000000 --- a/public/javascripts/wechat/blog_detail.js +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Created by root on 4/1/16. - */ -$(document).ready(function(){ - - var bt=baidu.template; - bt.LEFT_DELIMITER=''; - - - var apiUrl = '/api/v1/'; - - var setTemplate = function(data){ - console.log(data); - var html=bt('t:blog-detail',{blog: data}); - $('#blog-container').prepend(html); - $('.post-reply-submit').click(function(){ - replyInsert(); - }); - $('post-interactive-praise').click(function(){ - praiseClick(); - }); - }; - - var loadDataFromServer = function(id){ - //getOpenId(function(openid){ - $.ajax({ - url: apiUrl + 'blog_comments/' + id, - dataType: 'json', - success: function(data){ - setTemplate(data.data); - }, - error: function(xhr,status,err){ - console.log(err); - } - }); - //}) - - - }; - - var homeworkUrl = window.location.search; - var homeworkID = homeworkUrl.split("=")[1]; - - loadDataFromServer(homeworkID); - - //点击回复按钮,插入回复内容 - var replyInsert = function(){ - var replyContent = $("#postInput").val(); - if (!replyContent){ - alert("请输入回复"); - }else{ - - //将用户输入内容插入最后一条回复 - $(".post-reply-wrap:last").after('
回复
'); - $(".post-reply-content:last").append(replyContent); - $(".post-reply-date:last").append(Date()); - var postInput = $("#postInput").val(); - $("#postInput").val(""); - //回复数目+1 - var replyNum = $(".post-interactive-reply").text().match(/\d+/g); - replyNum++; - $(".reply-num").text("(" + replyNum + ")"); - - //获取并传送回复用户数据 - var userInfo = { - "replyType" : "homework_assignment", - "replyContent" : postInput - }; - - $.ajax({ - type: "POST", //提交方式 - dataType: "json", //类型 - url: "前台地址/后台方法", //提交的页面,方法名 - data: userInfo, //参数,如果没有,可以为null - success: function (data) { //如果执行成功,那么执行此方法 - alert(data.d); //用data.d来获取后台传过来的json语句,或者是单纯的语句 - }, - error: function (err) { //如果执行不成功,那么执行此方法 - alert("err:" + err); - } - }); - } - - } - - //点赞效果 - var praiseClick = function(){ - var praiseNum = $(".post-interactive-praise").text().match(/\d+/g); - praiseNum++; - $(".praise-num").text("(" + praiseNum + ")"); - } - - -}); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/activity.js b/public/javascripts/wechat/controllers/activity.js new file mode 100644 index 000000000..732772e13 --- /dev/null +++ b/public/javascripts/wechat/controllers/activity.js @@ -0,0 +1,66 @@ + +app.controller('ActivityController',function($anchorScroll, $location,$scope, $http, $timeout, auth, rms, common){ + $scope.replaceUrl = function(url){ + return url; + }; + + console.log("ActivityController load"); + + $scope.page = rms.get('page') || 0; + $scope.activities = rms.get("activities") || []; + $scope.has_more = rms.get("has_more"); + + $scope.loadActData = function(page){ + + $scope.page = page; + $http({ + method: 'POST', + url: apiUrl+ "activities", + data: {openid: auth.openid(), page: page} + }).then(function successCallback(response) { + if(response.data.page >0) { + $scope.activities = $scope.activities.concat(response.data.data); + } else { + $scope.activities = response.data.data; + } + + rms.save("activities", $scope.activities); + $scope.has_more = (response.data.count + response.data.page * 10) < response.data.all_count; + rms.save('has_more', $scope.has_more); + rms.save('page', response.data.page); + + console.log(response.data); + + }, function errorCallback(response) { + }); + }; + + if($scope.activities.length<=0){ + auth.getOpenId().then( + function successCallback(response){ + $scope.loadActData(0); + }, function errorCallback(response) { + alert("获取openid出错:"+response); + } + ); + } else { + $timeout(function(){ + window.scrollTo(0, rms.get("yoffset")); + }); + + } + + //跳到详情页 + $scope.goDetail = function(type, act_id,id){ + rms.save("yoffset", window.document.body.scrollTop); + $location.path('/'+type+'/'+act_id); + } + + $scope.addPraise = function(act){ + common.addCommonPraise(act); + }; + + $scope.decreasePraise = function(act){ + common.decreaseCommonPraise(act); + }; +}); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/add_class.js b/public/javascripts/wechat/controllers/add_class.js new file mode 100644 index 000000000..099bb8e8e --- /dev/null +++ b/public/javascripts/wechat/controllers/add_class.js @@ -0,0 +1,4 @@ + +app.controller('AddClassController', ['$scope',function($scope){ + +}]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/blog.js b/public/javascripts/wechat/controllers/blog.js new file mode 100644 index 000000000..56589122a --- /dev/null +++ b/public/javascripts/wechat/controllers/blog.js @@ -0,0 +1,38 @@ + +app.controller('BlogController', function($scope, $http, $routeParams, auth, common){ + $scope.formData = {comment: ''}; + + var loadData = function(id){ + common.loadCommonData(id, 'blog_comments').then(function successCallback(response) { + console.log(response.data); + $scope.blog = response.data.data; + }, function errorCallback(response) { + }); + }; + + auth.getOpenId().then( + function successCallback(response){ + loadData($routeParams.id); + }, function errorCallback(response) { + alert("获取openid出错:"+response); + } + ); + + $scope.addBlogReply = function(data){ + console.log(data.comment); + common.addCommonReply($routeParams.id, 'BlogComment', data, function(){ + $scope.formData = {comment: ''}; + loadData($routeParams.id); + }); + }; + + $scope.addPraise = function(act){ + console.log(act); + common.addCommonPraise(act); + }; + + $scope.decreasePraise = function(act){ + console.log(act); + common.decreaseCommonPraise(act); + }; +}); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/course_notice.js b/public/javascripts/wechat/controllers/course_notice.js new file mode 100644 index 000000000..9a60d2222 --- /dev/null +++ b/public/javascripts/wechat/controllers/course_notice.js @@ -0,0 +1,35 @@ +app.controller('CourseNoticeController', function($scope, $http, $routeParams, auth, common){ + $scope.formData = {comment: ''}; + + var loadData = function(id){ + common.loadCommonData(id, 'newss').then(function successCallback(response) { + console.log(response.data); + $scope.news = response.data.data; + }, function errorCallback(response) { + }); + }; + + auth.getOpenId().then( + function successCallback(response){ + loadData($routeParams.id); + }, function errorCallback(response) { + alert("获取openid出错:"+response); + } + ); + + $scope.addNoticeReply = function(data){ + console.log(data.comment); + common.addCommonReply($routeParams.id, 'News', data, function(){ + $scope.formData = {comment: ''}; + loadData($routeParams.id); + }); + }; + + $scope.addPraise = function(act){ + common.addCommonPraise(act); + }; + + $scope.decreasePraise = function(act){ + common.decreaseCommonPraise(act); + }; +}); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/discussion.js b/public/javascripts/wechat/controllers/discussion.js new file mode 100644 index 000000000..479f473bf --- /dev/null +++ b/public/javascripts/wechat/controllers/discussion.js @@ -0,0 +1,36 @@ + +app.controller('DiscussionController', function($scope, $http, $routeParams, auth, common){ + $scope.formData = {comment: ''}; + + var loadData = function(id){ + common.loadCommonData(id, 'messages').then(function successCallback(response) { + console.log(response.data); + $scope.discussion = response.data.data; + }, function errorCallback(response) { + }); + }; + + auth.getOpenId().then( + function successCallback(response){ + loadData($routeParams.id); + }, function errorCallback(response) { + alert("获取openid出错:"+response); + } + ); + + $scope.addDiscussionReply = function(data){ + console.log(data.comment); + common.addCommonReply($routeParams.id, 'Message', data, function(){ + $scope.formData = {comment: ''}; + loadData($routeParams.id); + }); + }; + + $scope.addPraise = function(act){ + common.addCommonPraise(act); + }; + + $scope.decreasePraise = function(act){ + common.decreaseCommonPraise(act); + }; +}); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/homework.js b/public/javascripts/wechat/controllers/homework.js new file mode 100644 index 000000000..5fb890741 --- /dev/null +++ b/public/javascripts/wechat/controllers/homework.js @@ -0,0 +1,36 @@ + +app.controller('HomeworkController', function($scope, $http, $routeParams, auth, common){ + $scope.formData = {comment: ''}; + + var loadData = function(id){ + common.loadCommonData(id, 'whomeworks').then(function successCallback(response) { + console.log(response.data); + $scope.homework = response.data.data; + }, function errorCallback(response) { + }); + }; + + auth.getOpenId().then( + function successCallback(response){ + loadData($routeParams.id); + }, function errorCallback(response) { + alert("获取openid出错:"+response); + } + ); + + $scope.addHomeworkReply = function(data){ + console.log(data.comment); + common.addCommonReply($routeParams.id, 'HomeworkCommon', data, function(){ + $scope.formData = {comment: ''}; + loadData($routeParams.id); + }); + }; + + $scope.addPraise = function(act){ + common.addCommonPraise(act); + }; + + $scope.decreasePraise = function(act){ + common.decreaseCommonPraise(act); + }; +}); diff --git a/public/javascripts/wechat/controllers/issue.js b/public/javascripts/wechat/controllers/issue.js new file mode 100644 index 000000000..53bdbf265 --- /dev/null +++ b/public/javascripts/wechat/controllers/issue.js @@ -0,0 +1,36 @@ +app.controller('IssueController', function($scope, $http, $routeParams, auth, common){ + $scope.formData = {comment: ''}; + + var loadData = function(id){ + common.loadCommonData(id, 'issues').then(function successCallback(response) { + console.log(response.data); + $scope.issue = response.data.data; + }, function errorCallback(response) { + }); + }; + + auth.getOpenId().then( + function successCallback(response){ + loadData($routeParams.id); + }, function errorCallback(response) { + alert("获取openid出错:"+response); + } + ); + + $scope.addIssueReply = function(data){ + console.log(data.comment); + common.addCommonReply($routeParams.id, 'Issue', data, function(){ + $scope.formData = {comment: ''}; + loadData($routeParams.id); + }); + + }; + + $scope.addPraise = function(act){ + common.addCommonPraise(act); + }; + + $scope.decreasePraise = function(act){ + common.decreaseCommonPraise(act); + }; +}); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/journals.js b/public/javascripts/wechat/controllers/journals.js new file mode 100644 index 000000000..c292b1932 --- /dev/null +++ b/public/javascripts/wechat/controllers/journals.js @@ -0,0 +1,37 @@ +app.controller('JournalsController', function($scope, $http, $routeParams, auth, common){ + $scope.formData = {comment: ''}; + + var loadData = function(id){ + common.loadCommonData(id, 'journal_for_messages').then(function successCallback(response) { + console.log(response.data); + $scope.message = response.data.data; + }, function errorCallback(response) { + }); + }; + + auth.getOpenId().then( + function successCallback(response){ + loadData($routeParams.id); + }, function errorCallback(response) { + alert("获取openid出错:"+response); + } + ); + + $scope.addJournalReply = function(data){ + console.log(data.comment); + common.addCommonReply($routeParams.id, 'JournalsForMessage', data, function(){ + $scope.formData = {comment: ''}; + loadData($routeParams.id); + }); + }; + + $scope.addPraise = function(act){ + console.log(act); + common.addCommonPraise(act); + }; + + $scope.decreasePraise = function(act){ + console.log(act); + common.decreaseCommonPraise(act); + }; +}); \ No newline at end of file diff --git a/public/javascripts/wechat/course_discussion.js b/public/javascripts/wechat/course_discussion.js deleted file mode 100644 index e01b6b451..000000000 --- a/public/javascripts/wechat/course_discussion.js +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Created by root on 4/1/16. - */ -$(document).ready(function(){ - - var bt=baidu.template; - bt.LEFT_DELIMITER=''; - - - var apiUrl = '/api/v1/'; - - var setReplyTemplate = function(data){ - console.log(data); - var html=bt('t:c-message-detail-reply',{reply: data}); - $('#all_course_message_reply').prepend(html); - }; - - var setTemplate = function(data){ - console.log(data); - var html=bt('t:course-discussion',{discussion: data}); - $('#c-discussion-container').prepend(html); - $('.post-reply-submit').click(function(){ - replyInsert(); - }); - /*$('post-interactive-praise').click(function(){ - praiseClick(); - });*/ - }; - - var loadDataFromServer = function(id){ - //getOpenId(function(openid){ - $.ajax({ - url: apiUrl + 'messages/' + id, - dataType: 'json', - success: function(data){ - setTemplate(data.data); - }, - error: function(xhr,status,err){ - console.log(err); - } - }); - //}) - - - }; - - var homeworkUrl = window.location.search; - var homeworkID = homeworkUrl.split("=")[1]; - - loadDataFromServer(homeworkID); - - //点击回复按钮,插入回复内容 - var replyInsert = function(){ - var replyContent = $("#postInput").val(); - if (!replyContent){ - alert("请输入回复"); - }else{ - - //将用户输入内容插入最后一条回复 - /*$(".post-reply-wrap:last").after('
回复
'); - $(".post-reply-content:last").append(replyContent); - $(".post-reply-date:last").append(Date());*/ - var postInput = $("#postInput").val(); - $("#postInput").val(""); - //回复数目+1 - var replyNum = $(".post-interactive-reply").text().match(/\d+/g); - replyNum++; - $(".reply-num").text("(" + replyNum + ")"); - - //获取并传送回复用户数据 - var userInfo = { - "Type" : "Message", - "Content" : postInput - }; - - $.ajax({ - type: "POST", //提交方式 - dataType: "json", //类型 - url: apiUrl + 'new_comment/' + homeworkID, //提交的页面,方法名 - data: userInfo, //参数,如果没有,可以为null - success: function (data) { //如果执行成功,那么执行此方法 - setReplyTemplate(data.data); - alert("6"); - }, - error: function (err) { //如果执行不成功,那么执行此方法 - alert("err:" + err); - } - }); - } - - } - - /*//点赞效果 - var praiseClick = function(){ - var praiseNum = $(".post-interactive-praise").text().match(/\d+/g); - praiseNum++; - $(".praise-num").text("(" + praiseNum + ")"); - }*/ - - -}); \ No newline at end of file diff --git a/public/javascripts/wechat/course_notice.js b/public/javascripts/wechat/course_notice.js deleted file mode 100644 index 546aac385..000000000 --- a/public/javascripts/wechat/course_notice.js +++ /dev/null @@ -1,101 +0,0 @@ -/** - * Created by root on 4/1/16. - */ -$(document).ready(function(){ - - var bt=baidu.template; - bt.LEFT_DELIMITER=''; - - - var apiUrl = '/api/v1/'; - - var setReplyTemplate = function(data){ - console.log(data); - var html=bt('t:news-detail-reply',{reply: data}); - $('#all_news_reply').prepend(html); - }; - - var setTemplate = function(data){ - console.log(data); - var html=bt('t:course-notice',{course: data}); - $('#c-notice-container').prepend(html); - $('.post-reply-submit').click(function(){ - replyInsert(); - }); - /*$('post-interactive-praise').click(function(){ - praiseClick(); - });*/ - }; - - var loadDataFromServer = function(id){ - //getOpenId(function(openid){ - $.ajax({ - url: apiUrl + 'newss/' + id, - dataType: 'json', - success: function(data){ - setTemplate(data.data); - }, - error: function(xhr,status,err){ - console.log(err); - } - }); - //}) - - - }; - - var homeworkUrl = window.location.search; - var homeworkID = homeworkUrl.split("=")[1]; - - loadDataFromServer(homeworkID); - - //点击回复按钮,插入回复内容 - var replyInsert = function(){ - var replyContent = $("#postInput").val(); - if (!replyContent){ - alert("请输入回复"); - }else{ - - //将用户输入内容插入最后一条回复 - /*$(".post-reply-wrap:last").after('
回复
'); - $(".post-reply-content:last").append(replyContent); - $(".post-reply-date:last").append(Date());*/ - var postInput = $("#postInput").val(); - $("#postInput").val(""); - //回复数目+1 - var replyNum = $(".post-interactive-reply").text().match(/\d+/g); - replyNum++; - $(".reply-num").text("(" + replyNum + ")"); - - //获取并传送回复用户数据 - var userInfo = { - "type" : "News", - "content" : postInput - }; - - $.ajax({ - type: "POST", //提交方式 - dataType: "json", //类型 - url: apiUrl + 'new_comment/' + homeworkID, //提交的页面,方法名 - data: userInfo, //参数,如果没有,可以为null - success: function (data) { //如果执行成功,那么执行此方法 - setReplyTemplate(data.data); - }, - error: function (err) { //如果执行不成功,那么执行此方法 - alert("err:" + err); - } - }); - } - - } - - //点赞效果 - var praiseClick = function(){ - var praiseNum = $(".post-interactive-praise").text().match(/\d+/g); - praiseNum++; - $(".praise-num").text("(" + praiseNum + ")"); - } - - -}); \ No newline at end of file diff --git a/public/javascripts/wechat/directives/input_auto.js b/public/javascripts/wechat/directives/input_auto.js new file mode 100644 index 000000000..bcb44141e --- /dev/null +++ b/public/javascripts/wechat/directives/input_auto.js @@ -0,0 +1,19 @@ +app.directive('inputAuto',function(){ + return{ + restrict: 'A', + scope: {}, + link: function(scope, element){ + var copyContainer = element.parent().children().eq(0); + var sendButton = element.parent().next(); + element.on('input',function(){ + console.log(sendButton); + copyContainer.html(element[0].value); + var textHeight = copyContainer[0].scrollHeight; + element.css('height', textHeight + 'px'); + }); + sendButton.on('click',function(){ + element.css('height','28px'); + }); + } + } +}); \ No newline at end of file diff --git a/public/javascripts/wechat/directives/loading_spinner.js b/public/javascripts/wechat/directives/loading_spinner.js new file mode 100644 index 000000000..780056828 --- /dev/null +++ b/public/javascripts/wechat/directives/loading_spinner.js @@ -0,0 +1,7 @@ +app.directive('loadingSpinner', ['$http', function ($http) { + return { + restrict: 'A', + replace: true, + template: '
加载中...
', + }; +}]); diff --git a/public/javascripts/wechat/gulpfile.js b/public/javascripts/wechat/gulpfile.js index 439b6ae5d..ea0649376 100644 --- a/public/javascripts/wechat/gulpfile.js +++ b/public/javascripts/wechat/gulpfile.js @@ -8,3 +8,10 @@ gulp.task('minify', function () { .pipe(concat('angular.all.min.js')) .pipe(gulp.dest('build')) }); + +gulp.task("default", function(){ + gulp.src(['app.js','others/factory.js','others/filter.js', 'controllers/*.js', 'directives/*.js', 'others/routes.js']) + .pipe(uglify()) + .pipe(concat('app.min.js')) + .pipe(gulp.dest('build')) +}); diff --git a/public/javascripts/wechat/homework_detail.js b/public/javascripts/wechat/homework_detail.js deleted file mode 100644 index 166ed20bf..000000000 --- a/public/javascripts/wechat/homework_detail.js +++ /dev/null @@ -1,104 +0,0 @@ -/** - * Created by root on 3/31/16. - */ -$(document).ready(function(){ - - var bt=baidu.template; - bt.LEFT_DELIMITER=''; - - - var apiUrl = '/api/v1/'; - - var setReplyTemplate = function(data){ - console.log(data); - var html=bt('t:homework-detail-reply',{reply: data}); - $('#all_homework_reply').prepend(html); - }; - - var setTemplate = function(data){ - console.log(data); - var html=bt('t:homework-detail',{homework: data}); - $('#homework-container').prepend(html); - $('.post-reply-submit').click(function(){ - replyInsert(); - }); - /*$('post-interactive-praise').click(function(){ - praiseClick(); - });*/ - }; - - var loadDataFromServer = function(id){ - //getOpenId(function(openid){ - $.ajax({ - url: apiUrl + 'whomeworks/' + id, - dataType: 'json', - success: function(data){ - setTemplate(data.data); - }, - error: function(xhr,status,err){ - console.log(err); - } - }); - //}) - - - }; - - var homeworkUrl = window.location.search; - var homeworkID = homeworkUrl.split("=")[1]; - - loadDataFromServer(homeworkID); - - //点击回复按钮,插入回复内容 - var replyInsert = function(){ - var replyContent = $("#postInput").val(); - if (!replyContent){ - alert("请输入回复"); - }else{ - - /*//将用户输入内容插入最后一条回复 - $(".post-reply-wrap:last").after('
回复
'); - $(".post-reply-content:last").append(replyContent); - $(".post-reply-date:last").append(Date());*/ - var postInput = $("#postInput").val(); - $("#postInput").val(""); - //回复数目+1 - var replyNum = $(".post-interactive-reply").text().match(/\d+/g); - replyNum++; - $(".reply-num").text("(" + replyNum + ")"); - - getOpenId(function(openid) { - //获取并传送回复用户数据 - var userInfo = { - "type": "HomeworkCommon", - "content": postInput, - openid: openid - }; - - $.ajax({ - type: "POST", //提交方式 - dataType: "json", //类型 - url: apiUrl + 'new_comment/' + homeworkID, //提交的页面,方法名 - data: userInfo, //参数,如果没有,可以为null - success: function (data) { //如果执行成功,那么执行此方法 - setReplyTemplate(data.data); - }, - error: function (err) { //如果执行不成功,那么执行此方法 - alert("err:" + err); - } - }) - }); - } - - }; - - //点赞效果 - /*var praiseClick = function(){ - var praiseNum = $(".post-interactive-praise").text().match(/\d+/g); - praiseNum++; - $(".praise-num").text("(" + praiseNum + ")"); - };*/ - - -}); \ No newline at end of file diff --git a/public/javascripts/wechat/issue_detail.js b/public/javascripts/wechat/issue_detail.js deleted file mode 100644 index 2b2766d29..000000000 --- a/public/javascripts/wechat/issue_detail.js +++ /dev/null @@ -1,108 +0,0 @@ -/** - * Created by root on 4/1/16. - */ -/** - * Created by root on 3/31/16. - */ -$(document).ready(function(){ - - var bt=baidu.template; - bt.LEFT_DELIMITER=''; - - - var apiUrl = '/api/v1/'; - - var setReplyTemplate = function(data){ - console.log(data); - var html=bt('t:issue-detail-reply',{issue_reply: data}); - $('#all_issue_reply').prepend(html); - }; - - - var setTemplate = function(data){ - console.log(data); - var html=bt('t:issue-detail',{issues: data}); - $('#issue-container').prepend(html); - $('.post-reply-submit').click(function(){ - IssueReplyInsert(); - }); - /*$('post-interactive-praise').click(function(){ - praiseClick(); - });*/ - }; - - var loadDataFromServer = function(id){ - //getOpenId(function(openid){ - $.ajax({ - url: apiUrl + 'issues/' + id, - dataType: 'json', - success: function(data){ - setTemplate(data.data); - }, - error: function(xhr,status,err){ - console.log(err); - } - }); - //}) - - - }; - - var IssueUrl = window.location.search; - var IssueID = IssueUrl.split("=")[1]; - - loadDataFromServer(IssueID); - - //点击回复按钮,插入回复内容 - var IssueReplyInsert = function(){ - var replyContent = $("#postInput").val(); - if (!replyContent){ - alert("请输入回复"); - }else{ - - //将用户输入内容插入最后一条回复 - /*$(".post-reply-wrap:last").after('
回复
'); - $(".post-reply-content:last").append(replyContent); - $(".post-reply-date:last").append(Date());*/ - var postInput = $("#postInput").val(); - $("#postInput").val(""); - //回复数目+1 - var replyNum = $(".post-interactive-reply").text().match(/\d+/g); - replyNum++; - $(".reply-num").text("(" + replyNum + ")"); - - getOpenId(function(openid) { - //获取并传送回复用户数据 - var userInfo = { - "type": "Issue", - "content": postInput, - openid: openid, - }; - - $.ajax({ - type: "POST", //提交方式 - dataType: "json", //类型 - url: apiUrl + 'new_comment/' + IssueID, //提交的页面,方法名 - data: userInfo, //参数,如果没有,可以为null - success: function (data) { //如果执行成功,那么执行此方法 - setReplyTemplate(data.data); - }, - error: function (err) { //如果执行不成功,那么执行此方法 - alert("err:" + err); - } - }) - }); - } - - }; - - //点赞效果 - /*var praiseClick = function(){ - var praiseNum = $(".post-interactive-praise").text().match(/\d+/g); - praiseNum++; - $(".praise-num").text("(" + praiseNum + ")"); - };*/ - - -}); \ No newline at end of file diff --git a/public/javascripts/wechat/message_detail.js b/public/javascripts/wechat/message_detail.js deleted file mode 100644 index 279da05d9..000000000 --- a/public/javascripts/wechat/message_detail.js +++ /dev/null @@ -1,95 +0,0 @@ -/** - * Created by root on 4/1/16. - */ -$(document).ready(function(){ - - var bt=baidu.template; - bt.LEFT_DELIMITER=''; - - - var apiUrl = '/api/v1/'; - - var setTemplate = function(data){ - console.log(data); - var html=bt('t:message-detail',{message: data}); - $('#message-container').prepend(html); - $('.post-reply-submit').click(function(){ - replyInsert(); - }); - $('post-interactive-praise').click(function(){ - praiseClick(); - }); - }; - - var loadDataFromServer = function(id){ - //getOpenId(function(openid){ - $.ajax({ - url: apiUrl + 'journal_for_messages/' + id, - dataType: 'json', - success: function(data){ - setTemplate(data.data); - }, - error: function(xhr,status,err){ - console.log(err); - } - }); - //}) - - - }; - - var homeworkUrl = window.location.search; - var homeworkID = homeworkUrl.split("=")[1]; - - loadDataFromServer(homeworkID); - - //点击回复按钮,插入回复内容 - var replyInsert = function(){ - var replyContent = $("#postInput").val(); - if (!replyContent){ - alert("请输入回复"); - }else{ - - //将用户输入内容插入最后一条回复 - $(".post-reply-wrap:last").after('
回复
'); - $(".post-reply-content:last").append(replyContent); - $(".post-reply-date:last").append(Date()); - var postInput = $("#postInput").val(); - $("#postInput").val(""); - //回复数目+1 - var replyNum = $(".post-interactive-reply").text().match(/\d+/g); - replyNum++; - $(".reply-num").text("(" + replyNum + ")"); - - //获取并传送回复用户数据 - var userInfo = { - "replyType" : "homework_assignment", - "replyContent" : postInput - }; - - $.ajax({ - type: "POST", //提交方式 - dataType: "json", //类型 - url: "前台地址/后台方法", //提交的页面,方法名 - data: userInfo, //参数,如果没有,可以为null - success: function (data) { //如果执行成功,那么执行此方法 - alert(data.d); //用data.d来获取后台传过来的json语句,或者是单纯的语句 - }, - error: function (err) { //如果执行不成功,那么执行此方法 - alert("err:" + err); - } - }); - } - - } - - //点赞效果 - var praiseClick = function(){ - var praiseNum = $(".post-interactive-praise").text().match(/\d+/g); - praiseNum++; - $(".praise-num").text("(" + praiseNum + ")"); - } - - -}); \ No newline at end of file diff --git a/public/javascripts/wechat/others/factory.js b/public/javascripts/wechat/others/factory.js new file mode 100644 index 000000000..955ca2faf --- /dev/null +++ b/public/javascripts/wechat/others/factory.js @@ -0,0 +1,120 @@ +app.factory('auth', function($http,$routeParams, $q){ + var _openid = ''; + + if(typeof g_openid !== 'undefined'){ + _openid = g_openid; + } + + if(debug===true){ + _openid = "oCnvgvz8R7QheXE-R9Kkr39j8Ndg"; //guange的帐号 + } + + var getOpenId = function() { + var deferred = $q.defer(); + if (typeof _openid !== 'undefined' && _openid.length > 0){ + deferred.resolve(_openid); + } else { + var code = $routeParams.code; + $http({ + url: '/wechat/get_open_id', + data: {code: code}, + method: 'POST' + }).then(function successCallback(response) { + _openid = response.data.openid; + deferred.resolve(_openid); + }, function errorCallback(response) { + deferred.reject(response); + }); + } + return deferred.promise; + }; + var openid = function(){ + return _openid; + }; + return {getOpenId: getOpenId, openid: openid}; +}); + + +app.factory('rms', function(){ + var _saveStorage = {}; + var save = function(key, value){ + _saveStorage[key] = value; + }; + + var get = function(key){ + return _saveStorage[key]; + }; + + return {save: save, get: get}; +}); + +app.factory('common', function($http, auth, $routeParams){ + var addCommonReply = function(id, type, data, cb){ + + if(!data.comment || data.comment.length<=0){ + return; + } + + var temp = data.comment.replace(/\n/g,'
'); + + var userInfo = { + type: type, + content: temp, + openid: auth.openid() + }; + //回复按钮禁用 + data.disabled = true; + + $http({ + method: 'POST', + url: apiUrl+ "new_comment/"+id, + data: userInfo + }).then(function successCallback(response) { + //alert("提交成功"); + //数据提交完成,回复按钮启用 + data.disabled = false; + if(typeof cb === 'function'){ + cb(); + } + }, function errorCallback(response) { + }); + }; + + var loadCommonData = function(id, type){ + return $http({ + method: 'GET', + url: apiUrl+ type + "/" + id+"?openid="+auth.openid() + }) + }; + + var addCommonPraise = function(act){ + act.praise_count += 1; + act.has_praise = true; + + $http({ + method: 'POST', + url: apiUrl + "praise/" + act.act_id, + data:{openid:auth.openid(),type:act.act_type} + }).then(function successCallback(response) { + console.log(response.data); + }, function errorCallback(response) { + }); + + }; + + var decreaseCommonPraise = function(act){ + act.praise_count -= 1; + act.has_praise = false; + + $http({ + method: 'POST', + url: apiUrl + "praise/" + act.act_id, + data:{openid:auth.openid(),type:act.act_type} + }).then(function successCallback(response) { + console.log(response.data); + }, function errorCallback(response) { + }); + }; + + return {addCommonReply: addCommonReply, loadCommonData: loadCommonData, addCommonPraise: addCommonPraise, decreaseCommonPraise: decreaseCommonPraise}; +}); \ No newline at end of file diff --git a/public/javascripts/wechat/others/filter.js b/public/javascripts/wechat/others/filter.js new file mode 100644 index 000000000..2f57c2417 --- /dev/null +++ b/public/javascripts/wechat/others/filter.js @@ -0,0 +1,5 @@ +app.filter('safeHtml', function ($sce) { + return function (input) { + return $sce.trustAsHtml(input); + } +}); \ No newline at end of file diff --git a/public/javascripts/wechat/others/routes.js b/public/javascripts/wechat/others/routes.js new file mode 100644 index 000000000..270c16edd --- /dev/null +++ b/public/javascripts/wechat/others/routes.js @@ -0,0 +1,70 @@ +app.config(['$routeProvider',"$httpProvider", "$locationProvider",function ($routeProvider, $httpProvider, $locationProvider) { + var rootPath = '/assets/wechat/' + //$locationProvider.html5Mode(true); + $routeProvider + .when('/activites', { + templateUrl: rootPath + 'activities.html', + controller: 'ActivityController' + }) + .when('/issues/:id', { + templateUrl: rootPath + 'issue_detail.html', + controller: 'IssueController' + }) + .when('/project_discussion/:id', { + templateUrl: rootPath + 'project_discussion.html', + controller: 'DiscussionController' + }) + .when('/homework/:id', { + templateUrl: rootPath + 'homework_detail.html', + controller: 'HomeworkController' + }) + .when('/course_notice/:id', { + templateUrl: rootPath + 'course_notice.html', + controller: 'CourseNoticeController' + }) + .when('/course_discussion/:id', { + templateUrl: rootPath + 'course_discussion.html', + controller: 'DiscussionController' + }) + .when('/journal_for_message/:id', { + templateUrl: rootPath + 'jour_message_detail.html', + controller: 'JournalsController' + }) + .when('/blog_comment/:id', { + templateUrl: rootPath + 'blog_detail.html', + controller: 'BlogController' + }) + .when('/add_class', { + templateUrl: rootPath + 'add_class.html', + controller: 'AddClassController' + }) + .otherwise({ + redirectTo: '/activites' + }); + + //监听异步请求,实现加载中显隐标记 + $httpProvider.interceptors.push(function ($q, $rootScope) { + if ($rootScope.activeCalls == undefined) { + $rootScope.activeCalls = 0; + } + + return { + request: function (config) { + $rootScope.activeCalls += 1; + return config; + }, + requestError: function (rejection) { + $rootScope.activeCalls -= 1; + return rejection; + }, + response: function (response) { + $rootScope.activeCalls -= 1; + return response; + }, + responseError: function (rejection) { + $rootScope.activeCalls -= 1; + return rejection; + } + }; + }); +}]); \ No newline at end of file diff --git a/public/javascripts/wechat/project_discussion.js b/public/javascripts/wechat/project_discussion.js deleted file mode 100644 index 94cdcea10..000000000 --- a/public/javascripts/wechat/project_discussion.js +++ /dev/null @@ -1,105 +0,0 @@ -/** - * Created by root on 4/1/16. - */ -/** - * Created by root on 4/1/16. - */ -$(document).ready(function(){ - - var bt=baidu.template; - bt.LEFT_DELIMITER=''; - - - var apiUrl = '/api/v1/'; - - var setReplyTemplate = function(data){ - console.log(data); - var html=bt('t:homework-detail-reply',{reply: data}); - $('#all_homework_reply').prepend(html); - }; - - - var setTemplate = function(data){ - console.log(data); - var html=bt('t:project-discussion',{discussion: data}); - $('#p-discussion-container').prepend(html); - $('.post-reply-submit').click(function(){ - replyInsert(); - }); - /*$('post-interactive-praise').click(function(){ - praiseClick(); - });*/ - }; - - var loadDataFromServer = function(id){ - //getOpenId(function(openid){ - $.ajax({ - url: apiUrl + 'messages/' + id, - dataType: 'json', - success: function(data){ - setTemplate(data.data); - }, - error: function(xhr,status,err){ - console.log(err); - } - }); - //}) - - - }; - - var homeworkUrl = window.location.search; - var homeworkID = homeworkUrl.split("=")[1]; - - loadDataFromServer(homeworkID); - - //点击回复按钮,插入回复内容 - var replyInsert = function(){ - var replyContent = $("#postInput").val(); - if (!replyContent){ - alert("请输入回复"); - }else{ - - /*//将用户输入内容插入最后一条回复 - $(".post-reply-wrap:last").after('
回复
'); - $(".post-reply-content:last").append(replyContent); - $(".post-reply-date:last").append(Date());*/ - var postInput = $("#postInput").val(); - $("#postInput").val(""); - //回复数目+1 - var replyNum = $(".post-interactive-reply").text().match(/\d+/g); - replyNum++; - $(".reply-num").text("(" + replyNum + ")"); - - //获取并传送回复用户数据 - var userInfo = { - "type" : "Message", - "content" : postInput - }; - - $.ajax({ - type: "POST", //提交方式 - dataType: "json", //类型 - url: apiUrl + 'new_comment/' + homeworkID, //提交的页面,方法名 - data: userInfo, //参数,如果没有,可以为null - success: function (data) { //如果执行成功,那么执行此方法 - setReplyTemplate(data.data); //用data.d来获取后台传过来的json语句,或者是单纯的语句 - }, - error: function (err) { //如果执行不成功,那么执行此方法 - alert("err:" + err); - } - }); - } - - } - - //点赞效果 - /*var praiseClick = function(){ - var praiseNum = $(".post-interactive-praise").text().match(/\d+/g); - praiseNum++; - $(".praise-num").text("(" + praiseNum + ")"); - }*/ - - -}); \ No newline at end of file From ada15b42123536486f0e62f76cb5f3072ccebd06 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Tue, 14 Jun 2016 16:03:10 +0800 Subject: [PATCH 010/216] =?UTF-8?q?=E6=A0=BC=E5=BC=8F=E4=B8=8A=E7=9A=84?= =?UTF-8?q?=E8=B0=83=E6=95=B4,=20=E7=8E=B0=E5=9C=A8=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E5=88=86=E5=BC=80=E5=86=99,=E4=BD=86=E5=8F=91=E5=B8=83?= =?UTF-8?q?=E6=97=B6=E6=89=93=E6=88=90=E4=B8=80=E4=B8=AAjs=E6=8F=90?= =?UTF-8?q?=E9=AB=98=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/wechats/user_activities.html.erb | 4 +- public/assets/wechat/app.html | 13 ++++- public/javascripts/wechat/app.js | 7 --- public/javascripts/wechat/build/app.min.js | 14 +++++ .../wechat/controllers/activity.js | 6 +- public/javascripts/wechat/controllers/blog.js | 6 +- .../wechat/controllers/course_notice.js | 5 +- .../wechat/controllers/discussion.js | 4 +- .../wechat/controllers/homework.js | 4 +- .../javascripts/wechat/controllers/issue.js | 4 +- .../wechat/controllers/journals.js | 4 +- public/javascripts/wechat/others/factory.js | 12 ++-- public/javascripts/wechat/others/filter.js | 4 +- public/javascripts/wechat/others/routes.js | 4 +- public/javascripts/wechat/wechat_dev.js | 57 ------------------- script/assets | 3 + 16 files changed, 59 insertions(+), 92 deletions(-) create mode 100644 public/javascripts/wechat/build/app.min.js delete mode 100644 public/javascripts/wechat/wechat_dev.js create mode 100644 script/assets diff --git a/app/views/wechats/user_activities.html.erb b/app/views/wechats/user_activities.html.erb index 3d61d8fcf..073d45495 100644 --- a/app/views/wechats/user_activities.html.erb +++ b/app/views/wechats/user_activities.html.erb @@ -13,6 +13,8 @@ @@ -21,7 +23,7 @@ - + \ No newline at end of file diff --git a/public/assets/wechat/app.html b/public/assets/wechat/app.html index d88efe50f..cabd224c4 100644 --- a/public/assets/wechat/app.html +++ b/public/assets/wechat/app.html @@ -2,7 +2,7 @@ - 我的动态 + 仅供本地调试使用 @@ -17,7 +17,15 @@
+ + + + @@ -33,6 +41,9 @@ + + + \ No newline at end of file diff --git a/public/javascripts/wechat/app.js b/public/javascripts/wechat/app.js index adf445b51..4d947e440 100644 --- a/public/javascripts/wechat/app.js +++ b/public/javascripts/wechat/app.js @@ -1,8 +1 @@ var app = angular.module('wechat', ['ngRoute']); -var apiUrl = '/api/v1/'; -var debug = true; //调试标志,如果在本地请置为true - -if(debug===true){ - apiUrl = 'http://localhost:3000/api/v1/'; - //apiUrl = 'http://www.trustie.net/api/v1/'; -} diff --git a/public/javascripts/wechat/build/app.min.js b/public/javascripts/wechat/build/app.min.js new file mode 100644 index 000000000..d8eacbf1b --- /dev/null +++ b/public/javascripts/wechat/build/app.min.js @@ -0,0 +1,14 @@ +var app=angular.module("wechat",["ngRoute"]); +app.factory("auth",["$http","$routeParams","$q",function(e,n,t){var o="";"undefined"!=typeof g_openid&&(o=g_openid);var a=function(){var a=t.defer();if("undefined"!=typeof o&&o.length>0)a.resolve(o);else{var i=n.code;e({url:"/wechat/get_open_id",data:{code:i},method:"POST"}).then(function(e){o=e.data.openid,a.resolve(o)},function(e){a.reject(e)})}return a.promise},i=function(){return o};return{getOpenId:a,openid:i}}]),app.factory("rms",function(){var e={},n=function(n,t){e[n]=t},t=function(n){return e[n]};return{save:n,get:t}}),app.factory("common",["$http","auth","$routeParams",function(e,n,t){var o=function(t,o,a,i){if(a.comment&&!(a.comment.length<=0)){var r=a.comment.replace(/\n/g,"
"),d={type:o,content:r,openid:n.openid()};a.disabled=!0,e({method:"POST",url:apiUrl+"new_comment/"+t,data:d}).then(function(e){a.disabled=!1,"function"==typeof i&&i()},function(e){})}},a=function(t,o){return e({method:"GET",url:apiUrl+o+"/"+t+"?openid="+n.openid()})},i=function(t){t.praise_count+=1,t.has_praise=!0,e({method:"POST",url:apiUrl+"praise/"+t.act_id,data:{openid:n.openid(),type:t.act_type}}).then(function(e){console.log(e.data)},function(e){})},r=function(t){t.praise_count-=1,t.has_praise=!1,e({method:"POST",url:apiUrl+"praise/"+t.act_id,data:{openid:n.openid(),type:t.act_type}}).then(function(e){console.log(e.data)},function(e){})};return{addCommonReply:o,loadCommonData:a,addCommonPraise:i,decreaseCommonPraise:r}}]); +app.filter("safeHtml",["$sce",function(t){return function(n){return t.trustAsHtml(n)}}]); +app.controller("ActivityController",["$anchorScroll","$location","$scope","$http","$timeout","auth","rms","common",function(t,a,e,o,i,n,c,s){e.replaceUrl=function(t){return t},console.log("ActivityController load"),e.page=c.get("page")||0,e.activities=c.get("activities")||[],e.has_more=c.get("has_more"),e.loadActData=function(t){e.page=t,o({method:"POST",url:apiUrl+"activities",data:{openid:n.openid(),page:t}}).then(function(t){t.data.page>0?e.activities=e.activities.concat(t.data.data):e.activities=t.data.data,c.save("activities",e.activities),e.has_more=t.data.count+10*t.data.page
加载中...
'}}]); +app.config(["$routeProvider","$httpProvider","$locationProvider",function(e,r,t){var o="/assets/wechat/";e.when("/activites",{templateUrl:o+"activities.html",controller:"ActivityController"}).when("/issues/:id",{templateUrl:o+"issue_detail.html",controller:"IssueController"}).when("/project_discussion/:id",{templateUrl:o+"project_discussion.html",controller:"DiscussionController"}).when("/homework/:id",{templateUrl:o+"homework_detail.html",controller:"HomeworkController"}).when("/course_notice/:id",{templateUrl:o+"course_notice.html",controller:"CourseNoticeController"}).when("/course_discussion/:id",{templateUrl:o+"course_discussion.html",controller:"DiscussionController"}).when("/journal_for_message/:id",{templateUrl:o+"jour_message_detail.html",controller:"JournalsController"}).when("/blog_comment/:id",{templateUrl:o+"blog_detail.html",controller:"BlogController"}).when("/add_class",{templateUrl:o+"add_class.html",controller:"AddClassController"}).otherwise({redirectTo:"/activites"}),r.interceptors.push(["$q","$rootScope",function(e,r){return void 0==r.activeCalls&&(r.activeCalls=0),{request:function(e){return r.activeCalls+=1,e},requestError:function(e){return r.activeCalls-=1,e},response:function(e){return r.activeCalls-=1,e},responseError:function(e){return r.activeCalls-=1,e}}}])}]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/activity.js b/public/javascripts/wechat/controllers/activity.js index 732772e13..e17b7c5b3 100644 --- a/public/javascripts/wechat/controllers/activity.js +++ b/public/javascripts/wechat/controllers/activity.js @@ -1,5 +1,7 @@ -app.controller('ActivityController',function($anchorScroll, $location,$scope, $http, $timeout, auth, rms, common){ +app.controller('ActivityController', + ['$anchorScroll', '$location','$scope', '$http', '$timeout', 'auth', 'rms', 'common', + function($anchorScroll, $location,$scope, $http, $timeout, auth, rms, common){ $scope.replaceUrl = function(url){ return url; }; @@ -63,4 +65,4 @@ app.controller('ActivityController',function($anchorScroll, $location,$scope, $h $scope.decreasePraise = function(act){ common.decreaseCommonPraise(act); }; -}); \ No newline at end of file +}]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/blog.js b/public/javascripts/wechat/controllers/blog.js index 56589122a..8eb45b604 100644 --- a/public/javascripts/wechat/controllers/blog.js +++ b/public/javascripts/wechat/controllers/blog.js @@ -1,5 +1,7 @@ -app.controller('BlogController', function($scope, $http, $routeParams, auth, common){ +app.controller('BlogController', + ['$scope', '$http', '$routeParams', 'auth', 'common', + function($scope, $http, $routeParams, auth, common){ $scope.formData = {comment: ''}; var loadData = function(id){ @@ -35,4 +37,4 @@ app.controller('BlogController', function($scope, $http, $routeParams, auth, com console.log(act); common.decreaseCommonPraise(act); }; -}); \ No newline at end of file +}]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/course_notice.js b/public/javascripts/wechat/controllers/course_notice.js index 9a60d2222..24b0fdbe1 100644 --- a/public/javascripts/wechat/controllers/course_notice.js +++ b/public/javascripts/wechat/controllers/course_notice.js @@ -1,4 +1,5 @@ -app.controller('CourseNoticeController', function($scope, $http, $routeParams, auth, common){ +app.controller('CourseNoticeController', ['$scope', '$http', '$routeParams', 'auth', 'common', + function($scope, $http, $routeParams, auth, common){ $scope.formData = {comment: ''}; var loadData = function(id){ @@ -32,4 +33,4 @@ app.controller('CourseNoticeController', function($scope, $http, $routeParams, a $scope.decreasePraise = function(act){ common.decreaseCommonPraise(act); }; -}); \ No newline at end of file +}]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/discussion.js b/public/javascripts/wechat/controllers/discussion.js index 479f473bf..4828cb39a 100644 --- a/public/javascripts/wechat/controllers/discussion.js +++ b/public/javascripts/wechat/controllers/discussion.js @@ -1,5 +1,5 @@ -app.controller('DiscussionController', function($scope, $http, $routeParams, auth, common){ +app.controller('DiscussionController', ['$scope', '$http', '$routeParams', 'auth', 'common', function($scope, $http, $routeParams, auth, common){ $scope.formData = {comment: ''}; var loadData = function(id){ @@ -33,4 +33,4 @@ app.controller('DiscussionController', function($scope, $http, $routeParams, aut $scope.decreasePraise = function(act){ common.decreaseCommonPraise(act); }; -}); \ No newline at end of file +}]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/homework.js b/public/javascripts/wechat/controllers/homework.js index 5fb890741..795bf30e9 100644 --- a/public/javascripts/wechat/controllers/homework.js +++ b/public/javascripts/wechat/controllers/homework.js @@ -1,5 +1,5 @@ -app.controller('HomeworkController', function($scope, $http, $routeParams, auth, common){ +app.controller('HomeworkController', ['$scope', '$http', '$routeParams', 'auth', 'common', function($scope, $http, $routeParams, auth, common){ $scope.formData = {comment: ''}; var loadData = function(id){ @@ -33,4 +33,4 @@ app.controller('HomeworkController', function($scope, $http, $routeParams, auth, $scope.decreasePraise = function(act){ common.decreaseCommonPraise(act); }; -}); +}]); diff --git a/public/javascripts/wechat/controllers/issue.js b/public/javascripts/wechat/controllers/issue.js index 53bdbf265..09602f9e1 100644 --- a/public/javascripts/wechat/controllers/issue.js +++ b/public/javascripts/wechat/controllers/issue.js @@ -1,4 +1,4 @@ -app.controller('IssueController', function($scope, $http, $routeParams, auth, common){ +app.controller('IssueController', ['$scope', '$http', '$routeParams', 'auth', 'common', function($scope, $http, $routeParams, auth, common){ $scope.formData = {comment: ''}; var loadData = function(id){ @@ -33,4 +33,4 @@ app.controller('IssueController', function($scope, $http, $routeParams, auth, co $scope.decreasePraise = function(act){ common.decreaseCommonPraise(act); }; -}); \ No newline at end of file +}]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/journals.js b/public/javascripts/wechat/controllers/journals.js index c292b1932..f379525d7 100644 --- a/public/javascripts/wechat/controllers/journals.js +++ b/public/javascripts/wechat/controllers/journals.js @@ -1,4 +1,4 @@ -app.controller('JournalsController', function($scope, $http, $routeParams, auth, common){ +app.controller('JournalsController', ['$scope', '$http', '$routeParams', 'auth', 'common', function($scope, $http, $routeParams, auth, common){ $scope.formData = {comment: ''}; var loadData = function(id){ @@ -34,4 +34,4 @@ app.controller('JournalsController', function($scope, $http, $routeParams, auth, console.log(act); common.decreaseCommonPraise(act); }; -}); \ No newline at end of file +}]); \ No newline at end of file diff --git a/public/javascripts/wechat/others/factory.js b/public/javascripts/wechat/others/factory.js index 955ca2faf..cefef3ab9 100644 --- a/public/javascripts/wechat/others/factory.js +++ b/public/javascripts/wechat/others/factory.js @@ -1,14 +1,10 @@ -app.factory('auth', function($http,$routeParams, $q){ +app.factory('auth', ['$http','$routeParams', '$q', function($http,$routeParams, $q){ var _openid = ''; if(typeof g_openid !== 'undefined'){ _openid = g_openid; } - if(debug===true){ - _openid = "oCnvgvz8R7QheXE-R9Kkr39j8Ndg"; //guange的帐号 - } - var getOpenId = function() { var deferred = $q.defer(); if (typeof _openid !== 'undefined' && _openid.length > 0){ @@ -32,7 +28,7 @@ app.factory('auth', function($http,$routeParams, $q){ return _openid; }; return {getOpenId: getOpenId, openid: openid}; -}); +}]); app.factory('rms', function(){ @@ -48,7 +44,7 @@ app.factory('rms', function(){ return {save: save, get: get}; }); -app.factory('common', function($http, auth, $routeParams){ +app.factory('common', ['$http', 'auth', '$routeParams', function($http, auth, $routeParams){ var addCommonReply = function(id, type, data, cb){ if(!data.comment || data.comment.length<=0){ @@ -117,4 +113,4 @@ app.factory('common', function($http, auth, $routeParams){ }; return {addCommonReply: addCommonReply, loadCommonData: loadCommonData, addCommonPraise: addCommonPraise, decreaseCommonPraise: decreaseCommonPraise}; -}); \ No newline at end of file +}]); \ No newline at end of file diff --git a/public/javascripts/wechat/others/filter.js b/public/javascripts/wechat/others/filter.js index 2f57c2417..dcb8e9e6a 100644 --- a/public/javascripts/wechat/others/filter.js +++ b/public/javascripts/wechat/others/filter.js @@ -1,5 +1,5 @@ -app.filter('safeHtml', function ($sce) { +app.filter('safeHtml', ['$sce',function ($sce) { return function (input) { return $sce.trustAsHtml(input); } -}); \ No newline at end of file +}]); \ No newline at end of file diff --git a/public/javascripts/wechat/others/routes.js b/public/javascripts/wechat/others/routes.js index 270c16edd..7ea270c6e 100644 --- a/public/javascripts/wechat/others/routes.js +++ b/public/javascripts/wechat/others/routes.js @@ -43,7 +43,7 @@ app.config(['$routeProvider',"$httpProvider", "$locationProvider",function ($rou }); //监听异步请求,实现加载中显隐标记 - $httpProvider.interceptors.push(function ($q, $rootScope) { + $httpProvider.interceptors.push(['$q', '$rootScope', function ($q, $rootScope) { if ($rootScope.activeCalls == undefined) { $rootScope.activeCalls = 0; } @@ -66,5 +66,5 @@ app.config(['$routeProvider',"$httpProvider", "$locationProvider",function ($rou return rejection; } }; - }); + }]); }]); \ No newline at end of file diff --git a/public/javascripts/wechat/wechat_dev.js b/public/javascripts/wechat/wechat_dev.js deleted file mode 100644 index 36529e0b8..000000000 --- a/public/javascripts/wechat/wechat_dev.js +++ /dev/null @@ -1,57 +0,0 @@ -/** - * Created by root on 3/25/16. - */ -$(document).ready(function(){ - - var bt=baidu.template; - bt.LEFT_DELIMITER=''; - - var apiUrl = '/api/v1/'; - var loadDataFromServer = function(id, page){ - getOpenId(function(openid){ - $.ajax({ - url: apiUrl + 'activities', - data: {openid: openid, page: page}, - type: 'POST', - dataType: 'json', - success: function(data){ - setTemplate(data.data, data.all_count, data.count, data.page); - }, - error: function(xhr,status,err){ - console.log(err); - } - }); - }) - - }; - var setTemplate = function(data, all_count, count, page){ - console.log(data); - var html=bt('t:result-list',{activities: data, all_count: all_count, count: count, page: page}); - if (page == 0) { - $('#container').prepend(html); - } else { - $("#more_activities").remove(); - $('#container').append(html); - } - descToggle(); - }; - //内容全部显示与部分隐藏 - var descToggle = function(){ - $(".post-all-content").each(function(){ - var postHeight = $(this).height(); - if (postHeight > 90){ - $(this).parent().next().css("display","block"); - $(this).parent().next().toggle(function(){ - $(this).text("点击隐藏"); - $(this).prev().css("height",postHeight); - },function(){ - $(this).text("点击展开"); - $(this).prev().css("height",90); - }); - } - }); - } - - loadDataFromServer(8686, 0); -}); diff --git a/script/assets b/script/assets new file mode 100644 index 000000000..bf4501127 --- /dev/null +++ b/script/assets @@ -0,0 +1,3 @@ +#!/usr/bin/env bash + +cd public/javascripts/wechat && gulp && gulp minify From 8fd4d518b26b159b6fe5040497c49b0944cc24af Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Wed, 15 Jun 2016 13:44:28 +0800 Subject: [PATCH 011/216] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=82=80=E8=AF=B7?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/mobile/api.rb | 3 +- app/api/mobile/apis/courses.rb | 25 ++++++-------- app/helpers/api_helper.rb | 22 ++++++++++++ app/models/course.rb | 19 +++++++++++ app/services/courses_service.rb | 34 ++++++++++++------- ...0160614072229_add_invite_code_to_course.rb | 5 +++ db/schema.rb | 3 +- 7 files changed, 81 insertions(+), 30 deletions(-) create mode 100644 db/migrate/20160614072229_add_invite_code_to_course.rb diff --git a/app/api/mobile/api.rb b/app/api/mobile/api.rb index c86a36d05..058687776 100644 --- a/app/api/mobile/api.rb +++ b/app/api/mobile/api.rb @@ -67,8 +67,7 @@ module Mobile mount Apis::NewComment mount Apis::Praise - #add_swagger_documentation ({api_version: 'v1', base_path: 'http://u06.shellinfo.cn/trustie/api'}) - #add_swagger_documentation ({api_version: 'v1', base_path: '/api'}) if Rails.env.development? + add_swagger_documentation ({api_version: 'v1', base_path: '/api'}) if Rails.env.development? end end diff --git a/app/api/mobile/apis/courses.rb b/app/api/mobile/apis/courses.rb index 3a36a9e37..b585e7dae 100644 --- a/app/api/mobile/apis/courses.rb +++ b/app/api/mobile/apis/courses.rb @@ -97,25 +97,22 @@ module Mobile desc "加入课程" params do - requires :course_password, type: String + optional :openid, type: String, desc: '微信ID' + requires :invite_code, type: String, desc: '邀请码' end - post ":id" do + post "join" do authenticate! + cs = CoursesService.new - status = cs.join_course({:object_id => params[:id],:course_password => params[:course_password]},current_user) - out = {status: status[:state]} - message = case status[:state] - when 0; "加入成功" - when 1; "密码错误" - when 2; "课程已过期 请联系课程管理员重启课程。(在配置课程处)" - when 3; "您已经加入了课程" - when 4; "您加入的课程不存在" - when 5; "您还未登录" - else; "未知错误,请稍后再试" - end - out.merge(message: message) + status = cs.join_course({openid: params[:openid], invite_code: params[:invite_code]}, current_user) + + { + status: status[:state], + messsge:CoursesService::JoinCourseError.message(status[:state]) + } end + desc "退出课程" params do requires :token, type: String diff --git a/app/helpers/api_helper.rb b/app/helpers/api_helper.rb index fb1231287..e993b120f 100644 --- a/app/helpers/api_helper.rb +++ b/app/helpers/api_helper.rb @@ -489,4 +489,26 @@ module ApiHelper self.update_attribute(:praise_num, self.praise_num.to_i - num) end + + class Errors + def self.define_error(arr) + @errors = {} + arr.each_with_index { |item, index| + if index %2 == 1 + @errors[arr[index-1]] = item + end + } + if arr.count % 2== 1 + @default_error = arr.last + else + @default_error = "未知错误" + end + + end + + def self.message(msg_id) + @errors[msg_id] || @default_error + end + end + end \ No newline at end of file diff --git a/app/models/course.rb b/app/models/course.rb index 69dbec5d0..d379b24d3 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -1,3 +1,5 @@ +#coding=utf-8 + require 'elasticsearch/model' class Course < ActiveRecord::Base include Redmine::SafeAttributes @@ -404,6 +406,7 @@ class Course < ActiveRecord::Base self.course_messages << CourseMessage.new(:user_id => self.tea_id, :course_id => self.id, :viewed => false) end + #项目与课程分离后,很多课程的名称等信息为空,这些数据信息存储在项目表中!!就是数据兼容的问题 #def name # read_attribute('name') || Project.find_by_identifier(self.extra).try(:name) @@ -450,6 +453,22 @@ class Course < ActiveRecord::Base end end + # 生成邀请码 + CODES = %W(2 3 4 5 6 7 8 9 A B C D E F G H J K L N M O P Q R S T U V W X Y Z) + def generate_invite_code + code = invite_code + if !invite_code || invite_code.size <6 + self.invite_code = CODES.sample(6).join + save! && reload + code = invite_code + end + code + end + + def + + end + end diff --git a/app/services/courses_service.rb b/app/services/courses_service.rb index 2c8387349..93529f57c 100644 --- a/app/services/courses_service.rb +++ b/app/services/courses_service.rb @@ -300,23 +300,31 @@ class CoursesService @state end + class JoinCourseError < Errors + define_error [ + 0, '加入成功', + 1, '密码错误', + 2, '课程已过期 请联系课程管理员重启课程。', + 3, '您已经加入了课程', + 4, '您加入的课程不存在', + 5, '您还未登录', + 6, '申请成功,请等待审核完毕', + 7, '您已经发送过申请了,请耐心等待', + 8, '您已经是该课程的教师了', + 9, '您已经是该课程的教辅了', + 10, '您已经是该课程的管理员了', + '未知错误,请稍后再试' + ] + end #加入课程 #object_id:课程id #course_password :加入课程的密码 - #@state == 0 加入成功 - #@state == 1 密码错误 - #@state == 2 课程已过期 请联系课程管理员重启课程。(在配置课程处) - #@state == 3 您已经加入了课程 - #@state == 4 您加入的课程不存在 - #@state == 5 您还未登录 - #@state == 6 申请成功,请等待审核完毕 - #@state == 7 您已经发送过申请了,请耐心等待 - #@state == 8 您已经是该课程的教师了 - #@state == 9 您已经是该课程的教辅了 - #@state == 10 您已经是该课程的管理员了 - #@state 其他 未知错误,请稍后再试 def join_course params,current_user - course = Course.find_by_id params[:object_id] + course = if params[:invite_code] + Course.find_by_invite_code(params[:invite_code]) + else + Course.find_by_id params[:object_id] + end @state = 10 if course diff --git a/db/migrate/20160614072229_add_invite_code_to_course.rb b/db/migrate/20160614072229_add_invite_code_to_course.rb new file mode 100644 index 000000000..8f7bb8da1 --- /dev/null +++ b/db/migrate/20160614072229_add_invite_code_to_course.rb @@ -0,0 +1,5 @@ +class AddInviteCodeToCourse < ActiveRecord::Migration + def change + add_column :courses, :invite_code, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 95ffceef1..820c6a035 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20160612043259) do +ActiveRecord::Schema.define(:version => 20160614072229) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -550,6 +550,7 @@ ActiveRecord::Schema.define(:version => 20160612043259) do t.integer "excellent_option", :default => 0 t.integer "is_copy", :default => 0 t.integer "visits", :default => 0 + t.string "invite_code" end create_table "custom_fields", :force => true do |t| From 24458ecb48a4578854bc65f9a3bea82707348876 Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 16 Jun 2016 11:31:39 +0800 Subject: [PATCH 012/216] =?UTF-8?q?table=E5=8F=AF=E6=8B=96=E6=8B=BD?= =?UTF-8?q?=EF=BC=8C=E5=9C=A8=E7=BA=BF=E6=B5=8B=E9=AA=8C=E8=A1=A8=E6=A0=BC?= =?UTF-8?q?=E5=B8=83=E5=B1=80=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/exercise/_student_table.html.erb | 25 ++++++++++--------- .../student_work/_evaluation_title.html.erb | 6 +---- .../_evaluation_un_title.html.erb | 6 +---- app/views/student_work/index.js.erb | 3 +-- public/javascripts/resizeable_table.js | 5 ++-- public/stylesheets/courses.css | 2 +- 6 files changed, 19 insertions(+), 28 deletions(-) diff --git a/app/views/exercise/_student_table.html.erb b/app/views/exercise/_student_table.html.erb index cbb56025e..f3a72b20e 100644 --- a/app/views/exercise/_student_table.html.erb +++ b/app/views/exercise/_student_table.html.erb @@ -1,23 +1,24 @@ +<%= javascript_include_tag 'resizeable_table'%> + - - + + + + + + + <% @exercise_users_list.each_with_index do |exercise, index|%> - + @@ -30,7 +31,7 @@ - +
- 序号 -    - 姓名 - 学号 - 班级 -
序号  姓名学号班级   - <%= link_to "时间",'',:class => "c_dark f14 fb fl ml50" ,:remote => true%> + <%= link_to "时间",'',:class => "c_dark f14 fb" ,:remote => true%> - <%= link_to "成绩",'',:class => "c_dark f14 fb fl ml10",:remote => true%> + <%= link_to "成绩",'',:class => "c_dark f14 fb",:remote => true%>
<%=index + 1 %><%=index + 1 %> <%= link_to(image_tag(url_to_avatar(exercise.user),:width =>"40",:height => "40",:style => "display:block;", :class => "mt15"),user_activities_path(exercise.user)) %> --    <% if exercise.created_at%> <%= Time.parse(format_time(exercise.created_at)).strftime("%m-%d %H:%M")%>  diff --git a/app/views/student_work/_evaluation_title.html.erb b/app/views/student_work/_evaluation_title.html.erb index 6a89b51b1..950c1660a 100644 --- a/app/views/student_work/_evaluation_title.html.erb +++ b/app/views/student_work/_evaluation_title.html.erb @@ -1,8 +1,4 @@ - - - +
diff --git a/app/views/student_work/_evaluation_un_title.html.erb b/app/views/student_work/_evaluation_un_title.html.erb index c4a6a3e9b..5ed2e82d6 100644 --- a/app/views/student_work/_evaluation_un_title.html.erb +++ b/app/views/student_work/_evaluation_un_title.html.erb @@ -1,8 +1,4 @@ - - -
序号  
+
diff --git a/app/views/student_work/index.js.erb b/app/views/student_work/index.js.erb index da2428316..f65782805 100644 --- a/app/views/student_work/index.js.erb +++ b/app/views/student_work/index.js.erb @@ -1,4 +1,3 @@ $("#homework_student_work_list").html("<%= escape_javascript(render :partial => 'student_work/student_work_list') %>"); $("#export_student_work").replaceWith("<%= escape_javascript( link_to "导出作业成绩", student_work_index_path(:homework => @homework.id,:order => @order, :sort => @b_sort, :group => @group, :name => @name, :format => 'xls'),:class=>'hworkExport postTypeGrey', :id => 'export_student_work') %>"); -/* -$("th").each(function(){$(this).css("width",$(this).width()-1);});*/ +$("th").each(function(){$(this).css("width",$(this).width()-1);}); diff --git a/public/javascripts/resizeable_table.js b/public/javascripts/resizeable_table.js index a43078dee..1f84d4471 100644 --- a/public/javascripts/resizeable_table.js +++ b/public/javascripts/resizeable_table.js @@ -1,7 +1,7 @@ /** * Created by ttang on 2016/5/24. */ - /*$(document).ready(function(){ + $(document).ready(function(){ $("th").each(function(){ $(this).css("width",$(this).width()-1); }); @@ -80,5 +80,4 @@ element.addEventListener?element.addEventListener(type,listener,useCapture):element.attachEvent("on" + type,listener); } } - }); -*/ \ No newline at end of file + }); \ No newline at end of file diff --git a/public/stylesheets/courses.css b/public/stylesheets/courses.css index 46fbc5950..382283f75 100644 --- a/public/stylesheets/courses.css +++ b/public/stylesheets/courses.css @@ -109,7 +109,7 @@ a.hworkSearchIcon:hover {background:url(../images/nav_icon.png) -49px -1px no-re /*20160520作品列表table*/ .hwork-table-wrap {width:720px; border-collapse:collapse; vertical-align:middle; table-layout:fixed;} -.hwork-table-wrap th {font-size:14px; color:#2d2d2d; border-bottom:1px solid #e1e1e1;} +.hwork-table-wrap th {font-size:14px; color:#2d2d2d; border:1px solid #e1e1e1; text-align:center;} /*作业信息*/ .mt-2 {margin-top:-2px;} From d0791253d9f56c532a3d970f43cf3fd722a9ca2c Mon Sep 17 00:00:00 2001 From: huang Date: Fri, 17 Jun 2016 11:29:49 +0800 Subject: [PATCH 013/216] quality --- app/assets/javascripts/quality_analyses.js.coffee | 3 +++ app/assets/stylesheets/quality_analyses.css.scss | 3 +++ app/controllers/projects_controller.rb | 2 +- app/controllers/quality_analyses_controller.rb | 15 +++++++++++++++ app/helpers/quality_analyses_helper.rb | 2 ++ app/views/quality_analyses/index.html.erb | 0 config/routes.rb | 7 +++++++ .../quality_analyses_controller_spec.rb | 5 +++++ 8 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 app/assets/javascripts/quality_analyses.js.coffee create mode 100644 app/assets/stylesheets/quality_analyses.css.scss create mode 100644 app/controllers/quality_analyses_controller.rb create mode 100644 app/helpers/quality_analyses_helper.rb create mode 100644 app/views/quality_analyses/index.html.erb create mode 100644 spec/controllers/quality_analyses_controller_spec.rb diff --git a/app/assets/javascripts/quality_analyses.js.coffee b/app/assets/javascripts/quality_analyses.js.coffee new file mode 100644 index 000000000..761567942 --- /dev/null +++ b/app/assets/javascripts/quality_analyses.js.coffee @@ -0,0 +1,3 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ diff --git a/app/assets/stylesheets/quality_analyses.css.scss b/app/assets/stylesheets/quality_analyses.css.scss new file mode 100644 index 000000000..9404eb70f --- /dev/null +++ b/app/assets/stylesheets/quality_analyses.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the QualityAnalyses controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index c8b272480..7e1738842 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -645,7 +645,7 @@ class ProjectsController < ApplicationController params[:project][:is_public] ? @project.is_public = 1 : @project.is_public = 0 params[:project][:hidden_repo] ? @project.hidden_repo = 1 : @project.hidden_repo = 0 # 更新公开私有时同步gitlab公开私有 - unless @project.gpid.nil? + if !@project.gpid.nil? && @project.is_public != (params[:project][:is_public] == "on" ? true : false) g = Gitlab.client params[:project][:is_public] ? g.edit_project(@project.gpid, 20, params[:branch]) : g.edit_project(@project.gpid, 0, params[:branch]) end diff --git a/app/controllers/quality_analyses_controller.rb b/app/controllers/quality_analyses_controller.rb new file mode 100644 index 000000000..0ea288a91 --- /dev/null +++ b/app/controllers/quality_analyses_controller.rb @@ -0,0 +1,15 @@ +class QualityAnalysesController < ApplicationController + before_filter :find_project_by_project_id#, :except => [:getattachtype] + layout "base_projects" + + def index + + end + + # Find project of id params[:project_id] + def find_project_by_project_id + @project = Project.find(params[:project_id]) + rescue ActiveRecord::RecordNotFound + render_404 + end +end diff --git a/app/helpers/quality_analyses_helper.rb b/app/helpers/quality_analyses_helper.rb new file mode 100644 index 000000000..a47f571bb --- /dev/null +++ b/app/helpers/quality_analyses_helper.rb @@ -0,0 +1,2 @@ +module QualityAnalysesHelper +end diff --git a/app/views/quality_analyses/index.html.erb b/app/views/quality_analyses/index.html.erb new file mode 100644 index 000000000..e69de29bb diff --git a/config/routes.rb b/config/routes.rb index 33a59b46b..17614f4b6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -782,6 +782,13 @@ RedmineApp::Application.routes.draw do end end + resources :quality_analyses, :only => [:index] do + collection do + end + member do + + end + end # resources :files, :only => [:index, :new, :create] do # member do # match "quote_resource_show_project",:via => [:get] diff --git a/spec/controllers/quality_analyses_controller_spec.rb b/spec/controllers/quality_analyses_controller_spec.rb new file mode 100644 index 000000000..c5076c53f --- /dev/null +++ b/spec/controllers/quality_analyses_controller_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe QualityAnalysesController, :type => :controller do + +end From a105f4eaf03e0b2f6572c9939eef14fba4d93412 Mon Sep 17 00:00:00 2001 From: cxt Date: Fri, 17 Jun 2016 14:09:43 +0800 Subject: [PATCH 014/216] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E4=B8=AD=EF=BC=9A=E8=AF=BE=E7=A8=8B=E8=AE=A8=E8=AE=BA=E5=8C=BA?= =?UTF-8?q?=E3=80=81=E8=AF=BE=E7=A8=8B=E9=80=9A=E7=9F=A5=20=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E5=8A=A8=E6=80=81=E4=B8=AD=EF=BC=9A=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?issue=E3=80=81=E9=A1=B9=E7=9B=AE=E6=96=B0=E9=97=BB=E3=80=81?= =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E8=AE=A8=E8=AE=BA=E5=8C=BA=20=E4=B8=AA?= =?UTF-8?q?=E4=BA=BA=E5=8A=A8=E6=80=81=EF=BC=9A=E5=A6=82=E4=B8=8A=E5=8A=A8?= =?UTF-8?q?=E6=80=81=20=E6=9C=AA=E7=99=BB=E5=BD=95=E6=97=B6=E4=B8=8D?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=BD=BF=E8=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/_course_message.html.erb | 54 ++++++++++++----------- app/views/users/_course_news.html.erb | 52 +++++++++++----------- app/views/users/_project_issue.html.erb | 44 +++++++++--------- app/views/users/_project_message.html.erb | 54 ++++++++++++----------- app/views/users/_project_news.html.erb | 52 +++++++++++----------- 5 files changed, 133 insertions(+), 123 deletions(-) diff --git a/app/views/users/_course_message.html.erb b/app/views/users/_course_message.html.erb index 76971e240..9fb844926 100644 --- a/app/views/users/_course_message.html.erb +++ b/app/views/users/_course_message.html.erb @@ -49,33 +49,35 @@ <%= render :partial=>"attachments/activity_attach", :locals=>{:activity => activity} %> - + + <% end %>
diff --git a/app/views/users/_course_news.html.erb b/app/views/users/_course_news.html.erb index 5ffa78158..65bc970e3 100644 --- a/app/views/users/_course_news.html.erb +++ b/app/views/users/_course_news.html.erb @@ -35,31 +35,33 @@
<%= render :partial=>"attachments/activity_attach", :locals=>{:activity => activity} %>
-
-
    -
  • - <% if User.current.logged? %> -
      -
    • <%= link_to("发送", 'javascript:void(0)',:class => "postOptionLink",:onclick=>"show_send('#{activity.id}',#{User.current.id},'news')") %>
    • -
    • - <%= link_to( - l(:button_edit), - {controller:'news', :action => 'edit', :id => activity.id}, - :class => 'postOptionLink' - ) if User.current.allowed_to?(:manage_news, activity.course) %> -
    • -
    • - <%= delete_link( - news_path(activity), - :data => {:confirm => l(:text_are_you_sure)}, - :class => 'postOptionLink' - ) if User.current.allowed_to?(:manage_news, activity.course) %> -
    • -
    - <% end %> -
  • -
-
+ <% if User.current.logged? %> +
+
    +
  • + <% if User.current.logged? %> +
      +
    • <%= link_to("发送", 'javascript:void(0)',:class => "postOptionLink",:onclick=>"show_send('#{activity.id}',#{User.current.id},'news')") %>
    • +
    • + <%= link_to( + l(:button_edit), + {controller:'news', :action => 'edit', :id => activity.id}, + :class => 'postOptionLink' + ) if User.current.allowed_to?(:manage_news, activity.course) %> +
    • +
    • + <%= delete_link( + news_path(activity), + :data => {:confirm => l(:text_are_you_sure)}, + :class => 'postOptionLink' + ) if User.current.allowed_to?(:manage_news, activity.course) %> +
    • +
    + <% end %> +
  • +
+
+ <% end %>
diff --git a/app/views/users/_project_issue.html.erb b/app/views/users/_project_issue.html.erb index d8714400d..ccf0e456e 100644 --- a/app/views/users/_project_issue.html.erb +++ b/app/views/users/_project_issue.html.erb @@ -13,29 +13,31 @@ <% end %> TO <%= link_to activity.project.name.to_s+" | 项目问题", project_issues_path(activity.project), :class => "newsBlue ml15"%> -
-
    -
  • -
      -
    • - <%= link_to l(:button_edit), issue_path(activity.id, :edit => 'true'), :class => 'postOptionLink', :accesskey => accesskey(:edit) if activity.editable? && User.current.allowed_to?(:edit_issues, activity.project) %> -
    • -
    • - <% if !defined?(project_id) && !defined?(user_id) %> - <%= link_to l(:button_delete), issue_path(activity.id), :data => {:confirm => issues_destroy_confirmation_message(activity)}, :method => :delete, :class => 'postOptionLink' if User.current.allowed_to?(:delete_issues, activity.project) %> - <% elsif defined?(project_id) %> - <%= link_to l(:button_delete), issue_path(activity.id, :page_classify => "project_page", :page_id => project_id), :data => {:confirm => issues_destroy_confirmation_message(activity)}, :method => :delete, :class => 'postOptionLink' if User.current.allowed_to?(:delete_issues, activity.project) %> - <% elsif defined?(user_id) %> - <%= link_to l(:button_delete), issue_path(activity.id, :page_classify => "user_page", :page_id => user_id), :data => {:confirm => issues_destroy_confirmation_message(activity)}, :method => :delete, :class => 'postOptionLink' if User.current.allowed_to?(:delete_issues, activity.project) %> - <% end %> -
    • -
    • - <%= link_to l(:button_copy), project_copy_issue_path(activity.project, activity), :class => 'postOptionLink' if User.current.allowed_to?(:add_issues, activity.project) %> + <% if User.current.logged? %> +
      +
        +
      • +
          +
        • + <%= link_to l(:button_edit), issue_path(activity.id, :edit => 'true'), :class => 'postOptionLink', :accesskey => accesskey(:edit) if activity.editable? && User.current.allowed_to?(:edit_issues, activity.project) %> +
        • +
        • + <% if !defined?(project_id) && !defined?(user_id) %> + <%= link_to l(:button_delete), issue_path(activity.id), :data => {:confirm => issues_destroy_confirmation_message(activity)}, :method => :delete, :class => 'postOptionLink' if User.current.allowed_to?(:delete_issues, activity.project) %> + <% elsif defined?(project_id) %> + <%= link_to l(:button_delete), issue_path(activity.id, :page_classify => "project_page", :page_id => project_id), :data => {:confirm => issues_destroy_confirmation_message(activity)}, :method => :delete, :class => 'postOptionLink' if User.current.allowed_to?(:delete_issues, activity.project) %> + <% elsif defined?(user_id) %> + <%= link_to l(:button_delete), issue_path(activity.id, :page_classify => "user_page", :page_id => user_id), :data => {:confirm => issues_destroy_confirmation_message(activity)}, :method => :delete, :class => 'postOptionLink' if User.current.allowed_to?(:delete_issues, activity.project) %> + <% end %> +
        • +
        • + <%= link_to l(:button_copy), project_copy_issue_path(activity.project, activity), :class => 'postOptionLink' if User.current.allowed_to?(:add_issues, activity.project) %> +
        • +
      -
    • -
    -
+ + <% end %>
<% case activity.tracker_id %> <% when 1%> diff --git a/app/views/users/_project_message.html.erb b/app/views/users/_project_message.html.erb index f82dc35e7..51f29be83 100644 --- a/app/views/users/_project_message.html.erb +++ b/app/views/users/_project_message.html.erb @@ -49,33 +49,35 @@
<%= render :partial=>"attachments/activity_attach", :locals=>{:activity => activity} %>
- +
+ <% end %>
diff --git a/app/views/users/_project_news.html.erb b/app/views/users/_project_news.html.erb index 43b22b193..1e56b7555 100644 --- a/app/views/users/_project_news.html.erb +++ b/app/views/users/_project_news.html.erb @@ -32,31 +32,33 @@
<%= render :partial=>"attachments/activity_attach", :locals=>{:activity => activity} %>
-
-
    -
  • - <% if User.current.logged? %> -
      -
    • <%= link_to("发送", 'javascript:void(0)',:class => "postOptionLink",:onclick=>"show_send('#{activity.id}',#{User.current.id},'news')") %>
    • -
    • - <%= link_to( - l(:button_edit), - {:action => 'edit', :id => activity}, - :class => 'postOptionLink' - ) if activity.author == User.current %> -
    • -
    • - <%= delete_link( - news_path(activity), - :data => {:confirm => l(:text_are_you_sure)}, - :class => 'postOptionLink' - ) if activity.author == User.current %> -
    • -
    - <% end %> -
  • -
-
+ <% if User.current.logged? %> +
+
    +
  • + <% if User.current.logged? %> +
      +
    • <%= link_to("发送", 'javascript:void(0)',:class => "postOptionLink",:onclick=>"show_send('#{activity.id}',#{User.current.id},'news')") %>
    • +
    • + <%= link_to( + l(:button_edit), + {:action => 'edit', :id => activity}, + :class => 'postOptionLink' + ) if activity.author == User.current %> +
    • +
    • + <%= delete_link( + news_path(activity), + :data => {:confirm => l(:text_are_you_sure)}, + :class => 'postOptionLink' + ) if activity.author == User.current %> +
    • +
    + <% end %> +
  • +
+
+ <% end %>
From 7d68df79a02d04f0dee32d5bb4ec804b39b499fb Mon Sep 17 00:00:00 2001 From: huang Date: Fri, 17 Jun 2016 14:44:12 +0800 Subject: [PATCH 015/216] =?UTF-8?q?=E7=BB=84=E7=BB=87=E5=90=88=E5=B9=B6?= =?UTF-8?q?=E5=87=8C=E5=BD=AC=E4=BB=A3=E7=A0=81500=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/organizations/_org_custom_left1.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/organizations/_org_custom_left1.html.erb b/app/views/organizations/_org_custom_left1.html.erb index 7661b64d0..ee88f3315 100644 --- a/app/views/organizations/_org_custom_left1.html.erb +++ b/app/views/organizations/_org_custom_left1.html.erb @@ -25,7 +25,7 @@ <% title = message.parent_id.nil? ? message.subject : message.parent.subject %> <% if message.board.org_subfield_id %>
  • - <%= link_to document.title, board_message_url_in_org(message.board.id,message.id), class: 'por_hot_title link-black', :target => "_blank", :title => title %> + <%= link_to title, board_message_url_in_org(message.board.id,message.id), class: 'por_hot_title link-black', :target => "_blank", :title => title %>

    <%= time_from_now(message.created_on) %> <%= link_to message.author.show_name, user_path(message.author), :class => "por_hot_name link-blue", :target => "_blank" %>

    @@ -33,7 +33,7 @@
  • <% else %>
  • - <%= link_to document.title, board_message_path(message.board.id,message.id), class: 'por_hot_title link-black', :target => "_blank", :title => title %> + <%= link_to title, board_message_path(message.board.id,message.id), class: 'por_hot_title link-black', :target => "_blank", :title => title %>

    <%= time_from_now(message.created_on) %> <%= link_to message.author.show_name, user_path(message.author), :class => "por_hot_name link-blue", :target => "_blank" %>

    From eb3694dbe6bab546527507e6cf3145220ec65ffe Mon Sep 17 00:00:00 2001 From: cxt Date: Fri, 17 Jun 2016 14:45:07 +0800 Subject: [PATCH 016/216] =?UTF-8?q?=E6=B6=88=E6=81=AF=E6=8A=A5500?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 6 +++--- app/views/users/_user_message_course.html.erb | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index ca63f496c..87c7d8f54 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -132,7 +132,7 @@ class UsersController < ApplicationController # 未读的消息存放在数组 mess = message_all.message if (message_all.message_type != "SystemMessage"&& !mess.nil? && (mess.viewed == 0 || !mess.viewed)) || (message_all.message_type == "SystemMessage"&& !mess.nil? && mess.created_at > onclick_time) - unless (message_all.message_type == 'CourseMessage' && mess && mess.course.is_delete == 1) + unless (message_all.message_type == 'CourseMessage' && mess && mess.course && mess.course.is_delete == 1) @message_alls << mess end break if @message_alls.length == 5 @@ -166,7 +166,7 @@ class UsersController < ApplicationController messages = MessageAll.where("(user_id =? and message_type !=?) or message_type =?" ,@user.id, "SystemMessage", "SystemMessage").includes(:message).order("created_at desc") messages.each do |message_all| mess = message_all.message - unless (message_all.message_type == 'CourseMessage' && mess && mess.course.is_delete == 1) + unless (message_all.message_type == 'CourseMessage' && mess && mess.course && mess.course.is_delete == 1) @message_alls << mess end end @@ -177,7 +177,7 @@ class UsersController < ApplicationController # 在点击或者刷新消息列表后未读的消息存放在数组 mess = message_all.message if message_all.message_type != "SystemMessage"&& !mess.nil? && (mess.viewed == 0 || !mess.viewed) - unless (message_all.message_type == 'CourseMessage' && mess && mess.course.is_delete == 1) + unless (message_all.message_type == 'CourseMessage' && mess && mess.course && mess.course.is_delete == 1) @message_alls << mess end end diff --git a/app/views/users/_user_message_course.html.erb b/app/views/users/_user_message_course.html.erb index 0c18dbcc3..3e83b0f7a 100644 --- a/app/views/users/_user_message_course.html.erb +++ b/app/views/users/_user_message_course.html.erb @@ -326,7 +326,7 @@ <% end %> - <% if ma.course_message_type == "StudentWorksScore" %> + <% if ma.course_message_type == "StudentWorksScore" && ma.course_message %>
    • <% if ma.course_message.reviewer_role == 3 %> From 994ce342d71abe8efed5ef605c380ab2775603a8 Mon Sep 17 00:00:00 2001 From: txz Date: Fri, 17 Jun 2016 15:35:58 +0800 Subject: [PATCH 017/216] =?UTF-8?q?=E5=BE=AE=E4=BF=A1ul=E5=B8=83=E5=B1=80?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/stylesheets/weui/weixin.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/public/stylesheets/weui/weixin.css b/public/stylesheets/weui/weixin.css index 514cb92aa..9954ac755 100644 --- a/public/stylesheets/weui/weixin.css +++ b/public/stylesheets/weui/weixin.css @@ -3,7 +3,8 @@ /*基本样式*/ body,table,input,textarea,select,button { font-family: "微软雅黑","宋体";} -body, h1,h2,h3,h4,h5,p,pre {padding:0px; margin:0px;} +body, h1,h2,h3,h4,h5,p,pre,ul {padding:0px; margin:0px;} +ul li {margin-left:40px;} img {max-width:100%;} blockquote {border:1px solid #d4d4d4; padding: 0.6em; margin-left: 1.4em; margin-right: 0.4em; border-radius: 4px; font-family: "Microsoft YaHei"; background-size: 100% 100%; margin-top:5px;} .text-control {word-break:normal; word-wrap:break-word;} @@ -88,7 +89,7 @@ a.underline {text-decoration:underline;} .reply-icon {background:url(/images/wechat/icon_list.gif) -150px -155px no-repeat; width:20px; height:20px; display:inline-block; vertical-align:middle;} .praise-icon {background:url(/images/wechat/icon_list.gif) -36px -88px no-repeat; width:20px; height:20px; display:inline-block; vertical-align:middle;} .praised-icon {background:url(/images/wechat/icon_list.gif) -152px -86px no-repeat; width:20px; height:20px; display:inline-block; vertical-align:middle;} -.num-block {width:12px; text-align:center; display:inline-block; vertical-align:top;} +.num-block {display:inline-block; vertical-align:top;} /* loading 弹框*/ .loading-bg {position:fixed; width:100%; height:100%; left:0; top:0; z-index:99; background:rgba(206, 206, 206, 0.3); overflow:hidden;} From acf17d625218eb8482a99b6cd93c02b0d95534c4 Mon Sep 17 00:00:00 2001 From: txz Date: Fri, 17 Jun 2016 15:45:29 +0800 Subject: [PATCH 018/216] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E9=93=BE=E6=8E=A5=E6=B7=BB=E5=8A=A0=E9=A2=9C?= =?UTF-8?q?=E8=89=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/assets/wechat/blog_detail.html | 2 +- public/assets/wechat/course_discussion.html | 2 +- public/assets/wechat/course_notice.html | 2 +- public/assets/wechat/homework_detail.html | 2 +- public/assets/wechat/issue_detail.html | 2 +- public/assets/wechat/jour_message_detail.html | 2 +- public/assets/wechat/project_discussion.html | 2 +- public/stylesheets/weui/weixin.css | 1 + 8 files changed, 8 insertions(+), 7 deletions(-) diff --git a/public/assets/wechat/blog_detail.html b/public/assets/wechat/blog_detail.html index 509e0171a..ee651eadf 100644 --- a/public/assets/wechat/blog_detail.html +++ b/public/assets/wechat/blog_detail.html @@ -8,7 +8,7 @@
      {{blog.title}}
      {{blog.user.realname}}发表博客
      -
      +
      {{blog.created_at}}
      diff --git a/public/assets/wechat/course_discussion.html b/public/assets/wechat/course_discussion.html index 2e7ed3151..aa1b05fd9 100644 --- a/public/assets/wechat/course_discussion.html +++ b/public/assets/wechat/course_discussion.html @@ -15,7 +15,7 @@
  • 序号  来   源: {{discussion.course_project_name}}  |  课程问答区
    -
    +
    {{discussion.created_on}}
    diff --git a/public/assets/wechat/course_notice.html b/public/assets/wechat/course_notice.html index cca135681..bbf08e03d 100644 --- a/public/assets/wechat/course_notice.html +++ b/public/assets/wechat/course_notice.html @@ -14,7 +14,7 @@
    来   源: {{news.course_name}}  |  课程通知
    -
    +
    {{news.created_on}}
    diff --git a/public/assets/wechat/homework_detail.html b/public/assets/wechat/homework_detail.html index 4de1c7b37..c22e89021 100644 --- a/public/assets/wechat/homework_detail.html +++ b/public/assets/wechat/homework_detail.html @@ -24,7 +24,7 @@ -
    +
    迟交扣分:{{homework.late_penalty}}分
    缺评扣分:{{homework.absence_penalty}}分/作品
    匿评开启时间:{{homework.evaluation_start}}
    diff --git a/public/assets/wechat/issue_detail.html b/public/assets/wechat/issue_detail.html index 1d7f9a536..70b9286dd 100644 --- a/public/assets/wechat/issue_detail.html +++ b/public/assets/wechat/issue_detail.html @@ -14,7 +14,7 @@ 来   源: {{issue.project_name}}  |  项目问题 -
    +
    状   态:{{issue.issue_status}}
    优先级:{{issue.issue_priority}}
    指派给:{{issue.issue_assigned_to}}
    diff --git a/public/assets/wechat/jour_message_detail.html b/public/assets/wechat/jour_message_detail.html index dc6b1409f..a1b79379f 100644 --- a/public/assets/wechat/jour_message_detail.html +++ b/public/assets/wechat/jour_message_detail.html @@ -7,7 +7,7 @@
    {{message.user.realname}}给您留言了
    {{message.created_on}}
    -
    +
    diff --git a/public/assets/wechat/project_discussion.html b/public/assets/wechat/project_discussion.html index 4831e1521..7bc4b0005 100644 --- a/public/assets/wechat/project_discussion.html +++ b/public/assets/wechat/project_discussion.html @@ -14,7 +14,7 @@ 来   源: {{discussion.course_project_name}}  |  项目讨论区 -
    +
    {{discussion.created_on}}
    diff --git a/public/stylesheets/weui/weixin.css b/public/stylesheets/weui/weixin.css index 9954ac755..d664be450 100644 --- a/public/stylesheets/weui/weixin.css +++ b/public/stylesheets/weui/weixin.css @@ -68,6 +68,7 @@ a.underline {text-decoration:underline;} .fr {float:right;} .cl {clear:both; overflow:hidden;} .post-content {width:100%; font-size:13px; line-height:18px; height:90px; overflow:hidden; word-break:break-all; word-wrap:break-word;} +.post-all-content a {color:#136ec2;} .post-interactive {width:100%; height:35px; line-height:35px; vertical-align:middle; border-top:1px solid #e6e6e6; background-color:#f8f9fb;} .post-interactive-column, .post-interactive-reply, From 18df93ba9fcfed58d91109fa8e68f6d2fe6b381a Mon Sep 17 00:00:00 2001 From: txz Date: Fri, 17 Jun 2016 16:16:24 +0800 Subject: [PATCH 019/216] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E7=95=8C=E9=9D=A2=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/assets/wechat/activities.html | 126 +++++++++++++++------------ public/stylesheets/weui/weixin.css | 2 + 2 files changed, 72 insertions(+), 56 deletions(-) diff --git a/public/assets/wechat/activities.html b/public/assets/wechat/activities.html index 476ae3690..54a00c1f7 100644 --- a/public/assets/wechat/activities.html +++ b/public/assets/wechat/activities.html @@ -27,16 +27,18 @@
    - 普通作业 - 编程作业 - 分组作业 - {{act.latest_update}} - 回复 - {{act.reply_count}} -
    -
    {{act.praise_count}}
    -
    {{act.praise_count}}
    -
    +
    + 普通作业 + 编程作业 + 分组作业 + {{act.latest_update}} + 回复 + {{act.reply_count}} +
    +
    {{act.praise_count}}
    +
    {{act.praise_count}}
    +
    +
    @@ -58,14 +60,16 @@
    - {{act.activity_type_name}} - {{act.latest_update}} - 回复 - {{act.reply_count}} -
    -
    {{act.praise_count}}
    -
    {{act.praise_count}}
    -
    +
    + {{act.activity_type_name}} + {{act.latest_update}} + 回复 + {{act.reply_count}} +
    +
    {{act.praise_count}}
    +
    {{act.praise_count}}
    +
    +
    @@ -87,14 +91,16 @@
    - {{act.activity_type_name}} - {{act.latest_update}} - 回复 - {{act.reply_count}} -
    -
    {{act.praise_count}}
    -
    {{act.praise_count}}
    -
    +
    + {{act.activity_type_name}} + {{act.latest_update}} + 回复 + {{act.reply_count}} +
    +
    {{act.praise_count}}
    +
    {{act.praise_count}}
    +
    +
    @@ -134,14 +140,16 @@
    - {{act.activity_type_name}} - {{act.latest_update}} - 回复 - {{act.reply_count}} -
    -
    {{act.praise_count}}
    -
    {{act.praise_count}}
    -
    +
    + {{act.activity_type_name}} + {{act.latest_update}} + 回复 + {{act.reply_count}} +
    +
    {{act.praise_count}}
    +
    {{act.praise_count}}
    +
    +
    @@ -164,14 +172,16 @@
    - {{act.activity_type_name}} - {{act.latest_update}} - 回复 - {{act.reply_count}} -
    -
    {{act.praise_count}}
    -
    {{act.praise_count}}
    -
    +
    + {{act.activity_type_name}} + {{act.latest_update}} + 回复 + {{act.reply_count}} +
    +
    {{act.praise_count}}
    +
    {{act.praise_count}}
    +
    +
    @@ -208,13 +218,15 @@
    - {{act.latest_update}} - 回复 - {{act.reply_count}} -
    -
    {{act.praise_count}}
    -
    {{act.praise_count}}
    -
    +
    + {{act.latest_update}} + 回复 + {{act.reply_count}} +
    +
    {{act.praise_count}}
    +
    {{act.praise_count}}
    +
    +
    @@ -237,13 +249,15 @@
    - {{act.latest_update}} - 回复 - {{act.reply_count}} -
    -
    {{act.praise_count}}
    -
    {{act.praise_count}}
    -
    +
    + {{act.latest_update}} + 回复 + {{act.reply_count}} +
    +
    {{act.praise_count}}
    +
    {{act.praise_count}}
    +
    +
    diff --git a/public/stylesheets/weui/weixin.css b/public/stylesheets/weui/weixin.css index d664be450..3fd9acd37 100644 --- a/public/stylesheets/weui/weixin.css +++ b/public/stylesheets/weui/weixin.css @@ -13,6 +13,7 @@ blockquote {border:1px solid #d4d4d4; padding: 0.6em; margin-left: 1.4em; margin .f15 {font-size:15px;} .fb {font-weight:bold;} .mt2 {margin-top:2px;} +.mt3 {margin-top:3px;} .mt4 {margin-top:4px;} .mt5 {margin-top:5px;} .mt10 {margin-top:10px;} @@ -91,6 +92,7 @@ a.underline {text-decoration:underline;} .praise-icon {background:url(/images/wechat/icon_list.gif) -36px -88px no-repeat; width:20px; height:20px; display:inline-block; vertical-align:middle;} .praised-icon {background:url(/images/wechat/icon_list.gif) -152px -86px no-repeat; width:20px; height:20px; display:inline-block; vertical-align:middle;} .num-block {display:inline-block; vertical-align:top;} +.post-op-banner {height:20px; line-height:20px; vertical-align:middle;} /* loading 弹框*/ .loading-bg {position:fixed; width:100%; height:100%; left:0; top:0; z-index:99; background:rgba(206, 206, 206, 0.3); overflow:hidden;} From 3492f65a9be91d795f3a97626fd38fea7fa15ee3 Mon Sep 17 00:00:00 2001 From: cxt Date: Fri, 17 Jun 2016 16:57:11 +0800 Subject: [PATCH 020/216] =?UTF-8?q?=E7=BC=96=E7=A8=8B=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E5=8C=BF=E8=AF=84=E6=97=B6=E7=9A=84=E5=88=97=E8=A1=A8=E5=AE=BD?= =?UTF-8?q?=E5=BA=A6=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/student_work/_evaluation_title.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/student_work/_evaluation_title.html.erb b/app/views/student_work/_evaluation_title.html.erb index 6a89b51b1..419407eae 100644 --- a/app/views/student_work/_evaluation_title.html.erb +++ b/app/views/student_work/_evaluation_title.html.erb @@ -7,7 +7,7 @@ 序号   <% if @homework.homework_type != 3 %> - 作品名称 + 作品名称 姓名 From 2464586ed207df76f58f47c7094285e0d644591f Mon Sep 17 00:00:00 2001 From: huang Date: Fri, 17 Jun 2016 17:20:17 +0800 Subject: [PATCH 021/216] =?UTF-8?q?=E7=BB=84=E7=BB=87=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/stylesheets/org_custom.css | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/public/stylesheets/org_custom.css b/public/stylesheets/org_custom.css index 95df98738..5ff340272 100644 --- a/public/stylesheets/org_custom.css +++ b/public/stylesheets/org_custom.css @@ -25,31 +25,31 @@ a.por_edit_index{ position:absolute; font-size:14px; right:5px; top:15px;} .por_h2_index{ font-size:18px; font-weight:normal; color:#3b94d6; width:100%; border-bottom:1px solid #e8e5e5; height:40px; line-height:40px;} a.por_more_index{ font-size:12px; color:#999; } .por_hotbar_left li{ width:365px; padding:12px 5px 12px 0; border-bottom:1px dashed #e8e5e5;} -a.por_hot_title{ font-size:16px; display:block; font-weight:bold; width:365px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} -.por_hot_txt{ color:#666; line-height:20px;max-height:60px;overflow:hidden;text-overflow:ellipsis;} +a.por_hot_title{ font-size:16px; display:block; width:365px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;color: #02253f;} +.por_hot_txt{ color:#637379; line-height:20px;max-height:60px;overflow:hidden;text-overflow:ellipsis;} .por_time{ color:#999;} a.por_hot_name{color:#3b94d6;} .por_hotbar_right{ padding:5px 0 5px 10px; margin-top:15px; width:300px; } .por_hotbar_right img{ width:300px; height:246px;} -.por_hot_title_r{ font-size:16px; display:block; font-weight:bold; width:300px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} +.por_hot_title_r{ font-size:16px; display:block; width:300px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;color: #02253f;} .por_hot_txt_r{color:#666; line-height:20px;max-height:80px;overflow:hidden;text-overflow:ellipsis;} .por_course{ } .por_course_bar{ width:328px; margin:0 7px; padding:20px 0 0px;} -a.por_course_title{font-size:14px; margin-bottom:10px; display:block; font-weight:bold; width:328px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} +a.por_course_title{font-size:16px; margin-bottom:10px; display:block; width:328px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;color: #02253f;} .por_course_bar img{ width:140px; height:100px; } -.por_course_txt { width:180px; margin-left:5px;color:#666; line-height:20px;max-height:80px;overflow:hidden;text-overflow:ellipsis;} +.por_course_txt { width:180px; margin-left:5px;color:#637379; line-height:20px;max-height:80px;overflow:hidden;text-overflow:ellipsis;} .por_course_time{color:#3b94d6; margin-left:5px;} .por_post{ padding-bottom:5px;} -.por_post_left{ width:394px; margin-top:15px;} +.por_post_left{ width:385px; margin-top:15px; margin-right: 9px;} .por_post_leftbar img{ width:377px; height:163px;} .por_post_leftbar { border-bottom:1px dashed #e8e5e5; padding-bottom:5px; margin-bottom:10px;} -a.por_post_title{font-size:18px; display:block; width:377px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} -.por_post_txt{color:#666; line-height:20px;max-height:40px;overflow:hidden;text-overflow:ellipsis; } +a.por_post_title{font-size:18px; display:block; width:377px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis; color: #02253f;} +.por_post_txt{color:#637379; line-height:20px;max-height:40px;overflow:hidden;text-overflow:ellipsis; margin-bottom: 5px;} .post_icons_grey{ width:4px; height:4px; margin:10px 5px 0 0; background-color:#b3b3b3; display:block; line-height:20px;} .por_post_list li{ height:35px;} .por_post_list li a{ font-size:14px; } -a.por_hidden_w390{ display:block; width:390px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} -a.por_hidden_w270{ display:block; width:280px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} +a.por_hidden_w390{ display:block; width:390px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis; color: #02253f;} +a.por_hidden_w270{ display:block; width:280px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis; color: #02253f;} .por_post_right{ width:280px; border-left:1px solid #e8e5e5; margin-top:15px; padding-left:10px;} .por_news_list li{ padding:15px 0; border-bottom:1px dashed #e8e5e5;} .por_users_img{ width:40px; height:40px; -webkit-border-radius:50px;-moz-border-radius:50px;-o-border-radius:50px;border-radius:50px;} @@ -57,11 +57,11 @@ a.por_hidden_w270{ display:block; width:280px; overflow:hidden; white-space: now .por_news_p{ line-height:20px;max-height:40px;min-width:240px;overflow:hidden;text-overflow:ellipsis; } a.por_zan{ background:url(../images/org_custom/icons_por.png) 0 -41px no-repeat; height:15px; width:20px; display:block; padding-left:15px; line-height:20px; color:#999;} a.por_zan:hover{background:url(../images/org_custom/icons_por.png) -34px -42px no-repeat; color:#3b94d6; } -.por_hidden_w205{ font-size:14px; display:block; width:205px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} +.por_hidden_w205{ font-size:14px; display:block; width:205px; overflow:hidden; white-space: nowrap; text-overflow:ellipsis; color: #02253f;} .por_projects{ padding-bottom:10px; margin-top:10px;} .por_projects ul li{ padding:5px 0;} .por_projects ul{ margin-top:5px;} -.por_project_p{ line-height:20px;max-height:40px;overflow:hidden;text-overflow:ellipsis; margin-top:5px; margin-left:10px; color:#666; } +.por_project_p{ line-height:20px;max-height:40px;overflow:hidden;text-overflow:ellipsis; margin-top:5px; margin-left:10px; color:#637379; margin-bottom: 5px;} .por_project_li{border-bottom:1px dashed #ccc; padding-bottom:10px; margin-bottom:5px;} .por_time a{ color:#3b94d6;} .por_teachers{ margin-top:20px; } @@ -78,7 +78,7 @@ a.por_more_teacher{ font-size:12px; } .por_teachers_li{ margin-top:10px;} .por_teachers_li li{ padding:10px 0;} .por_teachers_img{ width:60px; height:60px; -webkit-border-radius:50px;-moz-border-radius:50px;-o-border-radius:50px;border-radius:50px;} -a.por_teachers_name{ display:block; width:75px; font-size:18px;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} +a.por_teachers_name{ display:block; width:75px; font-size:18px;overflow:hidden; white-space: nowrap; text-overflow:ellipsis; color: #02253f;} .por_teachers_p{ font-size:14px; color:#999; width:150px;overflow:hidden; white-space: nowrap; text-overflow:ellipsis;} .por_teachers_span{ color:#999;} .por_teachers_span a{ margin:0 5px; color:#999;} From 6af0bf7b8396d6496bbc7276ce2398f78ab220af Mon Sep 17 00:00:00 2001 From: huang Date: Fri, 17 Jun 2016 17:35:46 +0800 Subject: [PATCH 022/216] =?UTF-8?q?=E7=BB=84=E7=BB=87=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../organizations/_org_custom_left1.html.erb | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/app/views/organizations/_org_custom_left1.html.erb b/app/views/organizations/_org_custom_left1.html.erb index ee88f3315..8632dd57a 100644 --- a/app/views/organizations/_org_custom_left1.html.erb +++ b/app/views/organizations/_org_custom_left1.html.erb @@ -66,7 +66,7 @@ <% else %> <%= link_to image_tag("/files/uploads/image#{get_image_path_from_content(document.content)}", :width => "299", :height => "246"), org_document_comment_path(:id => document.id, :organization_id => document.organization.id), :target => "_blank" %> <% end %> -
    +
    <%= link_to document.title, org_document_comment_path(:id => document.id, :organization_id => document.organization.id), :class => 'por_hot_title_r link-black', :target => "_blank", :title => document.title %>

    <%= time_from_now(document.created_at) %><%= link_to document.creator.show_name, user_path(document.creator), :class => "por_hot_name link-blue", :target => "_blank" %>

    <%=render :partial =>"organizations/organization_content_extension", :locals => {:user_activity_id => document.id, :content=> document.content, :maxheight => 80, :maxwordsnum => 90, :maxwidth => 0, :cl => "por_hot_txt_r"} %> @@ -85,9 +85,11 @@ <% else %> <%= link_to image_tag("/files/uploads/image#{get_image_path_from_content(content)}", :width => "299", :height => "246"), board_message_url_in_org(message.board.id, message.id), :target => "_blank" %> <% end %> - <%= link_to title, board_message_url_in_org(message.board.id, message.id), :class => 'por_hot_title_r link-black', :target => "_blank", :title => title %> -

    <%= time_from_now(message.created_on) %><%= link_to message.author.show_name, user_path(message.author), :class => "por_hot_name link-blue", :target => "_blank" %>

    - <%=render :partial =>"organizations/organization_content_extension", :locals => {:user_activity_id => message.id, :content=> content, :maxheight => 80, :maxwordsnum => 90, :maxwidth => 0, :cl => "por_hot_txt_r"} %> +
    + <%= link_to title, board_message_url_in_org(message.board.id, message.id), :class => 'por_hot_title_r link-black', :target => "_blank", :title => title %> +

    <%= time_from_now(message.created_on) %><%= link_to message.author.show_name, user_path(message.author), :class => "por_hot_name link-blue", :target => "_blank" %>

    + <%=render :partial =>"organizations/organization_content_extension", :locals => {:user_activity_id => message.id, :content=> content, :maxheight => 80, :maxwordsnum => 90, :maxwidth => 0, :cl => "por_hot_txt_r"} %> +
    <% else %>
    @@ -96,9 +98,11 @@ <% else %> <%= link_to image_tag("/files/uploads/image#{get_image_path_from_content(content)}", :width => "299", :height => "246"), board_message_path(message.board.id, message.id), :target => "_blank" %> <% end %> - <%= link_to title, board_message_path(message.board.id, message.id), :class => 'por_hot_title_r link-black', :target => "_blank", :title => title %> -

    <%= time_from_now(message.created_on) %><%= link_to message.author.show_name, user_path(message.author), :class => "por_hot_name link-blue", :target => "_blank" %>

    - <%=render :partial =>"organizations/organization_content_extension", :locals => {:user_activity_id => message.id, :content=> content, :maxheight => 80, :maxwordsnum => 90, :maxwidth => 0, :cl => "por_hot_txt_r"} %> +
    + <%= link_to title, board_message_path(message.board.id, message.id), :class => 'por_hot_title_r link-black', :target => "_blank", :title => title %> +

    <%= time_from_now(message.created_on) %><%= link_to message.author.show_name, user_path(message.author), :class => "por_hot_name link-blue", :target => "_blank" %>

    + <%=render :partial =>"organizations/organization_content_extension", :locals => {:user_activity_id => message.id, :content=> content, :maxheight => 80, :maxwordsnum => 90, :maxwidth => 0, :cl => "por_hot_txt_r"} %> +
    <% end %> <% end %> @@ -111,9 +115,11 @@ <% else %> <%= link_to image_tag("/files/uploads/image#{path}", :width => "299", :height => "246"), news_path(news), :target => "_blank" %> <% end %> - <%= link_to news.title, news_path(news), :class => 'por_hot_title_r link-black', :target => "_blank", :title => news.title %> -

    <%= time_from_now(news.created_on) %><%= link_to news.author.show_name, user_path(news.author), :class => "por_hot_name link-blue", :target => "_blank" %>

    - <%=render :partial =>"organizations/organization_content_extension", :locals => {:user_activity_id => news.id, :content=> news.description, :maxheight => 80, :maxwordsnum => 90, :maxwidth => 0, :cl => "por_hot_txt_r"} %> +
    + <%= link_to news.title, news_path(news), :class => 'por_hot_title_r link-black', :target => "_blank", :title => news.title %> +

    <%= time_from_now(news.created_on) %><%= link_to news.author.show_name, user_path(news.author), :class => "por_hot_name link-blue", :target => "_blank" %>

    + <%=render :partial =>"organizations/organization_content_extension", :locals => {:user_activity_id => news.id, :content=> news.description, :maxheight => 80, :maxwordsnum => 90, :maxwidth => 0, :cl => "por_hot_txt_r"} %> +
    <% end %> <% end %> @@ -121,4 +127,8 @@ <%# end %>
    - \ No newline at end of file + + + \ No newline at end of file From fce93de29682b60ebf392ae5ebc6e204b001e84c Mon Sep 17 00:00:00 2001 From: huang Date: Fri, 17 Jun 2016 18:03:58 +0800 Subject: [PATCH 023/216] =?UTF-8?q?500=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/organizations/_org_custom_left3.html.erb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/views/organizations/_org_custom_left3.html.erb b/app/views/organizations/_org_custom_left3.html.erb index fb2b83dd2..ff412d869 100644 --- a/app/views/organizations/_org_custom_left3.html.erb +++ b/app/views/organizations/_org_custom_left3.html.erb @@ -71,7 +71,7 @@ <% end %> <% end %> - <% unless acts[1..4].nil? %> + <% unless acts[1..4].blank? %> <% acts[1..4].each do |activity| %> <% if activity.container_type == 'Organization' && activity.org_act_type == 'OrgDocumentComment' %> <% document = activity.org_act %> @@ -110,10 +110,10 @@ <% end %> <% end %> - <% unless acts[5..16].nil? %> + <% unless acts[5..16].blank? %>
      - <% acts[6..16].each do |activity| %> + <% acts[5..16].each do |activity| %> <% if activity.container_type == 'Organization' && activity.org_act_type == 'OrgDocumentComment' %> <% document = activity.org_act %>
    • <%= link_to "#{document.title}".html_safe, org_document_comment_path(:id => document.id, :organization_id => document.organization.id), class: 'por_hidden_w270 link-black', :target => "_blank" %>
    • From 98c6548e3933cc92302182f7f079d9a9b1497ebb Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Fri, 17 Jun 2016 18:18:03 +0800 Subject: [PATCH 024/216] =?UTF-8?q?=E9=87=8D=E5=86=99=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=92=8C=E6=B3=A8=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/mobile/apis/users.rb | 11 +++ app/controllers/wechats_controller.rb | 4 +- app/models/course.rb | 5 - public/assets/wechat/app.html | 8 +- public/assets/wechat/login.html | 25 +++++ public/assets/wechat/reg.html | 43 +++++++++ public/assets/wechat/templates/alert.html | 12 +++ public/images/wechat/QR-code.jpg | Bin 0 -> 29738 bytes public/images/wechat/arrow.png | Bin 0 -> 21159 bytes public/images/wechat/checked.png | Bin 0 -> 1092 bytes public/images/wechat/dot.png | Bin 0 -> 27646 bytes public/images/wechat/female.jpg | Bin 0 -> 3783 bytes public/images/wechat/female.png | Bin 0 -> 22752 bytes public/images/wechat/male.jpg | Bin 0 -> 4136 bytes public/images/wechat/male.png | Bin 0 -> 23849 bytes public/images/wechat/minus.png | Bin 0 -> 23318 bytes public/images/wechat/plus.png | Bin 0 -> 23367 bytes public/images/wechat/post-avatar.jpg | Bin 0 -> 2756 bytes public/images/wechat/search.png | Bin 0 -> 1550 bytes public/images/wechat/setting.png | Bin 0 -> 23839 bytes public/images/wechat/tr-like.png | Bin 0 -> 2027 bytes public/images/wechat/tr-reply.png | Bin 0 -> 1908 bytes public/javascripts/wechat/app.js | 7 ++ .../javascripts/wechat/controllers/login.js | 54 +++++++++++ public/javascripts/wechat/controllers/reg.js | 42 +++++++++ public/javascripts/wechat/directives/alert.js | 16 ++++ .../wechat/directives/form_validate.js | 10 ++ public/javascripts/wechat/others/factory.js | 57 ++++++++++- public/javascripts/wechat/others/routes.js | 12 ++- public/stylesheets/weui/weixin.css | 89 +++++++++++++++++- 30 files changed, 378 insertions(+), 17 deletions(-) create mode 100644 public/assets/wechat/login.html create mode 100644 public/assets/wechat/reg.html create mode 100644 public/assets/wechat/templates/alert.html create mode 100644 public/images/wechat/QR-code.jpg create mode 100644 public/images/wechat/arrow.png create mode 100644 public/images/wechat/checked.png create mode 100644 public/images/wechat/dot.png create mode 100644 public/images/wechat/female.jpg create mode 100644 public/images/wechat/female.png create mode 100644 public/images/wechat/male.jpg create mode 100644 public/images/wechat/male.png create mode 100644 public/images/wechat/minus.png create mode 100644 public/images/wechat/plus.png create mode 100644 public/images/wechat/post-avatar.jpg create mode 100644 public/images/wechat/search.png create mode 100644 public/images/wechat/setting.png create mode 100644 public/images/wechat/tr-like.png create mode 100644 public/images/wechat/tr-reply.png create mode 100644 public/javascripts/wechat/controllers/login.js create mode 100644 public/javascripts/wechat/controllers/reg.js create mode 100644 public/javascripts/wechat/directives/alert.js create mode 100644 public/javascripts/wechat/directives/form_validate.js diff --git a/app/api/mobile/apis/users.rb b/app/api/mobile/apis/users.rb index 6ce3cacbb..7800382ad 100644 --- a/app/api/mobile/apis/users.rb +++ b/app/api/mobile/apis/users.rb @@ -4,6 +4,17 @@ module Mobile class Users < Grape::API resource :users do + + desc "绑定微信用户" + params do + requires :login, type: String, desc: 'username' + requires :mail, type: String, desc: 'mail' + requires :password, type: String, desc: 'password' + end + post '/bindwx' do + + end + desc "注册用户" params do requires :login, type: String, desc: 'username' diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index 169a33fce..887587a5f 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -145,7 +145,7 @@ class WechatsController < ActionController::Base 您还未绑定确实的用户,请先绑定,谢谢!" } } request.reply.news(news) do |article, n, index| # article is return object - url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{login_wechat_url}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect" + url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{root_url+'/assets/wechat/app.html#login'}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect" pic_url = "#{Setting.protocol}://#{Setting.host_name}/images/weixin_pic.jpg" article.item title: "#{n[:title]}", description: n[:content], @@ -175,7 +175,7 @@ class WechatsController < ActionController::Base code = params[:code] || session[:wechat_code] openid = get_openid_from_code(code) - raise "无法获取到openid" unless openid + raise "无法获取到openid,请在微信中打开本页面" unless openid raise "此微信号已绑定用户, 不能重复绑定" if user_binded?(openid) user, last_login_on = User.try_to_login(params[:username], params[:password]) diff --git a/app/models/course.rb b/app/models/course.rb index d379b24d3..c9ef010e6 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -465,11 +465,6 @@ class Course < ActiveRecord::Base code end - def - - end - - end diff --git a/public/assets/wechat/app.html b/public/assets/wechat/app.html index cabd224c4..6965d24f3 100644 --- a/public/assets/wechat/app.html +++ b/public/assets/wechat/app.html @@ -10,6 +10,7 @@ + @@ -17,8 +18,9 @@
      + @@ -30,8 +32,12 @@ + + + + diff --git a/public/assets/wechat/login.html b/public/assets/wechat/login.html new file mode 100644 index 000000000..d34d0054c --- /dev/null +++ b/public/assets/wechat/login.html @@ -0,0 +1,25 @@ +
      +
      + +
      +
      绑定注册
      + + + + + +
      +
      + + \ No newline at end of file diff --git a/public/assets/wechat/reg.html b/public/assets/wechat/reg.html new file mode 100644 index 000000000..9184fd0ed --- /dev/null +++ b/public/assets/wechat/reg.html @@ -0,0 +1,43 @@ +
      +
      +
      注册登录
      + + + + + + + + + +
      +
      + + \ No newline at end of file diff --git a/public/assets/wechat/templates/alert.html b/public/assets/wechat/templates/alert.html new file mode 100644 index 000000000..b59a1b87f --- /dev/null +++ b/public/assets/wechat/templates/alert.html @@ -0,0 +1,12 @@ + +
      +
      +
      +
      {{title}}
      +
      {{message}}
      +
      + 确定 +
      +
      +
      + \ No newline at end of file diff --git a/public/images/wechat/QR-code.jpg b/public/images/wechat/QR-code.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ba2a9e6a3ed11d223342f0093c71b845735700d3 GIT binary patch literal 29738 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 T6OyWr!$CfJ)GO$>f9C!db}~`> literal 0 HcmV?d00001 diff --git a/public/images/wechat/arrow.png b/public/images/wechat/arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..f9f9b18c5bf500b5b1d95f33e0c4404217148aad GIT binary patch literal 21159 zcmeI42UHW=y2l3)1QZJ@C|Dw3HzYIZ5h5g14=5s1tb}9&fi#m)RRjxqY+yyCh!s%u zSWu87MNv^fnjP$d90ddmBGxw{Afw`m_uTv5TX(G_i{zWVzwf{I{_Qe*4{POjx9N@s z`X>4S02nws*|{U%S&Bbh9puycst$yF=}DY?WB|}-km64R*qJmG0Q6n?ES8&FfLJb; z1&AdWXBG=1k&1bI0So|P)ycC$y|=U(F&?zR{XLntTaLvGq5(7WOx;TZeD)0346s)Y zFtoX_YK^|<;2{H(oMxY2ena0WdClY0@j3psYuC(KH+vrS#i+Y!CznPvH#L2@_2Eo? zQvJuW@bdmq0}aP+db%eNpt-NIqTe1BJHzSx<-91(Ax;l_VFo-cIp?o^0RURG!owov zN2h+&_(Ke60+Jh+7KX)-zO2Y~8|wvNHUSUK4D0)7#JK~PEIlp_1}+T+j?Oy4)d#i$ zfFOJc(+oIh05raFW@rPqGq&6{25#>eo}mkD&;Sy~J6dSk{0aEZj&`4{S$Gae&9pJI z>{WO~Bg*F#E+GU3+w7`YDtPUjs_P5Wy}St zJ%NA+?ehsWdZ}~tDcFAhQaQ!}gn#TC;&ci=h$M`~cB!0Lq@-344 zxhA3oShUk7;c(&J6`vNdMIlGrH`bT*VuGT!dh^f4tCoG*IHB?}@z}h{L)O0Z{yoRd z%(XcDwEHHz(U-S9Hhi`WdO2$QC%rA920&)ajKb-sdY>#26h^+#&|KHgyD9{*iF}P+ zZ_;NIFuH@8fDNVW71i*Pd|%w?-eIsdZg5*yeQlD3i4pQ)QKMV*mM3 z+xG-jnq-Z%jykm`t@5|Og5|){wHrB6m0&;K`aA4->sQZ0 zQ$mKA7N)S9buBd4MGb1yU9fV%Il=O{I7e?6Z&v!4M)NGgTwO1{6)VAW+UnLJnT z-ind-@fGn^L4WmrR{w0po6x=nF$OD&o&3fR3mUd~SlZC+VYmdB1KQW(6E1n+Z$YLB z{yX~b5YP6W_;%uwA)BrkZliDW+!nd5{-DQf+3cw|!VmWGI5fNep#`2x4>-&|;r1j$ z@4C^U8yO>J|CvEPQsy4&9_v;=!#? z^QP2Ot6_4`4p+aq$J-lSLbN}ahTs;v%wow7@-lgwc*#!}UDfD!@z}!_+MT3nWuwas z$`)g_uv4+eZU!Fa9gaLqsg9`5ul8$_HW@WFR5u4pl5LVFC%4jt^tNEVTypNr+*P?X z!R5~x*EkK~&-7ZawDx;;uhOwq_-1db@$=@J&6T4lc%m*jZkPb1a#~8`IDZB0;OA7f ztbCL{up}UN)A@kCmCk#|<&1r?+W!eD%$UK;6c6{yB;JSb23fKF_)yKh^ZPE;=1;h~ zHE1UaxENf)NABd;soUcG%uiS~Ba z?QNMmJQ<$ho~@p@GM#VEYna?1yy+!yGxbXBn@CSAIhB4m@$mVOMB#(Mj|az2sG86^ zOH>Uuer(il+}WtpM0?AAJLawMZTX1O;f5n_PLWSpB9#Z1h6p5Q8umRR7G<2zD0=4Q zZ|c8Wmi(GzeBigZ62thAc;i{Zw6$rXT@fYQ>P%kbR-L@ox;OF9#Jh*@2(RBOwZ5?Q z&<9t`MAOUji>#Y%-?X%OKVDS&BsncH?cD3QdfbAL1wIQtOO}y|@&H1?x z^GX)`(izt9`?6Xp!Ie{YiZ2JJs}aD5p=n0@sOd`3yPhzpHhnYMEXcl{^t ztQ>MhH+je$)A#t&u`VNT4%`@1uKQp>r1(I)%d^r`x@#Uf3fAO|;txwOZeKch!bIqx z<@1?Yv*e59ZIf?i*7|(#&)fJiHe>ziDK&woq#^#9fdY2{r!g@nD(7HMblB>5_AlcN z<%2Brntrc6fBU@k?@wf!^@5#*q}rVx+vS`ib$9oiHh%i7tRyAW%7^3=w}iTChhhBj zsdXzbOgG%n8FgtQ*AatWtxQ}s!#;n{hCMTnW#>$@+Wa)xbK6_$y(vps?*n3HI0RoL z=*@7S6uxQL=F{e{T|Mn?-p?$*v*-?%wl!&M(q4B1{`Ra%xA58HvuE%oP1<5m8~#*y z#dOQ+D{Zyr?XuT3Lj zFYc&Y&e0RMbHaRHJ~S(^|I^5P-7Mo!OK`q>E;o$dQnj=spyc@WPi~LB-DkfF48Qwo zqx*`g{rg#ymU|JmWo*4%B0BPB&S}mN_BQV9=D_$Hb3K<$G~Tu_Q<9l}Lf#3*rfV$;shlae_T`<=6`J3H>dfhCKdxc#-etmtmh)dva7vRic-e_#M&`Z z^68P&A9KYGa9c@}m(>yZ8`p*@mCe_dy$>wBA-nbNmgW3i;d#v$8%?uCWA6>m8I#-k zF63>Kaj5Z)bWP7gZYNo&gp`glD{#HXq9PgI;W2JnBqYxb@2e9}kz+EN#wd&V5jvH!5NLN1M-XuPfhkiqk4) zv@zfToGW4y&=!k$2ma{Qo zLV-v|53@Gw(4`}`A{l3f>2Q$;S)17^3dDH3x?xyiDU2amlCc~-nS!CvEI|^5LZnQ_ zKzNXZ!xL}>JQgC*iFi5@!gRjO82X51CFSzy?sg8H#UWSLW&v`!gpR|7hK5>(5-i11 ze;i1o(QtSO2SHfG11k#`$=P98k<45v(xqbu%Q#ZLM9vqBFbZ9^pEy`H z7AF+;7%7w6hafHJB+_G~%p+U^a+rZclCgL)79@CpL^?#JgU}>Am5#@wM3kQ2 zX}BVjh|89eMi2X?k&APJUyK9`QnaViy}kgz-+8^q#?L^75}KxR6TL!|Pk zc#a>9NbJDj>WU8kLE28t306!XL|VDlaK#)%{_8-Z)BHd`kVqk52@sxu1wmL*5RHJP zQK%denahP}G;&u#D6t<3njuBD<07^I<)df|7b%QNp;4(^f*;loCXlcYkx0S%5qLx_ z1*B346bPbGiKMO~dXV{{C?~!Q8F%5R@raDdj>T>kyy)B1t_%UcW6_eZr7~DCr>)Jp zCiT}l=`UfpO+CD0E_-^ zq9~<0ynZes6Z7PuY${|flEe4 zHxFcEiDV)h%f^Ecmc*v{Q3+H6#gD`5>gIpi4Frfz0=rh4|G#eN9>tshw#XmmGH_ij z>q_`<>Nz}zi^r4jR4jqUAt84LBGQL!4suDM!W1rvgRCU9uJ-+dp8N40q3*fP#ZN2> zfu;Y-@`o(4Y-BqNOJxk6R4l}>B@zLj!&WS%xDXMyb3gd?4up}5F{s<5k~>P{|8SIY zVJZJ#Sz%DM|_B^HRKu3|3CAXwpgN=9jRXCwcha#Q|) ziXn4%WMZ7{S!9q#CSxH>5G{l9>rtm`pKXhr8x-4N8LEPi#$xnQpp^MOe0Z1Hbhk^-E|Pc6R3C)q!95G2v4ShAe99Y?d_-p8qL9u zgm*v=K`NTxB?N)?R9hy23PDV~JrNP2+EbY%JBUfJvm?;Rzg{B})y@GTl31j!8sU-J z*xQovpe>$Bq9I$VU#t;@%5)&($z+J^K(Z%*Ak)?sVo_;KA`!B4u>BWm#KJ>(2Rnj2 z2+=4YXiuiv5?Hp#7l}${kqMCMA=1T&MY3ly$#yIz$-&Of0byj1XVEA`dkTfZ0!g+% zfvs%tw-X0FE&p!XSt%Z|(2)}?a+>Pc?l6!U{X-gRHh1KCD^8+<;Et0f(hJB72P!^0 zL($pahx+_|C_4N5(C*0DBEFmfb(Z#BGAc^(97wt3%|f1i!iuJSpY*-A8$S#dc-!%j z=MOT)IU1xQjp_*cKBvb>pPxpeaylcG-G+Kb*|F{^Q;{d2$ir9M*Qc*PEQ!i{@_+cV zyGj3HVYHmO5Ht;ywi=g8L}&*!E;J35wi=g8L}&*!E;J35wi=g8L}&*!E;J35wi=g8 zL}&*!E;J35wi=g8L}&*!E;J35wi=g8L}&*!E;J35wi=g8L}&*!E;J35wi=g8L}&*! zE;J35wi=g8L}&*!E;J35wi=g8L}&*!E;J35wi=g8L}&*!E;J35wi=g8L}&*!E;J35 zwi=g8L}&*!E;J35wi=g8L}&*!E;J35wi=g8L}&*!E;J35wi=g8L}&*!E;J35wi=g8 zL}&*!E;J35wi=g8L}&*!E;J35wi=g8L}&*!E;J35_TS>t@BTd#ScLqDNhtDbC6QT& z>X2VL!El`1T>&6s3;;x}0D$%{$oDe<2*v}zb6)_U?*IT}@#cjW8~{MG+}Y07Bdofy z=9p`d+u)eW2jjIYNWo*Hw1>|$2Q`w%`Sy*l@M^T-TabMLrXESq5)csJWU-Q45Sm|h zJTY{syzb)s31i%`$wQ-~ws*XZDhxZ{nsbzIdd0yQ*7_&!YMO+bYbTGAQz8 z;nIbh(=6hhM{da+`1bNKd1=~%TmEiZ^ZPutF^~&)?AD1mHsbwE!@yMIYmCd5mrbwR zu&}ASjVj#w1f**dkt+jI1!>QHjHcW*eO!8U%$%-#EdvtTH#){7P!V^6b&q8rcgR1Zo(ZjEXS{utl!iv=lZHZ;+L$V-l#;QrL5loK7u;jZKd>QkL6g_d%2qk&bl4 z)+SZBu@FHUrM(=<*^LM)(h=LXL;g8`c(Fm}<>!s>CpyzKTdga0E^e?0bV}mJd^;`|6lHbpW-#xsK_+ zCYIvA$>Z&aj_Hb1*giHz3XM7V@_pL|mg>lMam8FRu~gH9m#R&uz!&xHur-wOJJ>oV zyl?FjQ5|v}#UQpq4rNbHRYWL@L2S=M9oHHLO3zG(4sWC^jZd+`j!D`)q@Nu(ud^t} zYb9TqS=3ifN@wfjnq2RX&-U_~25R5=Zdhr~vH7j@eJCLx8TVhlXaPoP6`?x$gVT{q Oz}bGf-4Ukm^8W#$AM{a&h?f_czDyAj5rxSfoCt~tUQjk4hD=ZfV)3MFJ0Gke$+_@--~XTg|ITP< zyuIGmU?T{kKH9-2@VMIgRxZc?Egkl0JZwVY6zYO$lofP91SHrC$fzRpfdmkw;X{+4 zg&=AuIhjJK*gj5#ibJq44pY%En;=@+Oid8`0U~=rpRD?+Zx0?(q%8TVZcoe^(?TF4 zcjR=?m5V3ET)*g(sJ2$J#pJMn0+2wO%7AKcrk^V4a(HfS(-c{NpngBKm{cm(Nrs>f zNROl0E;<>8WLXE}_OL9olXN*57wyC^YiHb?hvi&eviMLqnl7ce1Rp8J!Yet_tA{c=d(0iE;~lpjbRlDrd>6*l@xejh`OvH8LFhEDD=WXTD(zuWg z1O)XYgaf52c4i=gMh0qRsEZ|=x@A>@Sz~(vAB%BO)j)zOf++8&u!2LDCC=-0GT!j6 zP_x_ZVVE%MbL|TGB0+D&$2NQUaInPXp*W}j6_vQs5|^*YwXC3MI5H1(c?d`m9V%qu z$edg`mq10mB3G)MORyrB#>voDWB+P&X$!l@nwD*g7iHrE6}w%>w*G$b++KVo?nU`P z(tJDh^3Lk2z?x_CzHIHOk>L8vfm@ANJHIx~uK)D$%qrXH=RKqCFAi6osuq5CNAv@> ziHp&rlj*zfRo8w?MKW6- zKd-;E|7mUe+!rRYZts*fbXt7v-}mEubz{R>=Gf_XGvhZVrk`%u_-gzyw>fvQ{`$$; xo)gPz=I;M$z5FCURx`xqAO6gLm@!vesjedos*Aaj=!jeQIvS4iw}U++e*h%3Y4rdA literal 0 HcmV?d00001 diff --git a/public/images/wechat/dot.png b/public/images/wechat/dot.png new file mode 100644 index 0000000000000000000000000000000000000000..bf1c0104e6d8c36a867507e927431299c758b9f8 GIT binary patch literal 27646 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 literal 0 HcmV?d00001 diff --git a/public/images/wechat/female.jpg b/public/images/wechat/female.jpg new file mode 100644 index 0000000000000000000000000000000000000000..219865572d134fd727a6192ff01f539322e3a780 GIT binary patch literal 3783 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 X#=BIQwe5HrP^?{gp7sR$-?#riPNQ%> literal 0 HcmV?d00001 diff --git a/public/images/wechat/male.png b/public/images/wechat/male.png new file mode 100644 index 0000000000000000000000000000000000000000..9f1214a4c8258b5015485c899ecee3caed81f48f GIT binary patch literal 23849 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 literal 0 HcmV?d00001 diff --git a/public/images/wechat/minus.png b/public/images/wechat/minus.png new file mode 100644 index 0000000000000000000000000000000000000000..32d82ea8484c3c4d07a6474e8e2f41976ef0db7b GIT binary patch literal 23318 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 EKcXtm5C8xG literal 0 HcmV?d00001 diff --git a/public/images/wechat/post-avatar.jpg b/public/images/wechat/post-avatar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..bd2597dd2a623d59dea9b37ed4452281a69496d3 GIT binary patch literal 2756 zcmbVN3s6&68a~Ml1Tpeh&_zMLhV_96$qh*$DUSdF1qa0-!dm2Ea)lU@8 zcd&ykQe8DFTk0xLi^8nnD$vSSs}{TX1aUxlDCHqOW>vuK&CP>$%XD`3Ofvb;|9{{A zI{!H_-8c0BuNbX#3jlF(%YhS^TBaf3F3cCp3IGXEaCImErXC2((P)%>21B6^%#vW6 z(LgaKXK1sO3?z`r0HG0DWtLcmYT(Uiwp0;DAHCQ_hozD*dI~3jnV^hDbEKC!F(f*{o*JVFIF&h0!C;QQ_2tL^v8# zp)e;fC_v0a5SYsiMA#fI7g+(bmQZGy7n%0&qltxmk zFgl*8r3AS$A;Io=+HT3^=DG;9S|dWI(wG*lUSFU@86s4T<*URf4)?W@@!tJ*ATtop zhQC%N#SbMbSBQ!8<)}gvCk&(GmOzPA!Vf`0f}%M>HY+M9Him=XjASE17J|fZBH2OFksJ<>&1NCY5LU2_8>difvJ_&}7FUYLwQ_mC z$>m3@&@2t6T90A5wh2hg!8DjU2UEh)NnChYic}%NwyXWj$788hh^nO9P)V!`lfy)R z`O<0P<0BKzVsUw#ST>$Hf`o9R*-=r^ypUifD=I2DmTu)r{-2&P@MIX~;rQ9G*i`rg znnnBQ;~V?sK^6FoQQ=p^Gy+_Rfd`Ui{0fpxonQ}eq);dh6h{XK#~F_Jcczo0qti^9 zv-3=6XPO(0SZ*{IS2tG|numv{r-z4+x3{;?Li-|7snl7tSzc~#Uh`(V&z@&D{I7zk z8Mr%vTi_N%atCC0668)YT>-g(WLZ;B2#Erb9h^v{DUC&P17tFZOmTo93S`lc$dLOY z3KF^QcUgJ6L>`~hSy8?Yf2|ElYWdOA{a1Wb2cSVDJT&AEBEY22fBU!Y-KNt!5Rcif zEF{5H6w(*Q>~upq5ZFIJ2QAFCIV=8xF!JMTzk;`HTjB`-h7|7d10w2DBG@>aPXJ2YH> zZL=b^_<1j(17ri45Zw0UHdge#iM!m}(CzwV@w&L2;&0M{IWE5D2G_<9ZfWw{5;P`I zT2$8NP%`9oYrm>}earRK4T}NLny#i$S6*%3mi(T30y)8h3`BXhUN6YiuG_h>M0rW@ zuK2N);;5fE+EI7mhxlc*wv|OkVc4v?sm@T zF(*BGI>9n4&elIu&O@WVLoc{jd%myp%-Hda+zF)FrQ5S z+C~6sJreg|&XbUy$+L66TSC1pO8QiCAr6gTE;GZRq7nTuX?>Y&M)iVJuQG=@orO<+w_pVm^6t{JK3py<=WKE$ueE{a$43%RS`tNc6OUpyCgc{q`WnDs*)r zRPFsqid=oSAv7hM)7{+hqHd=E0BT#~vy2ss3*oUROB&yhyoh0#IwL&FJ!)7hGB$F! z7<>7N`?-2O5^9O^yxp z8*a+I3!9creD?3?0~OE>$*DJk1d8w}k3s7`TTodsz9IACqW9No!dJ~omitu?%zrt+ z3!MZ*6taN;1JKj#!X3`3@2h!G<56_rHtp^@z3xeG;bh{*cUN5UN*1>awB+Gn^I((f z(Q~b<{f&=47sx8J)8-kQR6BQ^YAJv}xRjn@ZLZa;Pfcf%c%*pvEJ24KGe?*l-5m{dE0McX?Z{34HtePsdNjbUVH(5f%Q+KgQF+>cRd)J9fP4;_Qpmbf^-n7(k32s_>LuX?lj`O%x_(#qOzyM9^b)f(&XUU((Z(@wSvEe++# z*v>i2YX=+Go;|amVAnz>dq~#0(08I*-*$bs^_{ZA%>s0&zo~ftqPx5U#(aq8UE;g6 JwKT%?;6G!sTH^o! literal 0 HcmV?d00001 diff --git a/public/images/wechat/search.png b/public/images/wechat/search.png new file mode 100644 index 0000000000000000000000000000000000000000..a04c1496c728f78f3a778117bb00807994bbc659 GIT binary patch literal 1550 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 tfXHVuwaxfxitF6yjlPJ9>DNye*<>uCN z>E$8RHAJuKCcS#DTTzLm=t-8>s*$rrWR= z4rf4=1c#!b{1r?QA|*q53|TFeV{9DG%SSDTL@_W5M8HuJnK$wM#j8X>BK9V(rt{tS zauysd;c67{DosGJNE0LS6cc@x0A6Y)CLo1T2vAF7WlE;noA^bSiH-GP3K94ML1Vm$ zUrmMbg8&wyfB`z0MiRM!Ai!XdL3cWX0WJinZXlK7hTRMj=+2}wm{bqo+eO5(Da4UX z0o(suE^Ovaj7Cv8lR{CcRAd#6j3}Zgpr@y&UV};{VF;3PiwuR-B$?7_Oo0t6MGA== zl^`-euLwmTai}*DbNY1&Qu%jTney8Z090oE!8Fn_f~CPq|B zmoIoepUIOcQAj3&d2DYYra+cR#7tir6$I&Q4-UiA7X&$UKTl70mWMCHmqTTN9Jc2e zmyL+xq_7Mf!x6T%NrisH(32N@8?>?mV=M)71dvi znX(vkoDqk|*J($%e);${OWC=0L0kQfRdibc{WvRUS>s1DP5wjLJaS{uKBB2nX~xe|-)pzBQUhtz(vG7`7s$;g@KGFH}nx$~6WfQ`iq z;Kii5jII)3lif2ylH)s_F8)Ku!#=B7d5?w$T5rg4jijAIdvY4d5^ms{FMVuNaKDQc zeq(yj;P83FYl9y*_4dlzyKJXfa8{6LRwsqWM}h`$FT$ zAT*O^6l9f$Pkg02_uKW^g;NV}KY2!lO?sMaO$_lV%kxfWhE6W(*wLXjUzSB6B$zow zR@@z}_n62x?c00%UbQyP2GmkN&f(g%^sLAf5i;ywX?xRFI5#K>YRT-=J@_4 zeP8r_#F9^Nv%YL_q$T-*t9c?XdZ0!Fg=U{EtGHE5>p5bf%CLS$VQ-&oT6wRfVcwn4 z?&EjTjuNJZ*f?#d*?}3_ZMc;yKedRN;uMko-g{Skc7V_QnpR$YOGf+cB&UOuxtfNA ziO(I~5>FS^g-pwtvp?c`x3l#d(Xtc%e@-v+VszIibL_*{R5la`yZYc$ZfftAtUpva zcuAyC^laYtI<+XZ??K(V@M+b|)aLEOe>|J|7qo0?o9l%l>7uvCqsFDaJ3I{Yd8*nug%YfA3)vHWXaeblezd9(H}?s=St%bM<3<`Ks#3K9l8z`|drg zs;UxKQTnwnBao}x`gP9>7Y}!u;*BTY&8~bJHz(}auhNAJ?=_#z8cAB+S6RFwcr?DZ zKi^(=-JM(;*y`|iXZyLPyMek+ufg0+pMQCrxm`oC-C>e`@_?{(nq|w|o|A#H*t4-d zK*it4gs($6(S`}bPau{mtb2Rcg^JwFNrpuM+ zr=il 0){ + console.log(_openid); + if (typeof _openid !== 'undefined' && _openid && _openid.length > 0){ deferred.resolve(_openid); } else { - var code = $routeParams.code; + var code = $routeParams.code || session.get("code"); $http({ url: '/wechat/get_open_id', data: {code: code}, method: 'POST' }).then(function successCallback(response) { - _openid = response.data.openid; - deferred.resolve(_openid); + if(response.data.status != 0){ + deferred.reject(response.data.msg); + } else{ + _openid = response.data.openid; + session.save("openid", _openid); + deferred.resolve(_openid); + } }, function errorCallback(response) { deferred.reject(response); }); @@ -30,6 +67,16 @@ app.factory('auth', ['$http','$routeParams', '$q', function($http,$routeParams, return {getOpenId: getOpenId, openid: openid}; }]); +app.factory("session", function(){ + return { + save: function(key,value){ + sessionStorage.setItem(key,value); + }, + get: function(key){ + return sessionStorage.getItem(key); + } + } +}); app.factory('rms', function(){ var _saveStorage = {}; diff --git a/public/javascripts/wechat/others/routes.js b/public/javascripts/wechat/others/routes.js index 7ea270c6e..ded374930 100644 --- a/public/javascripts/wechat/others/routes.js +++ b/public/javascripts/wechat/others/routes.js @@ -1,7 +1,15 @@ -app.config(['$routeProvider',"$httpProvider", "$locationProvider",function ($routeProvider, $httpProvider, $locationProvider) { - var rootPath = '/assets/wechat/' +app.config(['$routeProvider',"$httpProvider", "$locationProvider",'config', function ($routeProvider, $httpProvider, $locationProvider, config) { + var rootPath = config.rootPath; //$locationProvider.html5Mode(true); $routeProvider + .when('/login', { + templateUrl: rootPath + 'login.html', + controller: 'LoginController' + }) + .when('/reg', { + templateUrl: rootPath + 'reg.html', + controller: 'RegController' + }) .when('/activites', { templateUrl: rootPath + 'activities.html', controller: 'ActivityController' diff --git a/public/stylesheets/weui/weixin.css b/public/stylesheets/weui/weixin.css index 6cccb3615..fd5a56bd6 100644 --- a/public/stylesheets/weui/weixin.css +++ b/public/stylesheets/weui/weixin.css @@ -3,7 +3,8 @@ /*基本样式*/ body,table,input,textarea,select,button { font-family: "微软雅黑","宋体";} -h1,h2,h3,h4,h5,p,pre {padding:0px; margin:0px;} +body, ul, h1,h2,h3,h4,h5,p,pre {padding:0px; margin:0px;} +ul li {list-style:none;} img {max-width:100%;} blockquote {border:1px solid #d4d4d4; padding: 0.6em; margin-left: 1.4em; margin-right: 0.4em; border-radius: 4px; font-family: "Microsoft YaHei"; background-size: 100% 100%; margin-top:5px;} .text-control {word-break:normal; word-wrap:break-word;} @@ -12,29 +13,42 @@ blockquote {border:1px solid #d4d4d4; padding: 0.6em; margin-left: 1.4em; margin .f15 {font-size:15px;} .fb {font-weight:bold;} .mt2 {margin-top:2px;} +.mt4 {margin-top:4px;} .mt5 {margin-top:5px;} .mt10 {margin-top:10px;} +.mt11 {margin-top:11px;} +.mt15 {margin-top:15px;} +.mt30 {margin-top:30px;} +.mt70 {margin-top:70px;} .mb5 {margin-bottom:5px;} .mb10 {margin-bottom:10px;} +.mb20 {margin-bottom:20px;} .ml10 {margin-left:10px;} .mr5 {margin-right:5px;} .mr10 {margin-right:10px;} .ml15 {margin-left:15px;} .mr15 {margin-right:15px;} .mr20 {margin-right:20px;} +.ml25 {margin-left:25px;} .mr25 {margin-right:25px;} .ml55 {margin-left:55px;} .mr55 {margin-right:55px;} +.c-red {color:#e81a1a;} .c-blue {color:#269ac9;} .c-grey {color:#9a9a9a;} .c-grey2 {color:#707070;} .c-grey3 {color:#555555;} +.c-grey4 {color:#888888;} +.c-grey5 {color:#aaaaaa;} +.c-grey6 {color:#777777;} +.c-blue {color:#3b94d6;} a {color:#707070;} a.c-grey {color:#707070;} a.c-grey2 {color:#9a9a9a;} a:link,a:visited{text-decoration:none;} a:hover,a:active{cursor:pointer;} a.link-blue {color:#269ac9;} +a.link-blue2 {color:#3b94d6;} a.underline {text-decoration:underline;} .border-radius {border-radius:5px;} .w36 {width:36px;} @@ -42,9 +56,21 @@ a.underline {text-decoration:underline;} .max-width-130 {max-width:130px;} .hidden {overflow:hidden; white-space:nowrap; text-overflow:ellipsis;} .inline-block {display:inline-block;} +.dis {display:block;} .undis {display:none;} .text-nowrap {white-space:nowrap;} .v-top {vertical-align:top;} +.tac {text-align:center;} +.block-center {margin-left:auto; margin-right:auto; display:block;} + +/*背景色*/ +.bg-grey {background-color:#c1c1c1;} +.bg-blue {background-color:#3b94d6;} + +/*按钮样式*/ +.btn1 {width:100%; height:40px; line-height:40px; vertical-align:middle; text-align:center; color:#fff; display:block; border-radius:5px;} +.bg-blue:not(.btn-disabled):active {background-color:#2780c2;} +.btn-disabled {background-color:#ccc;} /*动态样式*/ .post-container {width:100%;} @@ -88,4 +114,63 @@ a.underline {text-decoration:underline;} /*帖子锁定样式*/ .locked_btn_cir {background: url("/images/locked.png") 0 0 no-repeat; cursor: default;} -.bg-grey {background-color:#c1c1c1;} +/*20150612加入班级样式*/ +.add-class-box {width:80%; max-width:300px; min-width:240px; height:150px; font-size:15px; color:#444; background-color:#fff; margin:0 auto; box-shadow: 0px 2px 8px rgba(146, 153, 169, 0.5); border-radius:5px; margin-top:100px;} +.add-class-tip {padding-top:20px; padding-bottom:20px;} +.class-number-input {width:80%; max-width:240px; height:28px; border:1px solid #ccc; padding-left:5px; margin:0 auto; display:block;} +.cancel-btn {width:49%; height:37px; line-height:37px; text-align:center; vertical-align:middle; border-top:1px solid #ccc;} +.submit-btn {width:49%; height:37px; line-height:37px; text-align:center; vertical-align:middle; border-top:1px solid #ccc;} +.slice {width:2%; text-align:center; border-top:1px solid #ccc;} +.slice-line {width:1px; height:37px; margin:auto; background:#ccc;} + +/*20160613邀请码样式*/ +.qr-code-wrap {width:100%; padding:40px 0; background-color:#3b94d6;} +.qr-code-box {width:225px; height:332px; background-color:#fff; border-radius:3px; margin:0 auto;} +.share-class-name {font-size:18px; color:#3b3b3b; text-align:center; padding:12px; border-bottom:1px solid #cccccc; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;} +.qr-img-wrap {width:100%; border-bottom:1px dashed #ccc;} +.qr-code-img {margin:36px auto; display:block;} +.invitation-code-wrap {text-align:center; font-size:18px; color:#3b3b3b; padding:16px;} +.share-code-wrap {width:100%; background-color:#efeff4;} +.share-code-btn, .finish-btn {width:145px; height:35px; color:#fff; font-size:15px; line-height:35px; text-align:center; vertical-align:middle; background-color:#ff7239; margin:18px auto 20px auto; border-radius:50px; display:block;} +.share-code-instruction {max-width:228px; font-size:12px; color:#666; line-height:20px; margin:0 auto;} + +/*20160613班级详情*/ +.class-detail-name, .blue-title {width:100%; height:45px; line-height:45px; vertical-align:middle; background-color:#3b94d6; color:#fff; font-size:18px; text-align:center;} +.blue-title-sub {position:absolute; right:10px;} +.slice2 {width:2%; text-align:center; background-color:#fff; border-bottom:1px solid #ccc;} +.slice3 {width:1%; height:38px; text-align:center; background-color:#fff; border-bottom:1px solid #ccc;} +.slice-line2 {width:1px; height:38px; margin:auto; background:#ccc;} +.class-detail-tab {width:23%; height:38px; line-height:38px; font-size:13px; color:#444; background-color:#fff; float:left; text-align:center; vertical-align:middle; border-bottom:1px solid #ccc;} +.class-detail-tab2 {width:32%; height:38px; line-height:38px; font-size:13px; color:#444; background-color:#fff; float:left; text-align:center; vertical-align:middle; border-bottom:1px solid #ccc;} +.class-tab-active {border-bottom:1px solid #3b94d6;} +.class-search-wrap {padding:8px 12px; position:relative;} +.class-search-inner {padding:0 30px; background-color:#fff;} +.class-search-icon {position:absolute; top:16px; left:16px;} +.class-detail-search {width:100%; height:33px; color:#999; background-color:#fff; border:none; outline:none;} +.border-top {border-top:1px solid #ccc;} +.class-detail-row {width:100%; height:38px; line-height:38px; vertical-align:middle; border-bottom:1px solid #ccc; background-color:#fff;} +.class-test-tip {text-align:center; font-size:13px; color:#444; padding-top:40px;} +.img-circle {border-radius:50%;} + +/*20160614班级列表*/ +.course-list-row {width:100%; height:38px; line-height:38px; vertical-align:middle; border-top:1px solid #ccc; border-bottom:1px solid #ccc; background-color:#fff;} +.class-list {width:100%; border-bottom:1px solid #ccc;} +.class-list li {height:40px; line-height:40px; vertical-align:middle; margin:0 25px; border-left:1px solid #ccc; border-bottom:1px solid #ccc; position:relative;} +.class-list-name {max-width:75%; display:inline-block;} +.class-list-dot {position:absolute; top:13px; left:-8px;} +.border-bottom-none {border-bottom:none !important;} +.students-amount {height:14px; line-height:14px; vertical-align:middle; padding:2px 5px; background-color:#e6e6e6; border-radius:10px;} +.new-class-btn {font-size:15px; color:#fff; background-color:#3b94d6; padding:10px 40px; border-radius:20px; display:inline-block; margin:0 auto;} +.join-class-btn {font-size:15px; color:#444; background-color:#ccc; padding:10px 40px; border-radius:20px; display:inline-block; margin:0 auto;} +.new-class-input {width:60%; color:#aaa; height:35px; line-height:35px; vertical-align:middle; border:none; outline:none;} + +/*20160616登录注册*/ +.login-wrap {padding:0 10px;} +.input-box-wrap {padding-right:17px;} +.input-box {width:100%; height:36px; padding-left:5px; line-height:36px; vertical-align:middle; border:1px solid #ccc; border-radius:5px;} +.login-op-wrap {height:30px; line-height:30px; vertical-align:middle;} +.login-box{display:inline-block; width:14px; height:14px; line-height:14px; text-align:center; vertical-align:middle; border:1px solid #ccc; background:#fff; border-radius:3px; color:#fff; cursor:pointer;} +.login-box.checked{background:#63c360;} +.login-box.checked:after{content:url(/images/wechat/checked.png);} +.forget-psw-wrap {width:60px; margin:0 auto;} +.forget-psw {position:fixed; bottom:10px;} \ No newline at end of file From 7aec37bb3a852b3e92f91d932c343f6547dc1060 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Fri, 17 Jun 2016 18:25:55 +0800 Subject: [PATCH 025/216] . --- app/controllers/wechats_controller.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index 887587a5f..8c39c773e 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -139,6 +139,8 @@ class WechatsController < ActionController::Base end def sendBind(request) + root_url = "http://wechat.trustie.net" + news = (1..1).each_with_object([]) { |n, memo| memo << { title: '绑定登录', content: "欢迎使用Trustie创新实践服务平台! 在这里您可以随时了解您的课程和项目动态,随时点赞和回复。 我们将会与微信不断结合,为您提供更有价值的服务。 From a0c0a65d18d4c62b4e4139bb5802ba6d14fe32ad Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Fri, 17 Jun 2016 18:37:26 +0800 Subject: [PATCH 026/216] =?UTF-8?q?=E7=BB=91=E5=AE=9A=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=88=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/mobile/apis/users.rb | 21 ++++++++++++++++++- .../javascripts/wechat/controllers/login.js | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/app/api/mobile/apis/users.rb b/app/api/mobile/apis/users.rb index 7800382ad..ab2ba49b4 100644 --- a/app/api/mobile/apis/users.rb +++ b/app/api/mobile/apis/users.rb @@ -12,7 +12,26 @@ module Mobile requires :password, type: String, desc: 'password' end post '/bindwx' do - + code = params[:code] || session[:wechat_code] + openid = get_openid_from_code(code) + + raise "无法获取到openid,请在微信中打开本页面" unless openid + raise "此微信号已绑定用户, 不能重复绑定" if user_binded?(openid) + + user, last_login_on = User.try_to_login(params[:username], params[:password]) + raise "用户名或密码错误,请重新输入" unless user + #补全用户信息 + + raise "此用户已经绑定过公众号, 请换一个帐户试试" if user.user_wechat + + UserWechat.create!( + openid: openid, + user: user + ) + ws = WechatService.new + ws.binding_succ_notice(user.id, "您已成功绑定Trustie平台", user.login, format_time(Time.now)) + present status: 0 + present message: '绑定成功' end desc "注册用户" diff --git a/public/javascripts/wechat/controllers/login.js b/public/javascripts/wechat/controllers/login.js index 011f11baa..e8efad177 100644 --- a/public/javascripts/wechat/controllers/login.js +++ b/public/javascripts/wechat/controllers/login.js @@ -22,7 +22,7 @@ app.controller('LoginController', ['$scope', '$http', '$location', '$routeParams console.log(apiUrl + "auth"); auth.getOpenId().then( - function(){ + function(openid){ return $http.post( config.rootUrl + "wxbind", {login: user.login, password: user.password, openid: openid} From 3582849ef32801557a95e858c502d663a2cdf3e8 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Fri, 17 Jun 2016 18:40:03 +0800 Subject: [PATCH 027/216] . --- public/javascripts/wechat/controllers/login.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/javascripts/wechat/controllers/login.js b/public/javascripts/wechat/controllers/login.js index e8efad177..5695e63ff 100644 --- a/public/javascripts/wechat/controllers/login.js +++ b/public/javascripts/wechat/controllers/login.js @@ -24,7 +24,7 @@ app.controller('LoginController', ['$scope', '$http', '$location', '$routeParams auth.getOpenId().then( function(openid){ return $http.post( - config.rootUrl + "wxbind", + config.apiUrl + "wxbind", {login: user.login, password: user.password, openid: openid} ); } From 46018ad388fd67dffcd03c9c302f24b29e82ce88 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Fri, 17 Jun 2016 18:41:16 +0800 Subject: [PATCH 028/216] . --- public/javascripts/wechat/controllers/login.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/javascripts/wechat/controllers/login.js b/public/javascripts/wechat/controllers/login.js index 5695e63ff..97fe785f5 100644 --- a/public/javascripts/wechat/controllers/login.js +++ b/public/javascripts/wechat/controllers/login.js @@ -24,7 +24,7 @@ app.controller('LoginController', ['$scope', '$http', '$location', '$routeParams auth.getOpenId().then( function(openid){ return $http.post( - config.apiUrl + "wxbind", + config.apiUrl + "users/wxbind", {login: user.login, password: user.password, openid: openid} ); } From 64ad182a845abae1791986697bee5716a10a1913 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Fri, 17 Jun 2016 18:42:58 +0800 Subject: [PATCH 029/216] . --- app/api/mobile/apis/users.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/api/mobile/apis/users.rb b/app/api/mobile/apis/users.rb index ab2ba49b4..28fbb8839 100644 --- a/app/api/mobile/apis/users.rb +++ b/app/api/mobile/apis/users.rb @@ -11,7 +11,7 @@ module Mobile requires :mail, type: String, desc: 'mail' requires :password, type: String, desc: 'password' end - post '/bindwx' do + post 'wxbind' do code = params[:code] || session[:wechat_code] openid = get_openid_from_code(code) From b9280caf367fcd45d7f9e84f830114d35ea6c76d Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Fri, 17 Jun 2016 18:46:15 +0800 Subject: [PATCH 030/216] . --- app/api/mobile/apis/users.rb | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/api/mobile/apis/users.rb b/app/api/mobile/apis/users.rb index 28fbb8839..d83283081 100644 --- a/app/api/mobile/apis/users.rb +++ b/app/api/mobile/apis/users.rb @@ -8,15 +8,13 @@ module Mobile desc "绑定微信用户" params do requires :login, type: String, desc: 'username' - requires :mail, type: String, desc: 'mail' requires :password, type: String, desc: 'password' + requires :openid, type: String, desc: 'wechat openid' end post 'wxbind' do - code = params[:code] || session[:wechat_code] - openid = get_openid_from_code(code) - + openid = params[:openid] raise "无法获取到openid,请在微信中打开本页面" unless openid - raise "此微信号已绑定用户, 不能重复绑定" if user_binded?(openid) + raise "此微信号已绑定用户, 不能重复绑定" if UserWechat.where(openid: openid).first user, last_login_on = User.try_to_login(params[:username], params[:password]) raise "用户名或密码错误,请重新输入" unless user From 9d19caa736bdec95fae4a2cb5a1b7454b5a35020 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Fri, 17 Jun 2016 18:48:27 +0800 Subject: [PATCH 031/216] . --- app/controllers/wechats_controller.rb | 2 +- public/javascripts/wechat/controllers/login.js | 4 ++-- public/javascripts/wechat/others/factory.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index 8c39c773e..930318fa5 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -167,7 +167,7 @@ class WechatsController < ActionController::Base raise "无法获取到微信openid" unless openid render :json => {status:0, openid: openid} rescue Exception=>e - render :json => {status: -1, msg: e.message} + render :json => {status: -1, message: e.message} end end diff --git a/public/javascripts/wechat/controllers/login.js b/public/javascripts/wechat/controllers/login.js index 97fe785f5..a760ce8ea 100644 --- a/public/javascripts/wechat/controllers/login.js +++ b/public/javascripts/wechat/controllers/login.js @@ -32,11 +32,11 @@ app.controller('LoginController', ['$scope', '$http', '$location', '$routeParams function(response) { vm.loginFailed = (response.data.status != 0); console.log(response.data); - vm.alertService.showMessage('出错了', response.data.msg); + vm.alertService.showMessage('出错了', response.data.message); if (!$scope.loginFailed) { //绑定成功 } else { - vm.alertService.showMessage('出错了', response.data.msg); + vm.alertService.showMessage('出错了', response.data.message); } } ).catch(function(e){ diff --git a/public/javascripts/wechat/others/factory.js b/public/javascripts/wechat/others/factory.js index 27fbeb1c4..3cb601d2b 100644 --- a/public/javascripts/wechat/others/factory.js +++ b/public/javascripts/wechat/others/factory.js @@ -49,7 +49,7 @@ app.factory('auth', ['$http','$routeParams', '$q', 'session', function($http,$ro method: 'POST' }).then(function successCallback(response) { if(response.data.status != 0){ - deferred.reject(response.data.msg); + deferred.reject(response.data.message); } else{ _openid = response.data.openid; session.save("openid", _openid); From 762ca9c3cb8f5881c30590416f028864a9cb0389 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Fri, 17 Jun 2016 18:50:43 +0800 Subject: [PATCH 032/216] . --- app/api/mobile/apis/users.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/api/mobile/apis/users.rb b/app/api/mobile/apis/users.rb index d83283081..637f55565 100644 --- a/app/api/mobile/apis/users.rb +++ b/app/api/mobile/apis/users.rb @@ -16,7 +16,7 @@ module Mobile raise "无法获取到openid,请在微信中打开本页面" unless openid raise "此微信号已绑定用户, 不能重复绑定" if UserWechat.where(openid: openid).first - user, last_login_on = User.try_to_login(params[:username], params[:password]) + user, last_login_on = User.try_to_login(params[:login], params[:password]) raise "用户名或密码错误,请重新输入" unless user #补全用户信息 From f40794282f160f6cdece3e7f33cf05a0dc5551d2 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Fri, 17 Jun 2016 18:54:24 +0800 Subject: [PATCH 033/216] . --- app/api/mobile/apis/users.rb | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/app/api/mobile/apis/users.rb b/app/api/mobile/apis/users.rb index 637f55565..5aee29fe2 100644 --- a/app/api/mobile/apis/users.rb +++ b/app/api/mobile/apis/users.rb @@ -14,7 +14,8 @@ module Mobile post 'wxbind' do openid = params[:openid] raise "无法获取到openid,请在微信中打开本页面" unless openid - raise "此微信号已绑定用户, 不能重复绑定" if UserWechat.where(openid: openid).first + uw = UserWechat.where(openid: openid).first + raise "此微信号已绑定用户(#{uw.user.login}), 不能重复绑定" if uw user, last_login_on = User.try_to_login(params[:login], params[:password]) raise "用户名或密码错误,请重新输入" unless user @@ -26,8 +27,8 @@ module Mobile openid: openid, user: user ) - ws = WechatService.new - ws.binding_succ_notice(user.id, "您已成功绑定Trustie平台", user.login, format_time(Time.now)) + # ws = WechatService.new + # ws.binding_succ_notice(user.id, "您已成功绑定Trustie平台", user.login, format_time(Time.now)) present status: 0 present message: '绑定成功' end From b17b92cc3ec7341ef1d1e2179be0de623605a725 Mon Sep 17 00:00:00 2001 From: txz Date: Mon, 20 Jun 2016 11:08:57 +0800 Subject: [PATCH 034/216] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E5=9B=9E=E5=A4=8D?= =?UTF-8?q?=E5=90=8E=E5=85=88=E5=8A=A0=E8=BD=BD=E5=90=8E=E5=90=AF=E7=94=A8?= =?UTF-8?q?=E5=9B=9E=E5=A4=8D=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/assets/wechat/blog_detail.html | 2 +- public/assets/wechat/jour_message_detail.html | 2 +- public/javascripts/wechat/app.js | 16 +++++++++++++--- public/stylesheets/weui/weixin.css | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/public/assets/wechat/blog_detail.html b/public/assets/wechat/blog_detail.html index ee651eadf..509e0171a 100644 --- a/public/assets/wechat/blog_detail.html +++ b/public/assets/wechat/blog_detail.html @@ -8,7 +8,7 @@
      {{blog.title}}
      {{blog.user.realname}}发表博客
      -
      +
      {{blog.created_at}}
      diff --git a/public/assets/wechat/jour_message_detail.html b/public/assets/wechat/jour_message_detail.html index a1b79379f..dc6b1409f 100644 --- a/public/assets/wechat/jour_message_detail.html +++ b/public/assets/wechat/jour_message_detail.html @@ -7,7 +7,7 @@
      {{message.user.realname}}给您留言了
      {{message.created_on}}
      -
      +
    diff --git a/public/javascripts/wechat/app.js b/public/javascripts/wechat/app.js index ca9682db2..61ec717a2 100644 --- a/public/javascripts/wechat/app.js +++ b/public/javascripts/wechat/app.js @@ -16,7 +16,7 @@ app.factory('auth', function($http,$routeParams, $q){ } if(debug===true){ - _openid = "orgVLv8TlS6e7FDiI6xdTGHRaaRo"; //guange的帐号 + _openid = "1"; //guange的帐号 } var getOpenId = function() { @@ -147,8 +147,6 @@ app.factory('common', function($http, auth, $routeParams){ data: userInfo }).then(function successCallback(response) { //alert("提交成功"); - //数据提交完成,回复按钮启用 - data.disabled = false; if(typeof cb === 'function'){ cb(); } @@ -219,6 +217,8 @@ app.controller('IssueController', function($scope, $http, $routeParams, auth, co common.addCommonReply($routeParams.id, 'Issue', data, function(){ $scope.formData = {comment: ''}; loadData($routeParams.id); + //数据提交完成,回复按钮启用 + data.disabled = false; }); }; @@ -256,6 +256,8 @@ app.controller('HomeworkController', function($scope, $http, $routeParams, auth, common.addCommonReply($routeParams.id, 'HomeworkCommon', data, function(){ $scope.formData = {comment: ''}; loadData($routeParams.id); + //数据提交完成,回复按钮启用 + data.disabled = false; }); }; @@ -292,6 +294,8 @@ app.controller('CourseNoticeController', function($scope, $http, $routeParams, a common.addCommonReply($routeParams.id, 'News', data, function(){ $scope.formData = {comment: ''}; loadData($routeParams.id); + //数据提交完成,回复按钮启用 + data.disabled = false; }); }; @@ -328,6 +332,8 @@ app.controller('DiscussionController', function($scope, $http, $routeParams, aut common.addCommonReply($routeParams.id, 'Message', data, function(){ $scope.formData = {comment: ''}; loadData($routeParams.id); + //数据提交完成,回复按钮启用 + data.disabled = false; }); }; @@ -364,6 +370,8 @@ app.controller('JournalsController', function($scope, $http, $routeParams, auth, common.addCommonReply($routeParams.id, 'JournalsForMessage', data, function(){ $scope.formData = {comment: ''}; loadData($routeParams.id); + //数据提交完成,回复按钮启用 + data.disabled = false; }); }; @@ -402,6 +410,8 @@ app.controller('BlogController', function($scope, $http, $routeParams, auth, com common.addCommonReply($routeParams.id, 'BlogComment', data, function(){ $scope.formData = {comment: ''}; loadData($routeParams.id); + //数据提交完成,回复按钮启用 + data.disabled = false; }); }; diff --git a/public/stylesheets/weui/weixin.css b/public/stylesheets/weui/weixin.css index 3fd9acd37..f77cf1e2a 100644 --- a/public/stylesheets/weui/weixin.css +++ b/public/stylesheets/weui/weixin.css @@ -56,7 +56,7 @@ a.underline {text-decoration:underline;} .tac {text-align:center;} /*背景色*/ -.bg-grey {background-color:#c1c1c1;} +.bg-grey {background-color:#c1c1c1 !important;} /*动态样式*/ .post-container {width:100%;} From b26a6b5195b42a670abf74cb73277f3c189c71a1 Mon Sep 17 00:00:00 2001 From: cxt Date: Mon, 20 Jun 2016 11:24:34 +0800 Subject: [PATCH 035/216] =?UTF-8?q?=E6=B6=88=E6=81=AF=E5=BC=B9=E7=AA=97?= =?UTF-8?q?=E7=9A=84=E9=93=BE=E6=8E=A5=E6=97=A0=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/_show_messages_list.html.erb | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/views/layouts/_show_messages_list.html.erb b/app/views/layouts/_show_messages_list.html.erb index addd04815..966c04b4d 100644 --- a/app/views/layouts/_show_messages_list.html.erb +++ b/app/views/layouts/_show_messages_list.html.erb @@ -123,12 +123,14 @@ <% elsif AtMessage === ma && ma.at_valid? %> <% if ma.at_message_type == "Message" && !ma.at_message.course.nil? %> <% href = course_boards_path(ma.at_message.course,:parent_id => ma.at_message.parent_id ? ma.at_message.parent_id : ma.at_message.id, :topic_id => ma.at_message.id) %> +
  • <%=ma.author.show_name %> 提到了你:<%= ma.subject.html_safe%>
  • <% elsif ma.at_message_type == "Message" && !ma.at_message.project.nil? %> - <% href = project_boards_path(ma.at_message.project,:parent_id => ma.at_message.parent_id ? ma.at_message.parent_id : ma.at_message.id, :topic_id => ma.at_message.id) %> + <% href = project_boards_path(ma.at_message.project,:parent_id => ma.at_message.parent_id ? ma.at_message.parent_id : ma.at_message.id, :topic_id => ma.at_message.id) %> +
  • <%=ma.author.show_name %> 提到了你:<%= ma.subject.html_safe%>
  • <% else %> - <% href = ma.url %> + <% content = ''+ma.author.show_name+' 提到了你:'+ma.subject.html_safe %> +
  • <%=link_to content.html_safe, ma.url, :title => ma.author.show_name+' 提到了你:'+ma.subject.html_safe, :target => '_blank' %>
  • <% end %> -
  • <%=ma.author.show_name %> 提到了你:<%= ma.subject.html_safe%>
  • <% end %> <% end %> From 36e47fa8b1e6554ae40f91af752bce65f523e8f4 Mon Sep 17 00:00:00 2001 From: huang Date: Mon, 20 Jun 2016 14:21:40 +0800 Subject: [PATCH 036/216] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= =?UTF-8?q?=E5=88=86=E6=9E=90=EF=BC=8C=E5=BC=B9=E6=A1=86=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E4=BC=A0=E9=80=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/projects_controller.rb | 2 +- .../quality_analyses_controller.rb | 11 ++++ app/controllers/repositories_controller.rb | 52 ++++++++++++------- .../repositories/_quality_analyses.html.erb | 8 +-- config/routes.rb | 2 +- 5 files changed, 51 insertions(+), 24 deletions(-) diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 7e1738842..c216491b1 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -393,7 +393,7 @@ class ProjectsController < ApplicationController unless @project.gpid.nil? g = Gitlab.client @gitlab_branches = g.branches(@project.gpid) - @branch_names = g.branches(@project.gpid).map{|b| b.name} + @branch_names = @gitlab_branches.map{|b| b.name} @gitlab_default_branch = g.project(@project.gpid).default_branch end end diff --git a/app/controllers/quality_analyses_controller.rb b/app/controllers/quality_analyses_controller.rb index 0ea288a91..8f9a51666 100644 --- a/app/controllers/quality_analyses_controller.rb +++ b/app/controllers/quality_analyses_controller.rb @@ -1,6 +1,17 @@ class QualityAnalysesController < ApplicationController before_filter :find_project_by_project_id#, :except => [:getattachtype] layout "base_projects" + include ApplicationHelper + + def new + + end + + def create + branch = params[:branch] + language = params[:language] + path = params[:path] + end def index diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index d41def4af..3f630ce51 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -35,6 +35,8 @@ class RepositoriesController < ApplicationController before_filter :find_project_repository, :except => [:new, :create, :newcreate, :edit, :update, :destroy, :committers, :newrepo, :to_gitlab, :forked, :project_archive] before_filter :find_changeset, :only => [:revision, :add_related_issue, :remove_related_issue] before_filter :authorize , :except => [:newrepo,:newcreate,:fork, :to_gitlab, :forked, :commit_diff, :project_archive, :quality_analyses] + # 链接gitlab + before_filter :connect_gitlab, :only => [:quality_analyses] accept_rss_auth :revisions # hidden repositories filter // 隐藏代码过滤器 before_filter :check_hidden_repo, :only => [:show, :stats, :revisions, :revision, :diff ] @@ -308,26 +310,30 @@ update end def quality_analyses - language = params[:language] - branch = params[:branch] - path = params[:path] - user_name = User.find(@project.user_id).try(:login) - rep_name = params[:repository_id] - host = "192.168.0.200" - port = "1125" - username = "git" - password = "123123" - server_cmd1 = "sh gitclone.sh" + " " + user_name + " " + rep_name - # 连接到远程主机 foobar - ssh = Net::SSH.start(host, username, :port => port, :password => password) do |ssh| - result = ssh.exec!(server_cmd1) - path = "/home/git/repo/" + user_name + "/" + rep_name - # sonar 分析 - # server_cmd2 - # 删除clone的版本库 - # server_cmd3 - end + gitlab_branches = @g.branches(@project.gpid) + @branch_names = gitlab_branches.map{|b| b.name} + @gitlab_default_branch = @g.project(@project.gpid).default_branch + # language = params[:language] + # branch = params[:branch] + # path = params[:path] + # user_name = User.find(@project.user_id).try(:login) + # rep_name = params[:repository_id] + # host = "192.168.0.200" + # port = "1125" + # username = "git" + # password = "123123" + # server_cmd1 = "sh gitclone.sh" + " " + user_name + " " + rep_name + # # 连接到远程主机 foobar + # ssh = Net::SSH.start(host, username, :port => port, :password => password) do |ssh| + # result = ssh.exec!(server_cmd1) + # path = "/home/git/repo/" + user_name + "/" + rep_name + # # sonar 分析 + # # server_cmd2 + # # 删除clone的版本库 + # # server_cmd3 + # end respond_to do |format| + format.js format.html{ render :layout => "base_projects" } @@ -643,6 +649,14 @@ update project.project_score.update_attribute(:commit_time, date.created_at) end + # 链接gitlab + def connect_gitlab + @g = Gitlab.client + unless @project.gpid.nil? + @g_project = @g.project(@project.gpid) + end + end + def find_repository @repository = Repository.find(params[:id]) @project = @repository.project diff --git a/app/views/repositories/_quality_analyses.html.erb b/app/views/repositories/_quality_analyses.html.erb index 7424e0369..56951f3b6 100644 --- a/app/views/repositories/_quality_analyses.html.erb +++ b/app/views/repositories/_quality_analyses.html.erb @@ -1,5 +1,7 @@ -<%= form_tag( url_for(:controller => 'repositories', :action => 'quality_analyses'), :remote => true , :method => 'post', :class => 'resourcesSearchloadBox mt10', :id => 'resource_search_form') do %> - +<%= form_tag( url_for(:controller => 'quality_analyses', :action => 'create', :project_id => @project.id), :remote => true , :class => 'resourcesSearchloadBox mt10', :id => 'quality_analyses_form') do %> + <%= select_tag :branch, options_for_select(["#{@gitlab_default_branch}"]+ @branch_names, @rev), :id => 'branch' %> - <%= select_tag :language, options_for_select(["Java","C"]), :id => 'branch' %> + <%= select_tag :language, options_for_select(["Java","C","PHP", "Web"]), :id => 'branch' %> + + <% end %> \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 17614f4b6..b32816673 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -782,7 +782,7 @@ RedmineApp::Application.routes.draw do end end - resources :quality_analyses, :only => [:index] do + resources :quality_analyses, :only => [:index, :new, :create] do collection do end member do From 61c117b8cbc86ccb8de23c40f86295f727c6ce1e Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Mon, 20 Jun 2016 14:39:20 +0800 Subject: [PATCH 037/216] =?UTF-8?q?=E9=87=8D=E6=9E=84=E8=80=81=E7=9A=84?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=EF=BC=8C=E6=9C=AC=E5=9C=B0=E9=80=9A=E8=BF=87?= =?UTF-8?q?session=E6=9D=A5=E5=AD=98=E6=94=BEtoken,=20=E6=89=80=E6=9C=89?= =?UTF-8?q?=E7=9A=84=E8=AE=BF=E9=97=AE=E7=9B=B4=E6=8E=A5=E7=94=A8=E8=80=81?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/mobile/apis/activities.rb | 2 +- app/api/mobile/apis/issues.rb | 3 +- app/api/mobile/apis/journal_for_messages.rb | 3 +- app/api/mobile/apis/messages.rb | 3 +- app/api/mobile/apis/new_comment.rb | 4 +- app/api/mobile/apis/newss.rb | 3 +- app/api/mobile/apis/praise.rb | 5 +- app/api/mobile/apis/users.rb | 17 ++++- app/api/mobile/apis/whomeworks.rb | 3 +- public/assets/wechat/activities.html | 1 + public/assets/wechat/app.html | 2 +- public/assets/wechat/blog_detail.html | 2 +- public/assets/wechat/course_discussion.html | 2 +- public/assets/wechat/course_notice.html | 2 +- public/assets/wechat/homework_detail.html | 2 +- public/assets/wechat/issue.html | 50 ------------ public/assets/wechat/issue_detail.html | 2 +- public/assets/wechat/jour_message_detail.html | 2 +- public/assets/wechat/login.html | 2 +- public/assets/wechat/project_discussion.html | 2 +- public/javascripts/wechat/app.js | 21 ++++- .../wechat/controllers/activity.js | 14 ++-- public/javascripts/wechat/controllers/blog.js | 44 +++-------- .../wechat/controllers/course_notice.js | 40 +++------- .../wechat/controllers/discussion.js | 42 +++------- .../wechat/controllers/homework.js | 42 +++------- .../javascripts/wechat/controllers/issue.js | 43 +++-------- .../wechat/controllers/journals.js | 44 +++-------- .../javascripts/wechat/controllers/login.js | 13 ++-- public/javascripts/wechat/directives/alert.js | 10 ++- public/javascripts/wechat/others/factory.js | 76 ++++++++++++++++--- public/javascripts/wechat/others/routes.js | 57 +++++--------- 32 files changed, 232 insertions(+), 326 deletions(-) delete mode 100644 public/assets/wechat/issue.html diff --git a/app/api/mobile/apis/activities.rb b/app/api/mobile/apis/activities.rb index 49fdaff8f..661925012 100644 --- a/app/api/mobile/apis/activities.rb +++ b/app/api/mobile/apis/activities.rb @@ -9,7 +9,7 @@ module Mobile params do requires :page, type: Integer - requires :openid, type: String + requires :token, type: String end post do authenticate! diff --git a/app/api/mobile/apis/issues.rb b/app/api/mobile/apis/issues.rb index b767bd768..4a6417cb4 100644 --- a/app/api/mobile/apis/issues.rb +++ b/app/api/mobile/apis/issues.rb @@ -8,7 +8,8 @@ module Mobile desc "get special issuse" get ':id' do - user = UserWechat.find_by_openid(params[:openid]).user + authenticate! + user = current_user issue = Issue.find params[:id] present :data, issue, with: Mobile::Entities::Issue,user: user present :status, 0 diff --git a/app/api/mobile/apis/journal_for_messages.rb b/app/api/mobile/apis/journal_for_messages.rb index 15a571a82..5f2d01185 100644 --- a/app/api/mobile/apis/journal_for_messages.rb +++ b/app/api/mobile/apis/journal_for_messages.rb @@ -7,7 +7,8 @@ module Mobile desc "get special journal" get ':id' do - user = UserWechat.find_by_openid(params[:openid]).user + authenticate! + user = current_user jour = JournalsForMessage.find params[:id] present :data, jour, with: Mobile::Entities::Jours,user: user present :status, 0 diff --git a/app/api/mobile/apis/messages.rb b/app/api/mobile/apis/messages.rb index ae2f9a39c..bab82de8d 100644 --- a/app/api/mobile/apis/messages.rb +++ b/app/api/mobile/apis/messages.rb @@ -7,7 +7,8 @@ module Mobile desc "get special topic" get ':id' do - user = UserWechat.find_by_openid(params[:openid]).user + authenticate! + user = current_user message = Message.find params[:id] present :data, message, with: Mobile::Entities::Message,user: user present :status, 0 diff --git a/app/api/mobile/apis/new_comment.rb b/app/api/mobile/apis/new_comment.rb index 694ec0613..5b7159301 100644 --- a/app/api/mobile/apis/new_comment.rb +++ b/app/api/mobile/apis/new_comment.rb @@ -11,12 +11,12 @@ module Mobile params do requires :type, type: String requires :content, type: String - requires :openid, type: String + requires :token, type: String end post ':id' do + authenticate! type = params[:type] result = 1 - current_user = UserWechat.find_by_openid(params[:openid]).user if params[:content]!="" && current_user case type when "HomeworkCommon" diff --git a/app/api/mobile/apis/newss.rb b/app/api/mobile/apis/newss.rb index 8bdd460cc..d42177783 100644 --- a/app/api/mobile/apis/newss.rb +++ b/app/api/mobile/apis/newss.rb @@ -7,7 +7,8 @@ module Mobile desc "get special news" get ':id' do - user = UserWechat.find_by_openid(params[:openid]).user + authenticate! + user = current_user news = News.find params[:id] present :data, news, with: Mobile::Entities::News,user: user present :status, 0 diff --git a/app/api/mobile/apis/praise.rb b/app/api/mobile/apis/praise.rb index 57dbd0729..834d1195b 100644 --- a/app/api/mobile/apis/praise.rb +++ b/app/api/mobile/apis/praise.rb @@ -9,12 +9,13 @@ module Mobile params do requires :type, type: String - requires :openid, type: String + requires :token, type: String end post ':id' do + authenticate! obj_id = params[:id] obj_type = params[:type] - user = UserWechat.find_by_openid(params[:openid]).user + 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) diff --git a/app/api/mobile/apis/users.rb b/app/api/mobile/apis/users.rb index 5aee29fe2..e3041abcd 100644 --- a/app/api/mobile/apis/users.rb +++ b/app/api/mobile/apis/users.rb @@ -4,6 +4,20 @@ module Mobile class Users < Grape::API resource :users do + 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 @@ -29,8 +43,7 @@ module Mobile ) # ws = WechatService.new # ws.binding_succ_notice(user.id, "您已成功绑定Trustie平台", user.login, format_time(Time.now)) - present status: 0 - present message: '绑定成功' + present status: 0, message: '您已成功绑定Trustie平台' end desc "注册用户" diff --git a/app/api/mobile/apis/whomeworks.rb b/app/api/mobile/apis/whomeworks.rb index a88d509a3..c8377aa0d 100644 --- a/app/api/mobile/apis/whomeworks.rb +++ b/app/api/mobile/apis/whomeworks.rb @@ -7,7 +7,8 @@ module Mobile desc "get one homework" get ':id' do - user = UserWechat.find_by_openid(params[:openid]).user + authenticate! + user = current_user homework = HomeworkCommon.find params[:id] present :data, homework, with: Mobile::Entities::Whomework,user: user present :status, 0 diff --git a/public/assets/wechat/activities.html b/public/assets/wechat/activities.html index 69ea8f1fa..fd5b44b2b 100644 --- a/public/assets/wechat/activities.html +++ b/public/assets/wechat/activities.html @@ -254,6 +254,7 @@
    更多
    +
    diff --git a/public/assets/wechat/app.html b/public/assets/wechat/app.html index 6965d24f3..a3977ec5c 100644 --- a/public/assets/wechat/app.html +++ b/public/assets/wechat/app.html @@ -20,7 +20,7 @@ diff --git a/public/assets/wechat/blog_detail.html b/public/assets/wechat/blog_detail.html index 509e0171a..762bd090e 100644 --- a/public/assets/wechat/blog_detail.html +++ b/public/assets/wechat/blog_detail.html @@ -39,7 +39,7 @@ - +
    diff --git a/public/assets/wechat/course_discussion.html b/public/assets/wechat/course_discussion.html index 2e7ed3151..69daf2b05 100644 --- a/public/assets/wechat/course_discussion.html +++ b/public/assets/wechat/course_discussion.html @@ -46,7 +46,7 @@ - +
    diff --git a/public/assets/wechat/course_notice.html b/public/assets/wechat/course_notice.html index cca135681..6d2d49d23 100644 --- a/public/assets/wechat/course_notice.html +++ b/public/assets/wechat/course_notice.html @@ -45,7 +45,7 @@ - +
    diff --git a/public/assets/wechat/homework_detail.html b/public/assets/wechat/homework_detail.html index 0fc39c735..974af2246 100644 --- a/public/assets/wechat/homework_detail.html +++ b/public/assets/wechat/homework_detail.html @@ -59,7 +59,7 @@ - +
    diff --git a/public/assets/wechat/issue.html b/public/assets/wechat/issue.html deleted file mode 100644 index 558496ef0..000000000 --- a/public/assets/wechat/issue.html +++ /dev/null @@ -1,50 +0,0 @@ - - - - react js - - - - - - - - - - - -
    - - - - - - - - - - \ No newline at end of file diff --git a/public/assets/wechat/issue_detail.html b/public/assets/wechat/issue_detail.html index 1d7f9a536..4438c453d 100644 --- a/public/assets/wechat/issue_detail.html +++ b/public/assets/wechat/issue_detail.html @@ -49,7 +49,7 @@ - +
    diff --git a/public/assets/wechat/jour_message_detail.html b/public/assets/wechat/jour_message_detail.html index dc6b1409f..9fd09de2c 100644 --- a/public/assets/wechat/jour_message_detail.html +++ b/public/assets/wechat/jour_message_detail.html @@ -37,7 +37,7 @@ - +
    diff --git a/public/assets/wechat/login.html b/public/assets/wechat/login.html index d34d0054c..309db29de 100644 --- a/public/assets/wechat/login.html +++ b/public/assets/wechat/login.html @@ -22,4 +22,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/public/assets/wechat/project_discussion.html b/public/assets/wechat/project_discussion.html index 4831e1521..696ffd7d1 100644 --- a/public/assets/wechat/project_discussion.html +++ b/public/assets/wechat/project_discussion.html @@ -45,7 +45,7 @@ - +
    diff --git a/public/javascripts/wechat/app.js b/public/javascripts/wechat/app.js index d4275e9df..472a5a377 100644 --- a/public/javascripts/wechat/app.js +++ b/public/javascripts/wechat/app.js @@ -4,5 +4,24 @@ app.constant('config', { rootPath: '/assets/wechat/', rootUrl: '/', apiUrl: '/api/v1/' +}); -}); \ No newline at end of file + +app.run(['$rootScope', 'auth', '$location', function($rootScope, auth, $location){ + $rootScope.$on('$routeChangeError', function(event, next, current){ + + if(next && next.templateUrl){ + if(!next.templateUrl.endsWith("login.html") && !next.templateUrl.endsWith("reg.html")){ + $location.path("/login"); + } + } + }); + + $rootScope.$on('$routeChangeStart', function(event, next, current){ + if(next && next.templateUrl){ + if(!next.templateUrl.endsWith("login.html") && !next.templateUrl.endsWith("reg.html")){ + } + } + }); +} +]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/activity.js b/public/javascripts/wechat/controllers/activity.js index e17b7c5b3..e44eb3ea2 100644 --- a/public/javascripts/wechat/controllers/activity.js +++ b/public/javascripts/wechat/controllers/activity.js @@ -1,11 +1,12 @@ app.controller('ActivityController', - ['$anchorScroll', '$location','$scope', '$http', '$timeout', 'auth', 'rms', 'common', - function($anchorScroll, $location,$scope, $http, $timeout, auth, rms, common){ + ['$anchorScroll', '$location','$scope', '$http', '$timeout', 'auth', 'rms', 'common','alertService', + function($anchorScroll, $location,$scope, $http, $timeout, auth, rms, common, alertService){ $scope.replaceUrl = function(url){ return url; }; + $scope.alertService = alertService.create(); console.log("ActivityController load"); $scope.page = rms.get('page') || 0; @@ -18,7 +19,7 @@ app.controller('ActivityController', $http({ method: 'POST', url: apiUrl+ "activities", - data: {openid: auth.openid(), page: page} + data: {token: auth.token(), page: page} }).then(function successCallback(response) { if(response.data.page >0) { $scope.activities = $scope.activities.concat(response.data.data); @@ -38,18 +39,17 @@ app.controller('ActivityController', }; if($scope.activities.length<=0){ - auth.getOpenId().then( - function successCallback(response){ + auth.isBind().then( + function(){ $scope.loadActData(0); }, function errorCallback(response) { - alert("获取openid出错:"+response); + $scope.alertService.showMessage("获取token出错",response); } ); } else { $timeout(function(){ window.scrollTo(0, rms.get("yoffset")); }); - } //跳到详情页 diff --git a/public/javascripts/wechat/controllers/blog.js b/public/javascripts/wechat/controllers/blog.js index 8eb45b604..4c2403944 100644 --- a/public/javascripts/wechat/controllers/blog.js +++ b/public/javascripts/wechat/controllers/blog.js @@ -1,40 +1,16 @@ - app.controller('BlogController', ['$scope', '$http', '$routeParams', 'auth', 'common', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - - var loadData = function(id){ - common.loadCommonData(id, 'blog_comments').then(function successCallback(response) { - console.log(response.data); - $scope.blog = response.data.data; - }, function errorCallback(response) { - }); - }; - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); - } - ); - - $scope.addBlogReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'BlogComment', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); + common.init({ + id: $routeParams.id, + scope: $scope, + type: 'blog_comments', + replyType: 'BlogComment', + loadCallback: function(data){ + $scope.blog = data.data; + }, + replyCallback: function(){ + } }); - }; - - $scope.addPraise = function(act){ - console.log(act); - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - console.log(act); - common.decreaseCommonPraise(act); - }; }]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/course_notice.js b/public/javascripts/wechat/controllers/course_notice.js index 24b0fdbe1..77d2e6ab0 100644 --- a/public/javascripts/wechat/controllers/course_notice.js +++ b/public/javascripts/wechat/controllers/course_notice.js @@ -1,36 +1,16 @@ app.controller('CourseNoticeController', ['$scope', '$http', '$routeParams', 'auth', 'common', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - var loadData = function(id){ - common.loadCommonData(id, 'newss').then(function successCallback(response) { - console.log(response.data); - $scope.news = response.data.data; - }, function errorCallback(response) { + common.init({ + id: $routeParams.id, + scope: $scope, + type: 'newss', + replyType: 'News', + loadCallback: function(data){ + $scope.news = data.data; + }, + replyCallback: function(){ + } }); - }; - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); - } - ); - - $scope.addNoticeReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'News', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - }); - }; - - $scope.addPraise = function(act){ - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - common.decreaseCommonPraise(act); - }; }]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/discussion.js b/public/javascripts/wechat/controllers/discussion.js index 4828cb39a..7e0811a0d 100644 --- a/public/javascripts/wechat/controllers/discussion.js +++ b/public/javascripts/wechat/controllers/discussion.js @@ -1,36 +1,14 @@ app.controller('DiscussionController', ['$scope', '$http', '$routeParams', 'auth', 'common', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - - var loadData = function(id){ - common.loadCommonData(id, 'messages').then(function successCallback(response) { - console.log(response.data); - $scope.discussion = response.data.data; - }, function errorCallback(response) { - }); - }; - - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); + common.init({ + id: $routeParams.id, + scope: $scope, + type: 'messages', + replyType: 'Message', + loadCallback: function(data){ + $scope.discussion = data.data; + }, + replyCallback: function(){ } - ); - - $scope.addDiscussionReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'Message', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - }); - }; - - $scope.addPraise = function(act){ - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - common.decreaseCommonPraise(act); - }; + }); }]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/homework.js b/public/javascripts/wechat/controllers/homework.js index 795bf30e9..58f70db5a 100644 --- a/public/javascripts/wechat/controllers/homework.js +++ b/public/javascripts/wechat/controllers/homework.js @@ -1,36 +1,16 @@ app.controller('HomeworkController', ['$scope', '$http', '$routeParams', 'auth', 'common', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - - var loadData = function(id){ - common.loadCommonData(id, 'whomeworks').then(function successCallback(response) { - console.log(response.data); - $scope.homework = response.data.data; - }, function errorCallback(response) { - }); - }; - - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); + common.init({ + id: $routeParams.id, + scope: $scope, + type: 'whomeworks', + replyType: 'HomeworkCommon', + loadCallback: function(data){ + console.log(data); + $scope.homework = data.data; + }, + replyCallback: function(){ } - ); - - $scope.addHomeworkReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'HomeworkCommon', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - }); - }; - - $scope.addPraise = function(act){ - common.addCommonPraise(act); - }; + }); - $scope.decreasePraise = function(act){ - common.decreaseCommonPraise(act); - }; }]); diff --git a/public/javascripts/wechat/controllers/issue.js b/public/javascripts/wechat/controllers/issue.js index 09602f9e1..ae0cc4450 100644 --- a/public/javascripts/wechat/controllers/issue.js +++ b/public/javascripts/wechat/controllers/issue.js @@ -1,36 +1,15 @@ app.controller('IssueController', ['$scope', '$http', '$routeParams', 'auth', 'common', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - var loadData = function(id){ - common.loadCommonData(id, 'issues').then(function successCallback(response) { - console.log(response.data); - $scope.issue = response.data.data; - }, function errorCallback(response) { - }); - }; - - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); + common.init({ + id: $routeParams.id, + scope: $scope, + type: 'issues', + replyType: 'Issue', + loadCallback: function(data){ + console.log(data); + $scope.issue = data.data; + }, + replyCallback: function(){ } - ); - - $scope.addIssueReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'Issue', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - }); - - }; - - $scope.addPraise = function(act){ - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - common.decreaseCommonPraise(act); - }; + }); }]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/journals.js b/public/javascripts/wechat/controllers/journals.js index f379525d7..76b4f8cf6 100644 --- a/public/javascripts/wechat/controllers/journals.js +++ b/public/javascripts/wechat/controllers/journals.js @@ -1,37 +1,13 @@ app.controller('JournalsController', ['$scope', '$http', '$routeParams', 'auth', 'common', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - - var loadData = function(id){ - common.loadCommonData(id, 'journal_for_messages').then(function successCallback(response) { - console.log(response.data); - $scope.message = response.data.data; - }, function errorCallback(response) { - }); - }; - - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); + common.init({ + id: $routeParams.id, + scope: $scope, + type: 'journal_for_messages', + replyType: 'JournalsForMessage', + loadCallback: function(data){ + $scope.message = data.data; + }, + replyCallback: function(){ } - ); - - $scope.addJournalReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'JournalsForMessage', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - }); - }; - - $scope.addPraise = function(act){ - console.log(act); - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - console.log(act); - common.decreaseCommonPraise(act); - }; + }); }]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/login.js b/public/javascripts/wechat/controllers/login.js index a760ce8ea..35b750e8c 100644 --- a/public/javascripts/wechat/controllers/login.js +++ b/public/javascripts/wechat/controllers/login.js @@ -1,5 +1,8 @@ app.controller('LoginController', ['$scope', '$http', '$location', '$routeParams', 'alertService', 'config','auth','session', function ($scope, $http, $location, $routeParams, alertService, config, auth,session) { + if(auth.isBind().then(function(){ + $location.path("/activities"); + })); if($routeParams.code){ session.save('code', $routeParams.code); @@ -21,7 +24,7 @@ app.controller('LoginController', ['$scope', '$http', '$location', '$routeParams console.log(apiUrl + "auth"); - auth.getOpenId().then( + auth.openid().then( function(openid){ return $http.post( config.apiUrl + "users/wxbind", @@ -30,11 +33,12 @@ app.controller('LoginController', ['$scope', '$http', '$location', '$routeParams } ).then( function(response) { - vm.loginFailed = (response.data.status != 0); console.log(response.data); - vm.alertService.showMessage('出错了', response.data.message); - + vm.loginFailed = (response.data.status != 0); if (!$scope.loginFailed) { //绑定成功 + vm.alertService.showMessage('提示', response.data.message, function(){ + $location.path("/activities"); + }); } else { vm.alertService.showMessage('出错了', response.data.message); } @@ -47,7 +51,6 @@ app.controller('LoginController', ['$scope', '$http', '$location', '$routeParams vm.showBox = function () { vm.findPwdDialog.showMessage("提示", "请访问www.trustie.net获取密码,谢谢!"); } - vm.goReg = function () { $location.path('/reg'); } diff --git a/public/javascripts/wechat/directives/alert.js b/public/javascripts/wechat/directives/alert.js index aa346cb8c..332ec65bf 100644 --- a/public/javascripts/wechat/directives/alert.js +++ b/public/javascripts/wechat/directives/alert.js @@ -2,14 +2,16 @@ app.directive('myAlert', ['config', function(config){ return { templateUrl: config.rootPath+ 'templates/alert.html', scope: { - message: "=", title: "=", - visible: "=" + message: "=", + visible: "=", + cb: "=" }, link: function(scope){ - scope.visible = false; scope.dismiss = function(){ - scope.visible = false; + if(typeof scope.cb === 'function'){ + scope.cb(); + } }; } } diff --git a/public/javascripts/wechat/others/factory.js b/public/javascripts/wechat/others/factory.js index 3cb601d2b..c4aca60f4 100644 --- a/public/javascripts/wechat/others/factory.js +++ b/public/javascripts/wechat/others/factory.js @@ -3,18 +3,21 @@ app.factory('alertService', function(){ this.title = null; this.message = null; this.visible = null; + this.cb = null; } - Alert.prototype.showMessage = function(title, msg){ + Alert.prototype.showMessage = function(title, msg, cb){ this.message = msg; this.title = title; this.visible = true; + this.cb = cb; } Alert.prototype.dismiss = function(){ this.message = null; this.title = null; this.visible = false; + if(this.cb) {this.cb();} } return { @@ -25,7 +28,7 @@ app.factory('alertService', function(){ }); -app.factory('auth', ['$http','$routeParams', '$q', 'session', function($http,$routeParams, $q, session){ +app.factory('auth', ['$http','$routeParams', '$q', 'session', 'config',function($http,$routeParams, $q, session,config){ var _openid = ''; if(typeof g_openid !== 'undefined'){ @@ -36,6 +39,34 @@ app.factory('auth', ['$http','$routeParams', '$q', 'session', function($http,$ro _openid = session.get("openid"); } + //是否已经绑定 + var isBind = function(){ + var defer = $q.defer(); + + var token = getToken(); + if(token && token.length>10){ + defer.resolve(token); + } else { + getOpenId().then(function(openid){ + return $http.post( + config.apiUrl+ 'users/isbind', + {openid: openid} + ) + }).then(function(response){ + if(response.data.status!=0){ + defer.reject(response.data.message); + }else { + session.save("token", response.data.token); + defer.resolve(response.data.token); + } + }).catch(function(e){ + defer.reject(e); + }); + } + + return defer.promise; + } + var getOpenId = function() { var deferred = $q.defer(); console.log(_openid); @@ -52,7 +83,7 @@ app.factory('auth', ['$http','$routeParams', '$q', 'session', function($http,$ro deferred.reject(response.data.message); } else{ _openid = response.data.openid; - session.save("openid", _openid); + //session.save("openid", _openid); deferred.resolve(_openid); } }, function errorCallback(response) { @@ -64,7 +95,10 @@ app.factory('auth', ['$http','$routeParams', '$q', 'session', function($http,$ro var openid = function(){ return _openid; }; - return {getOpenId: getOpenId, openid: openid}; + var getToken = function(){ + return session.get("token"); + } + return {isBind: isBind, token: getToken, openid: getOpenId}; }]); app.factory("session", function(){ @@ -103,7 +137,7 @@ app.factory('common', ['$http', 'auth', '$routeParams', function($http, auth, $r var userInfo = { type: type, content: temp, - openid: auth.openid() + token: auth.token() }; //回复按钮禁用 data.disabled = true; @@ -126,7 +160,7 @@ app.factory('common', ['$http', 'auth', '$routeParams', function($http, auth, $r var loadCommonData = function(id, type){ return $http({ method: 'GET', - url: apiUrl+ type + "/" + id+"?openid="+auth.openid() + url: apiUrl+ type + "/" + id+"?token="+auth.token() }) }; @@ -137,7 +171,7 @@ app.factory('common', ['$http', 'auth', '$routeParams', function($http, auth, $r $http({ method: 'POST', url: apiUrl + "praise/" + act.act_id, - data:{openid:auth.openid(),type:act.act_type} + data:{token:auth.token(),type:act.act_type} }).then(function successCallback(response) { console.log(response.data); }, function errorCallback(response) { @@ -152,12 +186,36 @@ app.factory('common', ['$http', 'auth', '$routeParams', function($http, auth, $r $http({ method: 'POST', url: apiUrl + "praise/" + act.act_id, - data:{openid:auth.openid(),type:act.act_type} + data:{token:auth.token(),type:act.act_type} }).then(function successCallback(response) { console.log(response.data); }, function errorCallback(response) { }); }; - return {addCommonReply: addCommonReply, loadCommonData: loadCommonData, addCommonPraise: addCommonPraise, decreaseCommonPraise: decreaseCommonPraise}; + var init = function(args){ + args.scope.formData = {comment: ''}; + var loadData = function(id){ + loadCommonData(id, args.type).then(function successCallback(response) { + args.loadCallback(response.data); + }, function errorCallback(response) { + }); + }; + + loadData(args.id); + args.scope.addReply = function(data){ + console.log(data.comment); + addCommonReply(args.id, args.replyType, data, function(){ + args.scope.formData = {comment: ''}; + loadData(args.id); + if(typeof args.replyCallback === 'function'){ + args.replyCallback(); + } + }); + }; + args.scope.addPraise = addCommonPraise; + args.scope.decreasePraise = decreaseCommonPraise; + } + + return {init: init, addCommonReply: addCommonReply, loadCommonData: loadCommonData, addCommonPraise: addCommonPraise, decreaseCommonPraise: decreaseCommonPraise}; }]); \ No newline at end of file diff --git a/public/javascripts/wechat/others/routes.js b/public/javascripts/wechat/others/routes.js index ded374930..b4a4e4067 100644 --- a/public/javascripts/wechat/others/routes.js +++ b/public/javascripts/wechat/others/routes.js @@ -1,5 +1,17 @@ app.config(['$routeProvider',"$httpProvider", "$locationProvider",'config', function ($routeProvider, $httpProvider, $locationProvider, config) { var rootPath = config.rootPath; + var resolve = { + delay: ['auth',function(auth){ + return auth.isBind(); + }] + }; + var makeRoute = function(path, ctrl){ + return { + templateUrl: rootPath + path, + controller: ctrl, + resolve: resolve + } + } //$locationProvider.html5Mode(true); $routeProvider .when('/login', { @@ -10,42 +22,15 @@ app.config(['$routeProvider',"$httpProvider", "$locationProvider",'config', func templateUrl: rootPath + 'reg.html', controller: 'RegController' }) - .when('/activites', { - templateUrl: rootPath + 'activities.html', - controller: 'ActivityController' - }) - .when('/issues/:id', { - templateUrl: rootPath + 'issue_detail.html', - controller: 'IssueController' - }) - .when('/project_discussion/:id', { - templateUrl: rootPath + 'project_discussion.html', - controller: 'DiscussionController' - }) - .when('/homework/:id', { - templateUrl: rootPath + 'homework_detail.html', - controller: 'HomeworkController' - }) - .when('/course_notice/:id', { - templateUrl: rootPath + 'course_notice.html', - controller: 'CourseNoticeController' - }) - .when('/course_discussion/:id', { - templateUrl: rootPath + 'course_discussion.html', - controller: 'DiscussionController' - }) - .when('/journal_for_message/:id', { - templateUrl: rootPath + 'jour_message_detail.html', - controller: 'JournalsController' - }) - .when('/blog_comment/:id', { - templateUrl: rootPath + 'blog_detail.html', - controller: 'BlogController' - }) - .when('/add_class', { - templateUrl: rootPath + 'add_class.html', - controller: 'AddClassController' - }) + .when('/activites', makeRoute('activities.html', 'ActivityController')) + .when('/issues/:id', makeRoute('issue_detail.html', 'IssueController')) + .when('/project_discussion/:id', makeRoute('project_discussion.html', 'DiscussionController')) + .when('/homework/:id', makeRoute('homework_detail.html', 'HomeworkController')) + .when('/course_notice/:id', makeRoute('course_notice.html', 'CourseNoticeController')) + .when('/course_discussion/:id', makeRoute('course_discussion.html', 'DiscussionController')) + .when('/journal_for_message/:id', makeRoute('jour_message_detail.html', 'JournalsController')) + .when('/blog_comment/:id', makeRoute('blog_detail.html', 'BlogController')) + .when('/add_class', makeRoute('add_class.html', 'AddClassController')) .otherwise({ redirectTo: '/activites' }); From 3f98562c0fe304f828c9c8c4d782ba1767ae514e Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Mon, 20 Jun 2016 14:45:19 +0800 Subject: [PATCH 038/216] =?UTF-8?q?=E6=89=93=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/wechats_controller.rb | 16 +++++++-------- app/views/wechats/user_activities.html.erb | 2 +- public/javascripts/wechat/build/app.min.js | 24 +++++++++++++--------- 3 files changed, 23 insertions(+), 19 deletions(-) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index 930318fa5..cfd83cce1 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -207,14 +207,14 @@ class WechatsController < ActionController::Base end def user_activities - session[:wechat_code] = params[:code] if params[:code] - code = params[:code] || session[:wechat_code] - openid = get_openid_from_code(code) - @wechat_user = user_binded?(openid) - unless @wechat_user - redirect_to login_wechat_path - return - end + # session[:wechat_code] = params[:code] if params[:code] + # code = params[:code] || session[:wechat_code] + # openid = get_openid_from_code(code) + # @wechat_user = user_binded?(openid) + # unless @wechat_user + # redirect_to login_wechat_path + # return + # end render 'wechats/user_activities', layout: nil end diff --git a/app/views/wechats/user_activities.html.erb b/app/views/wechats/user_activities.html.erb index 073d45495..ccbf2a2b1 100644 --- a/app/views/wechats/user_activities.html.erb +++ b/app/views/wechats/user_activities.html.erb @@ -12,7 +12,7 @@ diff --git a/public/javascripts/wechat/build/app.min.js b/public/javascripts/wechat/build/app.min.js index d8eacbf1b..26995dea2 100644 --- a/public/javascripts/wechat/build/app.min.js +++ b/public/javascripts/wechat/build/app.min.js @@ -1,14 +1,18 @@ -var app=angular.module("wechat",["ngRoute"]); -app.factory("auth",["$http","$routeParams","$q",function(e,n,t){var o="";"undefined"!=typeof g_openid&&(o=g_openid);var a=function(){var a=t.defer();if("undefined"!=typeof o&&o.length>0)a.resolve(o);else{var i=n.code;e({url:"/wechat/get_open_id",data:{code:i},method:"POST"}).then(function(e){o=e.data.openid,a.resolve(o)},function(e){a.reject(e)})}return a.promise},i=function(){return o};return{getOpenId:a,openid:i}}]),app.factory("rms",function(){var e={},n=function(n,t){e[n]=t},t=function(n){return e[n]};return{save:n,get:t}}),app.factory("common",["$http","auth","$routeParams",function(e,n,t){var o=function(t,o,a,i){if(a.comment&&!(a.comment.length<=0)){var r=a.comment.replace(/\n/g,"
    "),d={type:o,content:r,openid:n.openid()};a.disabled=!0,e({method:"POST",url:apiUrl+"new_comment/"+t,data:d}).then(function(e){a.disabled=!1,"function"==typeof i&&i()},function(e){})}},a=function(t,o){return e({method:"GET",url:apiUrl+o+"/"+t+"?openid="+n.openid()})},i=function(t){t.praise_count+=1,t.has_praise=!0,e({method:"POST",url:apiUrl+"praise/"+t.act_id,data:{openid:n.openid(),type:t.act_type}}).then(function(e){console.log(e.data)},function(e){})},r=function(t){t.praise_count-=1,t.has_praise=!1,e({method:"POST",url:apiUrl+"praise/"+t.act_id,data:{openid:n.openid(),type:t.act_type}}).then(function(e){console.log(e.data)},function(e){})};return{addCommonReply:o,loadCommonData:a,addCommonPraise:i,decreaseCommonPraise:r}}]); +var app=angular.module("wechat",["ngRoute"]);app.constant("config",{rootPath:"/assets/wechat/",rootUrl:"/",apiUrl:"/api/v1/"}),app.run(["$rootScope","auth","$location",function(t,e,a){t.$on("$routeChangeError",function(t,e,l){e&&e.templateUrl&&(e.templateUrl.endsWith("login.html")||e.templateUrl.endsWith("reg.html")||a.path("/login"))}),t.$on("$routeChangeStart",function(t,e,a){e&&e.templateUrl&&!e.templateUrl.endsWith("login.html")&&!e.templateUrl.endsWith("reg.html")})}]); +app.factory("alertService",function(){function t(){this.title=null,this.message=null,this.visible=null,this.cb=null}return t.prototype.showMessage=function(t,e,n){this.message=e,this.title=t,this.visible=!0,this.cb=n},t.prototype.dismiss=function(){this.message=null,this.title=null,this.visible=!1,this.cb&&this.cb()},{create:function(){return new t}}}),app.factory("auth",["$http","$routeParams","$q","session","config",function(t,e,n,o,a){var i="";"undefined"!=typeof g_openid&&(i=g_openid),i||(i=o.get("openid"));var r=function(){var e=n.defer(),i=c();return i&&i.length>10?e.resolve(i):s().then(function(e){return t.post(a.apiUrl+"users/isbind",{openid:e})}).then(function(t){0!=t.data.status?e.reject(t.data.message):(o.save("token",t.data.token),e.resolve(t.data.token))})["catch"](function(t){e.reject(t)}),e.promise},s=function(){var a=n.defer();if(console.log(i),"undefined"!=typeof i&&i&&i.length>0)a.resolve(i);else{var r=e.code||o.get("code");t({url:"/wechat/get_open_id",data:{code:r},method:"POST"}).then(function(t){0!=t.data.status?a.reject(t.data.message):(i=t.data.openid,a.resolve(i))},function(t){a.reject(t)})}return a.promise},c=function(){return o.get("token")};return{isBind:r,token:c,openid:s}}]),app.factory("session",function(){return{save:function(t,e){sessionStorage.setItem(t,e)},get:function(t){return sessionStorage.getItem(t)}}}),app.factory("rms",function(){var t={},e=function(e,n){t[e]=n},n=function(e){return t[e]};return{save:e,get:n}}),app.factory("common",["$http","auth","$routeParams",function(t,e,n){var o=function(n,o,a,i){if(a.comment&&!(a.comment.length<=0)){var r=a.comment.replace(/\n/g,"
    "),s={type:o,content:r,token:e.token()};a.disabled=!0,t({method:"POST",url:apiUrl+"new_comment/"+n,data:s}).then(function(t){a.disabled=!1,"function"==typeof i&&i()},function(t){})}},a=function(n,o){return t({method:"GET",url:apiUrl+o+"/"+n+"?token="+e.token()})},i=function(n){n.praise_count+=1,n.has_praise=!0,t({method:"POST",url:apiUrl+"praise/"+n.act_id,data:{token:e.token(),type:n.act_type}}).then(function(t){console.log(t.data)},function(t){})},r=function(n){n.praise_count-=1,n.has_praise=!1,t({method:"POST",url:apiUrl+"praise/"+n.act_id,data:{token:e.token(),type:n.act_type}}).then(function(t){console.log(t.data)},function(t){})},s=function(t){t.scope.formData={comment:""};var e=function(e){a(e,t.type).then(function(e){t.loadCallback(e.data)},function(t){})};e(t.id),t.scope.addReply=function(n){console.log(n.comment),o(t.id,t.replyType,n,function(){t.scope.formData={comment:""},e(t.id),"function"==typeof t.replyCallback&&t.replyCallback()})},t.scope.addPraise=i,t.scope.decreasePraise=r};return{init:s,addCommonReply:o,loadCommonData:a,addCommonPraise:i,decreaseCommonPraise:r}}]); app.filter("safeHtml",["$sce",function(t){return function(n){return t.trustAsHtml(n)}}]); -app.controller("ActivityController",["$anchorScroll","$location","$scope","$http","$timeout","auth","rms","common",function(t,a,e,o,i,n,c,s){e.replaceUrl=function(t){return t},console.log("ActivityController load"),e.page=c.get("page")||0,e.activities=c.get("activities")||[],e.has_more=c.get("has_more"),e.loadActData=function(t){e.page=t,o({method:"POST",url:apiUrl+"activities",data:{openid:n.openid(),page:t}}).then(function(t){t.data.page>0?e.activities=e.activities.concat(t.data.data):e.activities=t.data.data,c.save("activities",e.activities),e.has_more=t.data.count+10*t.data.page0?e.activities=e.activities.concat(t.data.data):e.activities=t.data.data,n.save("activities",e.activities),e.has_more=t.data.count+10*t.data.page
    加载中...
    '}}]); -app.config(["$routeProvider","$httpProvider","$locationProvider",function(e,r,t){var o="/assets/wechat/";e.when("/activites",{templateUrl:o+"activities.html",controller:"ActivityController"}).when("/issues/:id",{templateUrl:o+"issue_detail.html",controller:"IssueController"}).when("/project_discussion/:id",{templateUrl:o+"project_discussion.html",controller:"DiscussionController"}).when("/homework/:id",{templateUrl:o+"homework_detail.html",controller:"HomeworkController"}).when("/course_notice/:id",{templateUrl:o+"course_notice.html",controller:"CourseNoticeController"}).when("/course_discussion/:id",{templateUrl:o+"course_discussion.html",controller:"DiscussionController"}).when("/journal_for_message/:id",{templateUrl:o+"jour_message_detail.html",controller:"JournalsController"}).when("/blog_comment/:id",{templateUrl:o+"blog_detail.html",controller:"BlogController"}).when("/add_class",{templateUrl:o+"add_class.html",controller:"AddClassController"}).otherwise({redirectTo:"/activites"}),r.interceptors.push(["$q","$rootScope",function(e,r){return void 0==r.activeCalls&&(r.activeCalls=0),{request:function(e){return r.activeCalls+=1,e},requestError:function(e){return r.activeCalls-=1,e},response:function(e){return r.activeCalls-=1,e},responseError:function(e){return r.activeCalls-=1,e}}}])}]); \ No newline at end of file +app.config(["$routeProvider","$httpProvider","$locationProvider","config",function(e,o,r,t){var l=t.rootPath,n={delay:["auth",function(e){return e.isBind()}]},i=function(e,o){return{templateUrl:l+e,controller:o,resolve:n}};e.when("/login",{templateUrl:l+"login.html",controller:"LoginController"}).when("/reg",{templateUrl:l+"reg.html",controller:"RegController"}).when("/activites",i("activities.html","ActivityController")).when("/issues/:id",i("issue_detail.html","IssueController")).when("/project_discussion/:id",i("project_discussion.html","DiscussionController")).when("/homework/:id",i("homework_detail.html","HomeworkController")).when("/course_notice/:id",i("course_notice.html","CourseNoticeController")).when("/course_discussion/:id",i("course_discussion.html","DiscussionController")).when("/journal_for_message/:id",i("jour_message_detail.html","JournalsController")).when("/blog_comment/:id",i("blog_detail.html","BlogController")).when("/add_class",i("add_class.html","AddClassController")).otherwise({redirectTo:"/activites"}),o.interceptors.push(["$q","$rootScope",function(e,o){return void 0==o.activeCalls&&(o.activeCalls=0),{request:function(e){return o.activeCalls+=1,e},requestError:function(e){return o.activeCalls-=1,e},response:function(e){return o.activeCalls-=1,e},responseError:function(e){return o.activeCalls-=1,e}}}])}]); \ No newline at end of file From b7230333dcbf6427774698a57de80bc55bd8f7b4 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Mon, 20 Jun 2016 15:21:13 +0800 Subject: [PATCH 039/216] =?UTF-8?q?code=E8=8E=B7=E5=8F=96=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/wechats_controller.rb | 3 ++- app/views/wechats/user_activities.html.erb | 2 +- public/javascripts/wechat/app.js | 3 ++- public/javascripts/wechat/build/app.min.js | 4 ++-- public/javascripts/wechat/others/factory.js | 2 +- 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index cfd83cce1..39e093cdd 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -215,7 +215,8 @@ class WechatsController < ActionController::Base # redirect_to login_wechat_path # return # end - + session[:wechat_code] = params[:code] if params[:code] + @code = params[:code] || session[:wechat_code] render 'wechats/user_activities', layout: nil end diff --git a/app/views/wechats/user_activities.html.erb b/app/views/wechats/user_activities.html.erb index ccbf2a2b1..a3f5c741b 100644 --- a/app/views/wechats/user_activities.html.erb +++ b/app/views/wechats/user_activities.html.erb @@ -12,7 +12,7 @@ diff --git a/public/javascripts/wechat/app.js b/public/javascripts/wechat/app.js index 472a5a377..a7c4d13d5 100644 --- a/public/javascripts/wechat/app.js +++ b/public/javascripts/wechat/app.js @@ -7,7 +7,7 @@ app.constant('config', { }); -app.run(['$rootScope', 'auth', '$location', function($rootScope, auth, $location){ +app.run(['$rootScope', 'auth', '$location', '$routeParams', function($rootScope, auth, $location, $routeParams){ $rootScope.$on('$routeChangeError', function(event, next, current){ if(next && next.templateUrl){ @@ -18,6 +18,7 @@ app.run(['$rootScope', 'auth', '$location', function($rootScope, auth, $location }); $rootScope.$on('$routeChangeStart', function(event, next, current){ + console.log($routeParams); if(next && next.templateUrl){ if(!next.templateUrl.endsWith("login.html") && !next.templateUrl.endsWith("reg.html")){ } diff --git a/public/javascripts/wechat/build/app.min.js b/public/javascripts/wechat/build/app.min.js index 26995dea2..57664c550 100644 --- a/public/javascripts/wechat/build/app.min.js +++ b/public/javascripts/wechat/build/app.min.js @@ -1,5 +1,5 @@ -var app=angular.module("wechat",["ngRoute"]);app.constant("config",{rootPath:"/assets/wechat/",rootUrl:"/",apiUrl:"/api/v1/"}),app.run(["$rootScope","auth","$location",function(t,e,a){t.$on("$routeChangeError",function(t,e,l){e&&e.templateUrl&&(e.templateUrl.endsWith("login.html")||e.templateUrl.endsWith("reg.html")||a.path("/login"))}),t.$on("$routeChangeStart",function(t,e,a){e&&e.templateUrl&&!e.templateUrl.endsWith("login.html")&&!e.templateUrl.endsWith("reg.html")})}]); -app.factory("alertService",function(){function t(){this.title=null,this.message=null,this.visible=null,this.cb=null}return t.prototype.showMessage=function(t,e,n){this.message=e,this.title=t,this.visible=!0,this.cb=n},t.prototype.dismiss=function(){this.message=null,this.title=null,this.visible=!1,this.cb&&this.cb()},{create:function(){return new t}}}),app.factory("auth",["$http","$routeParams","$q","session","config",function(t,e,n,o,a){var i="";"undefined"!=typeof g_openid&&(i=g_openid),i||(i=o.get("openid"));var r=function(){var e=n.defer(),i=c();return i&&i.length>10?e.resolve(i):s().then(function(e){return t.post(a.apiUrl+"users/isbind",{openid:e})}).then(function(t){0!=t.data.status?e.reject(t.data.message):(o.save("token",t.data.token),e.resolve(t.data.token))})["catch"](function(t){e.reject(t)}),e.promise},s=function(){var a=n.defer();if(console.log(i),"undefined"!=typeof i&&i&&i.length>0)a.resolve(i);else{var r=e.code||o.get("code");t({url:"/wechat/get_open_id",data:{code:r},method:"POST"}).then(function(t){0!=t.data.status?a.reject(t.data.message):(i=t.data.openid,a.resolve(i))},function(t){a.reject(t)})}return a.promise},c=function(){return o.get("token")};return{isBind:r,token:c,openid:s}}]),app.factory("session",function(){return{save:function(t,e){sessionStorage.setItem(t,e)},get:function(t){return sessionStorage.getItem(t)}}}),app.factory("rms",function(){var t={},e=function(e,n){t[e]=n},n=function(e){return t[e]};return{save:e,get:n}}),app.factory("common",["$http","auth","$routeParams",function(t,e,n){var o=function(n,o,a,i){if(a.comment&&!(a.comment.length<=0)){var r=a.comment.replace(/\n/g,"
    "),s={type:o,content:r,token:e.token()};a.disabled=!0,t({method:"POST",url:apiUrl+"new_comment/"+n,data:s}).then(function(t){a.disabled=!1,"function"==typeof i&&i()},function(t){})}},a=function(n,o){return t({method:"GET",url:apiUrl+o+"/"+n+"?token="+e.token()})},i=function(n){n.praise_count+=1,n.has_praise=!0,t({method:"POST",url:apiUrl+"praise/"+n.act_id,data:{token:e.token(),type:n.act_type}}).then(function(t){console.log(t.data)},function(t){})},r=function(n){n.praise_count-=1,n.has_praise=!1,t({method:"POST",url:apiUrl+"praise/"+n.act_id,data:{token:e.token(),type:n.act_type}}).then(function(t){console.log(t.data)},function(t){})},s=function(t){t.scope.formData={comment:""};var e=function(e){a(e,t.type).then(function(e){t.loadCallback(e.data)},function(t){})};e(t.id),t.scope.addReply=function(n){console.log(n.comment),o(t.id,t.replyType,n,function(){t.scope.formData={comment:""},e(t.id),"function"==typeof t.replyCallback&&t.replyCallback()})},t.scope.addPraise=i,t.scope.decreasePraise=r};return{init:s,addCommonReply:o,loadCommonData:a,addCommonPraise:i,decreaseCommonPraise:r}}]); +var app=angular.module("wechat",["ngRoute"]);app.constant("config",{rootPath:"/assets/wechat/",rootUrl:"/",apiUrl:"/api/v1/"}),app.run(["$rootScope","auth","$location","$routeParams",function(t,e,o,a){t.$on("$routeChangeError",function(t,e,a){e&&e.templateUrl&&(e.templateUrl.endsWith("login.html")||e.templateUrl.endsWith("reg.html")||o.path("/login"))}),t.$on("$routeChangeStart",function(t,e,o){console.log(a),e&&e.templateUrl&&!e.templateUrl.endsWith("login.html")&&!e.templateUrl.endsWith("reg.html")})}]); +app.factory("alertService",function(){function t(){this.title=null,this.message=null,this.visible=null,this.cb=null}return t.prototype.showMessage=function(t,e,n){this.message=e,this.title=t,this.visible=!0,this.cb=n},t.prototype.dismiss=function(){this.message=null,this.title=null,this.visible=!1,this.cb&&this.cb()},{create:function(){return new t}}}),app.factory("auth",["$http","$routeParams","$q","session","config",function(t,e,n,o,a){var i="";"undefined"!=typeof g_openid&&(i=g_openid),i||(i=o.get("openid"));var r=function(){var e=n.defer(),i=s();return i&&i.length>10?e.resolve(i):c().then(function(e){return t.post(a.apiUrl+"users/isbind",{openid:e})}).then(function(t){0!=t.data.status?e.reject(t.data.message):(o.save("token",t.data.token),e.resolve(t.data.token))})["catch"](function(t){e.reject(t)}),e.promise},c=function(){var a=n.defer();if(console.log(i),"undefined"!=typeof i&&i&&i.length>0)a.resolve(i);else{var r=window.g_code||e.code||o.get("code");t({url:"/wechat/get_open_id",data:{code:r},method:"POST"}).then(function(t){0!=t.data.status?a.reject(t.data.message):(i=t.data.openid,a.resolve(i))},function(t){a.reject(t)})}return a.promise},s=function(){return o.get("token")};return{isBind:r,token:s,openid:c}}]),app.factory("session",function(){return{save:function(t,e){sessionStorage.setItem(t,e)},get:function(t){return sessionStorage.getItem(t)}}}),app.factory("rms",function(){var t={},e=function(e,n){t[e]=n},n=function(e){return t[e]};return{save:e,get:n}}),app.factory("common",["$http","auth","$routeParams",function(t,e,n){var o=function(n,o,a,i){if(a.comment&&!(a.comment.length<=0)){var r=a.comment.replace(/\n/g,"
    "),c={type:o,content:r,token:e.token()};a.disabled=!0,t({method:"POST",url:apiUrl+"new_comment/"+n,data:c}).then(function(t){a.disabled=!1,"function"==typeof i&&i()},function(t){})}},a=function(n,o){return t({method:"GET",url:apiUrl+o+"/"+n+"?token="+e.token()})},i=function(n){n.praise_count+=1,n.has_praise=!0,t({method:"POST",url:apiUrl+"praise/"+n.act_id,data:{token:e.token(),type:n.act_type}}).then(function(t){console.log(t.data)},function(t){})},r=function(n){n.praise_count-=1,n.has_praise=!1,t({method:"POST",url:apiUrl+"praise/"+n.act_id,data:{token:e.token(),type:n.act_type}}).then(function(t){console.log(t.data)},function(t){})},c=function(t){t.scope.formData={comment:""};var e=function(e){a(e,t.type).then(function(e){t.loadCallback(e.data)},function(t){})};e(t.id),t.scope.addReply=function(n){console.log(n.comment),o(t.id,t.replyType,n,function(){t.scope.formData={comment:""},e(t.id),"function"==typeof t.replyCallback&&t.replyCallback()})},t.scope.addPraise=i,t.scope.decreasePraise=r};return{init:c,addCommonReply:o,loadCommonData:a,addCommonPraise:i,decreaseCommonPraise:r}}]); app.filter("safeHtml",["$sce",function(t){return function(n){return t.trustAsHtml(n)}}]); app.controller("ActivityController",["$anchorScroll","$location","$scope","$http","$timeout","auth","rms","common","alertService",function(t,a,e,o,i,c,n,s,r){e.replaceUrl=function(t){return t},e.alertService=r.create(),console.log("ActivityController load"),e.page=n.get("page")||0,e.activities=n.get("activities")||[],e.has_more=n.get("has_more"),e.loadActData=function(t){e.page=t,o({method:"POST",url:apiUrl+"activities",data:{token:c.token(),page:t}}).then(function(t){t.data.page>0?e.activities=e.activities.concat(t.data.data):e.activities=t.data.data,n.save("activities",e.activities),e.has_more=t.data.count+10*t.data.page 0){ deferred.resolve(_openid); } else { - var code = $routeParams.code || session.get("code"); + var code = window.g_code || $routeParams.code || session.get("code"); $http({ url: '/wechat/get_open_id', data: {code: code}, From 05ddbe5874266880774c2d78d9f95479f0428689 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Mon, 20 Jun 2016 15:28:19 +0800 Subject: [PATCH 040/216] =?UTF-8?q?=E4=BF=AE=E6=94=B9code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/wechats/user_activities.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/wechats/user_activities.html.erb b/app/views/wechats/user_activities.html.erb index a3f5c741b..061099571 100644 --- a/app/views/wechats/user_activities.html.erb +++ b/app/views/wechats/user_activities.html.erb @@ -12,7 +12,7 @@ From 048bb7fed5435682f605a695073448531b8ca33a Mon Sep 17 00:00:00 2001 From: cxt Date: Mon, 20 Jun 2016 15:38:43 +0800 Subject: [PATCH 041/216] =?UTF-8?q?=E5=A4=B4=E5=83=8F=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E8=8F=9C=E5=8D=95=E3=80=81=E6=9C=AA=E8=AF=BB=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E7=9A=84=E5=BB=B6=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 2 +- app/views/layouts/_logined_header.html.erb | 29 ++++++++++++++++--- .../layouts/_show_messages_list.html.erb | 26 ++++++++++++++++- public/stylesheets/public.css | 2 +- 4 files changed, 52 insertions(+), 7 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 87c7d8f54..29e6a4980 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -135,7 +135,7 @@ class UsersController < ApplicationController unless (message_all.message_type == 'CourseMessage' && mess && mess.course && mess.course.is_delete == 1) @message_alls << mess end - break if @message_alls.length == 5 + break if @message_alls.length == 10 end end end diff --git a/app/views/layouts/_logined_header.html.erb b/app/views/layouts/_logined_header.html.erb index 7ba0a23be..da22cce7a 100644 --- a/app/views/layouts/_logined_header.html.erb +++ b/app/views/layouts/_logined_header.html.erb @@ -91,6 +91,8 @@ \ No newline at end of file diff --git a/public/stylesheets/public.css b/public/stylesheets/public.css index ff71bf5c4..333c410ca 100644 --- a/public/stylesheets/public.css +++ b/public/stylesheets/public.css @@ -533,7 +533,7 @@ a.homepageSearchIcon:hover {background:url(../images/nav_icon.png) -49px 3px no- .homepageNewsIcon {background:url(../images/nav_icon.png) -5px -85px no-repeat; width:30px; height:35px; display:block;} .newsActive {width:16px; height:16px; border-radius:50%; background-color:#ff0000; position:absolute; left:17px; top:5px; text-align:center;font-size:12px; color:#ffffff !important;padding-bottom: 3px;padding-left: 2px;padding-right: 1px;font-weight: bold;} .navHomepageProfile {width:65px; display:block; float:right; margin-left:33px;} -.homepageProfileMenuIcon {background:url(../images/nav_icon.png) 30px -155px no-repeat; width:65px; height:50px; position:relative; display:inline-block;} +.homepageProfileMenuIcon {background:url(../images/nav_icon.png) 30px -155px no-repeat; width:65px; height:54px; position:relative; display:inline-block;} .homepageProfileMenuIcon:hover {background:url(../images/nav_icon.png) 30px -122px no-repeat;} .navHomepageProfile ul li ul {display:none;} .navHomepageProfile ul li:hover ul {display:block;} From c6f04db19e1a94eb2616b72a21e7744a6131a7bf Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Mon, 20 Jun 2016 15:50:52 +0800 Subject: [PATCH 042/216] wechat --- app/controllers/wechats_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index 39e093cdd..3a6be2016 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -147,7 +147,7 @@ class WechatsController < ActionController::Base 您还未绑定确实的用户,请先绑定,谢谢!" } } request.reply.news(news) do |article, n, index| # article is return object - url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{root_url+'/assets/wechat/app.html#login'}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect" + url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{root_url+'/wechat/user_activities#login'}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect" pic_url = "#{Setting.protocol}://#{Setting.host_name}/images/weixin_pic.jpg" article.item title: "#{n[:title]}", description: n[:content], From 47c443e59d35a238fc759da22440d3b14b9130b8 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Mon, 20 Jun 2016 15:56:57 +0800 Subject: [PATCH 043/216] =?UTF-8?q?=E8=BE=93=E5=85=A5=E6=A1=86=E5=8F=98?= =?UTF-8?q?=E5=A4=A7=E4=B8=80=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/stylesheets/weui/weixin.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/stylesheets/weui/weixin.css b/public/stylesheets/weui/weixin.css index fd5a56bd6..9ec0f6823 100644 --- a/public/stylesheets/weui/weixin.css +++ b/public/stylesheets/weui/weixin.css @@ -167,7 +167,7 @@ a.underline {text-decoration:underline;} /*20160616登录注册*/ .login-wrap {padding:0 10px;} .input-box-wrap {padding-right:17px;} -.input-box {width:100%; height:36px; padding-left:5px; line-height:36px; vertical-align:middle; border:1px solid #ccc; border-radius:5px;} +.input-box {font-size: 16px;width:100%; height:36px; padding-left:5px; line-height:36px; vertical-align:middle; border:1px solid #ccc; border-radius:5px;} .login-op-wrap {height:30px; line-height:30px; vertical-align:middle;} .login-box{display:inline-block; width:14px; height:14px; line-height:14px; text-align:center; vertical-align:middle; border:1px solid #ccc; background:#fff; border-radius:3px; color:#fff; cursor:pointer;} .login-box.checked{background:#63c360;} From f4d67bc027a1ea6365cb271b26a73983010020a5 Mon Sep 17 00:00:00 2001 From: cxt Date: Mon, 20 Jun 2016 16:03:57 +0800 Subject: [PATCH 044/216] =?UTF-8?q?=E6=9C=AA=E8=AF=BB=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=BC=B9=E7=AA=97=E2=80=9C=E7=82=B9=E5=87=BB=E5=B1=95=E5=BC=80?= =?UTF-8?q?=E2=80=9D=E6=98=BE=E7=A4=BA10=E6=9D=A1=E6=9C=AA=E8=AF=BB?= =?UTF-8?q?=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/layouts/_show_messages_list.html.erb | 11 ++++++++--- public/stylesheets/new_user.css | 3 ++- public/stylesheets/public.css | 5 +++-- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/app/views/layouts/_show_messages_list.html.erb b/app/views/layouts/_show_messages_list.html.erb index 423011e3c..762109bf5 100644 --- a/app/views/layouts/_show_messages_list.html.erb +++ b/app/views/layouts/_show_messages_list.html.erb @@ -1,6 +1,7 @@

    未读消息

    +
      <% messages.each do |ma| %> <% if ma.class == SystemMessage %> @@ -135,8 +136,8 @@ <% end %> <% end %>
    - 展开更多 -<%= link_to '查看全部', user_message_path(User.current),:id =>'show_all_messages', :class => "shadowbox_news_all undis", :target =>"_Blank" %> + +<%= link_to '查看全部', user_message_path(User.current),:id =>'show_all_messages', :class => "shadowbox_news_all", :style => "display:none", :target =>"_Blank" %>
    + + From 9e7cde60563795c2c9d2e740f86a63ecdb26bd5f Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 22 Jun 2016 11:25:59 +0800 Subject: [PATCH 069/216] stable version for sonar --- app/controllers/quality_analysis_controller.rb | 8 ++++---- app/controllers/repositories_controller.rb | 8 ++++---- app/models/quality_analysis.rb | 3 +++ ...y_analyses.html.erb => _quality_analysis.html.erb} | 2 +- ...uality_analyses.js.erb => quality_analysis.js.erb} | 2 +- app/views/repositories/show.html.erb | 2 +- db/migrate/20160622015019_create_quality_analyses.rb | 11 +++++++++++ db/schema.rb | 10 +++++++++- spec/factories/quality_analyses.rb | 7 +++++++ spec/models/quality_analysis_spec.rb | 5 +++++ 10 files changed, 46 insertions(+), 12 deletions(-) create mode 100644 app/models/quality_analysis.rb rename app/views/repositories/{_quality_analyses.html.erb => _quality_analysis.html.erb} (77%) rename app/views/repositories/{quality_analyses.js.erb => quality_analysis.js.erb} (89%) create mode 100644 db/migrate/20160622015019_create_quality_analyses.rb create mode 100644 spec/factories/quality_analyses.rb create mode 100644 spec/models/quality_analysis_spec.rb diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index 21e094407..77acdfd05 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -30,20 +30,20 @@ class QualityAnalysisController < ApplicationController sonar.sources=#{path} sonar.language=#{language.downcase} sonar.sourceEncoding=utf-8" - git_url = gitlab_address.to_s+"/"+@project.owner.to_s+"/"+ identifier+"."+"git" + git_url = gitlab_address.to_s+"/"+@project.owner.to_s+"/"+ identifier + "."+"git" - - # # modify config + # # # modify config @doc = Nokogiri::XML(File.open(File.join(Rails.root, 'tmp', 'config.xml'))) @doc.at_xpath("//hudson.plugins.git.UserRemoteConfig/url").content = git_url @doc.at_xpath("//hudson.plugins.git.BranchSpec/name").content = "*/#{branch}" @doc.at_xpath("//hudson.plugins.sonar.SonarRunnerBuilder/properties").content = properties #sonar-properties - + # # replace config.xml of jenkins @client = @client.job.create("#{user_name}_#{identifier}", @doc.to_xml) # relace gitlab hook # genkins address @g.add_project_hook(@project.gpid,"http://123.59.135.93:8890/project/#{user_name}_#{identifier}") + QualityAnalysis.create(:project_id => @project.id, :author_login => user_name, :rep_identifier => identifier) end def index diff --git a/app/controllers/repositories_controller.rb b/app/controllers/repositories_controller.rb index 3f630ce51..cbb5b2f69 100644 --- a/app/controllers/repositories_controller.rb +++ b/app/controllers/repositories_controller.rb @@ -30,13 +30,13 @@ class RepositoriesController < ApplicationController menu_item :settings, :only => [:new, :create, :edit, :update, :destroy, :committers] default_search_scope :changesets - before_filter :find_project_by_project_id, :only => [:new, :create, :newrepo, :stats, :quality_analyses] + before_filter :find_project_by_project_id, :only => [:new, :create, :newrepo, :stats, :quality_analysis] before_filter :find_repository, :only => [:edit, :update, :destroy, :committers] before_filter :find_project_repository, :except => [:new, :create, :newcreate, :edit, :update, :destroy, :committers, :newrepo, :to_gitlab, :forked, :project_archive] before_filter :find_changeset, :only => [:revision, :add_related_issue, :remove_related_issue] - before_filter :authorize , :except => [:newrepo,:newcreate,:fork, :to_gitlab, :forked, :commit_diff, :project_archive, :quality_analyses] + before_filter :authorize , :except => [:newrepo,:newcreate,:fork, :to_gitlab, :forked, :commit_diff, :project_archive, :quality_analysis] # 链接gitlab - before_filter :connect_gitlab, :only => [:quality_analyses] + before_filter :connect_gitlab, :only => [:quality_analysis] accept_rss_auth :revisions # hidden repositories filter // 隐藏代码过滤器 before_filter :check_hidden_repo, :only => [:show, :stats, :revisions, :revision, :diff ] @@ -309,7 +309,7 @@ update end end - def quality_analyses + def quality_analysis gitlab_branches = @g.branches(@project.gpid) @branch_names = gitlab_branches.map{|b| b.name} @gitlab_default_branch = @g.project(@project.gpid).default_branch diff --git a/app/models/quality_analysis.rb b/app/models/quality_analysis.rb new file mode 100644 index 000000000..45778ff3f --- /dev/null +++ b/app/models/quality_analysis.rb @@ -0,0 +1,3 @@ +class QualityAnalysis < ActiveRecord::Base + attr_accessible :author_login, :project_id, :rep_identifier +end diff --git a/app/views/repositories/_quality_analyses.html.erb b/app/views/repositories/_quality_analysis.html.erb similarity index 77% rename from app/views/repositories/_quality_analyses.html.erb rename to app/views/repositories/_quality_analysis.html.erb index bf45ba167..64dd837b7 100644 --- a/app/views/repositories/_quality_analyses.html.erb +++ b/app/views/repositories/_quality_analysis.html.erb @@ -1,4 +1,4 @@ -<%= form_tag( url_for(:controller => 'quality_analysis', :action => 'create', :project_id => @project.id), :remote => true , :class => 'resourcesSearchloadBox mt10', :id => 'quality_analyses_form') do %> +<%= form_tag( url_for(:controller => 'quality_analysis', :action => 'create', :project_id => @project.id, :user_id => User.current.id, :identifier => @repository.identifier), :remote => true , :class => 'resourcesSearchloadBox mt10', :id => 'quality_analyses_form') do %> <%= select_tag :branch, options_for_select(["#{@gitlab_default_branch}"]+ @branch_names, @rev), :id => 'branch' %> <%= select_tag :language, options_for_select(["Java","C","PHP", "Web"]), :id => 'branch' %> diff --git a/app/views/repositories/quality_analyses.js.erb b/app/views/repositories/quality_analysis.js.erb similarity index 89% rename from app/views/repositories/quality_analyses.js.erb rename to app/views/repositories/quality_analysis.js.erb index 89d8685cf..c9427c246 100644 --- a/app/views/repositories/quality_analyses.js.erb +++ b/app/views/repositories/quality_analysis.js.erb @@ -1,4 +1,4 @@ -$('#ajax-modal').html('<%= escape_javascript( render :partial => 'repositories/quality_analyses', :locals => {}) %>'); +$('#ajax-modal').html('<%= escape_javascript( render :partial => 'repositories/quality_analysis', :locals => {}) %>'); showModal('ajax-modal', '615px'); $('#ajax-modal').siblings().remove(); $('#ajax-modal').before(""); diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index d1c041d73..1e874544a 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -2,7 +2,7 @@

    <%= render :partial => 'breadcrumbs', :locals => {:path => @path, :kind => 'dir', :revision => @rev} %>

    ZIP下载 - <%= link_to "质量分析", quality_analyses_path(:id => @project.id, :repository_id => @repository.identifier), :remote => true, :class => "btn_zipdown fr" %> + <%= link_to "质量分析", quality_analysis_path(:id => @project.id, :repository_id => @repository.identifier), :remote => true, :class => "btn_zipdown fr" %>
    diff --git a/db/migrate/20160622015019_create_quality_analyses.rb b/db/migrate/20160622015019_create_quality_analyses.rb new file mode 100644 index 000000000..6316d5764 --- /dev/null +++ b/db/migrate/20160622015019_create_quality_analyses.rb @@ -0,0 +1,11 @@ +class CreateQualityAnalyses < ActiveRecord::Migration + def change + create_table :quality_analyses do |t| + t.integer :project_id + t.string :author_login + t.string :rep_identifier + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index e8e7e25cb..51e0682d0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20160613065840) do +ActiveRecord::Schema.define(:version => 20160622015019) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -1833,6 +1833,14 @@ ActiveRecord::Schema.define(:version => 20160613065840) do add_index "protected_branches", ["project_id"], :name => "index_protected_branches_on_project_id" + create_table "quality_analyses", :force => true do |t| + t.integer "project_id" + t.string "author_login" + t.string "rep_identifier" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + create_table "queries", :force => true do |t| t.integer "project_id" t.string "name", :default => "", :null => false diff --git a/spec/factories/quality_analyses.rb b/spec/factories/quality_analyses.rb new file mode 100644 index 000000000..a48e6e33f --- /dev/null +++ b/spec/factories/quality_analyses.rb @@ -0,0 +1,7 @@ +FactoryGirl.define do + factory :quality_analyasis, class: 'QualityAnalysis' do + project_id 1 + author_login "MyString" + rep_identifier "MyString" + end +end diff --git a/spec/models/quality_analysis_spec.rb b/spec/models/quality_analysis_spec.rb new file mode 100644 index 000000000..d18ede452 --- /dev/null +++ b/spec/models/quality_analysis_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe QualityAnalysis, :type => :model do + pending "add some examples to (or delete) #{__FILE__}" +end From 13273d02de69f5a535c57c304772547ed3c17320 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Wed, 22 Jun 2016 12:11:34 +0800 Subject: [PATCH 070/216] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BA=86=E5=AE=89?= =?UTF-8?q?=E5=85=A8=E9=97=AE=E9=A2=98=EF=BC=8C=E4=B8=8D=E6=9A=B4=E9=9C=B2?= =?UTF-8?q?openid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/mobile/api.rb | 5 ++ app/api/mobile/apis/users.rb | 4 +- app/controllers/wechats_controller.rb | 31 ++++++----- app/views/wechats/open_wechat.html.erb | 18 +++++++ app/views/wechats/user_activities.html.erb | 20 +++++++- config/routes.rb | 2 +- public/javascripts/wechat/app.js | 11 ++-- public/javascripts/wechat/build/app.min.js | 11 ++-- .../wechat/controllers/activity.js | 8 +-- .../javascripts/wechat/controllers/login.js | 12 ++--- public/javascripts/wechat/others/factory.js | 51 +++---------------- public/javascripts/wechat/others/routes.js | 2 +- 12 files changed, 88 insertions(+), 87 deletions(-) create mode 100644 app/views/wechats/open_wechat.html.erb diff --git a/app/api/mobile/api.rb b/app/api/mobile/api.rb index 058687776..9ffac4e10 100644 --- a/app/api/mobile/api.rb +++ b/app/api/mobile/api.rb @@ -23,6 +23,7 @@ module Mobile version 'v1', using: :path format :json content_type :json, "application/json;charset=UTF-8" + use ActionDispatch::Session::CookieStore use Mobile::Middleware::ErrorHandler helpers do @@ -34,6 +35,10 @@ module Mobile raise('Unauthorized. 用户认证失败.') unless current_user end + def session + env['rack.session'] + end + def current_user openid = params[:openid] if openid diff --git a/app/api/mobile/apis/users.rb b/app/api/mobile/apis/users.rb index e3041abcd..b5ee14d19 100644 --- a/app/api/mobile/apis/users.rb +++ b/app/api/mobile/apis/users.rb @@ -23,10 +23,10 @@ module Mobile params do requires :login, type: String, desc: 'username' requires :password, type: String, desc: 'password' - requires :openid, type: String, desc: 'wechat openid' end post 'wxbind' do - openid = params[:openid] + openid = session[:wechat_openid] + logger.debug "openid ============== #{openid}" raise "无法获取到openid,请在微信中打开本页面" unless openid uw = UserWechat.where(openid: openid).first raise "此微信号已绑定用户(#{uw.user.login}), 不能重复绑定" if uw diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index 6517c756e..dc1e26508 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -191,14 +191,22 @@ class WechatsController < ActionController::Base ### controller method module Controllers - def get_open_id + def get_bind begin - code = params[:code] || session[:wechat_code] openid = get_openid_from_code(code) raise "无法获取到微信openid" unless openid - render :json => {status:0, openid: openid} + + uw = UserWechat.where(openid: openid).first + raise "还未绑定trustie帐户" unless uw + logger.debug "get_bind ============= #{uw}" + + user = uw.user + ::ApiKey.delete_all(user_id: user.id) + key = ::ApiKey.create!(user_id: user.id) + + render :json =>{status: 0, token: key.access_token} rescue Exception=>e render :json => {status: -1, message: e.message} end @@ -240,21 +248,20 @@ class WechatsController < ActionController::Base end def user_activities - # session[:wechat_code] = params[:code] if params[:code] - # code = params[:code] || session[:wechat_code] - # openid = get_openid_from_code(code) - # @wechat_user = user_binded?(openid) - # unless @wechat_user - # redirect_to login_wechat_path - # return - # end session[:wechat_code] = params[:code] if params[:code] - @code = params[:code] || session[:wechat_code] + @path = '/'+(params[:state] || '') + open_id = get_openid_from_code(params[:code]) rescue + unless open_id + render 'wechats/open_wechat', layout: nil and return + end + session[:wechat_openid] = open_id render 'wechats/user_activities', layout: nil end + private def get_openid_from_code(code) + return 'oCnvgvz8R7QheXE-R9Kkr39j8Ndg' if code =='only-for-test' openid = session[:wechat_openid] unless openid diff --git a/app/views/wechats/open_wechat.html.erb b/app/views/wechats/open_wechat.html.erb new file mode 100644 index 000000000..4584e81b5 --- /dev/null +++ b/app/views/wechats/open_wechat.html.erb @@ -0,0 +1,18 @@ + + + + + + + + + diff --git a/app/views/wechats/user_activities.html.erb b/app/views/wechats/user_activities.html.erb index 6cb32850a..f920aed4b 100644 --- a/app/views/wechats/user_activities.html.erb +++ b/app/views/wechats/user_activities.html.erb @@ -13,9 +13,9 @@ @@ -26,6 +26,24 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index e4b462d93..0998044ff 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1249,7 +1249,7 @@ RedmineApp::Application.routes.draw do get :login get :user_activities post :bind - post :get_open_id + post :get_bind end end diff --git a/public/javascripts/wechat/app.js b/public/javascripts/wechat/app.js index a7c4d13d5..ea2bdf318 100644 --- a/public/javascripts/wechat/app.js +++ b/public/javascripts/wechat/app.js @@ -8,6 +8,12 @@ app.constant('config', { app.run(['$rootScope', 'auth', '$location', '$routeParams', function($rootScope, auth, $location, $routeParams){ + + if(g_redirect_path && g_redirect_path.length>0){ + $location.path(g_redirect_path); + g_redirect_path = null; + } + $rootScope.$on('$routeChangeError', function(event, next, current){ if(next && next.templateUrl){ @@ -18,11 +24,6 @@ app.run(['$rootScope', 'auth', '$location', '$routeParams', function($rootScope, }); $rootScope.$on('$routeChangeStart', function(event, next, current){ - console.log($routeParams); - if(next && next.templateUrl){ - if(!next.templateUrl.endsWith("login.html") && !next.templateUrl.endsWith("reg.html")){ - } - } }); } ]); \ No newline at end of file diff --git a/public/javascripts/wechat/build/app.min.js b/public/javascripts/wechat/build/app.min.js index c41e0bb7b..365ed28c0 100644 --- a/public/javascripts/wechat/build/app.min.js +++ b/public/javascripts/wechat/build/app.min.js @@ -1,7 +1,7 @@ -var app=angular.module("wechat",["ngRoute"]);app.constant("config",{rootPath:"/assets/wechat/",rootUrl:"/",apiUrl:"/api/v1/"}),app.run(["$rootScope","auth","$location","$routeParams",function(t,e,o,a){t.$on("$routeChangeError",function(t,e,a){e&&e.templateUrl&&(e.templateUrl.endsWith("login.html")||e.templateUrl.endsWith("reg.html")||o.path("/login"))}),t.$on("$routeChangeStart",function(t,e,o){console.log(a),e&&e.templateUrl&&!e.templateUrl.endsWith("login.html")&&!e.templateUrl.endsWith("reg.html")})}]); -app.factory("alertService",function(){function t(){this.title=null,this.message=null,this.visible=null,this.cb=null}return t.prototype.showMessage=function(t,e,n){this.message=e,this.title=t,this.visible=!0,this.cb=n},t.prototype.dismiss=function(){this.message=null,this.title=null,this.visible=!1,this.cb&&this.cb()},{create:function(){return new t}}}),app.factory("auth",["$http","$routeParams","$q","session","config",function(t,e,n,o,a){var i="";"undefined"!=typeof g_openid&&(i=g_openid),i||(i=o.get("openid"));var r=function(){var e=n.defer(),i=s();return i&&i.length>10?e.resolve(i):c().then(function(e){return t.post(a.apiUrl+"users/isbind",{openid:e})}).then(function(t){0!=t.data.status?e.reject(t.data.message):(o.save("token",t.data.token),e.resolve(t.data.token))})["catch"](function(t){e.reject(t)}),e.promise},c=function(){var a=n.defer();if(console.log(i),"undefined"!=typeof i&&i&&i.length>0)a.resolve(i);else{var r=window.g_code||e.code||o.get("code");t({url:"/wechat/get_open_id",data:{code:r},method:"POST"}).then(function(t){0!=t.data.status?a.reject(t.data.message):(i=t.data.openid,a.resolve(i))},function(t){a.reject(t)})}return a.promise},s=function(){return o.get("token")};return{isBind:r,token:s,openid:c}}]),app.factory("session",function(){return{save:function(t,e){sessionStorage.setItem(t,e)},get:function(t){return sessionStorage.getItem(t)}}}),app.factory("rms",function(){var t={},e=function(e,n){t[e]=n},n=function(e){return t[e]};return{save:e,get:n}}),app.factory("common",["$http","auth","$routeParams",function(t,e,n){var o=function(n,o,a,i){if(a.comment&&!(a.comment.length<=0)){var r=a.comment.replace(/\n/g,"
    "),c={type:o,content:r,token:e.token()};a.disabled=!0,t({method:"POST",url:apiUrl+"new_comment/"+n,data:c}).then(function(t){a.disabled=!1,"function"==typeof i&&i()},function(t){})}},a=function(n,o){return t({method:"GET",url:apiUrl+o+"/"+n+"?token="+e.token()})},i=function(n){n.praise_count+=1,n.has_praise=!0,t({method:"POST",url:apiUrl+"praise/"+n.act_id,data:{token:e.token(),type:n.act_type}}).then(function(t){console.log(t.data)},function(t){})},r=function(n){n.praise_count-=1,n.has_praise=!1,t({method:"POST",url:apiUrl+"praise/"+n.act_id,data:{token:e.token(),type:n.act_type}}).then(function(t){console.log(t.data)},function(t){})},c=function(t){t.scope.formData={comment:""};var e=function(e){a(e,t.type).then(function(e){t.loadCallback(e.data)},function(t){})};e(t.id),t.scope.addReply=function(n){console.log(n.comment),o(t.id,t.replyType,n,function(){t.scope.formData={comment:""},e(t.id),"function"==typeof t.replyCallback&&t.replyCallback()})},t.scope.addPraise=i,t.scope.decreasePraise=r};return{init:c,addCommonReply:o,loadCommonData:a,addCommonPraise:i,decreaseCommonPraise:r}}]); +var app=angular.module("wechat",["ngRoute"]);app.constant("config",{rootPath:"/assets/wechat/",rootUrl:"/",apiUrl:"/api/v1/"}),app.run(["$rootScope","auth","$location","$routeParams",function(t,a,e,r){g_redirect_path&&g_redirect_path.length>0&&(e.path(g_redirect_path),g_redirect_path=null),t.$on("$routeChangeError",function(t,a,r){a&&a.templateUrl&&(a.templateUrl.endsWith("login.html")||a.templateUrl.endsWith("reg.html")||e.path("/login"))}),t.$on("$routeChangeStart",function(t,a,e){})}]); +app.factory("alertService",function(){function t(){this.title=null,this.message=null,this.visible=null,this.cb=null}return t.prototype.showMessage=function(t,e,n){this.message=e,this.title=t,this.visible=!0,this.cb=n},t.prototype.dismiss=function(){this.message=null,this.title=null,this.visible=!1,this.cb&&this.cb()},{create:function(){return new t}}}),app.factory("auth",["$http","$routeParams","$q","session","config",function(t,e,n,o,a){var i=function(){var a=n.defer(),i=c();if(i&&i.length>10)a.resolve(i);else{window.g_code||e.code||o.get("code");t.post("/wechat/get_bind",{}).then(function(t){0!=t.data.status?a.reject(t.data.message):(o.save("token",t.data.token),a.resolve(t.data.token))})["catch"](function(t){a.reject(t)})}return a.promise},c=function(){return o.get("token")};return{get_bind:i,token:c}}]),app.factory("session",function(){return{save:function(t,e){sessionStorage.setItem(t,e)},get:function(t){return sessionStorage.getItem(t)}}}),app.factory("rms",function(){var t={},e=function(e,n){t[e]=n},n=function(e){return t[e]};return{save:e,get:n}}),app.factory("common",["$http","auth","$routeParams",function(t,e,n){var o=function(n,o,a,i){if(a.comment&&!(a.comment.length<=0)){var c=a.comment.replace(/\n/g,"
    "),s={type:o,content:c,token:e.token()};a.disabled=!0,t({method:"POST",url:apiUrl+"new_comment/"+n,data:s}).then(function(t){a.disabled=!1,"function"==typeof i&&i()},function(t){})}},a=function(n,o){return t({method:"GET",url:apiUrl+o+"/"+n+"?token="+e.token()})},i=function(n){n.praise_count+=1,n.has_praise=!0,t({method:"POST",url:apiUrl+"praise/"+n.act_id,data:{token:e.token(),type:n.act_type}}).then(function(t){console.log(t.data)},function(t){})},c=function(n){n.praise_count-=1,n.has_praise=!1,t({method:"POST",url:apiUrl+"praise/"+n.act_id,data:{token:e.token(),type:n.act_type}}).then(function(t){console.log(t.data)},function(t){})},s=function(t){t.scope.formData={comment:""};var e=function(e){a(e,t.type).then(function(e){t.loadCallback(e.data)},function(t){})};e(t.id),t.scope.addReply=function(n){console.log(n.comment),o(t.id,t.replyType,n,function(){t.scope.formData={comment:""},e(t.id),"function"==typeof t.replyCallback&&t.replyCallback()})},t.scope.addPraise=i,t.scope.decreasePraise=c};return{init:s,addCommonReply:o,loadCommonData:a,addCommonPraise:i,decreaseCommonPraise:c}}]); app.filter("safeHtml",["$sce",function(t){return function(n){return t.trustAsHtml(n)}}]); -app.controller("ActivityController",["$anchorScroll","$location","$scope","$http","$timeout","auth","rms","common","alertService",function(t,a,e,o,i,c,n,s,r){e.replaceUrl=function(t){return t},e.alertService=r.create(),console.log("ActivityController load"),e.page=n.get("page")||0,e.activities=n.get("activities")||[],e.has_more=n.get("has_more"),e.loadActData=function(t){e.page=t,o({method:"POST",url:apiUrl+"activities",data:{token:c.token(),page:t}}).then(function(t){t.data.page>0?e.activities=e.activities.concat(t.data.data):e.activities=t.data.data,n.save("activities",e.activities),e.has_more=t.data.count+10*t.data.page0?e.activities=e.activities.concat(a.data.data):e.activities=a.data.data,n.save("activities",e.activities),e.has_more=a.data.count+10*a.data.page
    加载中...
    '}}]); -app.config(["$routeProvider","$httpProvider","$locationProvider","config",function(e,o,r,t){var l=t.rootPath,n={delay:["auth",function(e){return e.isBind()}]},i=function(e,o){return{templateUrl:l+e,controller:o,resolve:n}};e.when("/login",{templateUrl:l+"login.html",controller:"LoginController"}).when("/reg",{templateUrl:l+"reg.html",controller:"RegController"}).when("/activites",i("activities.html","ActivityController")).when("/issues/:id",i("issue_detail.html","IssueController")).when("/project_discussion/:id",i("project_discussion.html","DiscussionController")).when("/homework/:id",i("homework_detail.html","HomeworkController")).when("/course_notice/:id",i("course_notice.html","CourseNoticeController")).when("/course_discussion/:id",i("course_discussion.html","DiscussionController")).when("/journal_for_message/:id",i("jour_message_detail.html","JournalsController")).when("/blog_comment/:id",i("blog_detail.html","BlogController")).when("/add_class",i("add_class.html","AddClassController")).otherwise({redirectTo:"/activites"}),o.interceptors.push(["$q","$rootScope",function(e,o){return void 0==o.activeCalls&&(o.activeCalls=0),{request:function(e){return o.activeCalls+=1,e},requestError:function(e){return o.activeCalls-=1,e},response:function(e){return o.activeCalls-=1,e},responseError:function(e){return o.activeCalls-=1,e}}}])}]); \ No newline at end of file +app.config(["$routeProvider","$httpProvider","$locationProvider","config",function(e,o,r,t){var l=t.rootPath,n={delay:["auth",function(e){return e.get_bind()}]},s=function(e,o){return{templateUrl:l+e,controller:o,resolve:n}};e.when("/login",{templateUrl:l+"login.html",controller:"LoginController"}).when("/reg",{templateUrl:l+"reg.html",controller:"RegController"}).when("/activites",s("activities.html","ActivityController")).when("/issues/:id",s("issue_detail.html","IssueController")).when("/project_discussion/:id",s("project_discussion.html","DiscussionController")).when("/homework/:id",s("homework_detail.html","HomeworkController")).when("/course_notice/:id",s("course_notice.html","CourseNoticeController")).when("/course_discussion/:id",s("course_discussion.html","DiscussionController")).when("/journal_for_message/:id",s("jour_message_detail.html","JournalsController")).when("/blog_comment/:id",s("blog_detail.html","BlogController")).when("/add_class",s("add_class.html","AddClassController")).when("/myclass",s("myclass.html","MyClassController")).otherwise({redirectTo:"/activites"}),o.interceptors.push(["$q","$rootScope",function(e,o){return void 0==o.activeCalls&&(o.activeCalls=0),{request:function(e){return o.activeCalls+=1,e},requestError:function(e){return o.activeCalls-=1,e},response:function(e){return o.activeCalls-=1,e},responseError:function(e){return o.activeCalls-=1,e}}}])}]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/activity.js b/public/javascripts/wechat/controllers/activity.js index e44eb3ea2..73bd09f26 100644 --- a/public/javascripts/wechat/controllers/activity.js +++ b/public/javascripts/wechat/controllers/activity.js @@ -39,13 +39,7 @@ app.controller('ActivityController', }; if($scope.activities.length<=0){ - auth.isBind().then( - function(){ - $scope.loadActData(0); - }, function errorCallback(response) { - $scope.alertService.showMessage("获取token出错",response); - } - ); + $scope.loadActData(0); } else { $timeout(function(){ window.scrollTo(0, rms.get("yoffset")); diff --git a/public/javascripts/wechat/controllers/login.js b/public/javascripts/wechat/controllers/login.js index 35b750e8c..1dbf804ed 100644 --- a/public/javascripts/wechat/controllers/login.js +++ b/public/javascripts/wechat/controllers/login.js @@ -1,6 +1,6 @@ app.controller('LoginController', ['$scope', '$http', '$location', '$routeParams', 'alertService', 'config','auth','session', function ($scope, $http, $location, $routeParams, alertService, config, auth,session) { - if(auth.isBind().then(function(){ + if(auth.get_bind().then(function(){ $location.path("/activities"); })); @@ -24,13 +24,9 @@ app.controller('LoginController', ['$scope', '$http', '$location', '$routeParams console.log(apiUrl + "auth"); - auth.openid().then( - function(openid){ - return $http.post( - config.apiUrl + "users/wxbind", - {login: user.login, password: user.password, openid: openid} - ); - } + $http.post( + config.apiUrl + "users/wxbind", + {login: user.login, password: user.password} ).then( function(response) { console.log(response.data); diff --git a/public/javascripts/wechat/others/factory.js b/public/javascripts/wechat/others/factory.js index aefd359a8..6acf25c59 100644 --- a/public/javascripts/wechat/others/factory.js +++ b/public/javascripts/wechat/others/factory.js @@ -29,16 +29,6 @@ app.factory('alertService', function(){ app.factory('auth', ['$http','$routeParams', '$q', 'session', 'config',function($http,$routeParams, $q, session,config){ - var _openid = ''; - - if(typeof g_openid !== 'undefined'){ - _openid = g_openid; - } - - if(!_openid){ - _openid = session.get("openid"); - } - //是否已经绑定 var isBind = function(){ var defer = $q.defer(); @@ -47,12 +37,11 @@ app.factory('auth', ['$http','$routeParams', '$q', 'session', 'config',function( if(token && token.length>10){ defer.resolve(token); } else { - getOpenId().then(function(openid){ - return $http.post( - config.apiUrl+ 'users/isbind', - {openid: openid} - ) - }).then(function(response){ + var code = window.g_code || $routeParams.code || session.get("code"); + $http.post( + '/wechat/get_bind', + {} ///不用传code了,都由服务器来处理 + ).then(function(response){ if(response.data.status!=0){ defer.reject(response.data.message); }else { @@ -67,38 +56,10 @@ app.factory('auth', ['$http','$routeParams', '$q', 'session', 'config',function( return defer.promise; } - var getOpenId = function() { - var deferred = $q.defer(); - console.log(_openid); - if (typeof _openid !== 'undefined' && _openid && _openid.length > 0){ - deferred.resolve(_openid); - } else { - var code = window.g_code || $routeParams.code || session.get("code"); - $http({ - url: '/wechat/get_open_id', - data: {code: code}, - method: 'POST' - }).then(function successCallback(response) { - if(response.data.status != 0){ - deferred.reject(response.data.message); - } else{ - _openid = response.data.openid; - //session.save("openid", _openid); - deferred.resolve(_openid); - } - }, function errorCallback(response) { - deferred.reject(response); - }); - } - return deferred.promise; - }; - var openid = function(){ - return _openid; - }; var getToken = function(){ return session.get("token"); } - return {isBind: isBind, token: getToken, openid: getOpenId}; + return {get_bind: isBind, token: getToken}; }]); app.factory("session", function(){ diff --git a/public/javascripts/wechat/others/routes.js b/public/javascripts/wechat/others/routes.js index fdfd72492..7fa5e6d74 100644 --- a/public/javascripts/wechat/others/routes.js +++ b/public/javascripts/wechat/others/routes.js @@ -2,7 +2,7 @@ app.config(['$routeProvider',"$httpProvider", "$locationProvider",'config', func var rootPath = config.rootPath; var resolve = { delay: ['auth',function(auth){ - return auth.isBind(); + return auth.get_bind(); }] }; var makeRoute = function(path, ctrl){ From 4663f48496c221e30544ece1ce7bb8f577d57217 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Wed, 22 Jun 2016 12:13:50 +0800 Subject: [PATCH 071/216] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B7=B3=E8=BD=AC?= =?UTF-8?q?=E8=8F=9C=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/wechats_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index dc1e26508..458c5024a 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -14,7 +14,7 @@ class WechatsController < ActionController::Base news = (1..1).each_with_object([]) { |n, memo| memo << { title: '恭喜您成功加入班级,开始学习吧!', content: "课程名称: 数据结构\n班级名称: 数据结构A班\n任课老师: 尹刚\n进入班级,和小伙伴愉快的学习吧!0"} } request.reply.news(news) do |article, n, index| # article is return object - url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{root_url+'/wechat/user_activities#myclass'}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect" + url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{root_url+'/wechat/user_activities'}&response_type=code&scope=snsapi_base&state=myclass#wechat_redirect" pic_url = "#{Setting.protocol}://#{Setting.host_name}/images/class.jpg" article.item title: "#{n[:title]}", description: n[:content], @@ -176,7 +176,7 @@ class WechatsController < ActionController::Base 您还未绑定确实的用户,请先绑定,谢谢!" } } request.reply.news(news) do |article, n, index| # article is return object - url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{root_url+'/wechat/user_activities#login'}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect" + url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{root_url+'/wechat/user_activities'}&response_type=code&scope=snsapi_base&state=login#wechat_redirect" pic_url = "#{Setting.protocol}://#{Setting.host_name}/images/weixin_pic.jpg" article.item title: "#{n[:title]}", description: n[:content], From 833c5a5ede74b391af1d25cc09f2e5ce74cd19af Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Wed, 22 Jun 2016 12:27:23 +0800 Subject: [PATCH 072/216] . --- app/controllers/wechats_controller.rb | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index 458c5024a..8a596a470 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -20,11 +20,10 @@ class WechatsController < ActionController::Base description: n[:content], pic_url: pic_url, url: url - end + end and return else - request.reply.text "课程邀请码不正确" + request.reply.text "课程邀请码不正确" and return end - return end request.reply.text "您的意见已收到,感谢您的反馈!" # Just echo end From 5b087179ebdeafcde9adc7c89aacf5f9aa4a18db Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Wed, 22 Jun 2016 12:31:47 +0800 Subject: [PATCH 073/216] . --- app/controllers/wechats_controller.rb | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index 8a596a470..b664c4474 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -6,7 +6,6 @@ class WechatsController < ActionController::Base # default text responder when no other match on :text do |request, content| - if content.size == 6 #邀请码 if join_class(content) root_url = "http://wechat.trustie.net" @@ -20,12 +19,10 @@ class WechatsController < ActionController::Base description: n[:content], pic_url: pic_url, url: url - end and return + end else - request.reply.text "课程邀请码不正确" and return + request.reply.text "您的意见已收到,感谢您的反馈!" # Just echo end - end - request.reply.text "您的意见已收到,感谢您的反馈!" # Just echo end # When receive 'help', will trigger this responder From f791f372059b37284b1497aa58f99f4533beab35 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Wed, 22 Jun 2016 12:36:46 +0800 Subject: [PATCH 074/216] . --- app/controllers/wechats_controller.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index b664c4474..20ef9f473 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -11,10 +11,10 @@ class WechatsController < ActionController::Base root_url = "http://wechat.trustie.net" news = (1..1).each_with_object([]) { |n, memo| memo << { title: '恭喜您成功加入班级,开始学习吧!', - content: "课程名称: 数据结构\n班级名称: 数据结构A班\n任课老师: 尹刚\n进入班级,和小伙伴愉快的学习吧!0"} } + content: "课程名称: 数据结构\n班级名称: 数据结构A班\n任课老师: 尹刚\n进入班级,和小伙伴愉快的学习吧!"} } request.reply.news(news) do |article, n, index| # article is return object url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{root_url+'/wechat/user_activities'}&response_type=code&scope=snsapi_base&state=myclass#wechat_redirect" - pic_url = "#{Setting.protocol}://#{Setting.host_name}/images/class.jpg" + pic_url = "#{Setting.protocol}://#{Setting.host_name}/images/wechat/class.jpg" article.item title: "#{n[:title]}", description: n[:content], pic_url: pic_url, From 8129e29d5ba35c8c89eb3906d1f087f60e1e96de Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Wed, 22 Jun 2016 12:52:26 +0800 Subject: [PATCH 075/216] . --- app/controllers/wechats_controller.rb | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index 20ef9f473..b1bab6c56 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -3,18 +3,18 @@ class WechatsController < ActionController::Base wechat_responder include ApplicationHelper - + # ROOT_URL = "#{Setting.protocol}://#{Setting.host_name}/" + ROOT_URL = "http://wechat.trustie.net" # default text responder when no other match on :text do |request, content| #邀请码 if join_class(content) - root_url = "http://wechat.trustie.net" news = (1..1).each_with_object([]) { |n, memo| memo << { title: '恭喜您成功加入班级,开始学习吧!', content: "课程名称: 数据结构\n班级名称: 数据结构A班\n任课老师: 尹刚\n进入班级,和小伙伴愉快的学习吧!"} } request.reply.news(news) do |article, n, index| # article is return object - url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{root_url+'/wechat/user_activities'}&response_type=code&scope=snsapi_base&state=myclass#wechat_redirect" - pic_url = "#{Setting.protocol}://#{Setting.host_name}/images/wechat/class.jpg" + url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{ROOT_URL+'/wechat/user_activities'}&response_type=code&scope=snsapi_base&state=myclass#wechat_redirect" + pic_url = "#{ROOT_URL}/images/wechat/class.jpg" article.item title: "#{n[:title]}", description: n[:content], pic_url: pic_url, @@ -164,16 +164,14 @@ class WechatsController < ActionController::Base end def sendBind(request) - root_url = "http://wechat.trustie.net" - news = (1..1).each_with_object([]) { |n, memo| memo << { title: '绑定登录', content: "欢迎使用Trustie创新实践服务平台! 在这里您可以随时了解您的课程和项目动态,随时点赞和回复。 我们将会与微信不断结合,为您提供更有价值的服务。 您还未绑定确实的用户,请先绑定,谢谢!" } } request.reply.news(news) do |article, n, index| # article is return object - url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{root_url+'/wechat/user_activities'}&response_type=code&scope=snsapi_base&state=login#wechat_redirect" - pic_url = "#{Setting.protocol}://#{Setting.host_name}/images/weixin_pic.jpg" + url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{ROOT_URL+'/wechat/user_activities'}&response_type=code&scope=snsapi_base&state=login#wechat_redirect" + pic_url = "#{ROOT_URL}/images/weixin_pic.jpg" article.item title: "#{n[:title]}", description: n[:content], pic_url: pic_url, From b68e227531bd4adcfeb834ea08dea3cb06276b83 Mon Sep 17 00:00:00 2001 From: yuanke <249218296@qq.com> Date: Wed, 22 Jun 2016 14:04:47 +0800 Subject: [PATCH 076/216] =?UTF-8?q?=E6=B2=A1=E6=BF=80=E6=B4=BB=E7=9A=84?= =?UTF-8?q?=E5=B8=90=E5=8F=B7=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/account_controller.rb | 15 +- app/controllers/users_controller.rb | 6 + app/controllers/words_controller.rb | 20 +++ app/views/account/email_activation.html.erb | 52 ++++++ config/routes.rb | 5 +- public/stylesheets/header.css | 176 ++++++++++++++++++++ 6 files changed, 270 insertions(+), 4 deletions(-) create mode 100644 app/views/account/email_activation.html.erb diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index 33d988e35..8bf40d472 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -239,14 +239,21 @@ class AccountController < ApplicationController end def resendmail + status = 1 user = User.find(params[:user]) if params[:user] token = Token.new(:user => user, :action => "register") if token.save Mailer.run.register(token) - else yield if block_given? + status = 0 end + render :json => status + end + + def email_activation + + end private @@ -264,6 +271,7 @@ class AccountController < ApplicationController if user.nil? invalid_credentials elsif user.status == 2 + @user = user invalid_credentials_new elsif user.new_record? onthefly_creation_failed(user, {:login => user.login, :auth_source_id => user.auth_source_id }) @@ -375,8 +383,9 @@ class AccountController < ApplicationController def invalid_credentials_new logger.warn "Failed login for '#{params[:username]}' from #{request.remote_ip} at #{Time.now.utc}" - flash[:error] = l(:notice_account_invalid_creditentials_new) - render signin_path(:login=>true) + # flash[:error] = l(:notice_account_invalid_creditentials_new) + # render signin_path(:login=>true) + render :action => 'email_activation' end # Register a user for email activation. diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 87c7d8f54..ed8a9fa36 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1239,6 +1239,12 @@ class UsersController < ApplicationController render :layout=>'new_base_user' end + #给某人留言 + def feedBackTo + + + end + def user_comments end diff --git a/app/controllers/words_controller.rb b/app/controllers/words_controller.rb index 22b7f1f52..3b540f0d0 100644 --- a/app/controllers/words_controller.rb +++ b/app/controllers/words_controller.rb @@ -337,6 +337,26 @@ class WordsController < ApplicationController UserExtensions.introduction(user, message) redirect_to user_url(user.id) end + + #邮箱激活问题留言 留言成功给出提示框 + def leave_email_activation_message + status = 1 #成功 + me = User.find(params[:user]) + if me + @user = User.find(params[:id]) + if params[:text].size>0 && @user + # @user.add_jour(me, params[:text]) + #私信 + message = "【未收到激活邮件的用户反馈,用户邮箱:"+me.mail+"】
    "+params[:text] + @user.journals_for_messages << JournalsForMessage.new(:user_id => me.id, :notes => message, :reply_id => 0, :status => true, :is_readed => false, :private => 1) + else + status = 0 + end + render :json => status + else + render_403 + end + end private diff --git a/app/views/account/email_activation.html.erb b/app/views/account/email_activation.html.erb new file mode 100644 index 000000000..abd010a96 --- /dev/null +++ b/app/views/account/email_activation.html.erb @@ -0,0 +1,52 @@ +
    + +
    + diff --git a/config/routes.rb b/config/routes.rb index ec8fa2337..6e720ffba 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -489,10 +489,13 @@ RedmineApp::Application.routes.draw do match 'account/activate', :via => :get match 'account/valid_ajax', :via => :get match 'account/email_valid', :to => 'account#email_valid', :via => :get - match 'account/resendmail', :to => 'account#resendmail', :via=> :get + match 'account/resendmail', :to => 'account#resendmail', :via=> :get, :as => 'resendmail' match 'projects/:id/wiki', :to => 'wikis#edit', :via => :post match 'projects/:id/wiki/destroy', :to => 'wikis#destroy', :via => [:get, :post] + #激活邮箱反馈问题 + match 'users/:id/leave_email_activation_message', :to => 'words#leave_email_activation_message', :via => :get, :as => "leave_email_activation_message" + # boards match 'boards/:board_id/topics/new', :to => 'messages#new', :via => [:get, :post], :as => 'new_board_message' match 'boards/:id/join_to_org_subfields', :to => 'boards#join_to_org_subfields' diff --git a/public/stylesheets/header.css b/public/stylesheets/header.css index 767d76cb2..5700d0b00 100644 --- a/public/stylesheets/header.css +++ b/public/stylesheets/header.css @@ -117,3 +117,179 @@ a.f_grey:hover {color:#000000 !important;} #loginInButton {height:54px; padding-left:10px; padding-right:10px; text-align:center; line-height:54px; vertical-align:middle; color:#ffffff; font-size:16px;} #loginSignButton:hover {background-color:#297fb8;} #loginInButton:hover {background-color:#297fb8;} + +/* 邮箱验证 */ +.email_verify body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{ margin:0; padding:0;} +.mt30{ margin-top:30px;} +.ml30{ margin-left:30px;} +.new_content{ + width:1000px; + margin:10px auto; + padding:30px 0; + background-color:#fff; +} +.email_verify{ + width:720px; + margin:0px auto; +} +.email_verify_prompt{ + border:2px solid #dd0000; + background:#ffe3e3 url(../images/icons_prompt.png) 25px 10px no-repeat;; + height:35px; + line-height:35px; + padding-left:45px; + color:#8b0000; + font-size:14px; +} +.email_verify_btn{ + border-style:none; + height:35px; + padding:0 15px; + line-height:35px; + color:#fff; + background:#3a95d7; + text-align:center; + -webkit-border-radius:5px; + -moz-border-radius:5px; + -o-border-radius:5px; + border-radius:5px; + font-size:14px; +} +.email_verify_btn:hover{ + background:#017bd3; +} +.email_sub_btn{ + border-style:none; + height:30px; + padding:0 25px; + line-height:30px; + color:#fff; + background:#3a95d7; + text-align:center; + -webkit-border-radius:5px; + -moz-border-radius:5px; + -o-border-radius:5px; + border-radius:5px; + font-size:14px; +} +.email_sub_btn:hover{ + background:#017bd3; +} +.email_prompt_p{ + font-size:14px; + color:#000; + margin-bottom:10px; +} +.email_prompt_txt{ width:480px;} +.email_prompt_txt li{ + margin-left:15px; + list-style-type: disc; + color:#777; + line-height:1.9; + font-size:14px; +} +.email_prompt_mes{ + border:1px solid #ccc; + -webkit-border-radius:5px; + -moz-border-radius:5px; + -o-border-radius:5px; + border-radius:5px; + width:468px; + height:60px; + background:#fff; + padding:5px; + margin-bottom: 5px; +} +.email_tanbox{ + border:2px solid #3a95d7; + background:#fff; + width:480px; + +} +.email_tancon{ + width:420px; + margin:0 auto; + text-align:center; + padding:20px 30px; + background:#fff; +} +.email_tan_title{ + font-size:18px; + color:#3a95d7; + font-weight:normal; + margin-bottom:5px; +} +.email_tan_p{ + font-size:14px; + color:#4c4c4c; + +} +.email_verify_p{ + font-size:14px; + color:#3a95d7; +} + +/***** Ajax indicator ******/ +/*-------resendmail---------*/ +#ajax-indicator { + position: absolute; /* fixed not supported by IE */ + background-color:#eee; + border: 1px solid #bbb; + top:35%; + left:40%; + width:20%; + font-weight:bold; + text-align:center; + padding:0.6em; + z-index:100000; + opacity: 0.5; +} + +html>body #ajax-indicator { position: fixed; } + +#ajax-indicator span { + background-position: 0% 40%; + background-repeat: no-repeat; + background-image: url(../images/loading.gif); + padding-left: 26px; + vertical-align: bottom; +} + +div.modal { + border-radius: 5px; + background: #fff; + z-index: 50; + padding: 4px; +} +.ui-widget-content { + border: 1px solid #ddd; + color: #333; +} +.ui-widget { + font-family: Verdana, sans-serif; + font-size: 1.1em; +} +.ui-dialog .ui-dialog-content { + position: relative; + border: 0; + padding: .5em 1em; + background: none; + overflow: auto; + zoom: 1; +} +.ui-widget-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-widget-overlay { + background: #666 url(http://forge.trustie.net/stylesheets/jquery/images/xui-bg_diagonals-thick_20_666666_40x40.png.pagespeed.ic.9mfuw_R0z1.png) 50% 50% repeat; + opacity: .5; + filter: Alpha(Opacity=50); +} +.resourceUploadPopup {width:400px; height:auto; border:3px solid #269ac9 !important; padding-left:16px; padding-bottom:16px; background-color:#ffffff; position:absolute; top:50%; left:50%; margin-left:-200px; z-index:1000;} +a.Blue-btn{ display:block; margin-right:15px;width:65px; height:22px; background-color:#ffffff; line-height:24px; vertical-align:middle; text-align:center; border:1px solid #3598db; color:#3598db; -moz-border-radius:5px; -webkit-border-radius:5px; border-radius:5px;} +a:hover.Blue-btn{ background:#3598db; color:#fff;} +/***** end Ajax indicator ******/ \ No newline at end of file From 9461c41fa72bd1aadd835cc47903cab985bad9f2 Mon Sep 17 00:00:00 2001 From: yuanke <249218296@qq.com> Date: Wed, 22 Jun 2016 14:14:36 +0800 Subject: [PATCH 077/216] =?UTF-8?q?=E6=BF=80=E6=B4=BB=E7=95=99=E8=A8=80?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/words_controller.rb | 3 ++- app/views/account/email_activation.html.erb | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/controllers/words_controller.rb b/app/controllers/words_controller.rb index 3b540f0d0..1bbbb1190 100644 --- a/app/controllers/words_controller.rb +++ b/app/controllers/words_controller.rb @@ -343,7 +343,8 @@ class WordsController < ApplicationController status = 1 #成功 me = User.find(params[:user]) if me - @user = User.find(params[:id]) + #课程使者id=1 + @user = User.find(1) if params[:text].size>0 && @user # @user.add_jour(me, params[:text]) #私信 diff --git a/app/views/account/email_activation.html.erb b/app/views/account/email_activation.html.erb index abd010a96..d625e7fc9 100644 --- a/app/views/account/email_activation.html.erb +++ b/app/views/account/email_activation.html.erb @@ -10,7 +10,7 @@
  • 如果您无法收到激活邮件,请您直接给我们管理员留言:
  • - +
    @@ -29,7 +29,7 @@ } ); } - function leave_email_activation_message(url,user,id) + function leave_email_activation_message(url,user) { if ($(".email_prompt_mes").val().length == 0){ //弹框请他输入文字 @@ -39,7 +39,7 @@ } $.get( url, - {user:user,id: 1,text:$(".email_prompt_mes").val() }, + {user:user,text:$(".email_prompt_mes").val() }, function (data) { console.log("2222222"); console.log(data); From 7700445c178938c23db5f0dbde9b9a8d4d6b780e Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Wed, 22 Jun 2016 16:42:20 +0800 Subject: [PATCH 078/216] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E8=AF=BE=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/mobile/apis/courses.rb | 4 +- app/controllers/wechats_controller.rb | 17 +++++--- app/views/wechats/user_activities.html.erb | 39 ++++++++++--------- public/assets/wechat/myclass.html | 32 +++++++++++++++ .../javascripts/wechat/controllers/myclass.js | 8 ++++ public/stylesheets/weui/weixin.css | 2 + 6 files changed, 74 insertions(+), 28 deletions(-) diff --git a/app/api/mobile/apis/courses.rb b/app/api/mobile/apis/courses.rb index b585e7dae..de2e48c8e 100644 --- a/app/api/mobile/apis/courses.rb +++ b/app/api/mobile/apis/courses.rb @@ -97,15 +97,13 @@ module Mobile desc "加入课程" params do - optional :openid, type: String, desc: '微信ID' + requires :token, type: String requires :invite_code, type: String, desc: '邀请码' end post "join" do authenticate! - cs = CoursesService.new status = cs.join_course({openid: params[:openid], invite_code: params[:invite_code]}, current_user) - { status: status[:state], messsge:CoursesService::JoinCourseError.message(status[:state]) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index b1bab6c56..f6e73e088 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -8,12 +8,14 @@ class WechatsController < ActionController::Base # default text responder when no other match on :text do |request, content| #邀请码 - if join_class(content) - + uw = user_binded?(request[:FromUserName]) + if !uw + sendBind() + elsif (course = join_class(content, uw.user)) && course news = (1..1).each_with_object([]) { |n, memo| memo << { title: '恭喜您成功加入班级,开始学习吧!', - content: "课程名称: 数据结构\n班级名称: 数据结构A班\n任课老师: 尹刚\n进入班级,和小伙伴愉快的学习吧!"} } + content: "课程名称: #{course.name}\n班级名称: #{course.name}\n任课老师: #{course.teacher.show_name}\n进入班级,和小伙伴愉快的学习吧!"} } request.reply.news(news) do |article, n, index| # article is return object - url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{ROOT_URL+'/wechat/user_activities'}&response_type=code&scope=snsapi_base&state=myclass#wechat_redirect" + url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{ROOT_URL+'/wechat/user_activities?id='+course.id}&response_type=code&scope=snsapi_base&state=myclass#wechat_redirect" pic_url = "#{ROOT_URL}/images/wechat/class.jpg" article.item title: "#{n[:title]}", description: n[:content], @@ -179,8 +181,11 @@ class WechatsController < ActionController::Base end end - def join_class(content) - true + def join_class(content, user) + cs = CoursesService.new + status = cs.join_course({invite_code: content.trim}, current_user) + logger.info status + status[:state] == 0 ? status[:course] : nil end ### controller method diff --git a/app/views/wechats/user_activities.html.erb b/app/views/wechats/user_activities.html.erb index f920aed4b..b5bd82fc5 100644 --- a/app/views/wechats/user_activities.html.erb +++ b/app/views/wechats/user_activities.html.erb @@ -25,25 +25,26 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/assets/wechat/myclass.html b/public/assets/wechat/myclass.html index e69de29bb..25d29008a 100644 --- a/public/assets/wechat/myclass.html +++ b/public/assets/wechat/myclass.html @@ -0,0 +1,32 @@ +
    +
    分布式计算环境A班邀请码
    +
    + +
    +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +
    资源名称001
    +
    资源名称002
    +
    资源名称003
    +
    资源名称004
    +
    资源名称005
    +
    资源名称006
    +
    +
    +
    授课老师
    +
    jacknudt
    +
    我的同学
    +
    jingquan教辅
    +
    yuanke
    +
    sasameimei
    +
    +
    diff --git a/public/javascripts/wechat/controllers/myclass.js b/public/javascripts/wechat/controllers/myclass.js index f6cd77e17..cb5cf9037 100644 --- a/public/javascripts/wechat/controllers/myclass.js +++ b/public/javascripts/wechat/controllers/myclass.js @@ -1,3 +1,11 @@ app.controller('MyClassController', ['$scope', function($scope){ + var vm = $scope; + + vm.currentTab = 1; + vm.tab = function(index){ + vm.currentTab = index; + console.log(vm.currentTab); + } + }]); \ No newline at end of file diff --git a/public/stylesheets/weui/weixin.css b/public/stylesheets/weui/weixin.css index ab8081173..12e11b5fa 100644 --- a/public/stylesheets/weui/weixin.css +++ b/public/stylesheets/weui/weixin.css @@ -142,6 +142,7 @@ a.underline {text-decoration:underline;} .slice-line2 {width:1px; height:38px; margin:auto; background:#ccc;} .class-detail-tab {width:23%; height:38px; line-height:38px; font-size:13px; color:#444; background-color:#fff; float:left; text-align:center; vertical-align:middle; border-bottom:1px solid #ccc;} .class-detail-tab2 {width:32%; height:38px; line-height:38px; font-size:13px; color:#444; background-color:#fff; float:left; text-align:center; vertical-align:middle; border-bottom:1px solid #ccc;} +.class-detail-tab3 {width:48%; height:38px; line-height:38px; font-size:13px; color:#444; background-color:#fff; float:left; text-align:center; vertical-align:middle; border-bottom:1px solid #ccc;} .class-tab-active {border-bottom:1px solid #3b94d6;} .class-search-wrap {padding:8px 12px; position:relative;} .class-search-inner {padding:0 30px; background-color:#fff;} @@ -151,6 +152,7 @@ a.underline {text-decoration:underline;} .class-detail-row {width:100%; height:38px; line-height:38px; vertical-align:middle; border-bottom:1px solid #ccc; background-color:#fff;} .class-test-tip {text-align:center; font-size:13px; color:#444; padding-top:40px;} .img-circle {border-radius:50%;} +.member-banner {height:24px; line-height:24px; text-align:center; vertical-align:middle; background-color:#dfdfdf;} /*20160614班级列表*/ .course-list-row {width:100%; height:38px; line-height:38px; vertical-align:middle; border-top:1px solid #ccc; border-bottom:1px solid #ccc; background-color:#fff;} From 0929d2ac284a8623d47dffe0d74229d7ea9bfe4e Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Wed, 22 Jun 2016 16:48:34 +0800 Subject: [PATCH 079/216] . --- app/controllers/wechats_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index f6e73e088..2cb114a56 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -183,7 +183,7 @@ class WechatsController < ActionController::Base def join_class(content, user) cs = CoursesService.new - status = cs.join_course({invite_code: content.trim}, current_user) + status = cs.join_course({invite_code: content.strip}, current_user) logger.info status status[:state] == 0 ? status[:course] : nil end From 40217d5c564aba1bf9ead1bba534f579156fc337 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Wed, 22 Jun 2016 16:57:01 +0800 Subject: [PATCH 080/216] . --- app/controllers/wechats_controller.rb | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index 2cb114a56..7e87d353c 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -8,6 +8,7 @@ class WechatsController < ActionController::Base # default text responder when no other match on :text do |request, content| #邀请码 + begin uw = user_binded?(request[:FromUserName]) if !uw sendBind() @@ -25,6 +26,9 @@ class WechatsController < ActionController::Base else request.reply.text "您的意见已收到,感谢您的反馈!" # Just echo end + rescue => e + request.reply.text e + end end # When receive 'help', will trigger this responder @@ -183,9 +187,12 @@ class WechatsController < ActionController::Base def join_class(content, user) cs = CoursesService.new - status = cs.join_course({invite_code: content.strip}, current_user) + status = cs.join_course({invite_code: content.upcase.strip}, current_user) logger.info status - status[:state] == 0 ? status[:course] : nil + if status[:state] != 0 + raise CoursesService::JoinCourseError.message(status[:state]) + end + status[:course] end ### controller method From fc5895e74f314622a4564ebbde5994b05b8b9ca2 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Wed, 22 Jun 2016 17:02:33 +0800 Subject: [PATCH 081/216] . --- app/services/courses_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/services/courses_service.rb b/app/services/courses_service.rb index 93529f57c..4d9231287 100644 --- a/app/services/courses_service.rb +++ b/app/services/courses_service.rb @@ -334,7 +334,7 @@ class CoursesService if current_user.member_of_course?(course) #如果已经是成员 member = course.members.where("user_id=#{current_user.id} and course_id=#{course.id}")[0] roleName = member.roles[0].name if member - if params[:course_password] == course.password + if params[:course_password] == course.password || params[:invite_code].present? #如果加入角色为学生 并且当前是学生 if params[:role] == "10" && roleName == "Student" @state = 3 @@ -367,7 +367,7 @@ class CoursesService @state = 1 end else - if params[:course_password] == course.password + if params[:course_password] == course.password || params[:invite_code].present? if params[:role] == "10" || params[:role] == nil members = [] members << Member.new(:role_ids => [10], :user_id => current_user.id) From 9b42b4e7f739a79459f58a44bef82787b8f2cf88 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Wed, 22 Jun 2016 17:04:01 +0800 Subject: [PATCH 082/216] . --- app/controllers/wechats_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index 7e87d353c..94b02d082 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -16,7 +16,7 @@ class WechatsController < ActionController::Base news = (1..1).each_with_object([]) { |n, memo| memo << { title: '恭喜您成功加入班级,开始学习吧!', content: "课程名称: #{course.name}\n班级名称: #{course.name}\n任课老师: #{course.teacher.show_name}\n进入班级,和小伙伴愉快的学习吧!"} } request.reply.news(news) do |article, n, index| # article is return object - url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{ROOT_URL+'/wechat/user_activities?id='+course.id}&response_type=code&scope=snsapi_base&state=myclass#wechat_redirect" + url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{ROOT_URL+'/wechat/user_activities?id='+course.id.to_s}&response_type=code&scope=snsapi_base&state=myclass#wechat_redirect" pic_url = "#{ROOT_URL}/images/wechat/class.jpg" article.item title: "#{n[:title]}", description: n[:content], From 1470cafe57ad6a02f7bcb58ad3f3607a4b5fd465 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Wed, 22 Jun 2016 17:09:49 +0800 Subject: [PATCH 083/216] . --- app/controllers/wechats_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index 94b02d082..30e2be847 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -187,7 +187,7 @@ class WechatsController < ActionController::Base def join_class(content, user) cs = CoursesService.new - status = cs.join_course({invite_code: content.upcase.strip}, current_user) + status = cs.join_course({invite_code: content.upcase.strip}, user) logger.info status if status[:state] != 0 raise CoursesService::JoinCourseError.message(status[:state]) From ce6e6116b5836819c65338cb1739ad3a7d8678db Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 22 Jun 2016 17:09:54 +0800 Subject: [PATCH 084/216] get data from sonar API --- .../quality_analysis_controller.rb | 25 ++++++++++++++----- app/models/quality_analysis.rb | 2 +- app/models/sonar_analysis.rb | 3 +++ app/views/quality_analysis/index.html.erb | 13 +++++++--- app/views/quality_analysis/show.html.erb | 0 ...20160622033322_create_quality_analyses.rb} | 0 ...4138_add_jk_version_to_quality_analysis.rb | 5 ++++ db/schema.rb | 8 +++--- 8 files changed, 43 insertions(+), 13 deletions(-) create mode 100644 app/models/sonar_analysis.rb create mode 100644 app/views/quality_analysis/show.html.erb rename db/migrate/{20160622015019_create_quality_analyses.rb => 20160622033322_create_quality_analyses.rb} (100%) create mode 100644 db/migrate/20160622074138_add_jk_version_to_quality_analysis.rb diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index 1cf38308e..6be51da70 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -8,7 +8,7 @@ class QualityAnalysisController < ApplicationController require 'json' require 'open-uri' - def new + def show end @@ -24,9 +24,11 @@ class QualityAnalysisController < ApplicationController language = params[:language] path = params[:path] identifier = params[:identifier] + qa = QualityAnalysis.where(:project_id => @project.id).first + version = qa.sonar_version + 1 properties = "sonar.projectKey=#{user_name}:#{identifier} sonar.projectName=#{user_name}:#{identifier} - sonar.projectVersion=1.0 + sonar.projectVersion=#{version} sonar.sources=#{path} sonar.language=#{language.downcase} sonar.sourceEncoding=utf-8" @@ -43,13 +45,24 @@ class QualityAnalysisController < ApplicationController # relace gitlab hook # genkins address @g.add_project_hook(@project.gpid,"http://123.59.135.93:8890/project/#{user_name}_#{identifier}") - QualityAnalysis.create(:project_id => @project.id, :author_login => user_name, :rep_identifier => identifier) + if qa.nil? + QualityAnalysis.create(:project_id => @project.id, :author_login => user_name, :rep_identifier => identifier, :version => version) + else + qa.update_attribute(:version, version) + end end def index - data = open('http://123.59.135.93:8891/api/resources/index?resource=my:project985&depth=-1&metrics=complexity,class_complexity,lines,comment_lines,blocker_violations').read - @cc =JSON.parse(data) - + if params[:name].nil? + @name_flag = true + projects_date = open("http://123.59.135.93:8891/api/projects/index").read + @results = JSON.parse(projects_date) + else + @name_flag = false + project_key = params[:name] + data = open("http://123.59.135.93:8891/api/resources/index?resource=#{project_key}&depth=-1&metrics=complexity,class_complexity,lines,comment_lines,blocker_violations").read + @cc =JSON.parse(data) + end end # Find project of id params[:project_id] diff --git a/app/models/quality_analysis.rb b/app/models/quality_analysis.rb index 45778ff3f..09803467e 100644 --- a/app/models/quality_analysis.rb +++ b/app/models/quality_analysis.rb @@ -1,3 +1,3 @@ class QualityAnalysis < ActiveRecord::Base - attr_accessible :author_login, :project_id, :rep_identifier + attr_accessible :author_login, :project_id, :rep_identifier, :sonar_version end diff --git a/app/models/sonar_analysis.rb b/app/models/sonar_analysis.rb new file mode 100644 index 000000000..0bb2089de --- /dev/null +++ b/app/models/sonar_analysis.rb @@ -0,0 +1,3 @@ +class SonarAnalysis < ActiveRecord::Base + attr_accessible :author_login, :project_id, :rep_identifier +end diff --git a/app/views/quality_analysis/index.html.erb b/app/views/quality_analysis/index.html.erb index 1f70644db..627d33d96 100644 --- a/app/views/quality_analysis/index.html.erb +++ b/app/views/quality_analysis/index.html.erb @@ -1,3 +1,10 @@ -<% @cc.each do |c| %> - <%= c %> -<% end %> \ No newline at end of file +<% if @name_flag %> + <%= @results.each do |result| %> +

    + <%=link_to result["k"], project_quality_analysis_path(:name => result["k"]) %> +

    + <% end %> +<% else %> + <%= @cc %> +<% end %> + diff --git a/app/views/quality_analysis/show.html.erb b/app/views/quality_analysis/show.html.erb new file mode 100644 index 000000000..e69de29bb diff --git a/db/migrate/20160622015019_create_quality_analyses.rb b/db/migrate/20160622033322_create_quality_analyses.rb similarity index 100% rename from db/migrate/20160622015019_create_quality_analyses.rb rename to db/migrate/20160622033322_create_quality_analyses.rb diff --git a/db/migrate/20160622074138_add_jk_version_to_quality_analysis.rb b/db/migrate/20160622074138_add_jk_version_to_quality_analysis.rb new file mode 100644 index 000000000..838d6d896 --- /dev/null +++ b/db/migrate/20160622074138_add_jk_version_to_quality_analysis.rb @@ -0,0 +1,5 @@ +class AddJkVersionToQualityAnalysis < ActiveRecord::Migration + def change + add_column :quality_analyses, :sonar_version, :integer, :default => false + end +end diff --git a/db/schema.rb b/db/schema.rb index 51e0682d0..01a001769 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20160622015019) do +ActiveRecord::Schema.define(:version => 20160622074138) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -1837,8 +1837,10 @@ ActiveRecord::Schema.define(:version => 20160622015019) do t.integer "project_id" t.string "author_login" t.string "rep_identifier" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.float "version", :default => 0.0 + t.integer "sonar_version", :default => 1 end create_table "queries", :force => true do |t| From d466b09f3f3cdbfab9d27b1865cb652f05a69000 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Wed, 22 Jun 2016 17:20:34 +0800 Subject: [PATCH 085/216] . --- app/controllers/wechats_controller.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index 30e2be847..d6ab11f92 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -11,11 +11,11 @@ class WechatsController < ActionController::Base begin uw = user_binded?(request[:FromUserName]) if !uw - sendBind() + return sendBind() elsif (course = join_class(content, uw.user)) && course news = (1..1).each_with_object([]) { |n, memo| memo << { title: '恭喜您成功加入班级,开始学习吧!', content: "课程名称: #{course.name}\n班级名称: #{course.name}\n任课老师: #{course.teacher.show_name}\n进入班级,和小伙伴愉快的学习吧!"} } - request.reply.news(news) do |article, n, index| # article is return object + return request.reply.news(news) do |article, n, index| # article is return object url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=#{Wechat.config.appid}&redirect_uri=#{ROOT_URL+'/wechat/user_activities?id='+course.id.to_s}&response_type=code&scope=snsapi_base&state=myclass#wechat_redirect" pic_url = "#{ROOT_URL}/images/wechat/class.jpg" article.item title: "#{n[:title]}", @@ -24,10 +24,10 @@ class WechatsController < ActionController::Base url: url end else - request.reply.text "您的意见已收到,感谢您的反馈!" # Just echo + return request.reply.text "您的意见已收到,感谢您的反馈!" # Just echo end rescue => e - request.reply.text e + return request.reply.text e end end From 9f15a8aa4e41d0d19f86447be297669d5a08f81e Mon Sep 17 00:00:00 2001 From: huang Date: Wed, 22 Jun 2016 17:40:13 +0800 Subject: [PATCH 086/216] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E8=B4=A8=E9=87=8F?= =?UTF-8?q?=E5=88=86=E6=9E=90=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quality_analysis/_result_list.html.erb | 0 app/views/quality_analysis/_show.html.erb | 148 ++++++++++++++++++ app/views/quality_analysis/index.html.erb | 2 +- .../repositories/_quality_analysis.html.erb | 32 +++- public/images/code-analysis-icon.png | Bin 0 -> 1682 bytes public/stylesheets/project.css | 22 +++ public/stylesheets/public.css | 3 + 7 files changed, 199 insertions(+), 8 deletions(-) create mode 100644 app/views/quality_analysis/_result_list.html.erb create mode 100644 app/views/quality_analysis/_show.html.erb create mode 100644 public/images/code-analysis-icon.png diff --git a/app/views/quality_analysis/_result_list.html.erb b/app/views/quality_analysis/_result_list.html.erb new file mode 100644 index 000000000..e69de29bb diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb new file mode 100644 index 000000000..4cb86f22c --- /dev/null +++ b/app/views/quality_analysis/_show.html.erb @@ -0,0 +1,148 @@ +
    +
    +

    SonarQube质量分析

    +
    +
    +
    + + 分支: + +
    +
    + 开始分析 +
    +
    项目代码质量分析报告
    +
    概要信息
    +
    +
    +

    质量等级

    +

    A正常

    +
    +
    +

    复杂度

    +

    44正常

    +
    +
    +

    重复

    +

    44%正常

    +
    +
    +

    注释率

    +

    12%偏低

    +
    +
    +
    质量等级2/5分可定性评价为:质量中等
    +
    +
    技术债务14天查看详情
    +
    质量问题130问题分类如下:
    +
    +
    阻断4
    +
    严重75
    +
    主要428
    +
    次要225
    +
    信息114
    +
    +
    +
    代码规模可定性评价为:规模中等
    +
    +
    +

    代码行数

    +

    9,337

    +
    +
    +

    文件

    +

    10

    +
    +
    +

    目录

    +

    6

    +
    +
    +

    +

    15

    +
    +
    +

    方法

    +

    36

    +
    +
    +
    贡献统计
    +
    +
      +
    •  
    • +
    • 代码行数
    • +
    • 引入质量问题数
    • +
    • 引入质量问题数/代码行数
    • +
      +
    +
      +
    • +
      + +
      +
    • +
    • 18340
    • +
    • 230
    • +
    • .012540
    • +
      +
    +
      +
    • +
      + +
      +
    • +
    • 834
    • +
    • 34
    • +
    • .04077
    • +
      +
    +
      +
    • +
      + +
      +
    • +
    • 134
    • +
    • 10
    • +
    • .07462
    • +
      +
    +
    +
    \ No newline at end of file diff --git a/app/views/quality_analysis/index.html.erb b/app/views/quality_analysis/index.html.erb index 627d33d96..3ce1a8e4a 100644 --- a/app/views/quality_analysis/index.html.erb +++ b/app/views/quality_analysis/index.html.erb @@ -5,6 +5,6 @@

    <% end %> <% else %> - <%= @cc %> + <%= render "show" %> <% end %> diff --git a/app/views/repositories/_quality_analysis.html.erb b/app/views/repositories/_quality_analysis.html.erb index 64dd837b7..bf1b9ea41 100644 --- a/app/views/repositories/_quality_analysis.html.erb +++ b/app/views/repositories/_quality_analysis.html.erb @@ -1,7 +1,25 @@ -<%= form_tag( url_for(:controller => 'quality_analysis', :action => 'create', :project_id => @project.id, :user_id => User.current.id, :identifier => @repository.identifier), :remote => true , :class => 'resourcesSearchloadBox mt10', :id => 'quality_analyses_form') do %> - - <%= select_tag :branch, options_for_select(["#{@gitlab_default_branch}"]+ @branch_names, @rev), :id => 'branch' %> - <%= select_tag :language, options_for_select(["Java","C","PHP", "Web"]), :id => 'branch' %> - - -<% end %> \ No newline at end of file +
    +
    代码质量分析
    +
    + <%= form_tag( url_for(:controller => 'quality_analysis', :action => 'create', :project_id => @project.id, :user_id => User.current.id, :identifier => @repository.identifier), :remote => true, :id => 'quality_analyses_form') do %> +
    +
    + +
    +
    +
    + <%= select_tag :branch, options_for_select(["#{@gitlab_default_branch}"]+ @branch_names, @rev), :id => 'branch', :class => "analysis-option-box" %> +
    +
    +
    +
    + <%= select_tag :language, options_for_select(["Java","C","PHP", "Web"]), :id => 'branch', :class => "analysis-option-box" %> +
    +
    + + +
    +
    + <% end %> +
    +
    \ No newline at end of file diff --git a/public/images/code-analysis-icon.png b/public/images/code-analysis-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..18869da0e413a92e76acb80a4b2fa2c7ea4dbb62 GIT binary patch literal 1682 zcmb_dX;2eq7~Y0)ro$AgGCH1}HC7u?a*{|=!j(-Vl|)S97!O*OWQ9mJ8#fCi(5l6Q zqUdz2C~8I9A0BmTbwKKfU=>mEsMRq;00Y`01T-9iNgyQY1_Aq{^jE*x{jPbQ=Y78S zdv~@tRlXuDbZ#gB0AbQ(NI{M>$hYYI5VBuZJyc2#a|p4TP-2^iJQzoSL@kzqfKn9B zL=*_DwQOlXVgVq8s#B>6wJb%T!B9FJ#L&&Ckz@lvY`obBYqAjn%s?`A1|hY#`Wh9~ zX@%6aTp3el6d_r<+hOO1~MW6c6m07VEGG^2WhNnjRIM|B0{Jh;uE zf};>3TS$FtN-awTMHr5NTskL8!(_2Q9*@q7=JI%~Wgwf$Vl$ZJ!;4}?3%EQ1dpS7P zsAM!;yGfvcBxAA2m5`c65Jmxmk(ZZ8&*RWBJd?rV^Z7vyHam($M42oG0yak(OpC@9 zAjG7>bw)ym8Ni?-oPp&KLMrL>?GaGpgsj0dmL@V`3^QzGu;|R-k;Z{C*?&V(bOLQ6 z6v#Wj|0--!S&RrnftauyTti;mrbWR}Mu7-NU;@Kc7^WZ3VrmvfV5Th02#SbCQbE5CHYB=q^79E{WaGEet&a!z1P_@ zJmPMWud~COeQu9UqBwdBF29p?_Mv5PsAr`A^>A0Wl_%;sU+Fk-q`T}yi}Le*wJB~} zbFZtz@AtnM>ig~K@!pEd0iW-{^)AQm-EGbXuRSjZ>hHAoS*?y5 zug`P$`MHC2>fsli1D;on2`Np|HN%cB|Im=%?`ssTay@B$+;Mrhv#V8Wc!uT{UzH3# zeEcU~aOma+k9V+r+it(tYfDx($<$W9_^+>a^|>7#eYPj0y*KRx4G)Gp90ML_W8BKu zH*U4U+1}p1{%du9@5u9>KZ>eFPdEvI(YE9E2|Jkw6`_zT-|qacJ)m^sj{xAkaw(Lk zGB>{}U5njdPTO7qmLzQ7X=Q&FF=ah%$`yBOU7SC#t!u%SlGSbIGwVy0#Qu1@bbtJY zM@!n0yy83e#nh(C!oje(Fxg>Ro#l(7xXvTfoN(d?&nQKe3H;5J*@|-sUeDIkb)2c0 zlp2MVzY(sTMO*23RRsfXyXsZuZi(;3=^0J?X%BQ|qV0EQm zsPu(bS$?@avt^0hsfs+cv3CA+AcNDAtUqSE@0w>TFG{)SGZcJZ;JSC!2`07tu^;M)y!Lw@}fDE#kPopk)<=#%OX}kEu3-S zGL$1J`9`m2XFz4)txmT5N?HnH`E{@4!p;Y2^;MdWzuR3=S#!qOF#EKVcd8${6vo7k z4ecBe)#u*Z6LRzC4fQVJx9e%NDj&s139Z#%ga Tpie)c2mcaMu^c*|lwSBZiC*=^ literal 0 HcmV?d00001 diff --git a/public/stylesheets/project.css b/public/stylesheets/project.css index 90a94b52f..0774fa892 100644 --- a/public/stylesheets/project.css +++ b/public/stylesheets/project.css @@ -1246,3 +1246,25 @@ a.pages-big{ width:50px;} .red-cir-btn{ background:#e74c3c; padding:1px 5px; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; color:#fff; font-weight:normal;font-size:12px;} .green-cir-btn{ background:#28be6c; padding:1px 5px; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; color:#fff; font-weight:normal;font-size:12px;} + +/*20160622质量分析*/ +.analysis-tag-wrap {width:100%; color:#000; height:20px; line-height:20px; vertical-align:middle;} +.analysis-tag {width:10px; height:20px; background-color:#777;} +.analysis-block {padding:15px; border:1px solid #d9d9d9;} +.flex {display:flex;} +.analysis-genral {flex:1; display:block; text-align:center;} +.analysis-block-icon {background:url(../images/code-analysis-icon.png) -2px -8px no-repeat; width:14px; height:14px; display:inline-block; vertical-align:middle;} +.analysis-serious-icon {background:url(../images/code-analysis-icon.png) -2px -34px no-repeat; width:14px; height:14px; display:inline-block; vertical-align:middle;} +.analysis-main-icon {background:url(../images/code-analysis-icon.png) -2px -59px no-repeat; width:14px; height:14px; display:inline-block; vertical-align:middle;} +.analysis-secondary-icon {background:url(../images/code-analysis-icon.png) -2px -85px no-repeat; width:14px; height:14px; display:inline-block; vertical-align:middle;} +.analysis-info-icon {background:url(../images/code-analysis-icon.png) -2px -111px no-repeat; width:14px; height:14px; display:inline-block; vertical-align:middle;} +.quality-percentage {width:320px; height:14px; display:inline-block;} +.quality-percentage-rate {width:50%; height:14px; background-color:#0a6c99; display:inline-block;} +.image-cir {border-radius:50%;} +.analysis-genral-icon {position:absolute; padding:1px 5px; display:inline-block; top:5px;} +.contribute-list-avatar {width:80px; vertical-align:middle; text-align:center;} +.contribute-list-code {width:160px; vertical-align:middle; text-align:center;} +.contribute-list-problem {width:170px; vertical-align:middle; text-align:center;} +.contribute-list-rate {width:228px; vertical-align:middle; text-align:center;} +.contribute-list-height {height:80px;} +.contribute-list-line-height {line-height:80px;} \ No newline at end of file diff --git a/public/stylesheets/public.css b/public/stylesheets/public.css index d9306fa0b..e33ac601e 100644 --- a/public/stylesheets/public.css +++ b/public/stylesheets/public.css @@ -1161,3 +1161,6 @@ a.st_down{ display: block; width:8px; float:left; height:13px; background:url(.. .shadowbox_news_list li:hover{ background-color:#eee;} span.shadowbox_news_user{ color:#3b94d6;} a.shadowbox_news_all{ display:block; width:305px; height:40px; line-height:40px; color:#3b94d6; text-align:center;border-top:1px solid #eee;} + +/*20160622代码分析弹窗*/ +.analysis-option-box {width:100%; border:1px solid #ccc; padding:3px 5px;} From 3fe5d9a1a31d164cd12376a4524ac9b5d218e97b Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 23 Jun 2016 11:24:58 +0800 Subject: [PATCH 087/216] get date froma sonar --- .../quality_analysis_controller.rb | 8 +-- app/views/quality_analysis/_show.html.erb | 70 +++++-------------- app/views/quality_analysis/index.html.erb | 2 +- .../repositories/_quality_analysis.html.erb | 12 ++-- .../repositories/quality_analysis.js.erb | 2 +- 5 files changed, 30 insertions(+), 64 deletions(-) diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index 6be51da70..fd000aa72 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -53,15 +53,15 @@ class QualityAnalysisController < ApplicationController end def index - if params[:name].nil? + if params[:resource_id].nil? @name_flag = true projects_date = open("http://123.59.135.93:8891/api/projects/index").read @results = JSON.parse(projects_date) else @name_flag = false - project_key = params[:name] - data = open("http://123.59.135.93:8891/api/resources/index?resource=#{project_key}&depth=-1&metrics=complexity,class_complexity,lines,comment_lines,blocker_violations").read - @cc =JSON.parse(data) + resource_id = params[:resource_id] + complexity_date = open("http://123.59.135.93:8891/api/resources/index?resource=139&depth=0&metrics=complexity,function_complexity,class_complexity,file_complexity,lines,file_line,files,functions,classes,directories").read + @complexity =JSON.parse(complexity_date).first end end diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index 4cb86f22c..46a5e2e3d 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -1,51 +1,20 @@ -
    +

    lines: <%= @complexity["msr"][0]["frmt_val"] %>

    +

    files: <%= @complexity["msr"][2]["frmt_val"] %>

    +

    directories: <%= @complexity["msr"][3]["frmt_val"] %>

    +

    classes: <%= @complexity["msr"][1]["frmt_val"] %>

    +

    function: <%= @complexity["msr"][4]["frmt_val"] %>

    +

    total Complexity: <%= @complexity["msr"][5]["frmt_val"] %>

    +

    file_complexity: <%= @complexity["msr"][6]["frmt_val"] %>

    +

    class_complexity: <%= @complexity["msr"][7]["frmt_val"] %>

    +

    function_complexity: <%= @complexity["msr"][8]["frmt_val"] %>

    + + + +

    SonarQube质量分析

    -
    -
    - - 分支: - -
    -
    - 开始分析 + branch:master
    项目代码质量分析报告
    概要信息
    @@ -83,23 +52,23 @@

    代码行数

    -

    9,337

    +

    <%= @complexity["msr"][0]["frmt_val"] %>

    文件

    -

    10

    +

    <%= @complexity["msr"][2]["frmt_val"] %>

    目录

    -

    6

    +

    <%= @complexity["msr"][3]["frmt_val"] %>

    -

    15

    +

    <%= @complexity["msr"][1]["frmt_val"] %>

    方法

    -

    36

    +

    <%= @complexity["msr"][4]["frmt_val"] %>

    贡献统计
    @@ -145,4 +114,3 @@
    - \ No newline at end of file diff --git a/app/views/quality_analysis/index.html.erb b/app/views/quality_analysis/index.html.erb index 3ce1a8e4a..e8fd5f8e2 100644 --- a/app/views/quality_analysis/index.html.erb +++ b/app/views/quality_analysis/index.html.erb @@ -1,7 +1,7 @@ <% if @name_flag %> <%= @results.each do |result| %>

    - <%=link_to result["k"], project_quality_analysis_path(:name => result["k"]) %> + <%=link_to result["k"], project_quality_analysis_path(:resource_id => result["id"]) %>

    <% end %> <% else %> diff --git a/app/views/repositories/_quality_analysis.html.erb b/app/views/repositories/_quality_analysis.html.erb index bf1b9ea41..7f6ab7ea1 100644 --- a/app/views/repositories/_quality_analysis.html.erb +++ b/app/views/repositories/_quality_analysis.html.erb @@ -1,7 +1,6 @@ -
    -
    代码质量分析
    -
    - <%= form_tag( url_for(:controller => 'quality_analysis', :action => 'create', :project_id => @project.id, :user_id => User.current.id, :identifier => @repository.identifier), :remote => true, :id => 'quality_analyses_form') do %> +
    代码质量分析
    +
    + <%= form_tag( url_for(:controller => 'quality_analysis', :action => 'create', :project_id => @project.id, :user_id => User.current.id, :identifier => @repository.identifier), :remote => true, :id => 'quality_analyses_form') do %>
    @@ -20,6 +19,5 @@
    - <% end %> -
    -
    \ No newline at end of file + <% end %> +
    diff --git a/app/views/repositories/quality_analysis.js.erb b/app/views/repositories/quality_analysis.js.erb index c9427c246..eff2825f6 100644 --- a/app/views/repositories/quality_analysis.js.erb +++ b/app/views/repositories/quality_analysis.js.erb @@ -2,7 +2,7 @@ $('#ajax-modal').html('<%= escape_javascript( render :partial => 'repositories/q showModal('ajax-modal', '615px'); $('#ajax-modal').siblings().remove(); $('#ajax-modal').before(""); -$('#ajax-modal').parent().css("top","20%").css("left","42%").css("border","3px solid #269ac9"); +$('#ajax-modal').parent().css("top","20%").css("left","30%").css("border","3px solid #269ac9"); $('#ajax-modal').parent().addClass("popbox_polls"); From ad6e3c3364726eaffc3ddfe3f320268e319c8782 Mon Sep 17 00:00:00 2001 From: huang Date: Thu, 23 Jun 2016 13:52:03 +0800 Subject: [PATCH 088/216] =?UTF-8?q?=E8=B4=A8=E9=87=8F=E5=88=86=E6=9E=90?= =?UTF-8?q?=E6=9D=83=E9=99=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/repositories/show.html.erb | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index 1e874544a..d3ffdb5b9 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -2,8 +2,11 @@

    <%= render :partial => 'breadcrumbs', :locals => {:path => @path, :kind => 'dir', :revision => @rev} %>

    ZIP下载 - <%= link_to "质量分析", quality_analysis_path(:id => @project.id, :repository_id => @repository.identifier), :remote => true, :class => "btn_zipdown fr" %> - + <% if is_project_manager?(User.current, @project.id) && QualityAnalysis.where(:project_id => @project.id).first.nil? %> + <%= link_to "质量分析", quality_analysis_path(:id => @project.id, :repository_id => @repository.identifier), :remote => true, :class => "btn_zipdown fr" %> + <% else %> + <%= link_to "质量分析", project_quality_analysis_path(:project_id => @project.id), :remote => true, :class => "btn_zipdown fr" %> + <% end %>
    <% if @entries.nil? %> From 723540044d30d500f4c9be084ff21ae77e1a0ea6 Mon Sep 17 00:00:00 2001 From: huang Date: Thu, 23 Jun 2016 13:59:45 +0800 Subject: [PATCH 089/216] =?UTF-8?q?=E6=A3=80=E6=B5=8B=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quality_analysis/_result_list.html.erb | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/app/views/quality_analysis/_result_list.html.erb b/app/views/quality_analysis/_result_list.html.erb index e69de29bb..114c054a3 100644 --- a/app/views/quality_analysis/_result_list.html.erb +++ b/app/views/quality_analysis/_result_list.html.erb @@ -0,0 +1,39 @@ +
    +
    +

    分析结果

    +
    +
      +
    • NAME
    • +
    • VERSION
    • +
    • LOC
    • +
    • TECHNICAL DEBT
    • +
    • LAST ANALYSIS
    • +
      +
    + + + + +
    +
    \ No newline at end of file From 8438bc7bcd81037abb9ba5005f89c9ca1bb420c8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 23 Jun 2016 14:31:23 +0800 Subject: [PATCH 090/216] somethint to added --- .../quality_analysis/_result_list.html.erb | 45 +++++-------------- app/views/quality_analysis/index.html.erb | 6 +-- app/views/repositories/show.html.erb | 2 +- public/stylesheets/project.css | 13 +++++- 4 files changed, 25 insertions(+), 41 deletions(-) diff --git a/app/views/quality_analysis/_result_list.html.erb b/app/views/quality_analysis/_result_list.html.erb index 114c054a3..4008bf6e5 100644 --- a/app/views/quality_analysis/_result_list.html.erb +++ b/app/views/quality_analysis/_result_list.html.erb @@ -2,38 +2,15 @@

    分析结果

    -
      -
    • NAME
    • -
    • VERSION
    • -
    • LOC
    • -
    • TECHNICAL DEBT
    • -
    • LAST ANALYSIS
    • -
      -
    - - - - + <% @results.each do |result| %> +
      +
    • <%=link_to result["k"], project_quality_analysis_path(:resource_id => result["id"]), :class => "analysis-result-name fl fontBlue2" %>
    • +
    • 1.0
    • +
    • LOC
    • +
    • TECHNICAL DEBT
    • +
    • LAST ANALYSIS
    • +
      +
    + <% end %>
    -
    \ No newline at end of file + diff --git a/app/views/quality_analysis/index.html.erb b/app/views/quality_analysis/index.html.erb index e8fd5f8e2..9b06e6483 100644 --- a/app/views/quality_analysis/index.html.erb +++ b/app/views/quality_analysis/index.html.erb @@ -1,9 +1,5 @@ <% if @name_flag %> - <%= @results.each do |result| %> -

    - <%=link_to result["k"], project_quality_analysis_path(:resource_id => result["id"]) %> -

    - <% end %> + <%= render :partial => "result_list" %> <% else %> <%= render "show" %> <% end %> diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index d3ffdb5b9..c639bcb6e 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -5,7 +5,7 @@ <% if is_project_manager?(User.current, @project.id) && QualityAnalysis.where(:project_id => @project.id).first.nil? %> <%= link_to "质量分析", quality_analysis_path(:id => @project.id, :repository_id => @repository.identifier), :remote => true, :class => "btn_zipdown fr" %> <% else %> - <%= link_to "质量分析", project_quality_analysis_path(:project_id => @project.id), :remote => true, :class => "btn_zipdown fr" %> + <%= link_to "质量分析", project_quality_analysis_path(:project_id => @project.id), :class => "btn_zipdown fr" %> <% end %>
    diff --git a/public/stylesheets/project.css b/public/stylesheets/project.css index 0774fa892..0d1c4fe85 100644 --- a/public/stylesheets/project.css +++ b/public/stylesheets/project.css @@ -1267,4 +1267,15 @@ a.pages-big{ width:50px;} .contribute-list-problem {width:170px; vertical-align:middle; text-align:center;} .contribute-list-rate {width:228px; vertical-align:middle; text-align:center;} .contribute-list-height {height:80px;} -.contribute-list-line-height {line-height:80px;} \ No newline at end of file +.contribute-list-line-height {line-height:80px;} + +/*20160623分析结果*/ +.analysis-result-list {padding:5px;} +.analysis-result-list:nth-of-type(odd){background:#fff;}/*奇数行*/ +.analysis-result-list:nth-of-type(even){background:#f5f5f5;}/*偶数行*/ +.analysis-result-name {width:200px; cursor:pointer;} +.analysis-result-version {width:90px; text-align:right; cursor:pointer;} +.analysis-result-loc {width:60px; text-align:right; cursor:pointer;} +.analysis-result-debt {width:160px; text-align:right; cursor:pointer;} +.analysis-result-time {width:150px; text-align:right; cursor:pointer;} +.analysis-name-icon {background:url(../images/code-analysis-icon.png) -2px -148px no-repeat; width:16px; height:16px; display:inline-block; vertical-align:middle;} \ No newline at end of file From 126bf9c195a2342065c112070cf6be7385a192fd Mon Sep 17 00:00:00 2001 From: cxt Date: Thu, 23 Jun 2016 14:47:22 +0800 Subject: [PATCH 091/216] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E7=95=99=E8=A8=80?= =?UTF-8?q?=E3=80=81=E8=AF=BE=E7=A8=8B=E7=95=99=E8=A8=80=E7=9A=84=E4=BA=8C?= =?UTF-8?q?=E7=BA=A7=E5=9B=9E=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 17 +++- app/controllers/words_controller.rb | 74 +++++++++------- app/helpers/application_helper.rb | 20 +++++ app/views/users/_all_replies.html.erb | 2 +- .../users/_comment_reply_detail.html.erb | 17 +--- .../users/_course_journalsformessage.html.erb | 12 ++- app/views/users/_homework_replies.html.erb | 11 +-- .../users/_journal_comment_reply.html.erb | 8 ++ app/views/users/_journal_replies.html.erb | 85 +++++++++++++++++++ .../users/_journal_reply_banner.html.erb | 18 ++++ app/views/users/_reply_to.html.erb | 41 ++++++--- app/views/users/_user_activities.html.erb | 2 +- .../users/_user_journalsformessage.html.erb | 14 +-- app/views/users/_user_jours_list.html.erb | 2 +- app/views/users/all_journals.js.erb | 4 +- app/views/users/show_all_replies.js.erb | 6 +- app/views/words/create_reply.js.erb | 6 +- app/views/words/destroy.js.erb | 10 ++- public/javascripts/application.js | 5 +- 19 files changed, 267 insertions(+), 87 deletions(-) create mode 100644 app/views/users/_journal_comment_reply.html.erb create mode 100644 app/views/users/_journal_replies.html.erb create mode 100644 app/views/users/_journal_reply_banner.html.erb diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 29e6a4980..c1f5863b8 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -87,7 +87,10 @@ class UsersController < ApplicationController #展开所有回复 def show_all_replies - @comment = JournalsForMessage.find params[:comment].to_i + case params[:type] + when 'JournalsForMessage' + @comment = JournalsForMessage.find params[:comment].to_i + end end #二级回复 @@ -95,6 +98,7 @@ class UsersController < ApplicationController case params[:type] when 'HomeworkCommon' @reply = JournalsForMessage.find params[:reply_id] + @type = 'HomeworkCommon' if params[:user_activity_id] @user_activity_id = params[:user_activity_id] else @@ -102,6 +106,11 @@ class UsersController < ApplicationController end @is_in_course = params[:is_in_course].to_i @course_activity = params[:course_activity].to_i + when 'JournalsForMessage' + @reply = JournalsForMessage.find params[:reply_id] + @user_activity_id = params[:user_activity_id] + @activity_id = params[:activity_id] + @type = 'JournalsForMessage' end respond_to do |format| format.js @@ -3261,7 +3270,11 @@ class UsersController < ApplicationController @journals = obj.comments.reorder("created_on desc") when 'JournalsForMessage' obj = JournalsForMessage.where('id = ?', params[:id].to_i).first - @journals = obj.children.reorder("created_on desc") + journals = [] + @journals = get_all_children(journals, obj) + @type = 'JournalsForMessage' + @user_activity_id = params[:div_id].to_i if params[:div_id] + @allow_delete = params[:allow_delete] when 'Issue' obj = Issue.where('id = ?', params[:id].to_i).first @journals = obj.journals.reorder("created_on desc") diff --git a/app/controllers/words_controller.rb b/app/controllers/words_controller.rb index 22b7f1f52..668269a26 100644 --- a/app/controllers/words_controller.rb +++ b/app/controllers/words_controller.rb @@ -54,15 +54,16 @@ class WordsController < ApplicationController :reply_id => reply_user_id, :notes => content, :is_readed => false} - @jfm = add_reply_adapter options + @activity = params[:activity_id].nil? ? JournalsForMessage.find(parent_id) : JournalsForMessage.find(params[:activity_id].to_i) + @jfm = add_reply_adapter(@activity, options) @save_succ = true if @jfm.errors.empty? if @save_succ - update_course_activity('JournalsForMessage',parent_id) - update_user_activity('JournalsForMessage',parent_id) - update_forge_activity('JournalsForMessage',parent_id) - update_org_activity('JournalsForMessage',parent_id) - update_principal_activity('JournalsForMessage',parent_id) - (JournalsForMessage.find parent_id).update_attribute(:updated_on,Time.now) + update_course_activity('JournalsForMessage',@activity.id) + update_user_activity('JournalsForMessage',@activity.id) + update_forge_activity('JournalsForMessage',@activity.id) + update_org_activity('JournalsForMessage',@activity.id) + update_principal_activity('JournalsForMessage',@activity.id) + @activity.update_attribute(:updated_on,Time.now) end respond_to do |format| # format.html { @@ -76,8 +77,6 @@ class WordsController < ApplicationController format.js { #@reply_type = params[:reply_type] @user_activity_id = params[:user_activity_id] - @activity = JournalsForMessage.find(parent_id) - @is_activity = params[:is_activity] if params[:is_activity] } end @@ -92,13 +91,14 @@ class WordsController < ApplicationController elsif @journal_destroyed.jour_type == "Course" @course = Course.find @journal_destroyed.jour_id @jours_count = @course.journals_for_messages.where('m_parent_id IS NULL').count + @user_activity_id = params[:user_activity_id] if params[:user_activity_id] + @activity = JournalsForMessage.where("id = #{params[:activity_id].to_i}").first if params[:activity_id] elsif @journal_destroyed.jour_type == "Principal" @user = User.find(@journal_destroyed.jour_id) @jours_count = @user.journals_for_messages.where('m_parent_id IS NULL').count @is_user = true @user_activity_id = params[:user_activity_id] if params[:user_activity_id] - @is_activity = params[:is_activity].to_i if params[:is_activity] - @activity = @journal_destroyed.parent if @journal_destroyed.parent + @activity = JournalsForMessage.where("id = #{params[:activity_id].to_i}").first if params[:activity_id] unless @activity redirect_to feedback_path(@user) return @@ -374,28 +374,44 @@ class WordsController < ApplicationController obj end - def add_reply_adapter options + def add_reply_adapter obj, options #modify by nwb #添加对课程留言的支持 #留言回复应该不关系其所属的Class,而关心的是其所属的父留言 - obj = obj_distinguish_url_origin || User.find_by_id(2) - if obj.kind_of? User - obj.add_jour(nil, nil, nil, options) - elsif obj.kind_of? Project - Project.add_new_jour(nil, nil, obj.id, options) - elsif obj.kind_of? Course - Course.add_new_jour(nil, nil, obj.id, options) - elsif obj.kind_of? Bid - obj.add_jour(nil, nil, nil, options) - elsif obj.kind_of? Contest - obj.add_jour(nil, nil, obj.id, options) #new added - elsif obj.kind_of? Softapplication - obj.add_jour(nil, nil, obj.id, options) #new added - elsif obj.kind_of? HomeworkAttach - obj.add_jour(nil, nil, obj.id, options) #new added - else - raise "create reply obj unknow type.#{obj.class}" + case obj.jour_type + when 'Principal' + obj.jour.add_jour(nil, nil, nil, options) + when 'Project' + Project.add_new_jour(nil, nil, obj.jour_id, options) + when 'Course' + Course.add_new_jour(nil, nil, obj.jour_id, options) + when 'Bid' + obj.jour.add_jour(nil, nil, nil, options) + when 'Contest' + obj.jour.add_jour(nil, nil, obj.jour_id, options) + when 'Softapplication' + obj.jour.add_jour(nil, nil, obj.jour_id, options) + when 'HomeworkAttach' + obj.jour.add_jour(nil, nil, obj.jour_id, options) end + # obj = obj_distinguish_url_origin || User.find_by_id(2) + # if obj.kind_of? User + # obj.add_jour(nil, nil, nil, options) + # elsif obj.kind_of? Project + # Project.add_new_jour(nil, nil, obj.id, options) + # elsif obj.kind_of? Course + # Course.add_new_jour(nil, nil, obj.id, options) + # elsif obj.kind_of? Bid + # obj.add_jour(nil, nil, nil, options) + # elsif obj.kind_of? Contest + # obj.add_jour(nil, nil, obj.id, options) #new added + # elsif obj.kind_of? Softapplication + # obj.add_jour(nil, nil, obj.id, options) #new added + # elsif obj.kind_of? HomeworkAttach + # obj.add_jour(nil, nil, obj.id, options) #new added + # else + # raise "create reply obj unknow type.#{obj.class}" + # end end #######end of message end diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 46fdb02f3..2552a6e84 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -3127,6 +3127,26 @@ def get_reply_parents parents_rely, comment parents_rely end +#获取回复的所有父节点(不包括根节点) +def get_reply_parents_no_root parents_rely, comment + if !comment.parent.nil? && !comment.parent.parent.nil? + parents_rely << comment.parent + get_reply_parents_no_root parents_rely, comment.parent + end + parents_rely +end + +#获取留言的所有子节点 +def get_all_children result, jour + if jour.kind_of? JournalsForMessage + jour.children.each do |jour_child| + result << jour_child + get_all_children result, jour_child + end + end + result.sort! { |a,b| b.created_on <=> a.created_on } +end + #将有置顶属性的提到数组前面 def sort_by_sticky topics tmpTopics = [] diff --git a/app/views/users/_all_replies.html.erb b/app/views/users/_all_replies.html.erb index 20a3289ff..45404ed84 100644 --- a/app/views/users/_all_replies.html.erb +++ b/app/views/users/_all_replies.html.erb @@ -13,7 +13,7 @@
    <%= link_to comment.creator_user.show_name, user_url_in_org(comment.creator_user.id), :class => "newsBlue mr10 f14" %> - <%= format_activity_day(comment.created_time) %> <%= format_time(comment.created_time, false) %> + <%= time_from_now(comment.created_on) %> <%=render :partial=> "praise_tread/praise", :locals => {:activity=>comment, :user_activity_id=>comment.id,:type=>"reply"}%> diff --git a/app/views/users/_comment_reply_detail.html.erb b/app/views/users/_comment_reply_detail.html.erb index caac3ee62..4ced798d0 100644 --- a/app/views/users/_comment_reply_detail.html.erb +++ b/app/views/users/_comment_reply_detail.html.erb @@ -1,20 +1,9 @@ -
    <%= link_to image_tag(url_to_avatar(comment.user), :width => "33", :height => "33"), user_path(comment.user_id), :alt => "用户头像" %>
    -<% if comment.try(:user).try(:realname) == ' ' %> - <%= link_to comment.try(:user), user_path(comment.user_id), :class => "content-username" %> -<% else %> - <%= link_to comment.try(:user).try(:realname), user_path(comment.user_id), :class => "content-username" %> -<% end %> -<%= time_from_now(comment.created_on) %> -
    <%= comment.notes.html_safe %>
    + <%= link_to comment.user.show_name, user_path(comment.user_id), :class => "content-username" %> + <%= time_from_now(comment.created_on) %> +
    <%= comment.notes.html_safe %>
    \ No newline at end of file diff --git a/app/views/users/_course_journalsformessage.html.erb b/app/views/users/_course_journalsformessage.html.erb index 85e0e9335..83519b1b1 100644 --- a/app/views/users/_course_journalsformessage.html.erb +++ b/app/views/users/_course_journalsformessage.html.erb @@ -38,14 +38,18 @@
    - <% count = fetch_user_leaveWord_reply(activity).count %> + <% all_comments = []%> + <% count=get_all_children(all_comments, activity).count %> + <% allow_delete = (activity.user == User.current || User.current.admin? || User.current.allowed_to?(:as_teacher,activity.course)) %> + <%# count = fetch_user_leaveWord_reply(activity).count %>
    - <%= render :partial => 'users/reply_banner', :locals => {:count => count, :activity => activity, :user_activity_id => user_activity_id} %> + <%= render :partial => 'users/journal_reply_banner', :locals => {:count => count, :activity => activity, :user_activity_id => user_activity_id, :allow_delete => allow_delete} %> - <% comments = activity.children.reorder("created_on desc").limit(3) %> + <% all_comments = []%> + <% comments = get_all_children(all_comments, activity)[0..2] %> <% if count > 0 %>
    - <%= render :partial => 'users/all_replies', :locals => {:comments => comments}%> + <%= render :partial => 'users/journal_replies', :locals => {:comments => comments, :user_activity_id => user_activity_id, :type => 'JournalsForMessage', :allow_delete => allow_delete, :activity_id =>activity.id}%>
    <% end %> diff --git a/app/views/users/_homework_replies.html.erb b/app/views/users/_homework_replies.html.erb index 7f4dc379b..285d464b1 100644 --- a/app/views/users/_homework_replies.html.erb +++ b/app/views/users/_homework_replies.html.erb @@ -12,11 +12,7 @@
    - <% if comment.try(:user).try(:realname) == ' ' %> - <%= link_to comment.try(:user), user_path(comment.user_id), :class => "newsBlue mr10 f14" %> - <% else %> - <%= link_to comment.try(:user).try(:realname), user_path(comment.user_id), :class => "newsBlue mr10 f14" %> - <% end %> + <%= link_to comment.user.show_name, user_path(comment.user_id), :class => "newsBlue mr10 f14" %> <%= time_from_now(comment.created_on) %>
    <% unless comment.m_parent_id.nil? %> @@ -37,7 +33,7 @@
    - <%= link_to '点击展开隐藏楼层', show_all_replies_users_path(:comment => comment),:remote=>true %> + <%= link_to '点击展开隐藏楼层', show_all_replies_users_path(:comment => comment, :type => comment.class),:remote=>true %>
    <%=render :partial => 'users/comment_reply_detail', :locals => {:comment => parents_rely[0]} %>
    @@ -45,7 +41,8 @@
    <% end %>
    - <%= comment.notes.html_safe %>
    + <%= comment.notes.html_safe %> +
    diff --git a/app/views/users/_journal_comment_reply.html.erb b/app/views/users/_journal_comment_reply.html.erb new file mode 100644 index 000000000..9906abeb5 --- /dev/null +++ b/app/views/users/_journal_comment_reply.html.erb @@ -0,0 +1,8 @@ +
    + <% if !comment.parent.nil? && !comment.parent.parent.nil? %> +
    + <%=render :partial => 'users/journal_comment_reply', :locals => {:comment => comment.parent} %> +
    + <% end %> + <%=render :partial => 'users/comment_reply_detail', :locals => {:comment => comment} %> +
    \ No newline at end of file diff --git a/app/views/users/_journal_replies.html.erb b/app/views/users/_journal_replies.html.erb new file mode 100644 index 000000000..7fc708ebb --- /dev/null +++ b/app/views/users/_journal_replies.html.erb @@ -0,0 +1,85 @@ +
      + <% comments.each do |comment| %> + +
    • +
      + <%= link_to image_tag(url_to_avatar(comment.creator_user), :width => 33, :height => 33, :alt => "用户头像"), user_url_in_org(comment.creator_user.id) %> +
      +
      +
      + <%= link_to comment.creator_user.show_name, user_url_in_org(comment.creator_user.id), :class => "newsBlue mr10 f14" %> + <%= time_from_now(comment.created_on) %> +
      + <% if !comment.parent.nil? && !comment.parent.parent.nil? %> + <% parents_rely = [] %> + <% parents_rely = get_reply_parents_no_root parents_rely, comment %> + <% length = parents_rely.length %> +
      + <% if length <= 3 %> + <%=render :partial => 'users/journal_comment_reply', :locals => {:comment => comment.parent} %> + <% else %> +
      +
      +
      + <%=render :partial => 'users/journal_comment_reply', :locals => {:comment => parents_rely[length - 1]} %> +
      + <%=render :partial => 'users/comment_reply_detail', :locals => {:comment => parents_rely[length - 2]} %> +
      +
      + + + <%= link_to '点击展开隐藏楼层', show_all_replies_users_path(:comment => comment, :type => comment.class),:remote=>true %> +
      + <%=render :partial => 'users/comment_reply_detail', :locals => {:comment => parents_rely[0]} %> +
      + <% end %> +
      + <% end %> + <% if !comment.content_detail.blank? || comment.class == Journal %> +
      + <% if comment.class == Journal %> + <% if comment.details.any? %> + <% details_to_strings(comment.details).each do |string| %> +

      <%= string %>

      + <% end %> + <% end %> +

      <%= comment.notes.html_safe %>

      + <% else %> + <%= comment.content_detail.html_safe %> + <% end %> +
      +
      +
      + + + <%=render :partial=> "praise_tread/praise", :locals => {:activity=>comment, :user_activity_id=>comment.id,:type=>"reply"}%> + + + <%= link_to( + l(:button_reply), + {:controller => 'users' ,:action => 'reply_to', :reply_id => comment.id, :type => type, :user_activity_id => user_activity_id, :activity_id => activity_id}, + :remote => true, + :method => 'get', + :title => l(:button_reply)) %> + + + <% if allow_delete %> + <%= link_to('删除', {:controller => 'words', :action => 'destroy', :object_id => comment, :user_id => comment.user, :user_activity_id => user_activity_id, :activity_id => activity_id}, + :remote => true, :confirm => l(:text_are_you_sure), :method => 'delete', :class => "fr mr20", :title => l(:button_delete)) %> + <% end %> + +
      +
      +
      +

      + <% end %> +
      +
      +
    • + <% end %> +
    \ No newline at end of file diff --git a/app/views/users/_journal_reply_banner.html.erb b/app/views/users/_journal_reply_banner.html.erb new file mode 100644 index 000000000..31934328f --- /dev/null +++ b/app/views/users/_journal_reply_banner.html.erb @@ -0,0 +1,18 @@ +
    +
    + 回复 + ︿ + <%= count>0 ? "(#{count})" : "" %> + + <%=render :partial=> "praise_tread/praise", :locals => {:activity=>activity, :user_activity_id=>user_activity_id,:type=>"activity"}%> + +
    +
    <%#= format_date(activity.updated_on) %>
    + <%if count>3 %> + + <% end %> +
    \ No newline at end of file diff --git a/app/views/users/_reply_to.html.erb b/app/views/users/_reply_to.html.erb index 23090265c..fd56eb712 100644 --- a/app/views/users/_reply_to.html.erb +++ b/app/views/users/_reply_to.html.erb @@ -1,19 +1,36 @@
    -
    <%= link_to image_tag(url_to_avatar(User.current), :width => "33", :height => "33"), user_path(User.current), :alt => "用户头像" %>
    +
    + <%= link_to image_tag(url_to_avatar(User.current), :width => "33", :height => "33"), user_path(User.current), :alt => "用户头像" %> +
    <% if User.current.logged? %>
    - <%= form_for('new_form',:url => {:controller => 'words', :action => 'reply_to_homework', :id => reply.id},:method => "post", :remote => true) do |f| %> - > - > - > - -
    - - -
    -

    - <% end%> + <% if @type == 'HomeworkCommon' %> + <%= form_for('new_form',:url => {:controller => 'words', :action => 'reply_to_homework', :id => reply.id},:method => "post", :remote => true) do |f| %> + > + > + > + +
    + + +
    +

    + <% end%> + <% elsif @type == 'JournalsForMessage' %> + <%= form_for('new_form',:url => {:controller => 'words', :action => 'create_reply', :id => reply.id}, :method => "post", :remote => true) do |f|%> + <%= hidden_field_tag 'reference_id', params[:reference_id], :value => reply.id %> + <%= hidden_field_tag 'reference_user_id', params[:reference_user_id], :value => reply.user.id %> + <%= hidden_field_tag 'reference_message_id', params[:reference_message_id], :value => reply.id %> + <%= hidden_field_tag 'show_name',params[:show_name],:value =>true %> + <%= hidden_field_tag 'user_activity_id',params[:user_activity_id],:value =>@user_activity_id %> + <%= hidden_field_tag 'activity_id',params[:activity_id],:value =>@activity_id %> +
    + + +
    + <% end%> + <% end %>
    <% else %> <%= render :partial => "users/show_unlogged" %> diff --git a/app/views/users/_user_activities.html.erb b/app/views/users/_user_activities.html.erb index 3b327c080..5d06a7001 100644 --- a/app/views/users/_user_activities.html.erb +++ b/app/views/users/_user_activities.html.erb @@ -86,7 +86,7 @@ <% case user_activity.act_type.to_s %> <% when 'JournalsForMessage' %> <% unless act.private == 1 && (!User.current || (User.current && act.jour_id != User.current.id && act.user_id != User.current.id)) %> - <%= render :partial => 'user_journalsformessage', :locals => {:activity => act,:user_activity_id =>user_activity.id,:is_activity=>1} %> + <%= render :partial => 'user_journalsformessage', :locals => {:activity => act,:user_activity_id =>user_activity.id} %> <% end %> <% end %> <% when 'Blog'%> diff --git a/app/views/users/_user_journalsformessage.html.erb b/app/views/users/_user_journalsformessage.html.erb index dd36d1328..4fb79ee2d 100644 --- a/app/views/users/_user_journalsformessage.html.erb +++ b/app/views/users/_user_journalsformessage.html.erb @@ -50,7 +50,7 @@
    • <%= link_to(l(:label_bid_respond_delete), - {:controller => 'words', :action => 'destroy', :object_id => activity, :user_id => activity.user,:user_activity_id => user_activity_id,:is_activity=>is_activity}, + {:controller => 'words', :action => 'destroy', :object_id => activity, :user_id => activity.user,:user_activity_id => user_activity_id, :activity_id => activity.id}, :confirm => l(:text_are_you_sure), :method => 'delete', :class => "postOptionLink", :title => l(:button_delete)) %>
    • @@ -62,14 +62,17 @@
    - <% count=fetch_user_leaveWord_reply(activity).count %> + <% all_comments = []%> + <% count=get_all_children(all_comments, activity).count %> + <% allow_delete = (activity.user == User.current || User.current.admin?) %>
    - <%= render :partial => 'users/reply_banner', :locals => {:count => count, :activity => activity, :user_activity_id => user_activity_id} %> + <%= render :partial => 'users/journal_reply_banner', :locals => {:count => count, :activity => activity, :user_activity_id => user_activity_id, :allow_delete => allow_delete} %> - <% comments = activity.children.reorder("created_on desc").limit(3) %> + <% all_comments = []%> + <% comments = get_all_children(all_comments, activity)[0..2] %> <% if count > 0 %>
    - <%= render :partial => 'users/all_replies', :locals => {:comments => comments}%> + <%= render :partial => 'users/journal_replies', :locals => {:comments => comments, :user_activity_id => user_activity_id, :type => 'JournalsForMessage', :allow_delete => allow_delete, :activity_id =>activity.id}%>
    <% end %> @@ -84,7 +87,6 @@ <%= hidden_field_tag 'reference_message_id', params[:reference_message_id], :value => activity.id %> <%= hidden_field_tag 'show_name',params[:show_name],:value =>true %> <%= hidden_field_tag 'user_activity_id',params[:user_activity_id],:value =>user_activity_id %> - <%= hidden_field_tag 'is_activity',params[:is_activity],:value =>is_activity %>
    diff --git a/app/views/users/_user_jours_list.html.erb b/app/views/users/_user_jours_list.html.erb index 6211aac7d..517d66038 100644 --- a/app/views/users/_user_jours_list.html.erb +++ b/app/views/users/_user_jours_list.html.erb @@ -11,7 +11,7 @@ sd_create_editor_from_data(<%= jour.id%>, null, "100%", "<%=jour.class.to_s%>"); }); - <%= render :partial => 'user_journalsformessage', :locals => {:activity => jour,:user_activity_id =>jour.id,:is_activity=>0} %> + <%= render :partial => 'user_journalsformessage', :locals => {:activity => jour,:user_activity_id =>jour.id} %> <%#= render :partial => 'user_jours_new', :locals => {:jour => jour} %> <% end %> <%end%> diff --git a/app/views/users/all_journals.js.erb b/app/views/users/all_journals.js.erb index c18c6aae4..d4c42368d 100644 --- a/app/views/users/all_journals.js.erb +++ b/app/views/users/all_journals.js.erb @@ -1,5 +1,7 @@ <% if params[:type] == 'HomeworkCommon' %> $('#reply_div_<%= params[:div_id].to_i %>').html('<%=escape_javascript(render :partial => 'users/homework_replies', :locals => {:comments => @journals, :is_in_course =>@is_in_course,:course_activity=>@course_activity, :is_teacher => @is_teacher, :user_activity_id => @user_activity_id}) %>'); +<% elsif params[:type] == 'JournalsForMessage' %> +$('#reply_div_<%= @user_activity_id %>').html('<%=escape_javascript(render :partial => 'users/journal_replies', :locals => {:comments => @journals,:user_activity_id => @user_activity_id, :type => @type, :allow_delete => @allow_delete, :activity_id =>params[:id].to_i}) %>'); <% else %> -$('#reply_div_<%= params[:div_id].to_i %>').html('<%=escape_javascript(render :partial => 'users/all_replies', :locals => {:comments => @journals}) %>'); +$('#reply_div_<%= @user_activity_id %>').html('<%=escape_javascript(render :partial => 'users/all_replies', :locals => {:comments => @journals,:user_activity_id => @user_activity_id, :type => @type, :allow_delete => @allow_delete, :activity_id =>params[:id].to_i}) %>'); <% end %> diff --git a/app/views/users/show_all_replies.js.erb b/app/views/users/show_all_replies.js.erb index 99ab73b46..5f5ea6c3f 100644 --- a/app/views/users/show_all_replies.js.erb +++ b/app/views/users/show_all_replies.js.erb @@ -1,3 +1,7 @@ <% unless @comment.parent.nil? %> -$('#comment_reply_<%=@comment.id %>').html("<%= escape_javascript(render :partial => 'users/comment_reply', :locals => {:comment => @comment.parent})%>"); + <% if params[:type] == 'JournalsForMessage' && (@comment.jour_type == 'Principal' || @comment.jour_type == 'Course') %> + $('#comment_reply_<%=@comment.id %>').html("<%= escape_javascript(render :partial => 'users/journal_comment_reply', :locals => {:comment => @comment.parent})%>"); + <% else %> + $('#comment_reply_<%=@comment.id %>').html("<%= escape_javascript(render :partial => 'users/comment_reply', :locals => {:comment => @comment.parent})%>"); + <% end %> <% end %> \ No newline at end of file diff --git a/app/views/words/create_reply.js.erb b/app/views/words/create_reply.js.erb index ded05887f..9f3b0164e 100644 --- a/app/views/words/create_reply.js.erb +++ b/app/views/words/create_reply.js.erb @@ -1,8 +1,8 @@ <% if @save_succ %> <% if @user_activity_id %> - <% if @is_activity %> - $("#user_activity_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/user_journalsformessage', :locals => {:activity => @activity,:user_activity_id =>@user_activity_id,:is_activity=>@is_activity}) %>"); - <% else %> + <% if @activity.jour_type == 'Principal' %> + $("#user_activity_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/user_journalsformessage', :locals => {:activity => @activity,:user_activity_id =>@user_activity_id}) %>"); + <% elsif @activity.jour_type == 'Course' %> $("#user_activity_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/course_journalsformessage', :locals => {:activity => @activity,:user_activity_id =>@user_activity_id}) %>"); <% end %> //init_activity_KindEditor_data('<%#= @user_activity_id%>', "", "87%", "UserActivity"); diff --git a/app/views/words/destroy.js.erb b/app/views/words/destroy.js.erb index a2d606e76..c527474cd 100644 --- a/app/views/words/destroy.js.erb +++ b/app/views/words/destroy.js.erb @@ -3,8 +3,7 @@ <% elsif (['Principal','Project','Course', 'Bid', 'Contest', 'Softapplication','HomeworkCommon'].include? @journal_destroyed.jour_type)%> <% if @is_user%> <% if @activity %> - $("#user_activity_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/user_journalsformessage', :locals => {:activity => @activity,:user_activity_id =>@user_activity_id,:is_activity=>@is_activity}) %>"); - //init_activity_KindEditor_data('<%#= @user_activity_id%>', "", "87%", "UserActivity"); + $("#user_activity_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/user_journalsformessage', :locals => {:activity => @activity,:user_activity_id =>@user_activity_id}) %>"); sd_create_editor_from_data('<%= @user_activity_id%>', "", "100%", "UserActivity"); <% else %> $("#user_activity_<%= @user_activity_id%>").hide(); @@ -20,7 +19,12 @@ <% if @bid && @jours_count %> $('#jours_count').html("<%= @jours_count %>"); <% elsif @course && @jours_count%> - $('#course_jour_count').html("(<%= @jours_count %>)"); + <% if @user_activity_id %> + $("#user_activity_<%= @user_activity_id%>").replaceWith("<%= escape_javascript(render :partial => 'users/course_journalsformessage', :locals => {:activity => @activity,:user_activity_id =>@user_activity_id}) %>"); + sd_create_editor_from_data('<%= @user_activity_id%>', "", "100%", "UserActivity"); + <% else %> + $('#course_jour_count').html("(<%= @jours_count %>)"); + <% end %> <% elsif @user && @jours_count%> $('#jour_count').html("<%= @jours_count %>"); <% elsif @homework%> diff --git a/public/javascripts/application.js b/public/javascripts/application.js index 22483c1d5..2b674b60d 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -1289,7 +1289,7 @@ function clear_data(k,mdu){ } } -function expand_reply(container, btnid, id, type, div_id) { +function expand_reply(container, btnid, id, type, div_id, allow_delete) { var target = $(container); var btn = $(btnid); if (btn.data('init') == '0') { @@ -1299,7 +1299,8 @@ function expand_reply(container, btnid, id, type, div_id) { { type: type, id: id, - div_id: div_id + div_id: div_id, + allow_delete: allow_delete }, function(data) { From 5cf108030f7095e6696caf637264ce696119fd84 Mon Sep 17 00:00:00 2001 From: huang Date: Thu, 23 Jun 2016 14:48:55 +0800 Subject: [PATCH 092/216] =?UTF-8?q?hight=20char=E9=92=9F=E8=A1=A8=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/quality_analysis/_show.html.erb | 119 +++++++++++++++++++++- 1 file changed, 118 insertions(+), 1 deletion(-) diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index 46a5e2e3d..17865ad32 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -8,6 +8,123 @@

    class_complexity: <%= @complexity["msr"][7]["frmt_val"] %>

    function_complexity: <%= @complexity["msr"][8]["frmt_val"] %>

    + @@ -23,7 +140,7 @@

    质量等级

    A正常

    -
    +

    复杂度

    44正常

    From 3964631ed1d5c0c5080f25f3cd830fe6fadf62db Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 23 Jun 2016 14:58:09 +0800 Subject: [PATCH 093/216] hight charts --- app/views/quality_analysis/_show.html.erb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index 17865ad32..cf81680b0 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -7,10 +7,9 @@

    file_complexity: <%= @complexity["msr"][6]["frmt_val"] %>

    class_complexity: <%= @complexity["msr"][7]["frmt_val"] %>

    function_complexity: <%= @complexity["msr"][8]["frmt_val"] %>

    - +<%= javascript_include_tag 'highcharts','highcharts-more' %> \ No newline at end of file diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index cf81680b0..674507c4c 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -1,132 +1,19 @@

    lines: <%= @complexity["msr"][0]["frmt_val"] %>

    +

    classes: <%= @complexity["msr"][1]["frmt_val"] %>

    files: <%= @complexity["msr"][2]["frmt_val"] %>

    directories: <%= @complexity["msr"][3]["frmt_val"] %>

    -

    classes: <%= @complexity["msr"][1]["frmt_val"] %>

    function: <%= @complexity["msr"][4]["frmt_val"] %>

    -

    total Complexity: <%= @complexity["msr"][5]["frmt_val"] %>

    -

    file_complexity: <%= @complexity["msr"][6]["frmt_val"] %>

    -

    class_complexity: <%= @complexity["msr"][7]["frmt_val"] %>

    -

    function_complexity: <%= @complexity["msr"][8]["frmt_val"] %>

    -<%= javascript_include_tag 'highcharts','highcharts-more' %> - +

    comment_lines_density: <%= @complexity["msr"][5]["frmt_val"] %>

    +

    function_complexity: <%= @complexity["msr"][6]["frmt_val"] %>

    +

    duplicated_lines_density: <%= @complexity["msr"][7]["frmt_val"] %>

    +

    sqale_index: <%= @complexity["msr"][8]["frmt_val"] %>

    +

    sqale_rating: <%= @complexity["msr"][9]["frmt_val"] %>

    +<%dd %> +<%= javascript_include_tag 'highcharts','highcharts-more' %> + <%= render :partial => "hightchars" %>

    SonarQube质量分析

    @@ -134,23 +21,30 @@
    项目代码质量分析报告
    概要信息
    -
    -
    -

    质量等级

    -

    A正常

    -
    -
    -

    复杂度

    -

    复杂度

    -

    44正常

    -
    -
    -

    重复

    -

    44%正常

    +
    +
    +
    +

    +

    质量等级

    +

    A正常

    +
    +
    +

    +

    复杂度

    +

    44正常

    +
    -
    -

    注释率

    -

    12%偏低

    +
    +
    +

    +

    重复

    +

    44%正常

    +
    +
    +

    +

    注释率

    +

    12%偏低

    +
    质量等级2/5分可定性评价为:质量中等
    From e45759341673ea2ef21bab10e3e26d5661e10dc2 Mon Sep 17 00:00:00 2001 From: cxt Date: Thu, 23 Jun 2016 17:34:46 +0800 Subject: [PATCH 097/216] =?UTF-8?q?=E4=BD=9C=E5=93=81=E5=88=97=E8=A1=A8--?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E4=BD=9C=E4=B8=9A=E6=88=90=E7=BB=A9=EF=BC=9A?= =?UTF-8?q?excel=E4=B8=AD=E5=A2=9E=E5=8A=A0=E7=BC=BA=E8=AF=84=E6=89=A3?= =?UTF-8?q?=E5=88=86=E3=80=81=E8=BF=9F=E4=BA=A4=E6=89=A3=E5=88=86=E6=83=85?= =?UTF-8?q?=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/student_work_controller.rb | 46 +++++++++++++++++----- config/locales/zh.yml | 2 + 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb index d478b4d63..a9a0f6081 100644 --- a/app/controllers/student_work_controller.rb +++ b/app/controllers/student_work_controller.rb @@ -1210,8 +1210,13 @@ class StudentWorkController < ApplicationController blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 sheet1.row(0).default_format = blue if @homework.homework_type == 1 #匿评作业 - sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_des), - l(:excel_t_score),l(:excel_ta_score), l(:excel_n_score),l(:excel_f_score),l(:excel_commit_time)]) + if @homework.anonymous_comment ==0 + sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_des), + l(:excel_t_score),l(:excel_ta_score), l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) + else + sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_des), + l(:excel_t_score),l(:excel_ta_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) + end count_row = 1 items.each do |homework| sheet1[count_row,0]=homework.user.id @@ -1223,14 +1228,27 @@ class StudentWorkController < ApplicationController sheet1[count_row,6] = strip_html homework.description sheet1[count_row,7] = homework.teacher_score.nil? ? l(:label_without_score) : homework.teacher_score.round(2) sheet1[count_row,8] = homework.teaching_asistant_score.nil? ? l(:label_without_score) : homework.teaching_asistant_score.round(2) - sheet1[count_row,9] = homework.student_score.nil? ? l(:label_without_score) : homework.student_score.round(2) - sheet1[count_row,10] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score) - sheet1[count_row,11] = format_time(homework.created_at) + if @homework.anonymous_comment ==0 + sheet1[count_row,9] = homework.student_score.nil? ? l(:label_without_score) : homework.student_score.round(2) + sheet1[count_row,10] = homework.absence_penalty + sheet1[count_row,11] = homework.late_penalty + sheet1[count_row,12] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score) + sheet1[count_row,13] = format_time(homework.created_at) + else + sheet1[count_row,9] = homework.late_penalty + sheet1[count_row,10] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score) + sheet1[count_row,11] = format_time(homework.created_at) + end count_row += 1 end elsif @homework.homework_type == 2 #编程作业 - sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_des), - l(:excel_t_score),l(:excel_ta_score), l(:excel_s_score),l(:excel_n_score),l(:excel_f_score),l(:excel_commit_time)]) + if @homework.anonymous_comment ==0 + sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_des), + l(:excel_t_score),l(:excel_ta_score), l(:excel_s_score),l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) + else + sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_des), + l(:excel_t_score),l(:excel_ta_score), l(:excel_s_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) + end count_row = 1 items.each do |homework| sheet1[count_row,0]=homework.user.id @@ -1243,9 +1261,17 @@ class StudentWorkController < ApplicationController sheet1[count_row,7] = homework.teacher_score.nil? ? l(:label_without_score) : homework.teacher_score.round(2) sheet1[count_row,8] = homework.teaching_asistant_score.nil? ? l(:label_without_score) : homework.teaching_asistant_score.round(2) sheet1[count_row,9] = homework.system_score.nil? ? l(:label_without_score) : homework.system_score.round(2) - sheet1[count_row,10] = homework.student_score.nil? ? l(:label_without_score) : homework.student_score.round(2) - sheet1[count_row,11] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score) - sheet1[count_row,12] = format_time(homework.created_at) + if @homework.anonymous_comment ==0 + sheet1[count_row,10] = homework.student_score.nil? ? l(:label_without_score) : homework.student_score.round(2) + sheet1[count_row,11] = homework.absence_penalty + sheet1[count_row,12] = homework.late_penalty + sheet1[count_row,13] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score) + sheet1[count_row,14] = format_time(homework.created_at) + else + sheet1[count_row,10] = homework.late_penalty + sheet1[count_row,11] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score) + sheet1[count_row,12] = format_time(homework.created_at) + end count_row += 1 end end diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 94be8af6d..8e3e29b16 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -1870,6 +1870,8 @@ zh: excel_ta_score: 教辅评分 excel_n_score: 匿名评分 excel_s_score: 系统评分 + excel_a_penalty: 缺评扣分 + excel_l_penalty: 迟交扣分 excel_f_score: 成绩 excel_commit_time: 提交时间 excel_homework_score: 作业积分 From eca189335b844dd1579af189f11c402334be6d82 Mon Sep 17 00:00:00 2001 From: huang Date: Thu, 23 Jun 2016 17:40:27 +0800 Subject: [PATCH 098/216] =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quality_analysis/_hightchars.html.erb | 196 ++++++++++++++---- app/views/quality_analysis/_show.html.erb | 8 +- 2 files changed, 158 insertions(+), 46 deletions(-) diff --git a/app/views/quality_analysis/_hightchars.html.erb b/app/views/quality_analysis/_hightchars.html.erb index 5acb0e20f..cea38f691 100644 --- a/app/views/quality_analysis/_hightchars.html.erb +++ b/app/views/quality_analysis/_hightchars.html.erb @@ -1,6 +1,7 @@ \ No newline at end of file diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index 674507c4c..24fd990df 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -24,24 +24,24 @@
    -

    +

    质量等级

    A正常

    -

    +

    复杂度

    44正常

    -

    +

    重复

    44%正常

    -

    +

    注释率

    12%偏低

    From 0dc1a1c047f985d9a8af77dd83cf0e27c27c430e Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 23 Jun 2016 18:24:22 +0800 Subject: [PATCH 099/216] get status --- app/helpers/quality_analysis_helper.rb | 43 +++++++++++++++++++ .../quality_analysis/_hightchars.html.erb | 17 +++----- app/views/quality_analysis/_show.html.erb | 13 +++--- 3 files changed, 56 insertions(+), 17 deletions(-) diff --git a/app/helpers/quality_analysis_helper.rb b/app/helpers/quality_analysis_helper.rb index f2a1effba..62993ea1b 100644 --- a/app/helpers/quality_analysis_helper.rb +++ b/app/helpers/quality_analysis_helper.rb @@ -1,2 +1,45 @@ module QualityAnalysisHelper + + def sqale_rating_status val + if val.to_i > 0 && val.to_i < 5 + "henhao" + elsif val.to_i > 5 && val.to_i < 10 + + elsif val.to_i > 10 && val.to_i < 20 + elsif val.to_i > 20 && val.to_i < 50 + "yiban" + elsif val.to_i > 20 + "cha" + end + end + + def complexity_status val + if val.to_i < 10 + "zhengchang" + elsif val.to_i > 10 && val.to_i < 15 + "yiban" + elsif val.to_i > 15 + "cha" + end + end + + def duplicated_lines_density_status val + if val.to_i < 30 + "zhengchang" + elsif val.to_i > 30 && val.to_i < 50 + "jiaogao" + elsif val.to_i > 50 + "gao" + end + end + + def comment_lines_density_status val + if val.to_i < 20 + "paindi" + elsif val.to_i > 20 && val.to_i < 50 + "jiaohao" + elsif val.to_i > 50 + "hao" + end + end end diff --git a/app/views/quality_analysis/_hightchars.html.erb b/app/views/quality_analysis/_hightchars.html.erb index cea38f691..620e2d4fb 100644 --- a/app/views/quality_analysis/_hightchars.html.erb +++ b/app/views/quality_analysis/_hightchars.html.erb @@ -44,12 +44,6 @@ }] }, - xAxis: { - style:{ - fontSize: '18px' - } - }, - // the value axis yAxis: { min: 0, @@ -100,7 +94,7 @@ }, series: [{ name: '代码质量', - data: [<%= @complexity["msr"][9]["frmt_val"] %>] + data: [<%= @complexity["msr"][9]["val"] %>] // tooltip: { // valueSuffix: ' km/h' // } @@ -127,6 +121,7 @@ }); }); + // function_complexity $(function () { $('#container_function_complexity').highcharts({ @@ -175,7 +170,7 @@ // the value axis yAxis: { min: 0, - max: 100, + max: 30, minorTickInterval: 'auto', minorTickWidth: 1, minorTickLength: 10, @@ -214,7 +209,7 @@ }, series: [{ name: '复杂度', - data: [<%= @complexity["msr"][5]["frmt_val"] %>] + data: [<%= @complexity["msr"][5]["val"] %>] // tooltip: { // valueSuffix: ' km/h' // } @@ -334,7 +329,7 @@ }, series: [{ name: '重复率', - data: [<%= @complexity["msr"][7]["frmt_val"] %>] + data: [<%= @complexity["msr"][7]["val"] %>] // tooltip: { // valueSuffix: ' km/h' // } @@ -459,7 +454,7 @@ }, series: [{ name: '质量等级', - data: [<%= @complexity["msr"][5]["frmt_val"] %>] + data: [<%= @complexity["msr"][5]["val"] %>] // tooltip: { // valueSuffix: ' km/h' // } diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index 24fd990df..4265a6e6c 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -8,12 +8,13 @@

    duplicated_lines_density: <%= @complexity["msr"][7]["frmt_val"] %>

    sqale_index: <%= @complexity["msr"][8]["frmt_val"] %>

    sqale_rating: <%= @complexity["msr"][9]["frmt_val"] %>

    - -<%dd %> +<%# DD %> <%= javascript_include_tag 'highcharts','highcharts-more' %> <%= render :partial => "hightchars" %> + +

    SonarQube质量分析

    @@ -26,24 +27,24 @@

    质量等级

    -

    A正常

    +

    <%= @complexity["msr"][9]["frmt_val"] %><%= sqale_rating_status(@complexity["msr"][9]["val"]) %>

    复杂度

    -

    44正常

    +

    <%= @complexity["msr"][6]["val"] %><%= complexity_status(@complexity["msr"][6]["val"]) %>

    重复

    -

    44%正常

    +

    <%= @complexity["msr"][7]["frmt_val"] %><%= duplicated_lines_density_status(@complexity["msr"][7]["val"]) %>

    注释率

    -

    12%偏低

    +

    <%= @complexity["msr"][5]["frmt_val"] %><%=comment_lines_density_status(@complexity["msr"][5]["val"]) %>

    From 52d4d36097da17d2ea3decd65921b4861f4238ba Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Fri, 24 Jun 2016 09:01:12 +0800 Subject: [PATCH 100/216] =?UTF-8?q?=E9=82=80=E8=AF=B7=E7=A0=81=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + Gemfile | 2 +- app/api/mobile/apis/courses.rb | 1 + app/api/mobile/entities/course.rb | 1 + app/controllers/wechats_controller.rb | 7 ++++ app/views/wechats/user_activities.html.erb | 4 ++ public/assets/wechat/invite_code.html | 15 +++++++ public/assets/wechat/myclass.html | 17 +++++--- public/javascripts/wechat/app.js | 2 +- .../wechat/controllers/invite_code.js | 18 +++++++++ .../javascripts/wechat/controllers/myclass.js | 40 ++++++++++++++++++- public/javascripts/wechat/others/routes.js | 1 + 12 files changed, 99 insertions(+), 10 deletions(-) create mode 100644 public/assets/wechat/invite_code.html create mode 100644 public/javascripts/wechat/controllers/invite_code.js diff --git a/.gitignore b/.gitignore index ba7890841..dbc349c80 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,4 @@ vendor/cache /config/initializers/gitlab_config.rb 1234567 public/javascripts/wechat/node_modules/ +.ruby-version diff --git a/Gemfile b/Gemfile index d392c6561..a8131fb3f 100644 --- a/Gemfile +++ b/Gemfile @@ -81,7 +81,7 @@ group :assets do gem 'coffee-rails', '~> 3.2.1' # See https://github.com/sstephenson/execjs#readme for more supported runtimes - gem 'therubyracer', :platforms => :ruby + # gem 'therubyracer', :platforms => :ruby gem 'uglifier', '>= 1.0.3' end diff --git a/app/api/mobile/apis/courses.rb b/app/api/mobile/apis/courses.rb index de2e48c8e..58d4a4f8c 100644 --- a/app/api/mobile/apis/courses.rb +++ b/app/api/mobile/apis/courses.rb @@ -196,6 +196,7 @@ module Mobile end route_param :id do get do + authenticate! cs = CoursesService.new course = cs.show_course(params,(current_user.nil? ? User.find(2):current_user)) #course = Course.find(params[:id]) diff --git a/app/api/mobile/entities/course.rb b/app/api/mobile/entities/course.rb index 50812b349..fc5c95ef5 100644 --- a/app/api/mobile/entities/course.rb +++ b/app/api/mobile/entities/course.rb @@ -45,6 +45,7 @@ module Mobile course_expose :tea_id course_expose :term course_expose :time + course_expose :invite_code course_expose :updated_at course_expose :course_student_num expose :teacher, using: Mobile::Entities::User do |c, opt| diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index d6ab11f92..75a8bac92 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -260,7 +260,14 @@ class WechatsController < ActionController::Base unless open_id render 'wechats/open_wechat', layout: nil and return end + if params[:state] == 'myclass' + @course_id = params[:id]; + end + session[:wechat_openid] = open_id + if params[:code] + redirect_to "/wechat/user_activities##{@path}?id=#{params[:id]}" and return + end render 'wechats/user_activities', layout: nil end diff --git a/app/views/wechats/user_activities.html.erb b/app/views/wechats/user_activities.html.erb index b5bd82fc5..2b4ebc703 100644 --- a/app/views/wechats/user_activities.html.erb +++ b/app/views/wechats/user_activities.html.erb @@ -16,6 +16,9 @@ window.g_debug = false; //调试标志,如果在本地请置为true window.apiUrl = '/api/v1/'; window.g_redirect_path = '<%= @path %>'; + <% if @course_id %> + window.g_courseid = <%= @course_id %>; + <% end %> @@ -34,6 +37,7 @@ + diff --git a/public/assets/wechat/invite_code.html b/public/assets/wechat/invite_code.html new file mode 100644 index 000000000..116dad8da --- /dev/null +++ b/public/assets/wechat/invite_code.html @@ -0,0 +1,15 @@ +
    +
    +
    + +
    +
    邀请码:{{course.invite_code}}
    +
    +
    + +
    \ No newline at end of file diff --git a/public/assets/wechat/myclass.html b/public/assets/wechat/myclass.html index 25d29008a..f12364130 100644 --- a/public/assets/wechat/myclass.html +++ b/public/assets/wechat/myclass.html @@ -1,5 +1,6 @@
    -
    分布式计算环境A班邀请码
    +
    +
    {{course.name}}邀请码
    @@ -10,7 +11,7 @@
    - +
    @@ -23,10 +24,14 @@
    授课老师
    -
    jacknudt
    + +
    + {{teacher.realname}}教辅 +
    我的同学
    -
    jingquan教辅
    -
    yuanke
    -
    sasameimei
    +
    + {{student.realname}} +
    +
    diff --git a/public/javascripts/wechat/app.js b/public/javascripts/wechat/app.js index ea2bdf318..00d6bf3bc 100644 --- a/public/javascripts/wechat/app.js +++ b/public/javascripts/wechat/app.js @@ -9,7 +9,7 @@ app.constant('config', { app.run(['$rootScope', 'auth', '$location', '$routeParams', function($rootScope, auth, $location, $routeParams){ - if(g_redirect_path && g_redirect_path.length>0){ + if(g_redirect_path && g_redirect_path.length>1){ $location.path(g_redirect_path); g_redirect_path = null; } diff --git a/public/javascripts/wechat/controllers/invite_code.js b/public/javascripts/wechat/controllers/invite_code.js new file mode 100644 index 000000000..b21653b1e --- /dev/null +++ b/public/javascripts/wechat/controllers/invite_code.js @@ -0,0 +1,18 @@ +/** + * Created by guange on 16/6/22. + */ + + +app.controller('InviteCodeController', ['$scope','$http', '$routeParams','config','auth', function($scope, $http, $routeParams, config, auth){ + var vm = $scope; + + vm.course = {}; + var courseid = $routeParams.id; + $http.get(config.apiUrl+ 'courses/'+courseid+"?token="+auth.token()).then( + function(response){ + console.log(response.data); + vm.course = response.data.data; + } + ); + +}]); diff --git a/public/javascripts/wechat/controllers/myclass.js b/public/javascripts/wechat/controllers/myclass.js index cb5cf9037..bf864ab88 100644 --- a/public/javascripts/wechat/controllers/myclass.js +++ b/public/javascripts/wechat/controllers/myclass.js @@ -1,11 +1,47 @@ -app.controller('MyClassController', ['$scope', function($scope){ +app.controller('MyClassController', ['$scope', 'config','$http', 'auth','$location','$routeParams', function($scope, config, $http, auth, $location, $routeParams){ var vm = $scope; + var courseid = $routeParams.id; vm.currentTab = 1; vm.tab = function(index){ vm.currentTab = index; - console.log(vm.currentTab); + vm.searchText = ''; + console.log(vm.currentTab); + if(index == 2){ + if(vm.students.length<=0){ + $http.get(config.apiUrl + 'courses/students?token='+auth.token()+'&course_id='+courseid).then( + function(response) { + console.log(response.data); + vm.students = response.data.data; + } + ) + } + } + } + vm.course = {}; + vm.students = []; + vm.teachers = []; + + vm.invite = function(){ + $location.path("/invite_code").search({id: courseid}); + }; + + $http.get(config.apiUrl+ 'courses/'+courseid+"?token="+auth.token()).then( + function(response){ + console.log(response.data); + vm.course = response.data.data; + } + ); + + + if(vm.teachers.length<=0){ + $http.get(config.apiUrl + 'courses/teachers?token='+auth.token()+'&course_id='+courseid).then( + function(response) { + console.log(response.data); + vm.teachers = response.data.data; + } + ) } }]); \ No newline at end of file diff --git a/public/javascripts/wechat/others/routes.js b/public/javascripts/wechat/others/routes.js index 7fa5e6d74..3fa7ca6df 100644 --- a/public/javascripts/wechat/others/routes.js +++ b/public/javascripts/wechat/others/routes.js @@ -32,6 +32,7 @@ app.config(['$routeProvider',"$httpProvider", "$locationProvider",'config', func .when('/blog_comment/:id', makeRoute('blog_detail.html', 'BlogController')) .when('/add_class', makeRoute('add_class.html', 'AddClassController')) .when('/myclass', makeRoute('myclass.html', 'MyClassController')) + .when('/invite_code', makeRoute('invite_code.html', 'InviteCodeController')) .otherwise({ redirectTo: '/activites' }); From e6b263feb5774d3c68cf7e864fe544f08d219e32 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Jun 2016 09:58:51 +0800 Subject: [PATCH 101/216] issues from sonar --- .../quality_analysis_controller.rb | 4 ++- app/helpers/quality_analysis_helper.rb | 32 +++++++++++++++++-- app/views/quality_analysis/_show.html.erb | 20 ++++++------ 3 files changed, 43 insertions(+), 13 deletions(-) diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index 58ae02add..99d63dfe3 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -60,8 +60,10 @@ class QualityAnalysisController < ApplicationController else @name_flag = false resource_id = params[:resource_id] - complexity_date = open("http://123.59.135.93:8891/api/resources/index?resource=139&depth=0&metrics=sqale_rating,function_complexity,duplicated_lines_density,comment_lines_density,sqale_index,lines,file_line,files,functions,classes,directories").read + complexity_date = open("http://123.59.135.93:8891/api/resources/index?resource=#{resource_id}&depth=0&metrics=sqale_rating,function_complexity,duplicated_lines_density,comment_lines_density,sqale_index,lines,file_line,files,functions,classes,directories").read @complexity =JSON.parse(complexity_date).first + issue_date = open("http://123.59.135.93:8891/api/resources/index?resource=#{resource_id}&depth=0&metrics=blocker_violations,critical_violations,major_violations,minor_violations,info_violations,violations").read + @sonar_issues = JSON.parse(issue_date).first end end diff --git a/app/helpers/quality_analysis_helper.rb b/app/helpers/quality_analysis_helper.rb index 62993ea1b..98b5cadd7 100644 --- a/app/helpers/quality_analysis_helper.rb +++ b/app/helpers/quality_analysis_helper.rb @@ -4,12 +4,13 @@ module QualityAnalysisHelper if val.to_i > 0 && val.to_i < 5 "henhao" elsif val.to_i > 5 && val.to_i < 10 - + "jiaohao" elsif val.to_i > 10 && val.to_i < 20 + "zhongdeng" elsif val.to_i > 20 && val.to_i < 50 - "yiban" + "jiaocha" elsif val.to_i > 20 - "cha" + "hencha" end end @@ -42,4 +43,29 @@ module QualityAnalysisHelper "hao" end end + + def score_sqale_rating val + if val.to_i > 0 && val.to_i < 5 + "5" + elsif val.to_i > 5 && val.to_i < 10 + "4" + elsif val.to_i > 10 && val.to_i < 20 + "3" + elsif val.to_i > 20 && val.to_i < 50 + "2" + elsif val.to_i > 20 + "1" + end + end + + def lines_scale val + if val.to_i < 5000 + "zhongdeng" + elsif val.to_i >5000 && val.to_i < 50000 + "zhongdneg" + else + "da" + end + end + end diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index 4265a6e6c..522b004a8 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -8,6 +8,8 @@

    duplicated_lines_density: <%= @complexity["msr"][7]["frmt_val"] %>

    sqale_index: <%= @complexity["msr"][8]["frmt_val"] %>

    sqale_rating: <%= @complexity["msr"][9]["frmt_val"] %>

    + +

    issues: <%= @sonar_issues["msr"][0]["frmt_val"] %>

    <%# DD %> @@ -48,19 +50,19 @@
    -
    质量等级2/5分可定性评价为:质量中等
    +
    质量等级<%= score_sqale_rating(@complexity["msr"][9]["val"]) %>/5分可定性评价为:质量<%= sqale_rating_status(@complexity["msr"][9]["val"]) %>
    -
    技术债务14天查看详情
    -
    质量问题130问题分类如下:
    +
    技术债务<%= @complexity["msr"][8]["frmt_val"] %>查看详情
    +
    质量问题<%= @sonar_issues["msr"][0]["frmt_val"] %>问题分类如下:
    -
    阻断4
    -
    严重75
    -
    主要428
    -
    次要225
    -
    信息114
    +
    阻断<%= @sonar_issues["msr"][1]["frmt_val"] %>
    +
    严重<%= @sonar_issues["msr"][2]["frmt_val"] %>
    +
    主要<%= @sonar_issues["msr"][3]["frmt_val"] %>
    +
    次要<%= @sonar_issues["msr"][4]["frmt_val"] %>
    +
    信息<%= @sonar_issues["msr"][5]["frmt_val"] %>
    -
    代码规模可定性评价为:规模中等
    +
    代码规模可定性评价为:<%= lines_scale(@complexity["msr"][0]["frmt_val"]) %>

    代码行数

    From dcd2aa7848457244e1ad34526729ae4ee7173935 Mon Sep 17 00:00:00 2001 From: huang Date: Fri, 24 Jun 2016 10:05:49 +0800 Subject: [PATCH 102/216] =?UTF-8?q?=E5=8F=82=E8=80=83=E4=B8=B4=E7=95=8C?= =?UTF-8?q?=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/quality_analysis_helper.rb | 34 +++++++++++++------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/app/helpers/quality_analysis_helper.rb b/app/helpers/quality_analysis_helper.rb index 98b5cadd7..68ceb0996 100644 --- a/app/helpers/quality_analysis_helper.rb +++ b/app/helpers/quality_analysis_helper.rb @@ -2,45 +2,45 @@ module QualityAnalysisHelper def sqale_rating_status val if val.to_i > 0 && val.to_i < 5 - "henhao" + "很好" elsif val.to_i > 5 && val.to_i < 10 - "jiaohao" + "较好" elsif val.to_i > 10 && val.to_i < 20 - "zhongdeng" + "中等" elsif val.to_i > 20 && val.to_i < 50 - "jiaocha" + "较差" elsif val.to_i > 20 - "hencha" + "很差" end end def complexity_status val if val.to_i < 10 - "zhengchang" + "良好" elsif val.to_i > 10 && val.to_i < 15 - "yiban" + "较高" elsif val.to_i > 15 - "cha" + "很高" end end def duplicated_lines_density_status val if val.to_i < 30 - "zhengchang" + "良好" elsif val.to_i > 30 && val.to_i < 50 - "jiaogao" + "较高" elsif val.to_i > 50 - "gao" + "很高" end end def comment_lines_density_status val if val.to_i < 20 - "paindi" + "较低" elsif val.to_i > 20 && val.to_i < 50 - "jiaohao" + "正常" elsif val.to_i > 50 - "hao" + "较高" end end @@ -60,11 +60,11 @@ module QualityAnalysisHelper def lines_scale val if val.to_i < 5000 - "zhongdeng" + "小型" elsif val.to_i >5000 && val.to_i < 50000 - "zhongdneg" + "中型" else - "da" + "大型" end end From a0635bbb2daac1e1218f8bf5dc87c19b5785635f Mon Sep 17 00:00:00 2001 From: huang Date: Fri, 24 Jun 2016 10:47:21 +0800 Subject: [PATCH 103/216] =?UTF-8?q?=E6=89=80=E5=8D=A0=E7=99=BE=E5=88=86?= =?UTF-8?q?=E6=AF=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/helpers/quality_analysis_helper.rb | 7 +++++++ app/views/quality_analysis/_show.html.erb | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/app/helpers/quality_analysis_helper.rb b/app/helpers/quality_analysis_helper.rb index 68ceb0996..0454a6943 100644 --- a/app/helpers/quality_analysis_helper.rb +++ b/app/helpers/quality_analysis_helper.rb @@ -68,4 +68,11 @@ module QualityAnalysisHelper end end + #统计答题百分比,统计结果保留两位小数 + def statistics_result_percentage(e, t) + e = e.to_f + t = t.to_f + t == 0 ? 0 : format("%.2f", e*100/t) + end + end diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index 522b004a8..d3dc277bc 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -55,8 +55,8 @@
    技术债务<%= @complexity["msr"][8]["frmt_val"] %>查看详情
    质量问题<%= @sonar_issues["msr"][0]["frmt_val"] %>问题分类如下:
    -
    阻断<%= @sonar_issues["msr"][1]["frmt_val"] %>
    -
    严重<%= @sonar_issues["msr"][2]["frmt_val"] %>
    +
    阻断<%= @sonar_issues["msr"][1]["frmt_val"] %>%;">
    +
    严重<%= @sonar_issues["msr"][2]["frmt_val"] %>
    主要<%= @sonar_issues["msr"][3]["frmt_val"] %>
    次要<%= @sonar_issues["msr"][4]["frmt_val"] %>
    信息<%= @sonar_issues["msr"][5]["frmt_val"] %>
    From 05eb71036ded75dbaf4b4b46c47f31fd957f09bb Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Jun 2016 10:47:24 +0800 Subject: [PATCH 104/216] some css to added --- app/views/quality_analysis/_show.html.erb | 21 ++------------------- public/stylesheets/public.css | 9 +++++++++ 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index 522b004a8..828b5a98d 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -1,26 +1,9 @@ -

    lines: <%= @complexity["msr"][0]["frmt_val"] %>

    -

    classes: <%= @complexity["msr"][1]["frmt_val"] %>

    -

    files: <%= @complexity["msr"][2]["frmt_val"] %>

    -

    directories: <%= @complexity["msr"][3]["frmt_val"] %>

    -

    function: <%= @complexity["msr"][4]["frmt_val"] %>

    -

    comment_lines_density: <%= @complexity["msr"][5]["frmt_val"] %>

    -

    function_complexity: <%= @complexity["msr"][6]["frmt_val"] %>

    -

    duplicated_lines_density: <%= @complexity["msr"][7]["frmt_val"] %>

    -

    sqale_index: <%= @complexity["msr"][8]["frmt_val"] %>

    -

    sqale_rating: <%= @complexity["msr"][9]["frmt_val"] %>

    - -

    issues: <%= @sonar_issues["msr"][0]["frmt_val"] %>

    -<%# DD %> - - <%= javascript_include_tag 'highcharts','highcharts-more' %> <%= render :partial => "hightchars" %> - -

    SonarQube质量分析

    - branch:master +
    项目代码质量分析报告
    概要信息
    @@ -40,7 +23,7 @@

    -

    重复

    +

    重复

    <%= @complexity["msr"][7]["frmt_val"] %><%= duplicated_lines_density_status(@complexity["msr"][7]["val"]) %>

    diff --git a/public/stylesheets/public.css b/public/stylesheets/public.css index e33ac601e..c6d7853e5 100644 --- a/public/stylesheets/public.css +++ b/public/stylesheets/public.css @@ -27,6 +27,7 @@ a.btn_message_free{ background:#ff5722; display:block; text-align:center; color h2{ font-size:18px; } h3{ font-size:14px; } h4{ font-size:14px; } +.f8 {font-size:8px;} .f12{font-size:12px; font-weight:normal;} .f14{font-size:14px;} .f16{font-size:16px;} @@ -130,6 +131,7 @@ h4{ font-size:14px; } .mt12 { margin-top:12px !important;} .mt15 {margin-top:15px;} .mt19 {margin-top:19px !important;} +.mt35 {margin-top:35px;} .ml70{margin-left: 70px;} .mb0 {margin-bottom: 0px !important;} .mb4{ margin-bottom:4px;} @@ -137,6 +139,8 @@ h4{ font-size:14px; } .mb8 {margin-bottom:8px;} .mb10{ margin-bottom:10px !important;} .mb20{ margin-bottom:20px;} +.mb30 {margin-bottom:30px;} +.mb40 {margin-bottom:40px;} .pl10 {padding-left:10px;} .pl15{ padding-left:15px;} .pl5{ padding-left:5px;} @@ -228,6 +232,7 @@ a.c_green{ color:#28be6c;} .b_grey{ background: #F5F5F5;} .b_dgrey{ background: #CCC;} +.c_white {color:#fff;} .c_orange{color:#e8770d;} .c_dark{ color:#2d2d2d;} .c_lorange{ color:#ff9900;} @@ -239,6 +244,8 @@ a.c_green{ color:#28be6c;} .c_dblue{ color:#09658c;} .b_blue{background:#64bdd9;} .b_green{background:#28be6c;} +.b_green2 {background:#63c360;} +.b_red {background:#d60308;} .b_w{ background:#fff !important;} /*add by Tim*/ @@ -341,6 +348,8 @@ a:hover.bgreen_n_btn{background:#08a384;} .orange_btn_cir{ background:#e67e22; padding:1px 10px; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; color:#fff; font-weight:normal; font-size:12px;white-space:nowrap;} .bgreen_btn_cir{ background:#1abc9c; padding:1px 10px; -moz-border-radius:2px; -webkit-border-radius:2px; border-radius:2px; color:#fff; font-weight:normal; font-size:12px;white-space:nowrap;} .grey_border{border:1px solid #dddddd !important;} +.borderRadius {border-radius:5px;} +.tac {text-align:center;} /* commonpic */ .pic_date{ display:block; background:url(../images/new_project/public_icon.png) -31px 0 no-repeat; width:16px; height:15px; float:left;} .pic_add{ display:block; background:url(../images/new_project/public_icon.png) -31px -273px no-repeat; width:16px; height:15px; float:left;} From bd3277681c291593da53f073f47db337efc039a2 Mon Sep 17 00:00:00 2001 From: cxt Date: Fri, 24 Jun 2016 10:50:40 +0800 Subject: [PATCH 105/216] =?UTF-8?q?=E5=88=86=E7=BB=84=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E7=9A=84=E4=BD=9C=E4=B8=9A=E6=88=90=E7=BB=A9=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E3=80=81=E5=AD=A6=E7=94=9F=E5=88=97=E8=A1=A8=E7=9A=84=E5=AF=BC?= =?UTF-8?q?=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/courses_controller.rb | 117 ++++++++++++++++++++- app/controllers/student_work_controller.rb | 35 +++++- app/helpers/application_helper.rb | 17 +++ config/locales/zh.yml | 4 + 4 files changed, 169 insertions(+), 4 deletions(-) diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index e421b8c69..2e8aebce5 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -1224,7 +1224,7 @@ class CoursesController < ApplicationController def member_to_xls homeworks, course, members,groups xls_report = StringIO.new book = Spreadsheet::Workbook.new - sheet1 = book.create_worksheet :name => "student" + sheet1 = book.create_worksheet :name => "总成绩" blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 #sheet1.row(0).default_format = blue #sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_class),l(:excel_f_score),l(:excel_commit_time)]) @@ -1268,6 +1268,121 @@ class CoursesController < ApplicationController count_row += 1 end + homeworks.each_with_index do |home, i| + sheet = book.create_worksheet :name => "第#{i+1}次作业" + sheet[0,0] = "课程编号" + sheet[0,1] = course.id + sheet[1,0] = "课程学期" + sheet[1,1] = course.time.to_s+"年"+course.term + sheet[2,0] = "课程名称" + sheet[2,1] = course.name + sheet[3,0] = "教师团队" + sheet[3,1] = (searchTeacherAndAssistant course).map{|member| member.user.show_name}.join('、') + sheet[4,0] = "主讲教师" + sheet[4,1] = course.teacher.show_name + sheet[4,0] = "作业批次" + sheet[4,1] = "第#{i+1}次作业" + sheet[4,0] = "作业名称" + sheet[4,1] = home.name + if home.homework_type == 1 #普通作业 + if home.anonymous_comment ==0 + sheet.row(5).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_name),l(:excel_homework_des), + l(:excel_t_score),l(:excel_ta_score), l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) + else + sheet.row(5).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_name),l(:excel_homework_des), + l(:excel_t_score),l(:excel_ta_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) + end + count_row = 6 + items = home.student_works.order("work_score desc") + items.each_with_index do |stu, j| + sheet[count_row,0]= j + 1 + sheet[count_row,1] = stu.user.show_name + sheet[count_row,2] = stu.user.login + sheet[count_row,3] = stu.user.user_extensions.student_id + sheet[count_row,4] = stu.name + sheet[count_row,5] = strip_html stu.description + sheet[count_row,6] = stu.teacher_score.nil? ? l(:label_without_score) : stu.teacher_score.round(2) + sheet[count_row,7] = stu.teaching_asistant_score.nil? ? l(:label_without_score) : stu.teaching_asistant_score.round(2) + if home.anonymous_comment ==0 + sheet[count_row,8] = stu.student_score.nil? ? l(:label_without_score) : stu.student_score.round(2) + sheet[count_row,9] = stu.absence_penalty + sheet[count_row,10] = stu.late_penalty + sheet[count_row,11] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(2) + sheet[count_row,12] = format_time(stu.created_at) + else + sheet[count_row,8] = stu.late_penalty + sheet[count_row,9] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(2) + sheet[count_row,10] = format_time(stu.created_at) + end + count_row += 1 + end + elsif home.homework_type == 2 #编程作业 + if home.anonymous_comment ==0 + sheet.row(5).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_name),l(:excel_homework_des), + l(:excel_t_score),l(:excel_ta_score), l(:excel_s_score),l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) + else + sheet.row(5).concat([l(:excel_rank),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_homework_name),l(:excel_homework_des), + l(:excel_t_score),l(:excel_ta_score), l(:excel_s_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) + end + count_row = 6 + items = home.student_works.order("work_score desc") + items.each_with_index do |stu, j| + sheet[count_row,0]= j + 1 + sheet[count_row,1] = stu.user.show_name + sheet[count_row,2] = stu.user.login + sheet[count_row,3] = stu.user.user_extensions.student_id + sheet[count_row,4] = stu.name + sheet[count_row,5] = stu.description + sheet[count_row,6] = stu.teacher_score.nil? ? l(:label_without_score) : stu.teacher_score.round(2) + sheet[count_row,7] = stu.teaching_asistant_score.nil? ? l(:label_without_score) : stu.teaching_asistant_score.round(2) + sheet[count_row,8] = stu.system_score.nil? ? l(:label_without_score) : stu.system_score.round(2) + if home.anonymous_comment ==0 + sheet[count_row,9] = stu.student_score.nil? ? l(:label_without_score) : stu.student_score.round(2) + sheet[count_row,10] = stu.absence_penalty + sheet[count_row,11] = stu.late_penalty + sheet[count_row,12] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(2) + sheet[count_row,13] = format_time(stu.created_at) + else + sheet[count_row,9] = stu.late_penalty + sheet[count_row,10] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(2) + sheet[count_row,11] = format_time(stu.created_at) + end + count_row += 1 + end + elsif home.homework_type == 3 #分组作业 + if home.anonymous_comment ==0 + sheet.row(5).concat([l(:excel_rank),l(:excel_group_member),l(:excel_homework_name),l(:excel_homework_project),l(:excel_homework_des), + l(:excel_t_score),l(:excel_ta_score),l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) + else + sheet.row(5).concat([l(:excel_rank),l(:excel_group_member),l(:excel_homework_name),l(:excel_homework_project),l(:excel_homework_des), + l(:excel_t_score),l(:excel_ta_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) + end + count_row = 6 + items = home.student_works.order("work_score desc") + items.each_with_index do |stu, j| + sheet[count_row,0] = j + 1 + sheet[count_row,1] = get_group_member_names stu + sheet[count_row,2] = stu.name + sheet[count_row,3] = (stu.project_id == 0 || stu.project_id.nil?) ? l(:excel_no_project) : stu.project.name + sheet[count_row,4] = strip_html stu.description + sheet[count_row,5] = stu.teacher_score.nil? ? l(:label_without_score) : stu.teacher_score.round(2) + sheet[count_row,6] = stu.teaching_asistant_score.nil? ? l(:label_without_score) : stu.teaching_asistant_score.round(2) + if home.anonymous_comment ==0 + sheet[count_row,7] = stu.student_score.nil? ? l(:label_without_score) : stu.student_score.round(2) + sheet[count_row,8] = stu.absence_penalty + sheet[count_row,9] = stu.late_penalty + sheet[count_row,10] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(2) + sheet[count_row,11] = format_time(stu.created_at) + else + sheet[count_row,7] = stu.late_penalty + sheet[count_row,8] = stu.work_score.nil? ? l(:label_without_score) : stu.work_score.round(2) + sheet[count_row,9] = format_time(stu.created_at) + end + count_row += 1 + end + end + end + =begin group0 = CourseGroup.new(); group0.id = 0; diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb index a9a0f6081..b92dbb935 100644 --- a/app/controllers/student_work_controller.rb +++ b/app/controllers/student_work_controller.rb @@ -1209,7 +1209,7 @@ class StudentWorkController < ApplicationController sheet1 = book.create_worksheet :name => "homework" blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10 sheet1.row(0).default_format = blue - if @homework.homework_type == 1 #匿评作业 + if @homework.homework_type == 1 #普通作业 if @homework.anonymous_comment ==0 sheet1.row(0).concat([l(:excel_user_id),l(:excel_user_name),l(:excel_nickname),l(:excel_student_id),l(:excel_mail),l(:excel_homework_name),l(:excel_homework_des), l(:excel_t_score),l(:excel_ta_score), l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) @@ -1220,7 +1220,7 @@ class StudentWorkController < ApplicationController count_row = 1 items.each do |homework| sheet1[count_row,0]=homework.user.id - sheet1[count_row,1] = homework.user.lastname.to_s + homework.user.firstname.to_s + sheet1[count_row,1] = homework.user.show_name sheet1[count_row,2] = homework.user.login sheet1[count_row,3] = homework.user.user_extensions.student_id sheet1[count_row,4] = homework.user.mail @@ -1252,7 +1252,7 @@ class StudentWorkController < ApplicationController count_row = 1 items.each do |homework| sheet1[count_row,0]=homework.user.id - sheet1[count_row,1] = homework.user.lastname.to_s + homework.user.firstname.to_s + sheet1[count_row,1] = homework.user.show_name sheet1[count_row,2] = homework.user.login sheet1[count_row,3] = homework.user.user_extensions.student_id sheet1[count_row,4] = homework.user.mail @@ -1274,6 +1274,35 @@ class StudentWorkController < ApplicationController end count_row += 1 end + elsif @homework.homework_type == 3 #分组作业 + if @homework.anonymous_comment ==0 + sheet1.row(0).concat([l(:excel_group_member),l(:excel_homework_name),l(:excel_homework_project),l(:excel_homework_des), + l(:excel_t_score),l(:excel_ta_score),l(:excel_n_score),l(:excel_a_penalty),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) + else + sheet1.row(0).concat([l(:excel_group_member),l(:excel_homework_name),l(:excel_homework_project),l(:excel_homework_des), + l(:excel_t_score),l(:excel_ta_score),l(:excel_l_penalty),l(:excel_f_score),l(:excel_commit_time)]) + end + count_row = 1 + items.each do |homework| + sheet1[count_row,0] = get_group_member_names homework + sheet1[count_row,1] = homework.name + sheet1[count_row,2] = (homework.project_id == 0 || homework.project_id.nil?) ? l(:excel_no_project) : homework.project.name + sheet1[count_row,3] = strip_html homework.description + sheet1[count_row,4] = homework.teacher_score.nil? ? l(:label_without_score) : homework.teacher_score.round(2) + sheet1[count_row,5] = homework.teaching_asistant_score.nil? ? l(:label_without_score) : homework.teaching_asistant_score.round(2) + if @homework.anonymous_comment ==0 + sheet1[count_row,6] = homework.student_score.nil? ? l(:label_without_score) : homework.student_score.round(2) + sheet1[count_row,7] = homework.absence_penalty + sheet1[count_row,8] = homework.late_penalty + sheet1[count_row,9] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score) + sheet1[count_row,10] = format_time(homework.created_at) + else + sheet1[count_row,6] = homework.late_penalty + sheet1[count_row,7] = homework.respond_to?("score") ? homework.score.nil? ? l(:label_without_score) : homework.score.round(2) : l(:label_without_score) + sheet1[count_row,8] = format_time(homework.created_at) + end + count_row += 1 + end end book.write xls_report xls_report.string diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 2552a6e84..ee2e2d74a 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -3303,3 +3303,20 @@ def get_hw_index(hw,is_teacher) index = hw_ids.index(hw.id) return index end + +def get_group_member_names work + result = "" + unless work.nil? + work.student_work_projects.each do |member| + user = User.where(:id => member.user_id).first + unless user.nil? + if result != "" + result += "、#{user.show_name}" + else + result += user.show_name + end + end + end + end + result +end diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 8e3e29b16..5d9b3c2a1 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -1864,8 +1864,12 @@ zh: excel_nickname: 登录名 excel_student_id: 学号 excel_mail: 电子邮箱 + excel_rank: 排名 excel_homework_name: 作品名 excel_homework_des: 作品描述 + excel_homework_project: 关联项目 + excel_no_project: 无关联项目 + excel_group_member: 组员 excel_t_score: 教师评分 excel_ta_score: 教辅评分 excel_n_score: 匿名评分 From a41d18dd0ec33d0f0e62957f85e52a7949716e66 Mon Sep 17 00:00:00 2001 From: cxt Date: Fri, 24 Jun 2016 11:02:29 +0800 Subject: [PATCH 106/216] =?UTF-8?q?=E7=BC=96=E7=A8=8B=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E7=9A=84=E4=BD=9C=E5=93=81=E8=AF=A6=E6=83=85=E5=9C=A8=E9=A1=B6?= =?UTF-8?q?=E9=83=A8=E5=A2=9E=E5=8A=A0=E2=80=9C=E6=94=B6=E8=B5=B7=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/student_work/_programing_work_show.html.erb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/views/student_work/_programing_work_show.html.erb b/app/views/student_work/_programing_work_show.html.erb index 4ca5a8f2d..c4df9e715 100644 --- a/app/views/student_work/_programing_work_show.html.erb +++ b/app/views/student_work/_programing_work_show.html.erb @@ -4,6 +4,7 @@
  • 上交时间: <%=format_time work.created_at %> + 收起
  • <% if work.user == User.current && Time.parse(@homework.end_time.to_s).strftime("%Y-%m-%d") >= Time.now.strftime("%Y-%m-%d") %> From e17aa4c5d881537dbb8259449d0c4f2f38a0a54b Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Jun 2016 11:20:39 +0800 Subject: [PATCH 107/216] color --- app/helpers/quality_analysis_helper.rb | 50 ++++++++++++++++------- app/views/quality_analysis/_show.html.erb | 22 +++++----- public/stylesheets/public.css | 3 ++ 3 files changed, 50 insertions(+), 25 deletions(-) diff --git a/app/helpers/quality_analysis_helper.rb b/app/helpers/quality_analysis_helper.rb index 0454a6943..8356c476b 100644 --- a/app/helpers/quality_analysis_helper.rb +++ b/app/helpers/quality_analysis_helper.rb @@ -1,47 +1,69 @@ module QualityAnalysisHelper def sqale_rating_status val + arr = [] if val.to_i > 0 && val.to_i < 5 - "很好" + arr << "很好" + arr << "b_green2" elsif val.to_i > 5 && val.to_i < 10 - "较好" + arr << "较好" + arr << "b_slow_yellow" elsif val.to_i > 10 && val.to_i < 20 - "中等" + arr << "中等" + arr << "b_yellow" elsif val.to_i > 20 && val.to_i < 50 - "较差" + arr << "较差" + arr << "b_slow_red" elsif val.to_i > 20 - "很差" + arr << "很差" + arr << "b_red" end + arr.first end def complexity_status val + arr = [] if val.to_i < 10 - "良好" + arr << "良好" + arr << "b_green2" elsif val.to_i > 10 && val.to_i < 15 - "较高" + arr << "较高" + arr << "b_yellow" elsif val.to_i > 15 - "很高" + arr << "很高" + arr << "b_red" end + arr.first end def duplicated_lines_density_status val + arr = [] if val.to_i < 30 - "良好" + arr << "良好" + arr << "b_green2" elsif val.to_i > 30 && val.to_i < 50 - "较高" + arr << "较高" + arr << "b_yellow" elsif val.to_i > 50 - "很高" + arr << "很高" + arr << "b_red" end + arr.first end def comment_lines_density_status val + arr = [] if val.to_i < 20 - "较低" + arr << "较低" + arr << "b_yellow" elsif val.to_i > 20 && val.to_i < 50 - "正常" + arr << "正常" + arr << "b_green2" elsif val.to_i > 50 - "较高" + arr << "较高" + arr << "b_red" end + arr.first end def score_sqale_rating val diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index 3b80d775c..86ff6782b 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -10,39 +10,39 @@
    -

    +

    质量等级

    -

    <%= @complexity["msr"][9]["frmt_val"] %><%= sqale_rating_status(@complexity["msr"][9]["val"]) %>

    +

    <%= @complexity["msr"][9]["frmt_val"] %>} borderRadius"><%= sqale_rating_status(@complexity["msr"][9]["val"]) %>

    -

    +

    复杂度

    <%= @complexity["msr"][6]["val"] %><%= complexity_status(@complexity["msr"][6]["val"]) %>

    -

    +

    重复

    <%= @complexity["msr"][7]["frmt_val"] %><%= duplicated_lines_density_status(@complexity["msr"][7]["val"]) %>

    -

    +

    注释率

    <%= @complexity["msr"][5]["frmt_val"] %><%=comment_lines_density_status(@complexity["msr"][5]["val"]) %>

    -
    质量等级<%= score_sqale_rating(@complexity["msr"][9]["val"]) %>/5分可定性评价为:质量<%= sqale_rating_status(@complexity["msr"][9]["val"]) %>
    +
    质量等级<%= score_sqale_rating(@complexity["msr"][9]["val"]) %>/5分可定性评价为:质量<%= sqale_rating_status(@complexity["msr"][9]["val"])[0] %>
    技术债务<%= @complexity["msr"][8]["frmt_val"] %>查看详情
    质量问题<%= @sonar_issues["msr"][0]["frmt_val"] %>问题分类如下:
    -
    阻断<%= @sonar_issues["msr"][1]["frmt_val"] %>%;">
    -
    严重<%= @sonar_issues["msr"][2]["frmt_val"] %>
    -
    主要<%= @sonar_issues["msr"][3]["frmt_val"] %>
    -
    次要<%= @sonar_issues["msr"][4]["frmt_val"] %>
    -
    信息<%= @sonar_issues["msr"][5]["frmt_val"] %>
    +
    阻断<%= @sonar_issues["msr"][1]["frmt_val"] %>%;">
    +
    严重<%= @sonar_issues["msr"][2]["frmt_val"] %>%;">
    +
    主要<%= @sonar_issues["msr"][3]["frmt_val"] %>%;">
    +
    次要<%= @sonar_issues["msr"][4]["frmt_val"] %>%;">
    +
    信息<%= @sonar_issues["msr"][5]["frmt_val"] %>%;">
    代码规模可定性评价为:<%= lines_scale(@complexity["msr"][0]["frmt_val"]) %>
    diff --git a/public/stylesheets/public.css b/public/stylesheets/public.css index c6d7853e5..743c81014 100644 --- a/public/stylesheets/public.css +++ b/public/stylesheets/public.css @@ -244,6 +244,9 @@ a.c_green{ color:#28be6c;} .c_dblue{ color:#09658c;} .b_blue{background:#64bdd9;} .b_green{background:#28be6c;} +.b_slow_yellow{background:#adde18;} +.b_yellow{background:#DDDF0D;} +.b_slow_red{background:#df8538;} .b_green2 {background:#63c360;} .b_red {background:#d60308;} .b_w{ background:#fff !important;} From 295939143861f35f9d6999171470e528b10e9f35 Mon Sep 17 00:00:00 2001 From: cxt Date: Fri, 24 Jun 2016 11:20:48 +0800 Subject: [PATCH 108/216] =?UTF-8?q?=E4=BD=9C=E4=B8=9A=E5=88=97=E8=A1=A8?= =?UTF-8?q?=EF=BC=9A=E6=B2=A1=E6=9C=89=E4=BD=9C=E4=B8=9A=E6=97=B6=E4=B8=8B?= =?UTF-8?q?=E6=8B=89=E6=A1=86=E8=A2=AB=E7=82=B9=E5=87=BB=E5=90=8E=EF=BC=8C?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E4=B8=80=E6=9D=A1=E8=AE=B0=E5=BD=95=EF=BC=9A?= =?UTF-8?q?=E7=9B=AE=E5=89=8D=E5=B0=9A=E6=9C=AA=E5=8F=91=E5=B8=83=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/homework_common/index.html.erb | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/app/views/homework_common/index.html.erb b/app/views/homework_common/index.html.erb index 35f4658f9..167ae98f0 100644 --- a/app/views/homework_common/index.html.erb +++ b/app/views/homework_common/index.html.erb @@ -45,11 +45,15 @@
  • 作业
      - <% @homework_commons.each_with_index do |homework_common,index |%> -
    • - <%= link_to "作业#{@homework_commons.count - index}:#{homework_common.name}",student_work_index_path(:homework => homework_common.id),:target=>"_blank"%> -
    • - <% end%> + <% if @homework_commons.empty? %> +
    • 目前尚未发布作业
    • + <% else %> + <% @homework_commons.each_with_index do |homework_common,index |%> +
    • + <%= link_to "作业#{@homework_commons.count - index}:#{homework_common.name}",student_work_index_path(:homework => homework_common.id),:target=>"_blank"%> +
    • + <% end%> + <% end %>
  • From e818b5fb073f4c1ef02b9d321e8a05dee8aa8d3b Mon Sep 17 00:00:00 2001 From: yuanke <249218296@qq.com> Date: Fri, 24 Jun 2016 11:22:43 +0800 Subject: [PATCH 109/216] =?UTF-8?q?=E6=97=A7=E7=9A=84=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=8E=BB=E6=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/account/register.html.erb | 127 ---------------------------- config/routes.rb | 2 +- 2 files changed, 1 insertion(+), 128 deletions(-) delete mode 100644 app/views/account/register.html.erb diff --git a/app/views/account/register.html.erb b/app/views/account/register.html.erb deleted file mode 100644 index 0bebfdf5f..000000000 --- a/app/views/account/register.html.erb +++ /dev/null @@ -1,127 +0,0 @@ -<% @nav_dispaly_home_path_label = 1 - @nav_dispaly_main_course_label = 1 - @nav_dispaly_main_project_label = 1 - @nav_dispaly_main_contest_label = 1 %> -<% @nav_dispaly_forum_label = 1%> - - - - - - -

    <%= l(:label_register) %> <%= link_to l(:label_login_with_open_id_option), signin_url if Setting.openid? %>

    - -<%= labelled_form_for @user, :url => register_path do |f| %> - <%= error_messages_for 'user' %> -
    - - <% if @user.auth_source_id.nil? %> -

    <%= f.text_field :login, :size => 25, :required => true %> - <%= l(:label_max_number) %> -

    -

    <%= f.password_field :password, :size => 25, :required => true %> - <%= l(:text_caracters_minimum, :count => Setting.password_min_length) %> -

    -

    <%= f.password_field :password_confirmation, :size => 25, :required => true %>

    - <% end %> - -

    - <%= f.text_field :mail,:size => 25, :required => true %> - -

    -

    - -

    <%= "#{l(:label_mail_attention)} " %>

    -

    <%= "#{l(:label_mail_attention1)} " %>

    -
    -

    - - - - -
    - -

    - - - - -
    <%= submit_tag l(:button_submit) %>
    -

    -<% end %> -<% if Setting.openid? %> -

    <%= f.text_field :identity_url %>

    -<% end %> -<% @user.custom_field_values.select { |v| v.editable? || v.required? }.each do |value| %> -

    <%= custom_field_tag_with_label :user, value %>

    -<% end %> -
    -<% password_min_length = Setting.password_min_length %> - \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 6e720ffba..8d822aafc 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -484,7 +484,7 @@ RedmineApp::Application.routes.draw do match 'logout', :to => 'account#logout', :as => 'signout', :via => [:get, :post] match 'agreement',:to => 'account#agreement',:as => 'agreement',:via=>[:get] match 'about_us',:to=>'account#about_us',:as=>'about_us',:via=>[:get] - match 'account/register', :via => [:get, :post], :as => 'register' + match 'account/register',:to=>'account#register', :via => [:get, :post], :as => 'register' match 'account/lost_password', :via => [:get, :post], :as => 'lost_password' match 'account/activate', :via => :get match 'account/valid_ajax', :via => :get From e4e0e7b16625850bbd9f7261f195887c0d964f04 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Jun 2016 12:17:05 +0800 Subject: [PATCH 110/216] helper --- app/helpers/quality_analysis_helper.rb | 4 ---- app/views/quality_analysis/_hightchars.html.erb | 4 ++-- app/views/quality_analysis/_show.html.erb | 8 ++++---- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/app/helpers/quality_analysis_helper.rb b/app/helpers/quality_analysis_helper.rb index 8356c476b..e13882f6f 100644 --- a/app/helpers/quality_analysis_helper.rb +++ b/app/helpers/quality_analysis_helper.rb @@ -18,7 +18,6 @@ module QualityAnalysisHelper arr << "很差" arr << "b_red" end - arr.first end def complexity_status val @@ -33,7 +32,6 @@ module QualityAnalysisHelper arr << "很高" arr << "b_red" end - arr.first end def duplicated_lines_density_status val @@ -48,7 +46,6 @@ module QualityAnalysisHelper arr << "很高" arr << "b_red" end - arr.first end def comment_lines_density_status val @@ -63,7 +60,6 @@ module QualityAnalysisHelper arr << "较高" arr << "b_red" end - arr.first end def score_sqale_rating val diff --git a/app/views/quality_analysis/_hightchars.html.erb b/app/views/quality_analysis/_hightchars.html.erb index 620e2d4fb..c4d884287 100644 --- a/app/views/quality_analysis/_hightchars.html.erb +++ b/app/views/quality_analysis/_hightchars.html.erb @@ -436,11 +436,11 @@ plotBands: [{ from: 0, to: 20, - color: '#55BF3B' // green + color: '#DDDF0D' // green }, { from: 21, to: 50, - color: '#DDDF0D' // red + color: '#55BF3B' // red }, { from: 51, to: 100, diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index 86ff6782b..f44bb9325 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -12,24 +12,24 @@

    质量等级

    -

    <%= @complexity["msr"][9]["frmt_val"] %>} borderRadius"><%= sqale_rating_status(@complexity["msr"][9]["val"]) %>

    +

    <%= @complexity["msr"][9]["frmt_val"] %> borderRadius"><%= sqale_rating_status(@complexity["msr"][9]["val"])[0] %>

    复杂度

    -

    <%= @complexity["msr"][6]["val"] %><%= complexity_status(@complexity["msr"][6]["val"]) %>

    +

    <%= @complexity["msr"][6]["val"] %> borderRadius"><%= complexity_status(@complexity["msr"][6]["val"])[0] %>

    重复

    -

    <%= @complexity["msr"][7]["frmt_val"] %><%= duplicated_lines_density_status(@complexity["msr"][7]["val"]) %>

    +

    <%= @complexity["msr"][7]["frmt_val"] %> borderRadius"><%= duplicated_lines_density_status(@complexity["msr"][7]["val"])[0] %>

    注释率

    -

    <%= @complexity["msr"][5]["frmt_val"] %><%=comment_lines_density_status(@complexity["msr"][5]["val"]) %>

    +

    <%= @complexity["msr"][5]["frmt_val"] %> borderRadius"><%=comment_lines_density_status(@complexity["msr"][5]["val"])[0] %>

    From de80403e8dc9aaeb23840ae3475b2b9eca25979f Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Jun 2016 12:38:39 +0800 Subject: [PATCH 111/216] add address to config --- app/controllers/quality_analysis_controller.rb | 10 ++++++---- app/views/quality_analysis/_hightchars.html.erb | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index 99d63dfe3..ac31ee198 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -19,6 +19,7 @@ class QualityAnalysisController < ApplicationController #@client.exists?(job_name) @g = Gitlab.client gitlab_address = Redmine::Configuration['gitlab_address'] + jenkins_address = Redmine::Configuration['jenkins_address'] user_name = User.find(params[:user_id]).try(:login) branch = params[:branch].nil? ? "master" : params[:branch] language = params[:language] @@ -44,7 +45,7 @@ class QualityAnalysisController < ApplicationController @client = @client.job.create("#{user_name}_#{identifier}", @doc.to_xml) # relace gitlab hook # genkins address - @g.add_project_hook(@project.gpid,"http://123.59.135.93:8890/project/#{user_name}_#{identifier}") + @g.add_project_hook(@project.gpid, (jenkins_address + "/project/#{user_name}_#{identifier}")) if qa.nil? QualityAnalysis.create(:project_id => @project.id, :author_login => user_name, :rep_identifier => identifier, :version => version) else @@ -53,16 +54,17 @@ class QualityAnalysisController < ApplicationController end def index + @sonar_address = Redmine::Configuration['sonar_address'] if params[:resource_id].nil? @name_flag = true - projects_date = open("http://123.59.135.93:8891/api/projects/index").read + projects_date = open(sonar_address + "/api/projects/index").read @results = JSON.parse(projects_date) else @name_flag = false resource_id = params[:resource_id] - complexity_date = open("http://123.59.135.93:8891/api/resources/index?resource=#{resource_id}&depth=0&metrics=sqale_rating,function_complexity,duplicated_lines_density,comment_lines_density,sqale_index,lines,file_line,files,functions,classes,directories").read + complexity_date = open(@sonar_address + "/api/resources/index?resource=#{resource_id}&depth=0&metrics=sqale_rating,function_complexity,duplicated_lines_density,comment_lines_density,sqale_index,lines,file_line,files,functions,classes,directories").read @complexity =JSON.parse(complexity_date).first - issue_date = open("http://123.59.135.93:8891/api/resources/index?resource=#{resource_id}&depth=0&metrics=blocker_violations,critical_violations,major_violations,minor_violations,info_violations,violations").read + issue_date = open(@sonar_address + "/api/resources/index?resource=#{resource_id}&depth=0&metrics=blocker_violations,critical_violations,major_violations,minor_violations,info_violations,violations").read @sonar_issues = JSON.parse(issue_date).first end end diff --git a/app/views/quality_analysis/_hightchars.html.erb b/app/views/quality_analysis/_hightchars.html.erb index c4d884287..6e63bcecd 100644 --- a/app/views/quality_analysis/_hightchars.html.erb +++ b/app/views/quality_analysis/_hightchars.html.erb @@ -209,7 +209,7 @@ }, series: [{ name: '复杂度', - data: [<%= @complexity["msr"][5]["val"] %>] + data: [<%= @complexity["msr"][6]["val"] %>] // tooltip: { // valueSuffix: ' km/h' // } From 128f6721be7117513de59ec92075487b825de766 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Jun 2016 13:00:02 +0800 Subject: [PATCH 112/216] stoped the zhizhen --- .../quality_analysis_controller.rb | 6 +- .../quality_analysis/_hightchars.html.erb | 120 +++++++++--------- app/views/quality_analysis/_show.html.erb | 93 +++++++------- 3 files changed, 110 insertions(+), 109 deletions(-) diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index ac31ee198..152335dd8 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -61,10 +61,10 @@ class QualityAnalysisController < ApplicationController @results = JSON.parse(projects_date) else @name_flag = false - resource_id = params[:resource_id] - complexity_date = open(@sonar_address + "/api/resources/index?resource=#{resource_id}&depth=0&metrics=sqale_rating,function_complexity,duplicated_lines_density,comment_lines_density,sqale_index,lines,file_line,files,functions,classes,directories").read + @resource_id = params[:resource_id] + complexity_date = open(@sonar_address + "/api/resources/index?resource=#{@resource_id}&depth=0&metrics=sqale_rating,function_complexity,duplicated_lines_density,comment_lines_density,sqale_index,lines,file_line,files,functions,classes,directories").read @complexity =JSON.parse(complexity_date).first - issue_date = open(@sonar_address + "/api/resources/index?resource=#{resource_id}&depth=0&metrics=blocker_violations,critical_violations,major_violations,minor_violations,info_violations,violations").read + issue_date = open(@sonar_address + "/api/resources/index?resource=#{@resource_id}&depth=0&metrics=blocker_violations,critical_violations,major_violations,minor_violations,info_violations,violations").read @sonar_issues = JSON.parse(issue_date).first end end diff --git a/app/views/quality_analysis/_hightchars.html.erb b/app/views/quality_analysis/_hightchars.html.erb index 6e63bcecd..fb60eaed3 100644 --- a/app/views/quality_analysis/_hightchars.html.erb +++ b/app/views/quality_analysis/_hightchars.html.erb @@ -103,21 +103,21 @@ }, // Add some life function (chart) { - if (!chart.renderer.forExport) { - setInterval(function () { - var point = chart.series[0].points[0], - newVal, - inc = Math.round((Math.random() - 0.5) * 20); - - newVal = point.y + inc; - if (newVal < 0 || newVal > 200) { - newVal = point.y - inc; - } - - point.update(newVal); - - }, 3000); - } +// if (!chart.renderer.forExport) { +// setInterval(function () { +// var point = chart.series[0].points[0], +// newVal, +// inc = Math.round((Math.random() - 0.5) * 20); +// +// newVal = point.y + inc; +// if (newVal < 0 || newVal > 200) { +// newVal = point.y - inc; +// } +// +// point.update(newVal); +// +// }, 3000); +// } }); }); @@ -218,21 +218,21 @@ }, // Add some life function (chart) { - if (!chart.renderer.forExport) { - setInterval(function () { - var point = chart.series[0].points[0], - newVal, - inc = Math.round((Math.random() - 0.5) * 20); - - newVal = point.y + inc; - if (newVal < 0 || newVal > 200) { - newVal = point.y - inc; - } - - point.update(newVal); - - }, 3000); - } +// if (!chart.renderer.forExport) { +// setInterval(function () { +// var point = chart.series[0].points[0], +//// newVal, +//// inc = Math.round((Math.random() - 0.5) * 20); +// +//// newVal = point.y + inc; +//// if (newVal < 0 || newVal > 200) { +//// newVal = point.y - inc; +//// } +// +//// point.update(newVal); +// +// }, 3000); +// } }); }); @@ -338,21 +338,21 @@ }, // Add some life function (chart) { - if (!chart.renderer.forExport) { - setInterval(function () { - var point = chart.series[0].points[0], - newVal, - inc = Math.round((Math.random() - 0.5) * 20); - - newVal = point.y + inc; - if (newVal < 0 || newVal > 200) { - newVal = point.y - inc; - } - - point.update(newVal); - - }, 3000); - } +// if (!chart.renderer.forExport) { +// setInterval(function () { +// var point = chart.series[0].points[0], +// newVal, +// inc = Math.round((Math.random() - 0.5) * 20); +// +// newVal = point.y + inc; +// if (newVal < 0 || newVal > 200) { +// newVal = point.y - inc; +// } +// +// point.update(newVal); +// +// }, 3000); +// } }); }); @@ -463,21 +463,21 @@ }, // Add some life function (chart) { - if (!chart.renderer.forExport) { - setInterval(function () { - var point = chart.series[0].points[0], - newVal, - inc = Math.round((Math.random() - 0.5) * 20); - - newVal = point.y + inc; - if (newVal < 0 || newVal > 200) { - newVal = point.y - inc; - } - - point.update(newVal); - - }, 3000); - } +// if (!chart.renderer.forExport) { +// setInterval(function () { +// var point = chart.series[0].points[0], +// newVal, +// inc = Math.round((Math.random() - 0.5) * 20); +// +// newVal = point.y + inc; +// if (newVal < 0 || newVal > 200) { +// newVal = point.y - inc; +// } +// +// point.update(newVal); +// +// }, 3000); +// } }); }); \ No newline at end of file diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index f44bb9325..b49cbb03f 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -1,7 +1,7 @@ <%= javascript_include_tag 'highcharts','highcharts-more' %> <%= render :partial => "hightchars" %>
    -

    SonarQube质量分析

    +

    质量分析

    @@ -35,8 +35,9 @@
    质量等级<%= score_sqale_rating(@complexity["msr"][9]["val"]) %>/5分可定性评价为:质量<%= sqale_rating_status(@complexity["msr"][9]["val"])[0] %>
    -
    技术债务<%= @complexity["msr"][8]["frmt_val"] %>查看详情
    -
    质量问题<%= @sonar_issues["msr"][0]["frmt_val"] %>问题分类如下:
    +
    技术债务<%= @complexity["msr"][8]["frmt_val"] %>查看详情
    +
    质量问题 + <%= @sonar_issues["msr"][0]["frmt_val"] %>问题分类如下:
    阻断<%= @sonar_issues["msr"][1]["frmt_val"] %>%;">
    严重<%= @sonar_issues["msr"][2]["frmt_val"] %>%;">
    @@ -68,46 +69,46 @@

    <%= @complexity["msr"][4]["frmt_val"] %>

    -
    贡献统计
    -
    -
      -
    •  
    • -
    • 代码行数
    • -
    • 引入质量问题数
    • -
    • 引入质量问题数/代码行数
    • -
      -
    -
      -
    • -
      - -
      -
    • -
    • 18340
    • -
    • 230
    • -
    • .012540
    • -
      -
    -
      -
    • -
      - -
      -
    • -
    • 834
    • -
    • 34
    • -
    • .04077
    • -
      -
    -
      -
    • -
      - -
      -
    • -
    • 134
    • -
    • 10
    • -
    • .07462
    • -
      -
    -
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From d34898172192365390bef7e0cbafef341d47204e Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Fri, 24 Jun 2016 13:29:36 +0800 Subject: [PATCH 113/216] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E9=82=80=E8=AF=B7?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/mobile/entities/user.rb | 7 ++++ app/helpers/courses_helper.rb | 34 ++++++++----------- app/models/course.rb | 5 +-- app/services/courses_service.rb | 7 ++-- ...20160624032138_add_index_to_invite_code.rb | 6 ++++ db/schema.rb | 5 ++- public/assets/wechat/myclass.html | 11 ++---- .../javascripts/wechat/controllers/myclass.js | 7 ++++ public/javascripts/wechat/others/filter.js | 11 +++++- public/stylesheets/weui/weixin.css | 5 +-- 10 files changed, 63 insertions(+), 35 deletions(-) create mode 100644 db/migrate/20160624032138_add_index_to_invite_code.rb diff --git a/app/api/mobile/entities/user.rb b/app/api/mobile/entities/user.rb index 8c6a839b3..2eb20f0db 100644 --- a/app/api/mobile/entities/user.rb +++ b/app/api/mobile/entities/user.rb @@ -26,6 +26,8 @@ module Mobile u.nil? || u.user_extensions.nil? ? "" : u.user_extensions.student_id when :realname u.nil? ? "" : get_user_realname(u) + when :name + u.nil? ? "" : u.show_name end end end @@ -57,6 +59,11 @@ module Mobile user_expose :student_num # 活跃值 user_expose :active_count + + user_expose :role_name + + user_expose :name + end end diff --git a/app/helpers/courses_helper.rb b/app/helpers/courses_helper.rb index c10652c6f..47d343e8f 100644 --- a/app/helpers/courses_helper.rb +++ b/app/helpers/courses_helper.rb @@ -270,13 +270,22 @@ module CoursesHelper # ===================================================================================== # return people list + def searchPeopleByName(course, role_name) + course.members.select{|m| + m.roles.any?{|r|r.name == role_name} + } + end + def searchTeacherAndAssistant project - #searchPeopleByRoles(project, TeacherRoles) - members = [] - project.members.includes(:user).each do |m| - members << m if m && m.user && m.user.allowed_to?(:as_teacher,project) - end - members + searchPeopleByName(project, 'Manager').concat( + searchPeopleByName(project, 'Teacher') + ).concat( + searchPeopleByName(project, 'TeachingAsistant') + ) + end + + def searchStudent project + searchPeopleByName(project, 'Student') end def TeacherAndAssistantCount course @@ -293,19 +302,6 @@ module CoursesHelper members end - def searchStudent project - #searchPeopleByRoles(project, StudentRoles) - members = [] - project.members.each do |m| - if m && m.user && m.user.allowed_to?(:as_student,project) - members << m - end - end - members - end - - - def searchStudent_by_name project, name #searchPeopleByRoles(project, StudentRoles) members = [] diff --git a/app/models/course.rb b/app/models/course.rb index c9ef010e6..d0266b381 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -457,8 +457,9 @@ class Course < ActiveRecord::Base CODES = %W(2 3 4 5 6 7 8 9 A B C D E F G H J K L N M O P Q R S T U V W X Y Z) def generate_invite_code code = invite_code - if !invite_code || invite_code.size <6 - self.invite_code = CODES.sample(6).join + if !invite_code || invite_code.size <5 + self.invite_code = CODES.sample(5).join + return generate_invite_code if Course.where(invite_code: invite_code).present? save! && reload code = invite_code end diff --git a/app/services/courses_service.rb b/app/services/courses_service.rb index 4d9231287..0eb699459 100644 --- a/app/services/courses_service.rb +++ b/app/services/courses_service.rb @@ -68,7 +68,6 @@ class CoursesService if current_user.nil? || !(current_user.admin? || c.is_public == 1 || (c.is_public == 0 && current_user.member_of_course?(c))) raise '403' end - @teachers= searchTeacherAndAssistant(c) #@canShowCode = isCourseTeacher(User.current.id,course) && params[:role] != '1' case params[:role] when '1' @@ -87,7 +86,11 @@ class CoursesService gender = m.user.user_extensions.gender.nil? ? 0 : m.user.user_extensions.gender work_unit = get_user_work_unit m.user location = get_user_location m.user - users << {:id => m.user.id, :img_url => img_url, :nickname => m.user.login, :gender => gender, :work_unit => work_unit, :mail => m.user.mail, :location => location, :brief_introduction => m.user.user_extensions.brief_introduction,:realname=>m.user.realname} + users << {:id => m.user.id, :img_url => img_url, :nickname => m.user.login, :gender => gender, + :work_unit => work_unit, :mail => m.user.mail, :location => location, + role_name: m.roles.first.name, + name: m.user.show_name, + :brief_introduction => m.user.user_extensions.brief_introduction,:realname=>m.user.realname} end users end diff --git a/db/migrate/20160624032138_add_index_to_invite_code.rb b/db/migrate/20160624032138_add_index_to_invite_code.rb new file mode 100644 index 000000000..420951874 --- /dev/null +++ b/db/migrate/20160624032138_add_index_to_invite_code.rb @@ -0,0 +1,6 @@ +class AddIndexToInviteCode < ActiveRecord::Migration + def change + add_column :courses, :qrcode, :string + add_index :courses, :invite_code, unique: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 820c6a035..9db65aca0 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20160614072229) do +ActiveRecord::Schema.define(:version => 20160624032138) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -551,8 +551,11 @@ ActiveRecord::Schema.define(:version => 20160614072229) do t.integer "is_copy", :default => 0 t.integer "visits", :default => 0 t.string "invite_code" + t.string "qrcode" end + add_index "courses", ["invite_code"], :name => "index_courses_on_invite_code", :unique => true + create_table "custom_fields", :force => true do |t| t.string "type", :limit => 30, :default => "", :null => false t.string "name", :limit => 30, :default => "", :null => false diff --git a/public/assets/wechat/myclass.html b/public/assets/wechat/myclass.html index f12364130..30a8b9083 100644 --- a/public/assets/wechat/myclass.html +++ b/public/assets/wechat/myclass.html @@ -15,22 +15,17 @@
    -
    资源名称001
    -
    资源名称002
    -
    资源名称003
    -
    资源名称004
    -
    资源名称005
    -
    资源名称006
    +
    {{r.filename}}
    授课老师
    - {{teacher.realname}}教辅 + {{teacher.name}}{{teacher.role_name|identify}}
    我的同学
    - {{student.realname}} + {{student.name}}
    diff --git a/public/javascripts/wechat/controllers/myclass.js b/public/javascripts/wechat/controllers/myclass.js index bf864ab88..b689e0f55 100644 --- a/public/javascripts/wechat/controllers/myclass.js +++ b/public/javascripts/wechat/controllers/myclass.js @@ -22,10 +22,17 @@ app.controller('MyClassController', ['$scope', 'config','$http', 'auth','$locati vm.course = {}; vm.students = []; vm.teachers = []; + vm.resources = []; vm.invite = function(){ $location.path("/invite_code").search({id: courseid}); }; + + $http.post(config.apiUrl + "courses/"+courseid+"/attachments", + {token: auth.token(), name: ''} + ).then(function(response){ + vm.resources = response.data.data; + }); $http.get(config.apiUrl+ 'courses/'+courseid+"?token="+auth.token()).then( function(response){ diff --git a/public/javascripts/wechat/others/filter.js b/public/javascripts/wechat/others/filter.js index dcb8e9e6a..96007958d 100644 --- a/public/javascripts/wechat/others/filter.js +++ b/public/javascripts/wechat/others/filter.js @@ -2,4 +2,13 @@ app.filter('safeHtml', ['$sce',function ($sce) { return function (input) { return $sce.trustAsHtml(input); } -}]); \ No newline at end of file +}]); + +app.filter('identify', function () { + return function(input){ + if (input == 'TeachingAsistant'){ + return '教辅' + } + return ''; + } +}) \ No newline at end of file diff --git a/public/stylesheets/weui/weixin.css b/public/stylesheets/weui/weixin.css index 12e11b5fa..8391b1083 100644 --- a/public/stylesheets/weui/weixin.css +++ b/public/stylesheets/weui/weixin.css @@ -4,6 +4,7 @@ /*基本样式*/ body,table,input,textarea,select,button { font-family: "微软雅黑","宋体","Helvetica Neue", Helvetica, Arial, sans-serif;} body, ul, h1,h2,h3,h4,h5,p,pre,input {padding:0px; margin:0px;} +body{background-color: #EFEFF4;} ul li {list-style:none;} img {max-width:100%;} blockquote {border:1px solid #d4d4d4; padding: 0.6em; margin-left: 1.4em; margin-right: 0.4em; border-radius: 4px; font-family: "Microsoft YaHei"; background-size: 100% 100%; margin-top:5px;} @@ -125,8 +126,8 @@ a.underline {text-decoration:underline;} /*20160613邀请码样式*/ .qr-code-wrap {width:100%; padding:40px 0; background-color:#3b94d6;} -.qr-code-box {width:225px; height:332px; background-color:#fff; border-radius:3px; margin:0 auto;} -.share-class-name {font-size:18px; color:#3b3b3b; text-align:center; padding:12px; border-bottom:1px solid #cccccc; overflow:hidden; white-space:nowrap; text-overflow:ellipsis;} +.qr-code-box {width:225px; background-color:#fff; border-radius:3px; margin:0 auto;} +.share-class-name {font-size:18px; color:#3b3b3b; text-align:center; padding:12px; border-bottom:1px solid #cccccc;} .qr-img-wrap {width:100%; border-bottom:1px dashed #ccc;} .qr-code-img {margin:36px auto; display:block;} .invitation-code-wrap {text-align:center; font-size:18px; color:#3b3b3b; padding:16px;} From e21f4e0b4dda91f1efab82d73b283b2e58272344 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Fri, 24 Jun 2016 13:52:11 +0800 Subject: [PATCH 114/216] merge --- public/javascripts/wechat/app.js | 439 +------------------------------ 1 file changed, 1 insertion(+), 438 deletions(-) diff --git a/public/javascripts/wechat/app.js b/public/javascripts/wechat/app.js index 5c0d7d5bf..00d6bf3bc 100644 --- a/public/javascripts/wechat/app.js +++ b/public/javascripts/wechat/app.js @@ -1,66 +1,9 @@ var app = angular.module('wechat', ['ngRoute']); -<<<<<<< HEAD app.constant('config', { rootPath: '/assets/wechat/', rootUrl: '/', apiUrl: '/api/v1/' -======= -if(debug===true){ - //apiUrl = 'http://localhost:3000/api/v1/'; - apiUrl = 'http://www.trustie.net/api/v1/'; -} - - -app.factory('auth', function($http,$routeParams, $q){ - var _openid = ''; - - if(typeof g_openid !== 'undefined'){ - _openid = g_openid; - } - - if(debug===true){ - _openid = "1"; //guange的帐号 - } - - var getOpenId = function() { - var deferred = $q.defer(); - if (typeof _openid !== 'undefined' && _openid.length > 0){ - deferred.resolve(_openid); - } else { - var code = $routeParams.code; - $http({ - url: '/wechat/get_open_id', - data: {code: code}, - method: 'POST' - }).then(function successCallback(response) { - _openid = response.data.openid; - deferred.resolve(_openid); - }, function errorCallback(response) { - deferred.reject(response); - }); - } - return deferred.promise; - }; - var openid = function(){ - return _openid; - }; - return {getOpenId: getOpenId, openid: openid}; -}); - - -app.factory('rms', function(){ - var _saveStorage = {}; - var save = function(key, value){ - _saveStorage[key] = value; - }; - - var get = function(key){ - return _saveStorage[key]; - }; - - return {save: save, get: get}; ->>>>>>> b17b92cc3ec7341ef1d1e2179be0de623605a725 }); @@ -73,394 +16,14 @@ app.run(['$rootScope', 'auth', '$location', '$routeParams', function($rootScope, $rootScope.$on('$routeChangeError', function(event, next, current){ -<<<<<<< HEAD if(next && next.templateUrl){ if(!next.templateUrl.endsWith("login.html") && !next.templateUrl.endsWith("reg.html")){ $location.path("/login"); -======= - $scope.decreasePraise = function(act){ - common.decreaseCommonPraise(act); - }; -}); - -app.factory('common', function($http, auth, $routeParams){ - var addCommonReply = function(id, type, data, cb){ - - if(!data.comment || data.comment.length<=0){ - return; - } - - var temp = data.comment.replace(/\n/g,'
    '); - - var userInfo = { - type: type, - content: temp, - openid: auth.openid() - }; - //回复按钮禁用 - data.disabled = true; - - $http({ - method: 'POST', - url: apiUrl+ "new_comment/"+id, - data: userInfo - }).then(function successCallback(response) { - //alert("提交成功"); - if(typeof cb === 'function'){ - cb(); ->>>>>>> b17b92cc3ec7341ef1d1e2179be0de623605a725 } } -<<<<<<< HEAD }); $rootScope.$on('$routeChangeStart', function(event, next, current){ }); } -]); -======= - ); - - $scope.addIssueReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'Issue', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - //数据提交完成,回复按钮启用 - data.disabled = false; - }); - - }; - - $scope.addPraise = function(act){ - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - common.decreaseCommonPraise(act); - }; -}); - -app.controller('HomeworkController', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - - var loadData = function(id){ - common.loadCommonData(id, 'whomeworks').then(function successCallback(response) { - console.log(response.data); - $scope.homework = response.data.data; - }, function errorCallback(response) { - }); - }; - - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); - } - ); - - $scope.addHomeworkReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'HomeworkCommon', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - //数据提交完成,回复按钮启用 - data.disabled = false; - }); - }; - - $scope.addPraise = function(act){ - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - common.decreaseCommonPraise(act); - }; -}); - -app.controller('CourseNoticeController', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - - var loadData = function(id){ - common.loadCommonData(id, 'newss').then(function successCallback(response) { - console.log(response.data); - $scope.news = response.data.data; - }, function errorCallback(response) { - }); - }; - - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); - } - ); - - $scope.addNoticeReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'News', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - //数据提交完成,回复按钮启用 - data.disabled = false; - }); - }; - - $scope.addPraise = function(act){ - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - common.decreaseCommonPraise(act); - }; -}); - -app.controller('DiscussionController', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - - var loadData = function(id){ - common.loadCommonData(id, 'messages').then(function successCallback(response) { - console.log(response.data); - $scope.discussion = response.data.data; - }, function errorCallback(response) { - }); - }; - - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); - } - ); - - $scope.addDiscussionReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'Message', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - //数据提交完成,回复按钮启用 - data.disabled = false; - }); - }; - - $scope.addPraise = function(act){ - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - common.decreaseCommonPraise(act); - }; -}); - -app.controller('JournalsController', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - - var loadData = function(id){ - common.loadCommonData(id, 'journal_for_messages').then(function successCallback(response) { - console.log(response.data); - $scope.message = response.data.data; - }, function errorCallback(response) { - }); - }; - - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); - } - ); - - $scope.addJournalReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'JournalsForMessage', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - //数据提交完成,回复按钮启用 - data.disabled = false; - }); - }; - - $scope.addPraise = function(act){ - console.log(act); - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - console.log(act); - common.decreaseCommonPraise(act); - }; -}); - -app.controller('BlogController', function($scope, $http, $routeParams, auth, common){ - $scope.formData = {comment: ''}; - - var loadData = function(id){ - common.loadCommonData(id, 'blog_comments').then(function successCallback(response) { - console.log(response.data); - $scope.blog = response.data.data; - }, function errorCallback(response) { - }); - }; - - auth.getOpenId().then( - function successCallback(response){ - loadData($routeParams.id); - }, function errorCallback(response) { - alert("获取openid出错:"+response); - } - ); - - $scope.addBlogReply = function(data){ - console.log(data.comment); - common.addCommonReply($routeParams.id, 'BlogComment', data, function(){ - $scope.formData = {comment: ''}; - loadData($routeParams.id); - //数据提交完成,回复按钮启用 - data.disabled = false; - }); - }; - - $scope.addPraise = function(act){ - console.log(act); - common.addCommonPraise(act); - }; - - $scope.decreasePraise = function(act){ - console.log(act); - common.decreaseCommonPraise(act); - }; -}); - -app.filter('safeHtml', function ($sce) { - return function (input) { - return $sce.trustAsHtml(input); - } -}); - -//app.directive('textAutoHeight', function($timeout){ -// return { -// restrict: 'A', -// scope: {}, -// link: function(scope, element, attr){ -// scope.text = '点击展开'; -// $timeout(function(){ -// var e = element.parent().children().eq(5); -// var height = e[0].scrollHeight; -// if(height>90){ -// element.css('display', 'block'); -// element.on('click', function(){ -// if(element.text() == "点击展开"){ -// e.css("height", height+'px'); -// element.text("点击隐藏"); -// } else { -// e.css("height", '90px'); -// element.text("点击展开"); -// } -// -// }); -// } -// }, false); -// -// } -// } -//}); - -app.directive('inputAuto',function(){ - return{ - restrict: 'A', - scope: {}, - link: function(scope, element){ - var copyContainer = element.parent().children().eq(0); - var sendButton = element.parent().next(); - element.on('input',function(){ - console.log(sendButton); - copyContainer.html(element[0].value); - var textHeight = copyContainer[0].scrollHeight; - element.css('height', textHeight + 'px'); - }); - sendButton.on('click',function(){ - element.css('height','28px'); - }); - } - } -}); - -app.directive('loadingSpinner', ['$http', function ($http) { - return { - restrict: 'A', - replace: true, - template: '
    加载中...
    ', - }; -}]); - -app.config(['$routeProvider',"$httpProvider", "$locationProvider",function ($routeProvider, $httpProvider, $locationProvider) { - var rootPath = '/assets/wechat/' - //$locationProvider.html5Mode(true); - $routeProvider - .when('/activites', { - templateUrl: rootPath + 'activities.html', - controller: 'ActivityController' - }) - .when('/issues/:id', { - templateUrl: rootPath + 'issue_detail.html', - controller: 'IssueController' - }) - .when('/project_discussion/:id', { - templateUrl: rootPath + 'project_discussion.html', - controller: 'DiscussionController' - }) - .when('/homework/:id', { - templateUrl: rootPath + 'homework_detail.html', - controller: 'HomeworkController' - }) - .when('/course_notice/:id', { - templateUrl: rootPath + 'course_notice.html', - controller: 'CourseNoticeController' - }) - .when('/course_discussion/:id', { - templateUrl: rootPath + 'course_discussion.html', - controller: 'DiscussionController' - }) - .when('/journal_for_message/:id', { - templateUrl: rootPath + 'jour_message_detail.html', - controller: 'JournalsController' - }) - .when('/blog_comment/:id', { - templateUrl: rootPath + 'blog_detail.html', - controller: 'BlogController' - }) - .otherwise({ - redirectTo: '/activites' - }); - - //监听异步请求,实现加载中显隐标记 - $httpProvider.interceptors.push(function ($q, $rootScope) { - if ($rootScope.activeCalls == undefined) { - $rootScope.activeCalls = 0; - } - - return { - request: function (config) { - $rootScope.activeCalls += 1; - return config; - }, - requestError: function (rejection) { - $rootScope.activeCalls -= 1; - return rejection; - }, - response: function (response) { - $rootScope.activeCalls -= 1; - return response; - }, - responseError: function (rejection) { - $rootScope.activeCalls -= 1; - return rejection; - } - }; - }); -}]); ->>>>>>> b17b92cc3ec7341ef1d1e2179be0de623605a725 +]); \ No newline at end of file From 06fe02890fb8ba2a522d7baea010b681b2919c31 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Jun 2016 14:59:17 +0800 Subject: [PATCH 115/216] index for sonar result --- .../quality_analysis_controller.rb | 13 ++++---- app/models/quality_analysis.rb | 2 +- .../projects/_development_group.html.erb | 4 +++ .../quality_analysis/_result_list.html.erb | 30 ++++++++++--------- .../repositories/_quality_analysis.html.erb | 2 +- app/views/repositories/show.html.erb | 8 +++-- ...24054614_add_column_to_quality_analyses.rb | 6 ++++ ...4055127_add_languae_to_quality_analyses.rb | 5 ++++ db/schema.rb | 5 +++- 9 files changed, 49 insertions(+), 26 deletions(-) create mode 100644 db/migrate/20160624054614_add_column_to_quality_analyses.rb create mode 100644 db/migrate/20160624055127_add_languae_to_quality_analyses.rb diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index 152335dd8..45d5a0ebf 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -25,8 +25,8 @@ class QualityAnalysisController < ApplicationController language = params[:language] path = params[:path] identifier = params[:identifier] - qa = QualityAnalysis.where(:project_id => @project.id).first - version = qa.sonar_version + 1 + qa = QualityAnalysis.where(:project_id => @project.id, :author_login => user_name).first + version = qa.nil? ? 1 : qa.sonar_version + 1 properties = "sonar.projectKey=#{user_name}:#{identifier} sonar.projectName=#{user_name}:#{identifier} sonar.projectVersion=#{version} @@ -47,9 +47,9 @@ class QualityAnalysisController < ApplicationController # genkins address @g.add_project_hook(@project.gpid, (jenkins_address + "/project/#{user_name}_#{identifier}")) if qa.nil? - QualityAnalysis.create(:project_id => @project.id, :author_login => user_name, :rep_identifier => identifier, :version => version) + QualityAnalysis.create(:project_id => @project.id, :author_login => user_name, :rep_identifier => identifier, :sonar_version => version, :path => path, :branch => branch, :language => language) else - qa.update_attribute(:version, version) + qa.update_attribute(:sonar_version, version) end end @@ -57,8 +57,9 @@ class QualityAnalysisController < ApplicationController @sonar_address = Redmine::Configuration['sonar_address'] if params[:resource_id].nil? @name_flag = true - projects_date = open(sonar_address + "/api/projects/index").read - @results = JSON.parse(projects_date) + @quality_analyses = QualityAnalysis.where(:project_id => @project.id) + # projects_date = open(@sonar_address + "/api/projects/index").read + # @results = JSON.parse(projects_date) else @name_flag = false @resource_id = params[:resource_id] diff --git a/app/models/quality_analysis.rb b/app/models/quality_analysis.rb index 09803467e..40a0d82e9 100644 --- a/app/models/quality_analysis.rb +++ b/app/models/quality_analysis.rb @@ -1,3 +1,3 @@ class QualityAnalysis < ActiveRecord::Base - attr_accessible :author_login, :project_id, :rep_identifier, :sonar_version + attr_accessible :author_login, :project_id, :rep_identifier, :sonar_version, :branch, :path, :rep_identifier end diff --git a/app/views/projects/_development_group.html.erb b/app/views/projects/_development_group.html.erb index 2c7d36fb5..298416fd1 100644 --- a/app/views/projects/_development_group.html.erb +++ b/app/views/projects/_development_group.html.erb @@ -56,6 +56,10 @@ <% end %>
    <% end %> + +
    <% if @quality_analyses.count >0 %> <% @quality_analyses.each do |qa| %> +
    +
    +

    分析结果

    +
    +
      +
    • +
    • VERSION
    • +
    • LOC
    • +
    • TECHNICAL DEBT
    • +
    • LAST ANALYSIS
    • +
      +
    + + + + +
      -
    • <%=link_to "#{qa.author_login}:#{qa.rep_identifier}", project_quality_analysis_path(:resource_id => qa.author_login+":"+qa.rep_identifier), :class => "analysis-result-name fl fontBlue2" %>
    • +
    • <%=link_to "#{qa.author_login}:#{qa.rep_identifier}", project_quality_analysis_path(:resource_id => qa.author_login+":"+qa.rep_identifier, :branch => qa.branch.nil? ? "master" : qa.branch), :class => "analysis-result-name fl fontBlue2" %>
    • 1.0
    • <%= qa.branch %>
    • <%= qa.language %>
    • -
    • <<%= qa.author_login %>/li> +
    • <%= qa.author_login %>
    <% end %> diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index 4fd1beb25..8f1cb8443 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -3,7 +3,7 @@

    质量分析

    - +
    当前分支:<%= params[:branch] %>
    项目代码质量分析报告
    概要信息
    From 6bc4dec6364d5b22331db1f68e0168bf26f75510 Mon Sep 17 00:00:00 2001 From: huang Date: Fri, 24 Jun 2016 17:46:21 +0800 Subject: [PATCH 137/216] =?UTF-8?q?=E5=88=97=E8=A1=A8=E7=95=8C=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quality_analysis/_result_list.html.erb | 51 +++++-------------- 1 file changed, 12 insertions(+), 39 deletions(-) diff --git a/app/views/quality_analysis/_result_list.html.erb b/app/views/quality_analysis/_result_list.html.erb index 00e5f1a27..73b5ebd3f 100644 --- a/app/views/quality_analysis/_result_list.html.erb +++ b/app/views/quality_analysis/_result_list.html.erb @@ -3,50 +3,23 @@
    <% if @quality_analyses.count >0 %> <% @quality_analyses.each do |qa| %> -
    -
    -

    分析结果

    -
    -
      -
    • -
    • VERSION
    • -
    • LOC
    • -
    • TECHNICAL DEBT
    • -
    • LAST ANALYSIS
    • -
      -
    - - - - +
    +

    分析结果

      -
    • <%=link_to "#{qa.author_login}:#{qa.rep_identifier}", project_quality_analysis_path(:resource_id => qa.author_login+":"+qa.rep_identifier, :branch => qa.branch.nil? ? "master" : qa.branch), :class => "analysis-result-name fl fontBlue2" %>
    • +
    • 名称
    • +
    • 版本
    • +
    • 分支
    • +
    • 语言
    • +
    • 时间
    • +
      +
    +
      +
    • <%=link_to "#{qa.author_login}:#{qa.rep_identifier}", project_quality_analysis_path(:resource_id => qa.author_login+":"+qa.rep_identifier, :branch => qa.branch.nil? ? "master" : qa.branch), :class => "analysis-result-name fl fontBlue2" %>
    • 1.0
    • <%= qa.branch %>
    • <%= qa.language %>
    • -
    • <%= qa.author_login %>
    • +
    • <%= format_time(qa.created_at) %>
    <% end %> From e5ad64831a22aa13fe566c75e96202efe86d2efb Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 24 Jun 2016 17:50:26 +0800 Subject: [PATCH 138/216] 0 --- app/views/quality_analysis/_result_list.html.erb | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/views/quality_analysis/_result_list.html.erb b/app/views/quality_analysis/_result_list.html.erb index 73b5ebd3f..a674d143b 100644 --- a/app/views/quality_analysis/_result_list.html.erb +++ b/app/views/quality_analysis/_result_list.html.erb @@ -3,9 +3,6 @@
    <% if @quality_analyses.count >0 %> <% @quality_analyses.each do |qa| %> -
    -

    分析结果

    -
    • 名称
    • 版本
    • From 4f342142e6f87caf7805d22bea5ae32fb4d2f184 Mon Sep 17 00:00:00 2001 From: cxt Date: Fri, 24 Jun 2016 17:58:50 +0800 Subject: [PATCH 139/216] =?UTF-8?q?=E7=BB=84=E7=BB=87=E6=96=87=E7=AB=A0?= =?UTF-8?q?=E7=9A=84=E5=B1=95=E5=BC=80=E6=9B=B4=E5=A4=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/_reply_banner.html.erb | 2 +- public/javascripts/application.js | 19 ++++++++++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/views/users/_reply_banner.html.erb b/app/views/users/_reply_banner.html.erb index 0d7e0b2bd..25175542f 100644 --- a/app/views/users/_reply_banner.html.erb +++ b/app/views/users/_reply_banner.html.erb @@ -10,7 +10,7 @@
      <%#= format_date(activity.updated_on) %>
      <%if count>3 %> diff --git a/public/javascripts/application.js b/public/javascripts/application.js index 06304a8b0..a04df39ac 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -1290,7 +1290,24 @@ function clear_data(k,mdu){ } } -function expand_reply(container, btnid, id, type, div_id) { +function expand_reply(container,btnid){ + var target = $(container).children(); + var btn = $(btnid); + if(btn.data('init')=='0'){ + btn.data('init',1); + btn.html('收起回复'); + target.show(); + }else{ + btn.data('init',0); + btn.html('展开更多'); + target.hide(); + target.eq(0).show(); + target.eq(1).show(); + target.eq(2).show(); + } +} + +function expand_all_reply(container, btnid, id, type, div_id) { var target = $(container); var btn = $(btnid); if (btn.data('init') == '0') { From 8d5501615c6d2d4c324c58399fdd44050f391056 Mon Sep 17 00:00:00 2001 From: cxt Date: Fri, 24 Jun 2016 18:09:18 +0800 Subject: [PATCH 140/216] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E7=9A=84=E6=A0=B7=E5=BC=8F=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/courses/_join_private_course.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/courses/_join_private_course.html.erb b/app/views/courses/_join_private_course.html.erb index 0799953bf..96c9a2b7d 100644 --- a/app/views/courses/_join_private_course.html.erb +++ b/app/views/courses/_join_private_course.html.erb @@ -49,7 +49,7 @@
      -

      快速进入课程通道

      +

      快速加入课程通道

      只要持有课程邀请码,就可以快速加入所在课程。课程页面搜索不到的私有课程只能从此通道进入哦!

      @@ -68,7 +68,7 @@
    • 课程邀请码是所在课程页面中显示的邀请码
    • - 身      份: + <% if User.current.logged? && User.current.extensions && User.current.extensions.identity == 0%>
    • -
      -
      {{r.filename}}
      + +
      +
      {{r.filename}}发送
      +

      暂无课件,
      + 请登录Trustie网站,在PC浏览器中上传课件。

      -
      +
      授课老师
      @@ -27,6 +34,22 @@
      {{student.name}}
      +
      + +
      +
      {{r.homework_name}}发送
      +

      暂无作业,
      + 请登录Trustie网站,在PC浏览器中上传作业。

      + +
      +
      {{r.exercise_name}}发送
      +

      暂无小测验,
      + 请登录Trustie网站,在PC浏览器中上传小测验。

      +
      + + + +
      diff --git a/public/javascripts/wechat/controllers/class_list.js b/public/javascripts/wechat/controllers/class_list.js index 73dffc9ec..81e485453 100644 --- a/public/javascripts/wechat/controllers/class_list.js +++ b/public/javascripts/wechat/controllers/class_list.js @@ -3,7 +3,7 @@ */ -app.controller('ClassListController', ['$scope','config','auth','$http', function($scope, config, auth, $http){ +app.controller('ClassListController', ['$scope','config','auth','$http','$location', function($scope, config, auth, $http, $location){ var vm = $scope; vm.courses = []; @@ -14,5 +14,10 @@ app.controller('ClassListController', ['$scope','config','auth','$http', functio } ); + vm.goClass = function(course_id){ + console.log(course_id); + $location.path("/myclass").search({id: course_id}); + } + }]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/myclass.js b/public/javascripts/wechat/controllers/myclass.js index b689e0f55..815f6aa54 100644 --- a/public/javascripts/wechat/controllers/myclass.js +++ b/public/javascripts/wechat/controllers/myclass.js @@ -3,52 +3,126 @@ app.controller('MyClassController', ['$scope', 'config','$http', 'auth','$locati var vm = $scope; var courseid = $routeParams.id; + + + var getUsers = function(){ + if(vm.teachers.length<=0){ + $http.get(config.apiUrl + 'courses/teachers?token='+auth.token()+'&course_id='+courseid).then( + function(response) { + console.log(response.data); + vm.teachers = response.data.data; + } + ) + } + + if(vm.students.length<=0){ + $http.get(config.apiUrl + 'courses/students?token='+auth.token()+'&course_id='+courseid).then( + function(response) { + console.log(response.data); + vm.students = response.data.data; + } + ) + } + } + + var getResources = function(){ + if(vm.resources.length<=0){ + $http.post(config.apiUrl + "courses/"+courseid+"/attachments", + {token: auth.token(), name: ''} + ).then(function(response){ + vm.resources = response.data.data; + }); + } + } + + var getHomeworks = function(){ + if(vm.homeworks.length <=0){ + $http.get(config.apiUrl + "courses/homeworks/"+courseid+"?token="+auth.token()).then(function(response){ + vm.homeworks = response.data.data; + console.log(response.data); + }); + } + } + + var getExercises = function(){ + if(vm.exercises.length <=0){ + $http.get(config.apiUrl + "courses/"+courseid+"/exercises?token="+auth.token()).then(function(response){ + vm.exercises = response.data.data; + console.log(response.data); + }); + } + } + + + vm.isTeacher = false; vm.currentTab = 1; vm.tab = function(index){ vm.currentTab = index; - vm.searchText = ''; - console.log(vm.currentTab); - if(index == 2){ - if(vm.students.length<=0){ - $http.get(config.apiUrl + 'courses/students?token='+auth.token()+'&course_id='+courseid).then( - function(response) { - console.log(response.data); - vm.students = response.data.data; - } - ) + vm.searchText = ''; + + vm.showClassMate = false; + vm.showResources = false; + vm.showHomework = false; + vm.showTestcase = false; + + if(vm.isTeacher){ + if(index == 1){ //课件 + getResources(); + vm.showResources = true; + } else if(index==2){ //作业 + getHomeworks(); + vm.showHomework = true; + } else if(index==3){ //小测验 + getExercises(); + vm.showTestcase = true; + } else if(index==4){ //学生管理 + getUsers(); + vm.showClassMate = true; + } + + } else { + if(index == 2){ + getUsers(); + vm.showClassMate = true; + } else if(index==1){ + getResources(); + vm.showResources = true; } } } + + + + vm.course = {}; vm.students = []; vm.teachers = []; vm.resources = []; + vm.homeworks = []; + vm.exercises = []; vm.invite = function(){ $location.path("/invite_code").search({id: courseid}); }; - $http.post(config.apiUrl + "courses/"+courseid+"/attachments", - {token: auth.token(), name: ''} - ).then(function(response){ - vm.resources = response.data.data; - }); - $http.get(config.apiUrl+ 'courses/'+courseid+"?token="+auth.token()).then( - function(response){ + function(response) { console.log(response.data); - vm.course = response.data.data; + vm.course = response.data.data; + resetMenu(vm.course.current_user_is_teacher); + vm.tab(1); } ); - - if(vm.teachers.length<=0){ - $http.get(config.apiUrl + 'courses/teachers?token='+auth.token()+'&course_id='+courseid).then( - function(response) { - console.log(response.data); - vm.teachers = response.data.data; - } - ) + + var resetMenu = function(is_teacher){ + vm.isTeacher = is_teacher; + if(is_teacher){ + vm.menus = ["课件", "作业", "小测验", "学生管理"]; + } else { + vm.menus = ['课堂资源', "我的同学"]; + } + } }]); \ No newline at end of file diff --git a/public/stylesheets/weui/weixin.css b/public/stylesheets/weui/weixin.css index 955a7ab73..3360d81ee 100644 --- a/public/stylesheets/weui/weixin.css +++ b/public/stylesheets/weui/weixin.css @@ -74,7 +74,19 @@ a.underline {text-decoration:underline;} .bg-blue:not(.btn-disabled):active {background-color:#2780c2;} .btn-disabled {background-color:#ccc;} -/*背景色*/ + +/*tab*/ +.tab-wrap {position:relative; line-height:38px; display:flex; font-size:13px; background-color:#fff;} +.tab-wrap a {position:relative; display:block; flex:1;} +.tab-wrap a:first-child:after {display:none;} +.tab-wrap a:after {content:" "; position:absolute; left:0; top:0; width:1px; height:100%; border-left:1px solid #ccc; color:#707070;} +.weixin-tab {text-align:center; border-bottom:1px solid #ccc;} + +/*bottom-tab*/ +.bottom-tab-wrap {position:fixed; width:100%; bottom:0; line-height:38px; display:flex; font-size:13px; background-color:#fff;} +.bottom-tab-wrap a {display:block; flex:1; position:relative;} +.bottom-tab-wrap a:after {content:" "; position:absolute; left:0; top:0; width:1px; height:100%; border-left:1px solid #ccc; color:#707070;} + /*动态样式*/ .post-container {width:100%;} From 845141a1891fab3ad969e29bb45802574186361e Mon Sep 17 00:00:00 2001 From: huang Date: Mon, 27 Jun 2016 16:03:43 +0800 Subject: [PATCH 154/216] =?UTF-8?q?=E6=B3=A8=E9=87=8A=E6=8E=89=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E8=B4=A8=E9=87=8F=E5=88=86=E6=9E=90=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/repositories/show.html.erb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index 124e3ef4d..22a64a219 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -2,13 +2,13 @@

      <%= render :partial => 'breadcrumbs', :locals => {:path => @path, :kind => 'dir', :revision => @rev} %>

      ZIP下载 - <% if is_project_manager?(User.current, @project.id) && QualityAnalysis.where(:project_id => @project.id).first.nil? %> + <%# if is_project_manager?(User.current, @project.id) && QualityAnalysis.where(:project_id => @project.id).first.nil? %> <%# if User.current.member_of?(@project) %> - <%= link_to "质量分析", quality_analysis_path(:id => @project.id), :remote => true, :class => "btn_zipdown fr" %> + <%#= link_to "质量分析", quality_analysis_path(:id => @project.id), :remote => true, :class => "btn_zipdown fr" %> + <%# end %> + <%# else %> + <%#= link_to "质量分析", project_quality_analysis_path(:project_id => @project.id, :resource_id => @proje), :class => "btn_zipdown fr" %> <%# end %> - <% else %> - <%= link_to "质量分析", project_quality_analysis_path(:project_id => @project.id, :resource_id => @proje), :class => "btn_zipdown fr" %> - <% end %>
      <% if @entries.nil? %> From 1e6454efc05d390184a2daa27c7da0620f54ea34 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Mon, 27 Jun 2016 17:24:06 +0800 Subject: [PATCH 155/216] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E6=88=91=E7=9A=84?= =?UTF-8?q?=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/mobile/api.rb | 2 + app/api/mobile/apis/resources.rb | 55 +++++++++++++++++++ app/models/user.rb | 1 + app/views/wechats/user_activities.html.erb | 3 +- public/assets/wechat/add_class.html | 13 ----- public/assets/wechat/class_list.html | 4 +- public/assets/wechat/myresource.html | 26 +++++++++ public/assets/wechat/new_class.html | 7 +++ .../wechat/controllers/add_class.js | 4 -- .../wechat/controllers/class_list.js | 7 +++ .../wechat/controllers/myresource.js | 30 ++++++++++ .../wechat/controllers/new_class.js | 12 ++++ public/javascripts/wechat/others/routes.js | 3 +- 13 files changed, 146 insertions(+), 21 deletions(-) create mode 100644 app/api/mobile/apis/resources.rb delete mode 100644 public/assets/wechat/add_class.html create mode 100644 public/assets/wechat/myresource.html create mode 100644 public/assets/wechat/new_class.html delete mode 100644 public/javascripts/wechat/controllers/add_class.js create mode 100644 public/javascripts/wechat/controllers/myresource.js create mode 100644 public/javascripts/wechat/controllers/new_class.js diff --git a/app/api/mobile/api.rb b/app/api/mobile/api.rb index 9ffac4e10..c555eb633 100644 --- a/app/api/mobile/api.rb +++ b/app/api/mobile/api.rb @@ -18,6 +18,7 @@ module Mobile require_relative 'apis/blog_comments' require_relative 'apis/new_comment' require_relative 'apis/praise' + require_relative 'apis/resources' class API < Grape::API version 'v1', using: :path @@ -71,6 +72,7 @@ module Mobile mount Apis::BlogComments mount Apis::NewComment mount Apis::Praise + mount Apis::Resources add_swagger_documentation ({api_version: 'v1', base_path: '/api'}) if Rails.env.development? diff --git a/app/api/mobile/apis/resources.rb b/app/api/mobile/apis/resources.rb new file mode 100644 index 000000000..fca94a642 --- /dev/null +++ b/app/api/mobile/apis/resources.rb @@ -0,0 +1,55 @@ +#coding=utf-8 +module Mobile + module Apis + class Resources < Grape::API + + resource :resources do + + desc '获取所有课件' + params do + requires :token, type: String + end + get do + authenticate! + data = current_user.course_attachments + present :data, data, with: Mobile::Entities::Attachment + present :status, 0 + + end + + + + desc '获取所有作业' + params do + requires :token, type: String + end + get 'homeworks' do + authenticate! + + homeworks = current_user.homework_commons + + present :data, homeworks, with: Mobile::Entities::Homework + present :status, 0 + + end + + desc '获取所有测验' + params do + requires :token, type: String + end + get 'exercies' do + authenticate! + + exercises = current_user.exercises + present :data, exercises, with: Mobile::Entities::Exercise + present :status, 0 + end + + + end + + + + end + end +end \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb index 3d491c8ab..daf1237cf 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -145,6 +145,7 @@ class User < Principal has_many :acts, :class_name => 'Activity', :as => :act, :dependent => :destroy has_many :principal_acts, :class_name => 'PrincipalActivity',:as =>:principal_act ,:dependent => :destroy has_many :file_commit, :class_name => 'Attachment', :foreign_key => 'author_id', :conditions => "container_type = 'Project' or container_type = 'Version'" + has_many :course_attachments , :class_name => 'Attachment', :foreign_key => 'author_id', :conditions => "container_type = 'Course'" #### # added by bai has_many :join_in_contests, :dependent => :destroy diff --git a/app/views/wechats/user_activities.html.erb b/app/views/wechats/user_activities.html.erb index e21f5d6c7..08221d00d 100644 --- a/app/views/wechats/user_activities.html.erb +++ b/app/views/wechats/user_activities.html.erb @@ -40,7 +40,7 @@ - + @@ -49,6 +49,7 @@ + diff --git a/public/assets/wechat/add_class.html b/public/assets/wechat/add_class.html deleted file mode 100644 index 2543d5cc4..000000000 --- a/public/assets/wechat/add_class.html +++ /dev/null @@ -1,13 +0,0 @@ -
      -
      -

      输入班级邀请码,即刻加入班级!

      -
      - -
      - 取消 -
      -
      -
      - 确定 -
      -
      diff --git a/public/assets/wechat/class_list.html b/public/assets/wechat/class_list.html index a449279f8..8ec8bcaa5 100644 --- a/public/assets/wechat/class_list.html +++ b/public/assets/wechat/class_list.html @@ -13,9 +13,9 @@
      \ No newline at end of file diff --git a/public/assets/wechat/myresource.html b/public/assets/wechat/myresource.html new file mode 100644 index 000000000..9d3bf0fda --- /dev/null +++ b/public/assets/wechat/myresource.html @@ -0,0 +1,26 @@ +
      +
      我的资源
      +
      + {{menu}} +
      +
      +
      + +
      +
      +
      +
      {{r.filename}}发送
      +

      暂无课件,
      + 请登录Trustie网站,在PC浏览器中上传课件。

      +
      +
      +
      {{r.homework_name}}发送
      +

      暂无作业,
      + 请登录Trustie网站,在PC浏览器中创建作业。

      +
      +
      +
      {{r.exercise_name}}发送
      +

      暂无测验,
      + 请登录Trustie网站,在PC浏览器中创建测验。

      +
      +
      diff --git a/public/assets/wechat/new_class.html b/public/assets/wechat/new_class.html new file mode 100644 index 000000000..2bb5d2aac --- /dev/null +++ b/public/assets/wechat/new_class.html @@ -0,0 +1,7 @@ +
      +
      新建课程
      +
      课程
      +
      班级
      + + 完成 +
      diff --git a/public/javascripts/wechat/controllers/add_class.js b/public/javascripts/wechat/controllers/add_class.js deleted file mode 100644 index 099bb8e8e..000000000 --- a/public/javascripts/wechat/controllers/add_class.js +++ /dev/null @@ -1,4 +0,0 @@ - -app.controller('AddClassController', ['$scope',function($scope){ - -}]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/class_list.js b/public/javascripts/wechat/controllers/class_list.js index 81e485453..7c40f57a0 100644 --- a/public/javascripts/wechat/controllers/class_list.js +++ b/public/javascripts/wechat/controllers/class_list.js @@ -19,5 +19,12 @@ app.controller('ClassListController', ['$scope','config','auth','$http','$locati $location.path("/myclass").search({id: course_id}); } + vm.newClass = function(){ + $location.path("/new_class"); + } + + vm.goResource =function(){ + $location.path("/myresource"); + } }]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/myresource.js b/public/javascripts/wechat/controllers/myresource.js new file mode 100644 index 000000000..87b2a4d82 --- /dev/null +++ b/public/javascripts/wechat/controllers/myresource.js @@ -0,0 +1,30 @@ +app.controller('MyResourceController', ['$scope', '$http', 'auth', 'config', function($scope, $http, auth, config){ + var vm = $scope; + vm.menus = ['课件', '作业', '测验']; + + vm.resources = []; + vm.homeworks = []; + vm.exercise = []; + + vm.tab = function(index){ + vm.currentTab = index; + if(index==1){ + $http.get(config.apiUrl + "resources?token="+auth.token()).then(function(response){ + console.log(response.data); + vm.resources = response.data.data; + }); + } else if(index==2){ + $http.get(config.apiUrl + "resources/homeworks?token="+auth.token()).then(function(response){ + console.log(response.data); + vm.homeworks = response.data.data; + }); + } else if(index==3){ + $http.get(config.apiUrl + "resources/exercies?token="+auth.token()).then(function(response){ + console.log(response.data); + vm.exercise = response.data.data; + }); + } + } + + vm.tab(1); +}] ); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/new_class.js b/public/javascripts/wechat/controllers/new_class.js new file mode 100644 index 000000000..488db31c6 --- /dev/null +++ b/public/javascripts/wechat/controllers/new_class.js @@ -0,0 +1,12 @@ + + +app.controller('NewClassController', ['$scope', '$http', 'auth', 'config', function($scope, $http, auth, config){ + var vm = $scope; + + vm.resources = []; + vm.homeworks = []; + vm.exercises = []; + + + +}] ); \ No newline at end of file diff --git a/public/javascripts/wechat/others/routes.js b/public/javascripts/wechat/others/routes.js index 36f54863a..af274cfd9 100644 --- a/public/javascripts/wechat/others/routes.js +++ b/public/javascripts/wechat/others/routes.js @@ -30,9 +30,10 @@ app.config(['$routeProvider',"$httpProvider", "$locationProvider",'config', func .when('/course_discussion/:id', makeRoute('course_discussion.html', 'DiscussionController')) .when('/journal_for_message/:id', makeRoute('jour_message_detail.html', 'JournalsController')) .when('/blog_comment/:id', makeRoute('blog_detail.html', 'BlogController')) - .when('/add_class', makeRoute('add_class.html', 'AddClassController')) .when('/myclass', makeRoute('myclass.html', 'MyClassController')) + .when('/new_class', makeRoute('new_class.html', 'NewClassController')) .when('/class_list', makeRoute('class_list.html', 'ClassListController')) + .when('/myresource', makeRoute('myresource.html', 'MyResourceController')) .when('/invite_code', makeRoute('invite_code.html', 'InviteCodeController')) .otherwise({ redirectTo: '/activites' From e5b93ac7ed7c8cdad1e02d7a726f2e1730b712b8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 27 Jun 2016 18:13:46 +0800 Subject: [PATCH 156/216] modified main method --- .../quality_analysis_controller.rb | 109 +++++++++--------- app/helpers/quality_analysis_helper.rb | 38 +++--- app/views/quality_analysis/_show.html.erb | 20 ++-- app/views/repositories/show.html.erb | 8 +- ...0624103411_add_name_to_quality_analyses.rb | 5 - ...0316_add_sonar_name_to_quality_analyses.rb | 5 + db/schema.rb | 3 +- 7 files changed, 93 insertions(+), 95 deletions(-) delete mode 100644 db/migrate/20160624103411_add_name_to_quality_analyses.rb create mode 100644 db/migrate/20160627090316_add_sonar_name_to_quality_analyses.rb diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index 6453ef5a8..9a5745dc1 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -1,6 +1,7 @@ class QualityAnalysisController < ApplicationController before_filter :find_project_by_project_id#, :except => [:getattachtype] before_filter :authorize + before_filter :connect_jenkins, :only => [:create] layout "base_projects" include ApplicationHelper require 'jenkins_api_client' @@ -13,74 +14,61 @@ class QualityAnalysisController < ApplicationController end def create - gitlab_address = Redmine::Configuration['gitlab_address'] - jenkins_address = Redmine::Configuration['jenkins_address'] - @client = JenkinsApi::Client.new(:server_url => jenkins_address, - :username => "temp", - :password => '123123') - #@client.exists?(job_name) - @g = Gitlab.client user_name = User.find(params[:user_id]).try(:login) - branch = params[:branch].blank? ? "master" : params[:branch] - language = params[:language] - path = params[:path] identifier = params[:identifier] - qa = QualityAnalysis.where(:project_id => @project.id).first - version = qa.nil? ? 1 : qa.sonar_version + 1 - properties = "sonar.projectKey=#{user_name}:#{identifier} + job_name = "#{user_name}:#{identifier}" + # Checks if the given job exists in Jenkins. + unless @client.job.exists?(job_name) + @g = Gitlab.client + branch = params[:branch].blank? ? "master" : params[:branch] + language = params[:language] + path = params[:path] + qa = QualityAnalysis.where(:project_id => @project.id).first + version = qa.nil? ? 1 : qa.sonar_version + 1 + properties = "sonar.projectKey=#{user_name}:#{identifier} sonar.projectName=#{user_name}:#{identifier} sonar.projectVersion=#{version} sonar.sources=#{path} sonar.language=#{language.downcase} sonar.sourceEncoding=utf-8" - git_url = gitlab_address.to_s+"/"+@project.owner.to_s+"/"+ identifier + "."+"git" - - # # # modify config - @doc = Nokogiri::XML(File.open(File.join(Rails.root, 'tmp', 'config.xml'))) - @doc.at_xpath("//hudson.plugins.git.UserRemoteConfig/url").content = git_url - @doc.at_xpath("//hudson.plugins.git.BranchSpec/name").content = "*/#{branch}" - @doc.at_xpath("//hudson.plugins.sonar.SonarRunnerBuilder/properties").content = properties #sonar-properties - # - # replace config.xml of jenkins - @client.job.create("#{user_name}_#{identifier}", @doc.to_xml) - # relace gitlab hook - # genkins address - @g.add_project_hook(@project.gpid, jenkins_address + "/project/#{user_name}_#{identifier}") - if qa.blank? - QualityAnalysis.create(:project_id => @project.id, :author_login => user_name, :rep_identifier => identifier, :sonar_version => version, :path => path, :branch => branch, :language => language) - - else - qa.update_attribute(:sonar_version, version) + git_url = @gitlab_address.to_s+"/"+@project.owner.to_s+"/"+ identifier + "."+"git" + # modify config.yml + @doc = Nokogiri::XML(File.open(File.join(Rails.root, 'tmp', 'config.xml'))) + @doc.at_xpath("//hudson.plugins.git.UserRemoteConfig/url").content = git_url + @doc.at_xpath("//hudson.plugins.git.BranchSpec/name").content = "*/#{branch}" + @doc.at_xpath("//hudson.plugins.sonar.SonarRunnerBuilder/properties").content = properties # sonar-properties + @client.job.create("#{user_name}_#{identifier}", @doc.to_xml) + # relace gitlab hook + @g.add_project_hook(@project.gpid, @jenkins_address + "/project/#{user_name}_#{identifier}") + # build job + opts = {'build_start_timeout' => 30, 'cancel_on_build_start_timeout' => true} + code = @client.job.build("#{user_name}_#{identifier}", opts) + # sucessed will return "201" + raise "Unable to build job: #{user_name}_#{identifier}" unless code == '201' + if qa.blank? && code == '201' + QualityAnalysis.create(:project_id => @project.id, :author_login => user_name, :rep_identifier => identifier, + :sonar_version => version, :path => path, :branch => branch, :language => language, :sonar_name => job_name) + else + qa.update_attribute(:sonar_version, version) + end end - - # scan - @client.job.build("#{user_name}_#{identifier}") end def index @sonar_address = Redmine::Configuration['sonar_address'] - # if params[:resource_id].nil? - # @name_flag = true - # @quality_analyses = QualityAnalysis.where(:project_id => @project.id) - # # @quality_analyses.map {|qa| qa.} - # # if @quality_analyses.count > 0 - # # @quality_analyses.each do |qa| - # # ["Hjqreturn:cc_rep", "Hjqreturn:putong", "Hjqreturn:sonar_rep2", "shitou:sonar_rep"] - # # - # # end - # # end - # # projects_date = open(@sonar_address + "/api/projects/index").read - # # arr = JSON.parse(projects_date).map {|m| m["nm"]} - # # arr.map - # else - qa = QualityAnalysis.where(:project_id => @project.id).first - @resource_id = qa.author_login+":"+qa.rep_identifier - @name_flag = false - complexity_date = open(@sonar_address + "/api/resources/index?resource=#{@resource_id}&depth=0&metrics=sqale_rating,function_complexity,duplicated_lines_density,comment_lines_density,sqale_index,lines,file_line,files,functions,classes,directories").read - @complexity =JSON.parse(complexity_date).first - issue_date = open(@sonar_address + "/api/resources/index?resource=#{@resource_id}&depth=0&metrics=blocker_violations,critical_violations,major_violations,minor_violations,info_violations,violations").read - @sonar_issues = JSON.parse(issue_date).first - # end + projects_date = open(@sonar_address + "/api/projects/index").read + arr = JSON.parse(projects_date).map {|m| m["nm"]} # ["Hjqreturn:cc_rep", "Hjqreturn:putong", "Hjqreturn:sonar_rep2", "shitou:sonar_rep"] + if params[:resource_id].nil? + @quality_analyses = QualityAnalysis.where("sonar_name in #{arr}") + else + qa = QualityAnalysis.where(:project_id => @project.id).first + @resource_id = qa.author_login+":"+qa.rep_identifier + @name_flag = false + complexity_date = open(@sonar_address + "/api/resources/index?resource=#{@resource_id}&depth=0&metrics=sqale_rating,function_complexity,duplicated_lines_density,comment_lines_density,sqale_index,lines,file_line,files,functions,classes,directories").read + @complexity =JSON.parse(complexity_date).first + # issue_date = open(@sonar_address + "/api/resources/index?resource=#{@resource_id}&depth=0&metrics=blocker_violations,critical_violations,major_violations,minor_violations,info_violations,violations").read + # @sonar_issues = JSON.parse(issue_date).first + end end # Find project of id params[:project_id] @@ -99,4 +87,13 @@ class QualityAnalysisController < ApplicationController end end + def connect_jenkins + @gitlab_address = Redmine::Configuration['gitlab_address'] + @jenkins_address = Redmine::Configuration['jenkins_address'] + # connect jenkins + @client = JenkinsApi::Client.new(:server_url => @jenkins_address, :username => "temp", :password => '123123') + rescue + logger.error("failed to connect Jenkins") + end + end diff --git a/app/helpers/quality_analysis_helper.rb b/app/helpers/quality_analysis_helper.rb index 9c6c07109..d2948e02b 100644 --- a/app/helpers/quality_analysis_helper.rb +++ b/app/helpers/quality_analysis_helper.rb @@ -3,19 +3,19 @@ module QualityAnalysisHelper def sqale_rating_status val arr = [] - if val.to_i > 0 && val.to_i < 5 + if val > 0 && val < 5 arr << "很好" arr << "b_green2" - elsif val.to_i > 5 && val.to_i < 10 + elsif val. > 5 && val < 10 arr << "较好" arr << "b_slow_yellow" - elsif val.to_i > 10 && val.to_i < 20 + elsif val > 10 && val < 20 arr << "中等" arr << "b_yellow" - elsif val.to_i > 20 && val.to_i < 50 + elsif val > 20 && val < 50 arr << "较差" arr << "b_slow_red" - elsif val.to_i > 20 + elsif val > 20 arr << "很差" arr << "b_red" end @@ -23,13 +23,13 @@ module QualityAnalysisHelper def complexity_status val arr = [] - if val.to_i < 10 + if val < 10 arr << "良好" arr << "b_green2" - elsif val.to_i > 10 && val.to_i < 15 + elsif val > 10 && val < 15 arr << "较高" arr << "b_yellow" - elsif val.to_i > 15 + elsif val > 15 arr << "很高" arr << "b_red" end @@ -37,13 +37,13 @@ module QualityAnalysisHelper def duplicated_lines_density_status val arr = [] - if val.to_i < 30 + if val < 30 arr << "良好" arr << "b_green2" - elsif val.to_i > 30 && val.to_i < 50 + elsif val > 30 && val < 50 arr << "较高" arr << "b_yellow" - elsif val.to_i > 50 + elsif val > 50 arr << "很高" arr << "b_red" end @@ -51,28 +51,28 @@ module QualityAnalysisHelper def comment_lines_density_status val arr = [] - if val.to_i < 20 + if val < 20 arr << "较低" arr << "b_yellow" - elsif val.to_i > 20 && val.to_i < 50 + elsif val > 20 && val < 50 arr << "正常" arr << "b_green2" - elsif val.to_i > 50 + elsif val > 50 arr << "较高" arr << "b_red" end end def score_sqale_rating val - if val.to_i > 0 && val.to_i < 5 + if val > 0 && val < 5 "5" - elsif val.to_i > 5 && val.to_i < 10 + elsif val > 5 && val < 10 "4" - elsif val.to_i > 10 && val.to_i < 20 + elsif val > 10 && val < 20 "3" - elsif val.to_i > 20 && val.to_i < 50 + elsif val > 20 && val < 50 "2" - elsif val.to_i > 20 + elsif val > 20 "1" end end diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index 8f1cb8443..864512bdd 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -1,8 +1,8 @@ <%= javascript_include_tag 'highcharts','highcharts-more' %> - <%= render :partial => "hightchars" %> -
      -

      质量分析

      -
      +<%= render :partial => "hightchars" %> +
      +

      质量分析

      +
      当前分支:<%= params[:branch] %>
      项目代码质量分析报告
      @@ -12,28 +12,28 @@

      质量等级

      -

      <%= @complexity["msr"][9]["frmt_val"] %> borderRadius"><%= sqale_rating_status(@complexity["msr"][9]["val"])[0] %>

      +

      <%= @complexity["msr"][9]["frmt_val"] %> borderRadius"><%= sqale_rating_status(@complexity["msr"][9]["val"].to_i)[0] %>

      复杂度

      -

      <%= @complexity["msr"][6]["val"] %> borderRadius"><%= complexity_status(@complexity["msr"][6]["val"])[0] %>

      +

      <%= @complexity["msr"][6]["val"] %> borderRadius"><%= complexity_status(@complexity["msr"][6]["val"].to_i)[0] %>

      代码重复度

      -

      <%= @complexity["msr"][7]["frmt_val"] %> borderRadius"><%= duplicated_lines_density_status(@complexity["msr"][7]["val"])[0] %>

      +

      <%= @complexity["msr"][7]["frmt_val"] %> borderRadius"><%= duplicated_lines_density_status(@complexity["msr"][7]["val"].to_i)[0] %>

      注释率

      -

      <%= @complexity["msr"][5]["frmt_val"] %> borderRadius"><%=comment_lines_density_status(@complexity["msr"][5]["val"])[0] %>

      +

      <%= @complexity["msr"][5]["frmt_val"] %> borderRadius"><%=comment_lines_density_status(@complexity["msr"][5]["val"].to_i)[0] %>

      -
      质量等级<%= score_sqale_rating(@complexity["msr"][9]["val"]) %>/5分可定性评价为:质量<%= sqale_rating_status(@complexity["msr"][9]["val"])[0] %>
      +
      质量等级<%= score_sqale_rating(@complexity["msr"][9]["val"].to_i) %>/5分可定性评价为:质量<%= sqale_rating_status(@complexity["msr"][9]["val"])[0] %>
      技术债务<%= @complexity["msr"][8]["frmt_val"] %>查看详情
      质量问题 @@ -46,7 +46,7 @@
      信息<%= @sonar_issues["msr"][5]["frmt_val"] %>%;">
      -
      代码规模可定性评价为:<%= lines_scale(@complexity["msr"][0]["frmt_val"]) %>
      +
      代码规模可定性评价为:<%= lines_scale(@complexity["msr"][0]["frmt_val"].to_i) %>

      代码行数

      diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index 124e3ef4d..5f4288262 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -2,13 +2,13 @@

      <%= render :partial => 'breadcrumbs', :locals => {:path => @path, :kind => 'dir', :revision => @rev} %>

      ZIP下载 - <% if is_project_manager?(User.current, @project.id) && QualityAnalysis.where(:project_id => @project.id).first.nil? %> + <%# if is_project_manager?(User.current, @project.id) && QualityAnalysis.where(:project_id => @project.id).first.nil? %> <%# if User.current.member_of?(@project) %> <%= link_to "质量分析", quality_analysis_path(:id => @project.id), :remote => true, :class => "btn_zipdown fr" %> <%# end %> - <% else %> - <%= link_to "质量分析", project_quality_analysis_path(:project_id => @project.id, :resource_id => @proje), :class => "btn_zipdown fr" %> - <% end %> + <%# else %> + <%#= link_to "质量分析", project_quality_analysis_path(:project_id => @project.id, :resource_id => @proje), :class => "btn_zipdown fr" %> + <%# end %>
      <% if @entries.nil? %> diff --git a/db/migrate/20160624103411_add_name_to_quality_analyses.rb b/db/migrate/20160624103411_add_name_to_quality_analyses.rb deleted file mode 100644 index bf61fd5ac..000000000 --- a/db/migrate/20160624103411_add_name_to_quality_analyses.rb +++ /dev/null @@ -1,5 +0,0 @@ -class AddNameToQualityAnalyses < ActiveRecord::Migration - def change - add_column :quality_analyses, :language, :string - end -end diff --git a/db/migrate/20160627090316_add_sonar_name_to_quality_analyses.rb b/db/migrate/20160627090316_add_sonar_name_to_quality_analyses.rb new file mode 100644 index 000000000..c69b5c909 --- /dev/null +++ b/db/migrate/20160627090316_add_sonar_name_to_quality_analyses.rb @@ -0,0 +1,5 @@ +class AddSonarNameToQualityAnalyses < ActiveRecord::Migration + def change + add_column :quality_analyses, :sonar_name, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index ee2da177b..16f39f6a1 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20160624055127) do +ActiveRecord::Schema.define(:version => 20160627090316) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -1844,6 +1844,7 @@ ActiveRecord::Schema.define(:version => 20160624055127) do t.string "path" t.string "branch" t.string "language" + t.string "sonar_name" end create_table "queries", :force => true do |t| From 0c4f8810c8d5232f3289ab9f06dca17db59cd433 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Mon, 27 Jun 2016 21:36:59 +0800 Subject: [PATCH 157/216] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=B8=80=E4=B8=AAcen?= =?UTF-8?q?tos=E8=83=BD=E5=AE=89=E8=A3=85=E6=88=90=E5=8A=9F=E7=9A=84rmagic?= =?UTF-8?q?k?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Gemfile b/Gemfile index 334f15853..b482cb6fd 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,7 @@ source 'https://ruby.taobao.org/' unless RUBY_PLATFORM =~ /w32/ # unix-like only gem 'iconv' - gem "rmagick", ">= 2.0.0" + gem "rmagick", "= 2.13.1" ## centos yum install ImageMagick-devel gem 'certified' end From f930bbddad7eb88c1884878dade392e132627342 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Jun 2016 09:45:45 +0800 Subject: [PATCH 158/216] modified create --- .../quality_analysis_controller.rb | 77 +++++++++++-------- 1 file changed, 44 insertions(+), 33 deletions(-) diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index 9a5745dc1..bff369eaf 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -14,43 +14,53 @@ class QualityAnalysisController < ApplicationController end def create - user_name = User.find(params[:user_id]).try(:login) - identifier = params[:identifier] - job_name = "#{user_name}:#{identifier}" - # Checks if the given job exists in Jenkins. - unless @client.job.exists?(job_name) - @g = Gitlab.client - branch = params[:branch].blank? ? "master" : params[:branch] - language = params[:language] - path = params[:path] - qa = QualityAnalysis.where(:project_id => @project.id).first - version = qa.nil? ? 1 : qa.sonar_version + 1 - properties = "sonar.projectKey=#{user_name}:#{identifier} + begin + user_name = User.find(params[:user_id]).try(:login) + identifier = params[:identifier] + # REDO + job_name = "#{user_name}:#{identifier}" + + # Checks if the given job exists in Jenkins. + unless @client.job.exists?(job_name) + @g = Gitlab.client + branch = params[:branch].blank? ? "master" : params[:branch] + language = params[:language] + path = params[:path] + qa = QualityAnalysis.where(:project_id => @project.id).first + version = qa.nil? ? 1 : qa.sonar_version + 1 + properties = "sonar.projectKey=#{user_name}:#{identifier} sonar.projectName=#{user_name}:#{identifier} sonar.projectVersion=#{version} sonar.sources=#{path} sonar.language=#{language.downcase} sonar.sourceEncoding=utf-8" - git_url = @gitlab_address.to_s+"/"+@project.owner.to_s+"/"+ identifier + "."+"git" - # modify config.yml - @doc = Nokogiri::XML(File.open(File.join(Rails.root, 'tmp', 'config.xml'))) - @doc.at_xpath("//hudson.plugins.git.UserRemoteConfig/url").content = git_url - @doc.at_xpath("//hudson.plugins.git.BranchSpec/name").content = "*/#{branch}" - @doc.at_xpath("//hudson.plugins.sonar.SonarRunnerBuilder/properties").content = properties # sonar-properties - @client.job.create("#{user_name}_#{identifier}", @doc.to_xml) - # relace gitlab hook - @g.add_project_hook(@project.gpid, @jenkins_address + "/project/#{user_name}_#{identifier}") - # build job - opts = {'build_start_timeout' => 30, 'cancel_on_build_start_timeout' => true} - code = @client.job.build("#{user_name}_#{identifier}", opts) - # sucessed will return "201" - raise "Unable to build job: #{user_name}_#{identifier}" unless code == '201' - if qa.blank? && code == '201' - QualityAnalysis.create(:project_id => @project.id, :author_login => user_name, :rep_identifier => identifier, - :sonar_version => version, :path => path, :branch => branch, :language => language, :sonar_name => job_name) - else - qa.update_attribute(:sonar_version, version) + git_url = @gitlab_address.to_s+"/"+@project.owner.to_s+"/"+ identifier + "."+"git" + + # modify config.yml + @doc = Nokogiri::XML(File.open(File.join(Rails.root, 'tmp', 'config.xml'))) + @doc.at_xpath("//hudson.plugins.git.UserRemoteConfig/url").content = git_url + @doc.at_xpath("//hudson.plugins.git.BranchSpec/name").content = "*/#{branch}" + @doc.at_xpath("//hudson.plugins.sonar.SonarRunnerBuilder/properties").content = properties # sonar-properties + + # return '200' if successed + jenkins_job = @client.job.create("#{user_name}_#{identifier}", @doc.to_xml) + + # replace gitlab hook + @g.add_project_hook(@project.gpid, @jenkins_address + "/project/#{user_name}_#{identifier}") + # build job + logger.error("Test#{jenkins_job}") + + # return '201' if successed + code = @client.job.build("#{user_name}_#{identifier}") + if qa.blank? + QualityAnalysis.create(:project_id => @project.id, :author_login => user_name, :rep_identifier => identifier, + :sonar_version => version, :path => path, :branch => branch, :language => language, :sonar_name => job_name) + else + qa.update_attribute(:sonar_version, version) + end end + rescue => e + puts e end end @@ -90,10 +100,11 @@ class QualityAnalysisController < ApplicationController def connect_jenkins @gitlab_address = Redmine::Configuration['gitlab_address'] @jenkins_address = Redmine::Configuration['jenkins_address'] + # connect jenkins @client = JenkinsApi::Client.new(:server_url => @jenkins_address, :username => "temp", :password => '123123') - rescue - logger.error("failed to connect Jenkins") + rescue => e + logger.error("failed to connect Jenkins ==> #{e}") end end From 047903ddfff03680c182b7c62ebfdb413fea4a85 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Tue, 28 Jun 2016 10:57:58 +0800 Subject: [PATCH 159/216] =?UTF-8?q?=E9=87=8D=E6=9E=84=E8=AF=BE=E7=A8=8B?= =?UTF-8?q?=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/wechats/user_activities.html.erb | 46 +++++++++---------- .../wechat/{myclass.html => class.html} | 0 public/javascripts/wechat/build/app.min.js | 8 ++-- .../controllers/{myclass.js => class.js} | 2 +- public/javascripts/wechat/others/routes.js | 2 +- 5 files changed, 30 insertions(+), 28 deletions(-) rename public/assets/wechat/{myclass.html => class.html} (100%) rename public/javascripts/wechat/controllers/{myclass.js => class.js} (95%) diff --git a/app/views/wechats/user_activities.html.erb b/app/views/wechats/user_activities.html.erb index 08221d00d..8fa650ac1 100644 --- a/app/views/wechats/user_activities.html.erb +++ b/app/views/wechats/user_activities.html.erb @@ -28,29 +28,29 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/assets/wechat/myclass.html b/public/assets/wechat/class.html similarity index 100% rename from public/assets/wechat/myclass.html rename to public/assets/wechat/class.html diff --git a/public/javascripts/wechat/build/app.min.js b/public/javascripts/wechat/build/app.min.js index 52dcd34ca..7e9ade713 100644 --- a/public/javascripts/wechat/build/app.min.js +++ b/public/javascripts/wechat/build/app.min.js @@ -2,8 +2,9 @@ var app=angular.module("wechat",["ngRoute"]);app.constant("config",{rootPath:"/a app.factory("alertService",function(){function t(){this.title=null,this.message=null,this.visible=null,this.cb=null}return t.prototype.showMessage=function(t,e,n){this.message=e,this.title=t,this.visible=!0,this.cb=n},t.prototype.dismiss=function(){this.message=null,this.title=null,this.visible=!1,this.cb&&this.cb()},{create:function(){return new t}}}),app.factory("auth",["$http","$routeParams","$q","session","config",function(t,e,n,o,a){var i=function(){var a=n.defer(),i=c();if(i&&i.length>10)a.resolve(i);else{window.g_code||e.code||o.get("code");t.post("/wechat/get_bind",{}).then(function(t){0!=t.data.status?a.reject(t.data.message):(o.save("token",t.data.token),a.resolve(t.data.token))})["catch"](function(t){a.reject(t)})}return a.promise},c=function(){return o.get("token")};return{get_bind:i,token:c}}]),app.factory("session",function(){return{save:function(t,e){sessionStorage.setItem(t,e)},get:function(t){return sessionStorage.getItem(t)}}}),app.factory("rms",function(){var t={},e=function(e,n){t[e]=n},n=function(e){return t[e]};return{save:e,get:n}}),app.factory("common",["$http","auth","$routeParams",function(t,e,n){var o=function(n,o,a,i){if(a.comment&&!(a.comment.length<=0)){var c=a.comment.replace(/\n/g,"
      "),s={type:o,content:c,token:e.token()};a.disabled=!0,t({method:"POST",url:apiUrl+"new_comment/"+n,data:s}).then(function(t){a.disabled=!1,"function"==typeof i&&i()},function(t){})}},a=function(n,o){return t({method:"GET",url:apiUrl+o+"/"+n+"?token="+e.token()})},i=function(n){n.praise_count+=1,n.has_praise=!0,t({method:"POST",url:apiUrl+"praise/"+n.act_id,data:{token:e.token(),type:n.act_type}}).then(function(t){console.log(t.data)},function(t){})},c=function(n){n.praise_count-=1,n.has_praise=!1,t({method:"POST",url:apiUrl+"praise/"+n.act_id,data:{token:e.token(),type:n.act_type}}).then(function(t){console.log(t.data)},function(t){})},s=function(t){t.scope.formData={comment:""};var e=function(e){a(e,t.type).then(function(e){t.loadCallback(e.data)},function(t){})};e(t.id),t.scope.addReply=function(n){console.log(n.comment),o(t.id,t.replyType,n,function(){t.scope.formData={comment:""},e(t.id),"function"==typeof t.replyCallback&&t.replyCallback()})},t.scope.addPraise=i,t.scope.decreasePraise=c};return{init:s,addCommonReply:o,loadCommonData:a,addCommonPraise:i,decreaseCommonPraise:c}}]); app.filter("safeHtml",["$sce",function(t){return function(n){return t.trustAsHtml(n)}}]),app.filter("identify",function(){return function(t){return"TeachingAsistant"==t?"教辅":""}}); app.controller("ActivityController",["$anchorScroll","$location","$scope","$http","$timeout","auth","rms","common","alertService",function(a,t,e,o,i,c,n,r,s){e.replaceUrl=function(a){return a},e.alertService=s.create(),console.log("ActivityController load"),e.page=n.get("page")||0,e.activities=n.get("activities")||[],e.has_more=n.get("has_more"),e.loadActData=function(a){e.page=a,o({method:"POST",url:apiUrl+"activities",data:{token:c.token(),page:a}}).then(function(a){a.data.page>0?e.activities=e.activities.concat(a.data.data):e.activities=a.data.data,n.save("activities",e.activities),e.has_more=a.data.count+10*a.data.page
      加载中...
      '}}]); -app.config(["$routeProvider","$httpProvider","$locationProvider","config",function(e,o,t,r){var l=r.rootPath,n={delay:["auth",function(e){return e.get_bind()}]},i=function(e,o){return{templateUrl:l+e,controller:o,resolve:n}};e.when("/login",{templateUrl:l+"login.html",controller:"LoginController"}).when("/reg",{templateUrl:l+"reg.html",controller:"RegController"}).when("/activites",i("activities.html","ActivityController")).when("/issues/:id",i("issue_detail.html","IssueController")).when("/project_discussion/:id",i("project_discussion.html","DiscussionController")).when("/homework/:id",i("homework_detail.html","HomeworkController")).when("/course_notice/:id",i("course_notice.html","CourseNoticeController")).when("/course_discussion/:id",i("course_discussion.html","DiscussionController")).when("/journal_for_message/:id",i("jour_message_detail.html","JournalsController")).when("/blog_comment/:id",i("blog_detail.html","BlogController")).when("/add_class",i("add_class.html","AddClassController")).when("/myclass",i("myclass.html","MyClassController")).when("/invite_code",i("invite_code.html","InviteCodeController")).otherwise({redirectTo:"/activites"}),o.interceptors.push(["$q","$rootScope",function(e,o){return void 0==o.activeCalls&&(o.activeCalls=0),{request:function(e){return o.activeCalls+=1,e},requestError:function(e){return o.activeCalls-=1,e},response:function(e){return o.activeCalls-=1,e},responseError:function(e){return o.activeCalls-=1,e}}}])}]); \ No newline at end of file +app.config(["$routeProvider","$httpProvider","$locationProvider","config",function(e,o,r,t){var l=t.rootPath,n={delay:["auth",function(e){return e.get_bind()}]},s=function(e,o){return{templateUrl:l+e,controller:o,resolve:n}};e.when("/login",{templateUrl:l+"login.html",controller:"LoginController"}).when("/reg",{templateUrl:l+"reg.html",controller:"RegController"}).when("/activites",s("activities.html","ActivityController")).when("/issues/:id",s("issue_detail.html","IssueController")).when("/project_discussion/:id",s("project_discussion.html","DiscussionController")).when("/homework/:id",s("homework_detail.html","HomeworkController")).when("/course_notice/:id",s("course_notice.html","CourseNoticeController")).when("/course_discussion/:id",s("course_discussion.html","DiscussionController")).when("/journal_for_message/:id",s("jour_message_detail.html","JournalsController")).when("/blog_comment/:id",s("blog_detail.html","BlogController")).when("/class",s("class.html","ClassController")).when("/new_class",s("new_class.html","NewClassController")).when("/class_list",s("class_list.html","ClassListController")).when("/myresource",s("myresource.html","MyResourceController")).when("/invite_code",s("invite_code.html","InviteCodeController")).otherwise({redirectTo:"/activites"}),o.interceptors.push(["$q","$rootScope",function(e,o){return void 0==o.activeCalls&&(o.activeCalls=0),{request:function(e){return o.activeCalls+=1,e},requestError:function(e){return o.activeCalls-=1,e},response:function(e){return o.activeCalls-=1,e},responseError:function(e){return o.activeCalls-=1,e}}}])}]); \ No newline at end of file diff --git a/public/javascripts/wechat/controllers/myclass.js b/public/javascripts/wechat/controllers/class.js similarity index 95% rename from public/javascripts/wechat/controllers/myclass.js rename to public/javascripts/wechat/controllers/class.js index 815f6aa54..c2281be88 100644 --- a/public/javascripts/wechat/controllers/myclass.js +++ b/public/javascripts/wechat/controllers/class.js @@ -1,4 +1,4 @@ -app.controller('MyClassController', ['$scope', 'config','$http', 'auth','$location','$routeParams', function($scope, config, $http, auth, $location, $routeParams){ +app.controller('ClassController', ['$scope', 'config','$http', 'auth','$location','$routeParams', function($scope, config, $http, auth, $location, $routeParams){ var vm = $scope; var courseid = $routeParams.id; diff --git a/public/javascripts/wechat/others/routes.js b/public/javascripts/wechat/others/routes.js index af274cfd9..80efa71e9 100644 --- a/public/javascripts/wechat/others/routes.js +++ b/public/javascripts/wechat/others/routes.js @@ -30,7 +30,7 @@ app.config(['$routeProvider',"$httpProvider", "$locationProvider",'config', func .when('/course_discussion/:id', makeRoute('course_discussion.html', 'DiscussionController')) .when('/journal_for_message/:id', makeRoute('jour_message_detail.html', 'JournalsController')) .when('/blog_comment/:id', makeRoute('blog_detail.html', 'BlogController')) - .when('/myclass', makeRoute('myclass.html', 'MyClassController')) + .when('/class', makeRoute('class.html', 'ClassController')) .when('/new_class', makeRoute('new_class.html', 'NewClassController')) .when('/class_list', makeRoute('class_list.html', 'ClassListController')) .when('/myresource', makeRoute('myresource.html', 'MyResourceController')) From e9f280b4aa5c3608d7749d19a97959638d6552e8 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Tue, 28 Jun 2016 11:07:15 +0800 Subject: [PATCH 160/216] . --- public/javascripts/wechat/build/app.min.js | 2 +- public/javascripts/wechat/controllers/class_list.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/public/javascripts/wechat/build/app.min.js b/public/javascripts/wechat/build/app.min.js index 7e9ade713..1fea6f08a 100644 --- a/public/javascripts/wechat/build/app.min.js +++ b/public/javascripts/wechat/build/app.min.js @@ -4,7 +4,7 @@ app.filter("safeHtml",["$sce",function(t){return function(n){return t.trustAsHtm app.controller("ActivityController",["$anchorScroll","$location","$scope","$http","$timeout","auth","rms","common","alertService",function(a,t,e,o,i,c,n,r,s){e.replaceUrl=function(a){return a},e.alertService=s.create(),console.log("ActivityController load"),e.page=n.get("page")||0,e.activities=n.get("activities")||[],e.has_more=n.get("has_more"),e.loadActData=function(a){e.page=a,o({method:"POST",url:apiUrl+"activities",data:{token:c.token(),page:a}}).then(function(a){a.data.page>0?e.activities=e.activities.concat(a.data.data):e.activities=a.data.data,n.save("activities",e.activities),e.has_more=a.data.count+10*a.data.page Date: Tue, 28 Jun 2016 11:30:06 +0800 Subject: [PATCH 161/216] =?UTF-8?q?=E5=8D=8F=E8=AE=AE=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/wechats_controller.rb | 4 ++-- app/views/wechats/user_activities.html.erb | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index 09bcba78c..4e0d42a45 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -3,8 +3,8 @@ class WechatsController < ActionController::Base wechat_responder include ApplicationHelper - # ROOT_URL = "#{Setting.protocol}://#{Setting.host_name}/" - ROOT_URL = "http://www.trustie.net" + ROOT_URL = "#{Setting.protocol}://#{Setting.host_name}" + #ROOT_URL = "http://www.trustie.net" # default text responder when no other match on :text do |request, content| #邀请码 diff --git a/app/views/wechats/user_activities.html.erb b/app/views/wechats/user_activities.html.erb index 8fa650ac1..1e3957ea9 100644 --- a/app/views/wechats/user_activities.html.erb +++ b/app/views/wechats/user_activities.html.erb @@ -2,7 +2,7 @@ - 我的动态 + Trustie平台 From 436de8ce5adccce709e96f2e08c0953445154cb1 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Tue, 28 Jun 2016 11:33:54 +0800 Subject: [PATCH 162/216] =?UTF-8?q?=E4=BC=98=E5=85=88=E5=8F=96env=E4=B8=AD?= =?UTF-8?q?=E7=9A=84wechat=20url?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/wechats_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/wechats_controller.rb b/app/controllers/wechats_controller.rb index 4e0d42a45..4a79d6d93 100644 --- a/app/controllers/wechats_controller.rb +++ b/app/controllers/wechats_controller.rb @@ -3,7 +3,7 @@ class WechatsController < ActionController::Base wechat_responder include ApplicationHelper - ROOT_URL = "#{Setting.protocol}://#{Setting.host_name}" + ROOT_URL = ENV["wechat_url"] || "#{Setting.protocol}://#{Setting.host_name}" #ROOT_URL = "http://www.trustie.net" # default text responder when no other match on :text do |request, content| From dd6b19a8b543234d1f9d2fa879a583bf3d1f4cb7 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Jun 2016 14:48:09 +0800 Subject: [PATCH 163/216] some status of sonar --- .../quality_analysis_controller.rb | 66 +++++++++++-------- app/models/quality_analysis.rb | 2 +- .../quality_analysis/_result_list.html.erb | 6 +- .../repositories/_quality_analysis.html.erb | 2 +- 4 files changed, 45 insertions(+), 31 deletions(-) diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index bff369eaf..7de4bedab 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -17,19 +17,20 @@ class QualityAnalysisController < ApplicationController begin user_name = User.find(params[:user_id]).try(:login) identifier = params[:identifier] + rep_id = params[:rep_id] # REDO - job_name = "#{user_name}:#{identifier}" + job_name = "#{user_name}-#{rep_id}" # Checks if the given job exists in Jenkins. unless @client.job.exists?(job_name) @g = Gitlab.client - branch = params[:branch].blank? ? "master" : params[:branch] + branch = params[:branch] language = params[:language] path = params[:path] - qa = QualityAnalysis.where(:project_id => @project.id).first + qa = QualityAnalysis.where(:project_id => @project.id, :author_login => user_name).first version = qa.nil? ? 1 : qa.sonar_version + 1 - properties = "sonar.projectKey=#{user_name}:#{identifier} - sonar.projectName=#{user_name}:#{identifier} + properties = "sonar.projectKey=#{user_name}:#{rep_id} + sonar.projectName=#{user_name}:#{rep_id} sonar.projectVersion=#{version} sonar.sources=#{path} sonar.language=#{language.downcase} @@ -43,18 +44,20 @@ class QualityAnalysisController < ApplicationController @doc.at_xpath("//hudson.plugins.sonar.SonarRunnerBuilder/properties").content = properties # sonar-properties # return '200' if successed - jenkins_job = @client.job.create("#{user_name}_#{identifier}", @doc.to_xml) + jenkins_job = @client.job.create("#{job_name}", @doc.to_xml) # replace gitlab hook - @g.add_project_hook(@project.gpid, @jenkins_address + "/project/#{user_name}_#{identifier}") + @g.add_project_hook(@project.gpid, @jenkins_address + "/project/#{job_name}") # build job - logger.error("Test#{jenkins_job}") - - # return '201' if successed - code = @client.job.build("#{user_name}_#{identifier}") - if qa.blank? + logger.error("Jenkins status of create ==> #{jenkins_job}") + # return '201' if build successed + code = @client.job.build("#{job_name}") + logger.error("build result ==> #{code}") + d = @client.delete("#{job_name}") if jenkins_job == '200' && code != '201' + logger.error("delete result ==> #{code}") + if qa.blank? && code == '201' QualityAnalysis.create(:project_id => @project.id, :author_login => user_name, :rep_identifier => identifier, - :sonar_version => version, :path => path, :branch => branch, :language => language, :sonar_name => job_name) + :sonar_version => version, :path => path, :branch => branch, :language => language, :sonar_name => "#{user_name}:#{rep_id}") else qa.update_attribute(:sonar_version, version) end @@ -62,23 +65,34 @@ class QualityAnalysisController < ApplicationController rescue => e puts e end + respond_to do |format| + format.html{redirect_to project_quality_analysis_path(:project_id => @project.id, :resource_id => "#{user_name}:#{rep_id}")} + format.js + end end + # resource_id: login + @repository.id def index - @sonar_address = Redmine::Configuration['sonar_address'] - projects_date = open(@sonar_address + "/api/projects/index").read - arr = JSON.parse(projects_date).map {|m| m["nm"]} # ["Hjqreturn:cc_rep", "Hjqreturn:putong", "Hjqreturn:sonar_rep2", "shitou:sonar_rep"] - if params[:resource_id].nil? - @quality_analyses = QualityAnalysis.where("sonar_name in #{arr}") - else - qa = QualityAnalysis.where(:project_id => @project.id).first - @resource_id = qa.author_login+":"+qa.rep_identifier - @name_flag = false - complexity_date = open(@sonar_address + "/api/resources/index?resource=#{@resource_id}&depth=0&metrics=sqale_rating,function_complexity,duplicated_lines_density,comment_lines_density,sqale_index,lines,file_line,files,functions,classes,directories").read - @complexity =JSON.parse(complexity_date).first - # issue_date = open(@sonar_address + "/api/resources/index?resource=#{@resource_id}&depth=0&metrics=blocker_violations,critical_violations,major_violations,minor_violations,info_violations,violations").read - # @sonar_issues = JSON.parse(issue_date).first + begin + @resource_id = params[:resource_id] + @sonar_address = Redmine::Configuration['sonar_address'] + # projects_date = open(@sonar_address + "/api/projects/index").read + # @arr = JSON.parse(projects_date).map {|m| m["nm"]} # ["Hjqreturn:cc_rep", "Hjqreturn:putong", "Hjqreturn:sonar_rep2", "shitou:sonar_rep"] + if params[:resource_id].nil? + @name_flag = true + # @quality_analyses = QualityAnalysis.where("sonar_name in (#{arr.empty? ? '0': arr.join(',')})") + @quality_analyses = QualityAnalysis.where(:project_id => @project.id) + else + qa = QualityAnalysis.where(:project_id => @project.id).first + complexity_date = open(@sonar_address + "/api/resources/index?resource=#{@resource_id}&depth=0&metrics=sqale_rating,function_complexity,duplicated_lines_density,comment_lines_density,sqale_index,lines,file_line,files,functions,classes,directories").read + @complexity =JSON.parse(complexity_date).first + issue_date = open(@sonar_address + "/api/resources/index?resource=#{@resource_id}&depth=0&metrics=blocker_violations,critical_violations,major_violations,minor_violations,info_violations,violations").read + @sonar_issues = JSON.parse(issue_date).first + end + rescue => e + puts e end + end # Find project of id params[:project_id] diff --git a/app/models/quality_analysis.rb b/app/models/quality_analysis.rb index 229be9826..8b8034c65 100644 --- a/app/models/quality_analysis.rb +++ b/app/models/quality_analysis.rb @@ -1,5 +1,5 @@ class QualityAnalysis < ActiveRecord::Base - attr_accessible :author_login, :project_id, :rep_identifier, :sonar_version, :branch, :path, :rep_identifier, :language + attr_accessible :author_login, :project_id, :rep_identifier, :sonar_version, :branch, :path, :rep_identifier, :language, :sonar_name def user_rep_name self.author_login+":"+self.rep_identifier diff --git a/app/views/quality_analysis/_result_list.html.erb b/app/views/quality_analysis/_result_list.html.erb index 507ded0fe..845049cea 100644 --- a/app/views/quality_analysis/_result_list.html.erb +++ b/app/views/quality_analysis/_result_list.html.erb @@ -6,17 +6,17 @@
    • 版本
    • 分支
    • 语言
    • -
    • 时间
    • +
    • lujing
    <% if @quality_analyses.count >0 %> <% @quality_analyses.each do |qa| %>
      -
    • <%=link_to "#{qa.author_login}:#{qa.rep_identifier}", project_quality_analysis_path(:resource_id => qa.author_login+":"+qa.rep_identifier, :branch => qa.branch.nil? ? "master" : qa.branch), :class => "analysis-result-name fl fontBlue2" %>
    • +
    • <%=link_to "#{qa.author_login}:#{qa.rep_identifier}", project_quality_analysis_path(:resource_id => qa.sonar_name, :branch => qa.branch.nil? ? "master" : qa.branch), :class => "analysis-result-name fl fontBlue2" %>
    • 1.0
    • <%= qa.branch %>
    • <%= qa.language %>
    • -
    • <%= format_time(qa.created_at) %>
    • +
    • <%= qa.path %>
    <% end %> diff --git a/app/views/repositories/_quality_analysis.html.erb b/app/views/repositories/_quality_analysis.html.erb index f9726fb9b..0b3f38ee3 100644 --- a/app/views/repositories/_quality_analysis.html.erb +++ b/app/views/repositories/_quality_analysis.html.erb @@ -1,6 +1,6 @@
    代码质量分析
    - <%= form_tag( url_for(:controller => 'quality_analysis', :action => 'create', :project_id => @project.id, :user_id => User.current.id, :identifier => @repository.identifier), :remote => true, :id => 'quality_analyses_form') do %> + <%= form_tag( url_for(:controller => 'quality_analysis', :action => 'create', :project_id => @project.id, :user_id => User.current.id, :identifier => @repository.identifier, :rep_id => @repository.id), :remote => true, :id => 'quality_analyses_form') do %>
    From 383483de269bdf40c739c9b911a257f6101bc39a Mon Sep 17 00:00:00 2001 From: cxt Date: Tue, 28 Jun 2016 15:13:04 +0800 Subject: [PATCH 164/216] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E5=A4=A7=E7=BA=B2?= =?UTF-8?q?=E7=9A=84=E5=B7=A6=E4=BE=A7=E6=A0=8Fbase=EF=BC=8C=E6=96=B0?= =?UTF-8?q?=E5=BB=BA=E8=AF=BE=E7=A8=8B=E5=A4=A7=E7=BA=B2=E3=80=81=E6=96=B0?= =?UTF-8?q?=E5=BB=BA=E7=8F=AD=E7=BA=A7=E7=9A=84=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/courses_controller.rb | 1 + app/controllers/syllabuses_controller.rb | 37 +++- app/controllers/tags_controller.rb | 8 + app/helpers/courses_helper.rb | 16 ++ app/helpers/syllabuses_helper.rb | 3 + app/helpers/tags_helper.rb | 2 + app/models/syllabus.rb | 4 +- app/services/courses_service.rb | 1 + app/views/courses/new.html.erb | 20 ++- app/views/layouts/_syllabus_info.html.erb | 25 +++ app/views/layouts/_user_courses.html.erb | 4 +- app/views/layouts/base_syllabus.html.erb | 158 ++++++++++++++++++ app/views/layouts/new_base.html.erb | 2 +- app/views/layouts/new_base_user.html.erb | 5 +- app/views/syllabuses/new.html.erb | 27 +++ app/views/syllabuses/show.html.erb | 0 app/views/tags/_syllabus_tag.html.erb | 5 + .../tags/_tag_syllabus_new_name.html.erb | 28 ++++ app/views/tags/remove_tag.js.erb | 3 + app/views/tags/tag_save.js.erb | 4 + config/locales/zh.yml | 8 +- config/routes.rb | 12 ++ .../20160627074232_add_column_to_syllabus.rb | 12 ++ db/schema.rb | 26 ++- public/images/syllabus.jpg | Bin 0 -> 16760 bytes public/javascripts/course.js | 40 ++++- public/javascripts/syllabus.js | 9 + public/stylesheets/courses.css | 4 +- public/stylesheets/syllabus.css | 155 +++++++++++++++++ 29 files changed, 599 insertions(+), 20 deletions(-) create mode 100644 app/views/layouts/_syllabus_info.html.erb create mode 100644 app/views/layouts/base_syllabus.html.erb create mode 100644 app/views/syllabuses/new.html.erb create mode 100644 app/views/syllabuses/show.html.erb create mode 100644 app/views/tags/_syllabus_tag.html.erb create mode 100644 app/views/tags/_tag_syllabus_new_name.html.erb create mode 100644 db/migrate/20160627074232_add_column_to_syllabus.rb create mode 100644 public/images/syllabus.jpg create mode 100644 public/javascripts/syllabus.js create mode 100644 public/stylesheets/syllabus.css diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb index 7dea90e4b..e81251f63 100644 --- a/app/controllers/courses_controller.rb +++ b/app/controllers/courses_controller.rb @@ -715,6 +715,7 @@ class CoursesController < ApplicationController @trackers = Tracker.sorted.all @course = Course.new @course.safe_attributes = params[:course] + @syllabus = Syllabus.where("id = #{params[:syllabus_id].to_i}").first if params[:syllabus_id] # month = Time.now.month render :layout => 'new_base' else diff --git a/app/controllers/syllabuses_controller.rb b/app/controllers/syllabuses_controller.rb index 69982b99a..5ee3224bd 100644 --- a/app/controllers/syllabuses_controller.rb +++ b/app/controllers/syllabuses_controller.rb @@ -8,8 +8,43 @@ class SyllabusesController < ApplicationController end def show - @courses = @syllabus.courses + #@courses = @syllabus.courses + respond_to do |format| + format.js + format.html{render :layout => 'base_syllabus'} + format.api + end + end + + def new + if User.current.login? + @syllabus = Syllabus.new + render :layout => 'new_base' + else + redirect_to signin_url + end + end + def create + if User.current.user_extensions.identity + @syllabus = Syllabus.new + @syllabus.title = params[:title] + @syllabus.eng_name = params[:eng_name] + @syllabus.user_id = User.current.id + if @syllabus && @syllabus.save + respond_to do |format| + flash[:notice] = l(:notice_successful_create) + format.html {redirect_to syllabus_path(@syllabus)} + format.api { render :action => 'show', :status => :created, :location => url_for(:controller => 'syllabuses', :action => 'show', :id => @syllabus.id) } + end + else + respond_to do |format| + flash[:notice] = l(:notice_create_failed) + format.html { redirect_to new_syllabus_path } #Added by young + format.api { render_validation_errors(@syllabus) } + end + end + end end private diff --git a/app/controllers/tags_controller.rb b/app/controllers/tags_controller.rb index 2c390025e..e66f88848 100644 --- a/app/controllers/tags_controller.rb +++ b/app/controllers/tags_controller.rb @@ -13,6 +13,7 @@ class TagsController < ApplicationController include ForumsHelper include AttachmentsHelper include ContestsHelper + include SyllabusesHelper include ActsAsTaggableOn::TagsHelper include TagsHelper include FilesHelper @@ -529,6 +530,8 @@ class TagsController < ApplicationController @obj = Course.find_by_id(@obj_id) when '10' @obj = Attachment.find_by_id(@obj_id) + when '11' + @obj = Syllabus.find_by_id(@obj_id) else @obj = nil end @@ -619,6 +622,9 @@ class TagsController < ApplicationController when '9' then @obj = Course.find_by_id(obj_id) @obj_pages, @courses_results, @results_count = for_pagination(get_courses_by_tag(selected_tags)) + when '11' then + @obj = Syllabus.find_by_id(obj_id) + @obj_pages, @syllabuses_results, @results_count = for_pagination(get_syllabuses_by_tag(selected_tags)) else @obj = nil end @@ -684,6 +690,8 @@ class TagsController < ApplicationController return 'Course' when '10' return 'Attachment' + when '11' + return 'Syllabus' else render_error :message => e.message return diff --git a/app/helpers/courses_helper.rb b/app/helpers/courses_helper.rb index 47d343e8f..fd3be1369 100644 --- a/app/helpers/courses_helper.rb +++ b/app/helpers/courses_helper.rb @@ -667,6 +667,22 @@ module CoursesHelper is_current_term || is_next_term end + #课程大纲下拉框 + def syllabus_option + type = [] + option1 = [] + option1 << "请选择课程" + option1 << 0 + type << option1 + Syllabus.all.each do |syllabus| + option = [] + option << syllabus.title + option << syllabus.id + type << option + end + type + end + #获取课程动态 def get_course_activity courses, activities @course_ids=activities.keys() diff --git a/app/helpers/syllabuses_helper.rb b/app/helpers/syllabuses_helper.rb index dac84937b..d5284586e 100644 --- a/app/helpers/syllabuses_helper.rb +++ b/app/helpers/syllabuses_helper.rb @@ -1,2 +1,5 @@ module SyllabusesHelper + def get_syllabuses_by_tag(tag_name) + Syllabus.tagged_with(tag_name).order('updated_at desc') + end end diff --git a/app/helpers/tags_helper.rb b/app/helpers/tags_helper.rb index 8847f4163..54753807d 100644 --- a/app/helpers/tags_helper.rb +++ b/app/helpers/tags_helper.rb @@ -23,6 +23,8 @@ module TagsHelper @obj= Course.find_by_id(obj_id) when '10' @obj = Attachment.find_by_id(obj_id) + when '11' + @obj = Syllabus.find_by_id(obj_id) else raise Exception, '[TagsHelper] ===> tag type unknow.' end diff --git a/app/models/syllabus.rb b/app/models/syllabus.rb index 7d6319955..b1bdfd5aa 100644 --- a/app/models/syllabus.rb +++ b/app/models/syllabus.rb @@ -1,5 +1,7 @@ class Syllabus < ActiveRecord::Base + acts_as_taggable + belongs_to :user has_many :courses - attr_accessible :description, :title + attr_accessible :description, :title, :eng_name, :type, :credit, :hours, :theory_hours, :practice_hours, :applicable_major, :pre_course end diff --git a/app/services/courses_service.rb b/app/services/courses_service.rb index 60c053997..b7b5e73ac 100644 --- a/app/services/courses_service.rb +++ b/app/services/courses_service.rb @@ -201,6 +201,7 @@ class CoursesService #@course.safe_attributes(current_user,params[:course]) #@course.password = params[:course][:password] @course.tea_id = current_user.id + @course.syllabus_id = params[:syllabus_id].to_i @course.term = params[:term] @course.time = params[:time] @course.end_term = params[:end_term] diff --git a/app/views/courses/new.html.erb b/app/views/courses/new.html.erb index ddaf17ae8..d3326480f 100644 --- a/app/views/courses/new.html.erb +++ b/app/views/courses/new.html.erb @@ -4,12 +4,22 @@
      <%= labelled_form_for @course do |f| %> +
    • + + <% if @syllabus.nil? %> + <%= select_tag :syllabus_id,options_for_select(syllabus_option,@course.syllabus_id), {:id=>"new_syllabus_id", :class=>"syllabus_input"} %> + <% else %> + <%=@syllabus.title %> + + <% end %> + + +
    • +
    • - - - +
    • @@ -49,13 +59,13 @@
    • - (选中后课外用户可见该课程,否则仅对课内成员可见) + (选中后班级外用户可见该班级,否则仅对班级内成员可见)
    • - (选中后课外用户可见学生列表,否则仅对课内成员可见) + (选中后班级外用户可见学生列表,否则仅对班级内成员可见)
    • diff --git a/app/views/layouts/_syllabus_info.html.erb b/app/views/layouts/_syllabus_info.html.erb new file mode 100644 index 000000000..4e7bc1f7b --- /dev/null +++ b/app/views/layouts/_syllabus_info.html.erb @@ -0,0 +1,25 @@ + +
      +

      <%=@syllabus.title %>

      +
      +
      +
      +
      +
      + <% if @syllabus.eng_name && !@syllabus.eng_name.empty? %> + <%= @syllabus.eng_name %> + <% else%> + 课程英文名称 + <% end %> + <% if User.current == @syllabus.user %> + <%= link_to image_tag("../images/signature_edit.png",width:"12px", height: "12px"), "javascript:void(0);", :onclick => "show_edit_eng_name();"%> + <% end %> +
      +
      +
      + 教师(10| + 学生(10| + 资源(100
      +
      \ No newline at end of file diff --git a/app/views/layouts/_user_courses.html.erb b/app/views/layouts/_user_courses.html.erb index ff18e68bd..546a5b14b 100644 --- a/app/views/layouts/_user_courses.html.erb +++ b/app/views/layouts/_user_courses.html.erb @@ -47,7 +47,7 @@ <%= link_to "+",course_boards_path(course, :flag => true, :is_new => 1), :class => 'fr fb', :title => '发布帖子',:target => '_blank' %>
    • - <% if User.current == @user %> + <% if User.current == user %>
    • +
    + +
    +
    + 班级 +
    +
      +
    • +
        +
      • + <%= link_to "新建班级", new_course_path(:host=> Setting.host_course, :syllabus_id => @syllabus.id), :class => "menuGrey"%> +
      • + +
      • + <%= link_to "加入班级",join_private_courses_courses_path,:remote => true,:class => "menuGrey",:method => "post"%> +
      • +
      +
    • +
    +
    +
    + + <% courses = User.current.courses.visible.where("is_delete =? and syllabus_id =?", 0, @syllabus.id).select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS a").order("a desc").limit(5) %> +
    +
    +
      + <%= render :partial => 'layouts/user_courses', :locals => {:courses => courses,:user => User.current, :page => 0} %> + +
    +
    + <% if !courses.empty? %> +
    + +
    + <% end %> +
    +
    + +
    +

    标签:

    +
    + <%= render :partial => 'tags/syllabus_tag', :locals => {:obj => @syllabus,:object_flag => "11"}%> +
    +
    +
    +
    访问计数 343 (自2016年5月)
    + +
    +
    + <%= yield %> +
    +
    + <%= render :partial => 'layouts/new_feedback' %> +
    +
    +<%= render :partial => 'layouts/footer' %> +
    + + + + + + diff --git a/app/views/layouts/new_base.html.erb b/app/views/layouts/new_base.html.erb index e7695f0e7..4922882b9 100644 --- a/app/views/layouts/new_base.html.erb +++ b/app/views/layouts/new_base.html.erb @@ -13,7 +13,7 @@ <%= javascript_heads %> <%= heads_for_theme %> <%= call_hook :view_layouts_base_html_head %> - <%= stylesheet_link_tag 'public', 'leftside', 'courses','header','prettify', 'org'%> + <%= stylesheet_link_tag 'public', 'leftside', 'courses','header','prettify', 'org', 'syllabus'%> <%= javascript_include_tag "course","header",'prettify' %> <%= yield :header_tags -%> diff --git a/app/views/layouts/new_base_user.html.erb b/app/views/layouts/new_base_user.html.erb index 8455d5693..9c816af7f 100644 --- a/app/views/layouts/new_base_user.html.erb +++ b/app/views/layouts/new_base_user.html.erb @@ -198,7 +198,10 @@
    • - <%= link_to "新建课程", new_course_path(:host=> Setting.host_course), :class => "menuGrey"%> + <%= link_to "新建课程", new_syllabus_path(:host=> Setting.host_course), :class => "menuGrey"%> +
    • +
    • + <%= link_to "新建班级", new_course_path(:host=> Setting.host_course), :class => "menuGrey"%>
    • diff --git a/app/views/syllabuses/new.html.erb b/app/views/syllabuses/new.html.erb new file mode 100644 index 000000000..34b02e33a --- /dev/null +++ b/app/views/syllabuses/new.html.erb @@ -0,0 +1,27 @@ +
      +

      新建课程

      +
      +
      +
        + <%= labelled_form_for @syllabus do |f| %> +
      • + + + +
      • +
        +
      • + + + +
      • +
        +
      • + 提交 + <%= link_to "取消",user_activities_path(User.current.id),:class => "blue_btn grey_btn fl c_white"%> +
        +
      • + <% end%> +
      +
      +
      \ No newline at end of file diff --git a/app/views/syllabuses/show.html.erb b/app/views/syllabuses/show.html.erb new file mode 100644 index 000000000..e69de29bb diff --git a/app/views/tags/_syllabus_tag.html.erb b/app/views/tags/_syllabus_tag.html.erb new file mode 100644 index 000000000..4d6fc6b87 --- /dev/null +++ b/app/views/tags/_syllabus_tag.html.erb @@ -0,0 +1,5 @@ +
      +
      + <%= render :partial => "tags/tag_syllabus_new_name",:locals => {:obj => obj,:non_list_all => false ,:object_flag => object_flag} %> +
      +
      \ No newline at end of file diff --git a/app/views/tags/_tag_syllabus_new_name.html.erb b/app/views/tags/_tag_syllabus_new_name.html.erb new file mode 100644 index 000000000..093e372ac --- /dev/null +++ b/app/views/tags/_tag_syllabus_new_name.html.erb @@ -0,0 +1,28 @@ +<% @tags = obj.reload.tag_list %> +<% if non_list_all && @tags.size > 0 %> + +<% else %> + + <% if @tags.size > 0 %> + <% @tags.each do |tag| %> + + <%= link_to tag, :controller => "tags", :action => "index", :q => tag, :object_flag => object_flag, :obj_id => obj.id, :class => 'pt5' %> + + <%= link_to('x', remove_tag_path(:tag_name => tag,:taggable_id => obj.id, :taggable_type => object_flag), :remote => true, :confirm => l(:text_are_you_sure) ) if obj.user == User.current %> + + + <% end %> + <% end %> +<% end %> + +<% if User.current.logged?%> + <%= l(:label_add_tag)%> + +<% end%> \ No newline at end of file diff --git a/app/views/tags/remove_tag.js.erb b/app/views/tags/remove_tag.js.erb index 4c4409c1c..b53aef949 100644 --- a/app/views/tags/remove_tag.js.erb +++ b/app/views/tags/remove_tag.js.erb @@ -19,6 +19,9 @@ $('#tags_show').html('<%= escape_javascript(render :partial => 'tags/tag_project $("#tags_show-<%=@obj.class%>-<%=@obj.id%>").empty(); $("#tags_show-<%=@obj.class%>-<%=@obj.id%>").html('<%= escape_javascript(render :partial => 'tags/course_attachment_tag_name', :locals => {:obj => @obj,:non_list_all => false, :object_flag => @object_flag}) %>'); +<% elsif @object_flag == '11'%> +$('#tags_show').html('<%= escape_javascript(render :partial => 'tags/tag_syllabus_new_name', + :locals => {:obj => @obj,:non_list_all => false,:object_flag => @object_flag}) %>'); <% else%> $('#tags_show').html('<%= escape_javascript(render :partial => 'tags/tag_name', :locals => {:obj => @obj,:non_list_all => false,:object_flag => @object_flag}) %>'); diff --git a/app/views/tags/tag_save.js.erb b/app/views/tags/tag_save.js.erb index e4f12b558..10b1393d8 100644 --- a/app/views/tags/tag_save.js.erb +++ b/app/views/tags/tag_save.js.erb @@ -38,6 +38,10 @@ $('#tags_name2').val(""); $('#tags_name').val(""); <% elsif @obj_flag == '10'%> //$("#put-tag-form-<%#=@obj.class%>-<%#=@obj.id%>").hide(); +<% elsif @obj_flag == '11'%> +$('#tags_show').html('<%= escape_javascript(render :partial => 'tags/tag_syllabus_new_name', + :locals => {:obj => @obj,:non_list_all => false,:object_flag => @obj_flag}) %>'); +$('#tags_name4').val(""); <% else%> $('#tags_show').html('<%= escape_javascript(render :partial => 'tags/tag_name', :locals => {:obj => @obj,:non_list_all => false,:object_flag => @obj_flag}) %>'); diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 3dbd2e8ef..41e70639c 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -329,7 +329,7 @@ zh: permission_manage_subtasks: 管理子任务 permission_view_journals_for_messages: 查看留言 permission_view_courses: 查看课程 - permission_new_course: 新建课程 + permission_new_course: 新建班级 permission_configure_course: 配置课程 permission_close_course: 关闭/重开 permission_new_assignment: 新建任务 @@ -1265,7 +1265,9 @@ zh: label_delete_confirm: 确认删除? label_tags_bid: 需求名称 - label_tags_course_name: 课程名称 + label_tags_syllabus_name: 课程名称 + label_tags_course_name: 班级名称 + label_tags_course_eng_name: 英文名称 label_tags_bid_description: 需求描述 label_tags_issue_description: 问题描述 label_tags_all_objects: 所有 @@ -1692,7 +1694,7 @@ zh: label_new_join_group: 加入当前分班 label_new_course_password: 课程密码 label_new_course_school: 开课学校 - label_new_course_description: 课程描述 + label_new_course_description: 班级描述 label_homework_description: 作业描述 label_new_join_order: 请输入课程密码 label_task_submit_form_accessory: 作业最终以附件形式提交 diff --git a/config/routes.rb b/config/routes.rb index a0ab9b783..7e2998262 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1071,6 +1071,18 @@ RedmineApp::Application.routes.draw do match 'courses/search' match '/contests/search', :via => [:get, :post] + + #课程大纲路由设置 + resources :syllabuses do + member do + + end + + collection do + + end + end + # add by nwb # 课程路由设置 resources :courses do diff --git a/db/migrate/20160627074232_add_column_to_syllabus.rb b/db/migrate/20160627074232_add_column_to_syllabus.rb new file mode 100644 index 000000000..f907f7a31 --- /dev/null +++ b/db/migrate/20160627074232_add_column_to_syllabus.rb @@ -0,0 +1,12 @@ +class AddColumnToSyllabus < ActiveRecord::Migration + def change + add_column :syllabuses, :eng_name, :string + add_column :syllabuses, :type, :integer + add_column :syllabuses, :credit, :integer + add_column :syllabuses, :hours, :integer + add_column :syllabuses, :theory_hours, :integer + add_column :syllabuses, :practice_hours, :integer + add_column :syllabuses, :applicable_major, :string + add_column :syllabuses, :pre_course, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 148a6e21b..5147a5c73 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20160624032138) do +ActiveRecord::Schema.define(:version => 20160627074232) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -1539,6 +1539,18 @@ ActiveRecord::Schema.define(:version => 20160624032138) do add_index "projects_trackers", ["project_id", "tracker_id"], :name => "projects_trackers_unique", :unique => true add_index "projects_trackers", ["project_id"], :name => "projects_trackers_project_id" + create_table "quality_analyses", :force => true do |t| + t.integer "project_id" + t.string "author_login" + t.string "rep_identifier" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "sonar_version", :default => 0 + t.string "path" + t.string "branch" + t.string "language" + end + create_table "queries", :force => true do |t| t.integer "project_id" t.string "name", :default => "", :null => false @@ -1853,8 +1865,16 @@ ActiveRecord::Schema.define(:version => 20160624032138) do t.string "title" t.text "description" t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "eng_name" + t.integer "type" + t.integer "credit" + t.integer "hours" + t.integer "theory_hours" + t.integer "practice_hours" + t.string "applicable_major" + t.string "pre_course" end add_index "syllabuses", ["user_id"], :name => "index_syllabuses_on_user_id" diff --git a/public/images/syllabus.jpg b/public/images/syllabus.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3daef5a011ac6e10b3ceec2d28235c03a9febf02 GIT binary patch literal 16760 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 a0r~!>Y@zI4V$b!56QX)UIU^~YxBms9*~}{d literal 0 HcmV?d00001 diff --git a/public/javascripts/course.js b/public/javascripts/course.js index 8b5e58618..fb272cfd0 100644 --- a/public/javascripts/course.js +++ b/public/javascripts/course.js @@ -182,10 +182,22 @@ function regex_course_password(str) return false; } } +//验证课程大纲 +function regex_syllabus_option(str) { + var obj = document.getElementById(str + "_syllabus_id"); + var syllabus = obj.options[obj.selectedIndex]; + if(parseInt(syllabus.value) == 0) { + $("#"+str+"_syllabus_notice").show(); + return false; + } else{ + $("#"+str+"_syllabus_notice").hide(); + return true; + } +} //提交新建课程 function submit_new_course() { - if(regex_course_name('new')&®ex_course_class_period('new')&®ex_time_term('new')) + if(regex_syllabus_option('new')&®ex_course_name('new')&®ex_course_class_period('new')&®ex_time_term('new')) { $("#new_course").submit(); } @@ -193,11 +205,35 @@ function submit_new_course() function submit_edit_course(id) { - if(regex_course_name('edit')&®ex_course_class_period('edit')&®ex_time_term('edit')) + if(regex_syllabus_option('edit')&®ex_course_name('edit')&®ex_course_class_period('edit')&®ex_time_term('edit')) { $("#edit_course_"+id).submit(); } } + +//新建课程大纲 +function submit_new_syllabus() +{ + if(regex_syllabus_name()) + { + $("#new_syllabus").submit(); + } +} + +function regex_syllabus_name() { + var name = $.trim($("#new_syllabus_name").val()); + if(name.length < 2) + { + $("#new_syllabus_name_notice").show(); + return false; + } + else + { + $("#new_syllabus_name_notice").hide(); + return true; + } +} + //课程讨论区 function regexTopicSubject() { var name = $("#message_subject").val(); diff --git a/public/javascripts/syllabus.js b/public/javascripts/syllabus.js new file mode 100644 index 000000000..6483d266d --- /dev/null +++ b/public/javascripts/syllabus.js @@ -0,0 +1,9 @@ +//显示更多的班级 +function show_more_course(url){ + $.get( + url, + { page: $("#course_page_num").val() }, + function (data) { + } + ); +} diff --git a/public/stylesheets/courses.css b/public/stylesheets/courses.css index d0a5e7ab3..9bfc00625 100644 --- a/public/stylesheets/courses.css +++ b/public/stylesheets/courses.css @@ -1426,4 +1426,6 @@ a.pages-big{ width:50px;} .H60 {height:60px !important;} .W420 {width:420px;} .W300 {width:300px !important;} -.W600{ width:600px;} +.W600{ width:600px;} + +.syllabus_input {width: 290px; border: 1px solid #64bdd9; height: 30px;} \ No newline at end of file diff --git a/public/stylesheets/syllabus.css b/public/stylesheets/syllabus.css new file mode 100644 index 000000000..cbdd5808f --- /dev/null +++ b/public/stylesheets/syllabus.css @@ -0,0 +1,155 @@ +/****标签(和资源库的tag样式一致)***/ +.project_Label{ width:218px; padding:10px; background:#fff; margin-top:10px; padding-top:5px; margin-bottom:10px; border:1px solid #dddddd;} +.project_Label_New {width:218px; padding-left:10px; background:#fff; margin-top:15px; margin-bottom:10px;} +a.yellowBtn{ display:inline-block;color:#0d90c3; height:22px;} +.submit{height:21px;border:0; cursor:pointer; background:url(../images/btn.png) no-repeat 0 0;width:42px; margin-top:2px; margin-left:3px; } +.isTxt{background:#fbfbfb url(../images/inputBg.png) repeat-x left top;height:22px;line-height:22px;border:1px solid #c1c1c1;padding:0 5px;color:#666666;} +.re_tag{ width: auto; padding:0 5px; padding-top:2px; height:20px; border:1px solid #f8df8c; background:#fffce6; margin-right:5px; } +.re_tag a{ color:#0d90c3;} +.tag_h{ } +.tag_h span,.tag_h a{ margin-bottom:5px;} +/*信息*/ +.project_info{ background:#fff; padding:10px 8px; width:222px; margin-bottom:10px; border:1px solid #dddddd;} +.pr_info_id{ width:137px; color:#5a5a5a; font-size:14px; margin-top:5px;} +.pr_info_logo{ border:1px solid #eaeaea; width:60px; height:60px; padding:1px;} +.pr_info_logo:hover{ border:1px solid #297fb8; } + +/*课程大纲*/ +input.syllabus_input{ + border:none; + width:150px; + height:25px; + line-height:25px; + color:#333; +} +input.syllabus_input_min{ + border:none; + width:30px; + height:25px; + line-height:25px; + color:#333; +} +.syllabus_select{ + border:1px solid #ccc; + margin-left:5px; +} +.syllabus_leftinfo { + margin:10px 10px 0 10px; + width:220px; +} +.syllabus_leftinfo li{ + line-height:25px; +} +.syllabus_leftinfo label{ + display:block; + width:60px; + text-align:right; + float:left; + line-height:25px; +} +.syllabusbox{ + position:relative; + width: 718px; + color: #4b4b4b; + padding:30px 15px; + margin-bottom: 10px; + background: #fff; + border: 1px solid #dddddd; +} +.syllabuscon_title{ + color:#000; text-align:center; +} +.syllabuscon_txt p{ + font-size:14px; + line-height:1.9; + color:#000; +} +.syllabuscon_txt_title{ + font-weight:bold; + margin:10px 0; +} +.syllabusbox_tishi{ + font-size:14px; + width:733px; + color:#cb7c01; + padding:10px 0 0 15px; + margin-bottom:10px; + background:#fff7d1; + border:1px solid #fcd9b4; + height:34px; +} +a.syllabusbox_a_blue{ + color:#3b94d6; +} +.syllabus_leftinfo p{ + line-height:25px; + width:150px; + overflow:hidden; + white-space: nowrap; + text-overflow:ellipsis; +} +.syllabus_info_tishi{ + font-size:16px; + width:400px; + margin:100px auto; +} +.syllabus_info_tishi a{ + color:#3b94d6; +} + +/*课程大纲-课程列表*/ +.icon_course{ background: url(../images/syllabus/icons_syllabus.png) 0 -35px no-repeat; width:18px; height:15px; display:block;} +.icons_sy_open{background: url(../images/syllabus/icons_syllabus.png) 0 -53px no-repeat; width:20px; height:23px; display:block; cursor:pointer; } +.icons_sy_close{background: url(../images/syllabus/icons_syllabus.png) -26px -53px no-repeat; width:20px; height:23px; display:block; } +.icons_sy_setting{background: url(../images/syllabus/icons_syllabus.png) -51px -33px no-repeat; width:20px; height:20px; display:block; } +.icons_sy_setting:hover{background: url(../images/syllabus/icons_syllabus.png) -25px -33px no-repeat; } +.icons_sy_cir{background: url(../images/syllabus/icons_syllabus.png) 0px -82px no-repeat; width:15px; height:15px; display:block; position:absolute; left:-8px; top:25px;} +.icons_sy_arrow{background: url(../images/syllabus/icons_syllabus.png) -31px -81px no-repeat; width:20px; height:20px; display:block; } +.syllabus_h2_top{ font-size:18px; color:#333; font-weight:normal; padding:10px 15px;border-bottom:1px solid #e7e7e7; } +.syllabus_category{ padding:10px 15px; background-color:#f6f6f6; border-bottom:1px solid #e7e7e7;} +.syllabus_box{ width:750px; border:1px solid #e7e7e7; background-color:#fff;} +.syllabus_courses_list{ padding:15px; border-bottom:1px solid #e7e7e7; cursor:pointer;} +.syllabus_courses_list:hover{ background:#f6fafd;} +.syllabus_courses_title{ font-size:16px; color:#333; width:650px; font-weight:normal;white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } +.sy_p_grey{ margin-left:25px; color:#888; margin-top:5px; font-size:12px;} +.syllabus_class_box{ padding-left:30px; background:#f6f6f6;} +.syllabus_class_list{ padding:12px 0 12px 15px; height:44px;border-left:1px solid #e7e7e7;border-bottom:1px solid #e7e7e7; position:relative;} +.syllabus_class_list:hover{ background:#ececec;} +.syllabus_class_list_more{padding:8px; text-align:center;border-left:1px solid #e7e7e7;border-bottom:1px solid #e7e7e7;} +.syllabus_class_list_more:hover{ background:#ececec;} +.syllabus_class_list_more a{ color:#ff7e00;} +.syllabus_class_title{ font-size:14px; color:#333; width:500px; margin-bottom:3px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } +.syllabus_class_w{ width:650px;} +.dis {display:block;} +.undis {display:none;} + +/*班级列表界面(用的博客列表的样式)*/ +.listbox{ width:730px; background-color:#fff; border:1px solid #ddd; padding:10px; } +.bloglistbox{ min-height:690px;} +.list-h2{ font-size:16px; font-weight:bold; color:#000; padding-bottom:5px;} +.category{ } +.list_title{padding:10px 0; border-bottom:1px solid #ddd;} +.category a,.category span{ float:left; margin-right:5px;} +.grayTxt{ color:#9093a6;} +.sortTxt{ color:#000;} +.sortTxt:hover{ color:#28be6c;} +a.sortupbtn{ background: url(../images/syllabus/icons_syllabus.png) 0 3px no-repeat; width:12px; height:17px; display:block; margin-right:10px; cursor:pointer;} +a.sortdownbtn{ background: url(../images/syllabus/icons_syllabus.png) 0 -12px no-repeat; width:12px; height:17px; display:block;cursor:pointer; } +a.sort_no{ background: url(../images/syllabus/icons_syllabus.png) -16px -12px no-repeat; width:12px; height:17px; display:block;cursor:pointer; } +.item_list{ display:block; width:5px; height:5px;-webkit-border-radius: 25px;border-radius:25px; background-color:#adadad; margin:10px 10px 0 0;} +a.list-title{ font-size:14px; font-weight: bold; color:#000;white-space:nowrap; overflow:hidden; text-overflow:ellipsis; display:block; width:708px;} +a:hover.list-title{ color:#269ac9;} +.c_red{ font-weight:normal; font-size:12px;} +.list-file{ padding:10px 0; border-bottom:1px dashed #ddd;} +.list-file li{ line-height:1.9;} +.list-info span{ margin-left:5px;} +.pages a{ display:block; border:1px solid #d1d1d1; color:#888; float:left; width:30px; text-align:center; padding:3px 0; line-height:1.9; margin-right:5px; } +.pages a:hover{ background-color:#3b94d6; border:1px solid #3b94d6; color:#fff;} +a.pages-big{ width:50px;} +.pages .active{ background-color:#3b94d6; border:1px solid #3b94d6; color:#fff;} +.pages{width:330px; margin:20px auto 10px;} +a.course-title{ font-size:14px; font-weight: bold; color:#000;white-space:nowrap; overflow:hidden; text-overflow:ellipsis; display:block; width:590px;} +a:hover.course-title{ color:#269ac9;} + +/*新建页面*/ +.name_input{ border:1px solid #64bdd9; height:16px; width:310px; background:#fff; margin-bottom:10px; padding:5px;} \ No newline at end of file From cbe34ea0a7991c3cacbad35875056deaed039c13 Mon Sep 17 00:00:00 2001 From: cxt Date: Tue, 28 Jun 2016 15:57:56 +0800 Subject: [PATCH 165/216] =?UTF-8?q?=E5=88=86=E7=BB=84=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BD=9C=E5=93=81=E6=97=B6=E5=85=B3=E8=81=94?= =?UTF-8?q?=E6=88=90=E5=91=98=E5=88=97=E8=A1=A8=E4=B8=BA=E7=A9=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/student_work_controller.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb index 9006c8a79..661770206 100644 --- a/app/controllers/student_work_controller.rb +++ b/app/controllers/student_work_controller.rb @@ -1096,7 +1096,7 @@ class StudentWorkController < ApplicationController all_student_ids = "(" + pro.members.map{|member| member.user_id}.join(",") + ")" end all_students = User.where("id in #{all_student_ids}") - student_work_id = @homework.student_work_projects.where("user_id=?",User.current.id).empty? ? -1 : @homework.student_work_projects.where("user_id=?",User.current.id).first.student_work_id + student_work_id = @homework.student_work_projects.where("user_id=? and student_work_id is not null",User.current.id).first.nil? ? -1 : @homework.student_work_projects.where("user_id=?",User.current.id).first.student_work_id @commit_student_ids = @homework.student_work_projects.where("student_work_id != #{student_work_id}").map{|student| student.user_id} @users = searchstudent_by_name all_students,name respond_to do |format| From 4983d5283bd1b930882c09c6984051a4c048ba74 Mon Sep 17 00:00:00 2001 From: cxt Date: Tue, 28 Jun 2016 16:30:33 +0800 Subject: [PATCH 166/216] =?UTF-8?q?=E5=85=B3=E8=81=94=E6=88=90=E5=91=98?= =?UTF-8?q?=E8=83=BD=E5=A4=9A=E6=AC=A1=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/student_work/search_course_students.js.erb | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/views/student_work/search_course_students.js.erb b/app/views/student_work/search_course_students.js.erb index 2ac4eeaab..65179317f 100644 --- a/app/views/student_work/search_course_students.js.erb +++ b/app/views/student_work/search_course_students.js.erb @@ -8,19 +8,19 @@ $("#all_students_list").empty(); $("#all_students_list").append(link); var str = $("#group_member_ids").val(); - /*var str = ""; + var choose_str = ""; var lists = $("#choose_students_list li"); if(lists.length > 0) { for(var i=0; i - if (str.indexOf(<%=user.id.to_s %>) < 0) { + if (str.indexOf(<%=user.id.to_s %>) < 0 && choose_str.indexOf(<%=user.id.to_s %>) < 0) { $("#student_<%=user.id %>").one("click",function choose_student() { var li = "
    • From a08edcca8a6acdb1ab2d026916d52306460ec450 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Jun 2016 17:18:50 +0800 Subject: [PATCH 167/216] quanxian --- app/controllers/quality_analysis_controller.rb | 9 +++++---- app/helpers/repositories_helper.rb | 5 +++++ app/views/projects/_development_group.html.erb | 6 ++++++ .../quality_analysis/_result_list.html.erb | 2 +- app/views/quality_analysis/_show.html.erb | 18 +++++++++--------- app/views/quality_analysis/create.js.erb | 1 + .../repositories/_quality_analysis.html.erb | 2 +- app/views/repositories/show.html.erb | 2 ++ public/stylesheets/public.css | 1 + 9 files changed, 31 insertions(+), 15 deletions(-) create mode 100644 app/views/quality_analysis/create.js.erb diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index 7de4bedab..591cef596 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -20,17 +20,19 @@ class QualityAnalysisController < ApplicationController rep_id = params[:rep_id] # REDO job_name = "#{user_name}-#{rep_id}" + sonar_name = "#{user_name}:#{rep_id}" # Checks if the given job exists in Jenkins. unless @client.job.exists?(job_name) @g = Gitlab.client branch = params[:branch] + logger.error("##################################{branch}") language = params[:language] path = params[:path] qa = QualityAnalysis.where(:project_id => @project.id, :author_login => user_name).first version = qa.nil? ? 1 : qa.sonar_version + 1 - properties = "sonar.projectKey=#{user_name}:#{rep_id} - sonar.projectName=#{user_name}:#{rep_id} + properties = "sonar.projectKey=#{sonar_name} + sonar.projectName=#{sonar_name} sonar.projectVersion=#{version} sonar.sources=#{path} sonar.language=#{language.downcase} @@ -66,7 +68,7 @@ class QualityAnalysisController < ApplicationController puts e end respond_to do |format| - format.html{redirect_to project_quality_analysis_path(:project_id => @project.id, :resource_id => "#{user_name}:#{rep_id}")} + format.html{redirect_to project_quality_analysis_path(:project_id => @project.id, :resource_id => sonar_name, :branch => branch)} format.js end end @@ -83,7 +85,6 @@ class QualityAnalysisController < ApplicationController # @quality_analyses = QualityAnalysis.where("sonar_name in (#{arr.empty? ? '0': arr.join(',')})") @quality_analyses = QualityAnalysis.where(:project_id => @project.id) else - qa = QualityAnalysis.where(:project_id => @project.id).first complexity_date = open(@sonar_address + "/api/resources/index?resource=#{@resource_id}&depth=0&metrics=sqale_rating,function_complexity,duplicated_lines_density,comment_lines_density,sqale_index,lines,file_line,files,functions,classes,directories").read @complexity =JSON.parse(complexity_date).first issue_date = open(@sonar_address + "/api/resources/index?resource=#{@resource_id}&depth=0&metrics=blocker_violations,critical_violations,major_violations,minor_violations,info_violations,violations").read diff --git a/app/helpers/repositories_helper.rb b/app/helpers/repositories_helper.rb index 3cf781f76..b525c4aed 100644 --- a/app/helpers/repositories_helper.rb +++ b/app/helpers/repositories_helper.rb @@ -41,6 +41,11 @@ module RepositoriesHelper identifiers.include?(iden) ? false :true end + def quality_analysis login, rep_id + long_rep_id = "#{login}:#{rep_id}" + QualityAnalysis.where(:sonar_name => long_rep_id).first + end + # 获取文件目录的最新动态 def get_trees_last_changes(project_id, rev, ent_name) g = Gitlab.client diff --git a/app/views/projects/_development_group.html.erb b/app/views/projects/_development_group.html.erb index 2c7d36fb5..6961fcbac 100644 --- a/app/views/projects/_development_group.html.erb +++ b/app/views/projects/_development_group.html.erb @@ -55,6 +55,12 @@ <%= link_to "+"+l(:project_gitlab_create_repository), url_for(:controller => 'projects', :action => 'settings', :id => @project.id, :tab=>'repositories') , :class => "subnav_green" %> <% end %> + + <% unless QualityAnalysis.where(:project_id => @project.id).first.nil? %> + + <% end %> <% end %> diff --git a/app/views/quality_analysis/_result_list.html.erb b/app/views/quality_analysis/_result_list.html.erb index 845049cea..8c80d403f 100644 --- a/app/views/quality_analysis/_result_list.html.erb +++ b/app/views/quality_analysis/_result_list.html.erb @@ -12,7 +12,7 @@ <% if @quality_analyses.count >0 %> <% @quality_analyses.each do |qa| %>
        -
      • <%=link_to "#{qa.author_login}:#{qa.rep_identifier}", project_quality_analysis_path(:resource_id => qa.sonar_name, :branch => qa.branch.nil? ? "master" : qa.branch), :class => "analysis-result-name fl fontBlue2" %>
      • +
      • <%=link_to "#{qa.author_login}:#{qa.rep_identifier}", project_quality_analysis_path(:resource_id => qa.sonar_name, :branch => (qa.branch.nil? ? "master" : qa.branch)), :class => "analysis-result-name fl fontBlue2" %>
      • 1.0
      • <%= qa.branch %>
      • <%= qa.language %>
      • diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index 864512bdd..4f8c21fe3 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -12,37 +12,37 @@

        质量等级

        -

        <%= @complexity["msr"][9]["frmt_val"] %> borderRadius"><%= sqale_rating_status(@complexity["msr"][9]["val"].to_i)[0] %>

        +

        <%= @complexity["msr"][9]["frmt_val"] %> borderRadius"><%= sqale_rating_status(@complexity["msr"][9]["val"].to_i)[0] %>

        复杂度

        -

        <%= @complexity["msr"][6]["val"] %> borderRadius"><%= complexity_status(@complexity["msr"][6]["val"].to_i)[0] %>

        +

        <%= @complexity["msr"][6]["val"] %> borderRadius"><%= complexity_status(@complexity["msr"][6]["val"].to_i)[0] %>

        代码重复度

        -

        <%= @complexity["msr"][7]["frmt_val"] %> borderRadius"><%= duplicated_lines_density_status(@complexity["msr"][7]["val"].to_i)[0] %>

        +

        <%= @complexity["msr"][7]["frmt_val"] %> borderRadius"><%= duplicated_lines_density_status(@complexity["msr"][7]["val"].to_i)[0] %>

        注释率

        -

        <%= @complexity["msr"][5]["frmt_val"] %> borderRadius"><%=comment_lines_density_status(@complexity["msr"][5]["val"].to_i)[0] %>

        +

        <%= @complexity["msr"][5]["frmt_val"] %> borderRadius"><%=comment_lines_density_status(@complexity["msr"][5]["val"].to_i)[0] %>

        质量等级<%= score_sqale_rating(@complexity["msr"][9]["val"].to_i) %>/5分可定性评价为:质量<%= sqale_rating_status(@complexity["msr"][9]["val"])[0] %>
        技术债务<%= @complexity["msr"][8]["frmt_val"] %>查看详情
        -
        质量问题 +
        质量问题 <%= @sonar_issues["msr"][0]["frmt_val"] %>问题分类如下:
        -
        阻断<%= @sonar_issues["msr"][1]["frmt_val"] %>%;">
        -
        严重<%= @sonar_issues["msr"][2]["frmt_val"] %>%;">
        -
        主要<%= @sonar_issues["msr"][3]["frmt_val"] %>%;">
        -
        次要<%= @sonar_issues["msr"][4]["frmt_val"] %>%;">
        +
        阻断<%= @sonar_issues["msr"][1]["frmt_val"] %>%;">
        +
        严重<%= @sonar_issues["msr"][2]["frmt_val"] %>%;">
        +
        主要<%= @sonar_issues["msr"][3]["frmt_val"] %>%;">
        +
        次要<%= @sonar_issues["msr"][4]["frmt_val"] %>%;">
        信息<%= @sonar_issues["msr"][5]["frmt_val"] %>%;">
        diff --git a/app/views/quality_analysis/create.js.erb b/app/views/quality_analysis/create.js.erb new file mode 100644 index 000000000..f6955106f --- /dev/null +++ b/app/views/quality_analysis/create.js.erb @@ -0,0 +1 @@ +<% %> \ No newline at end of file diff --git a/app/views/repositories/_quality_analysis.html.erb b/app/views/repositories/_quality_analysis.html.erb index 0b3f38ee3..e0240c257 100644 --- a/app/views/repositories/_quality_analysis.html.erb +++ b/app/views/repositories/_quality_analysis.html.erb @@ -1,6 +1,6 @@
        代码质量分析
        - <%= form_tag( url_for(:controller => 'quality_analysis', :action => 'create', :project_id => @project.id, :user_id => User.current.id, :identifier => @repository.identifier, :rep_id => @repository.id), :remote => true, :id => 'quality_analyses_form') do %> + <%= form_tag( url_for(:controller => 'quality_analysis', :action => 'create', :project_id => @project.id, :user_id => User.current.id, :identifier => @repository.identifier, :rep_id => @repository.id), :id => 'quality_analyses_form') do %>
        diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index 5f4288262..6bc01c83c 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -4,7 +4,9 @@ ZIP下载 <%# if is_project_manager?(User.current, @project.id) && QualityAnalysis.where(:project_id => @project.id).first.nil? %> <%# if User.current.member_of?(@project) %> + <% if quality_analysis(User.current.try(:login), @repository.id).nil? %> <%= link_to "质量分析", quality_analysis_path(:id => @project.id), :remote => true, :class => "btn_zipdown fr" %> + <% end %> <%# end %> <%# else %> <%#= link_to "质量分析", project_quality_analysis_path(:project_id => @project.id, :resource_id => @proje), :class => "btn_zipdown fr" %> diff --git a/public/stylesheets/public.css b/public/stylesheets/public.css index 743c81014..2ab150405 100644 --- a/public/stylesheets/public.css +++ b/public/stylesheets/public.css @@ -28,6 +28,7 @@ h2{ font-size:18px; } h3{ font-size:14px; } h4{ font-size:14px; } .f8 {font-size:8px;} +.f10 {font-size:10px;} .f12{font-size:12px; font-weight:normal;} .f14{font-size:14px;} .f16{font-size:16px;} From 300ad6840537cc2ea92bac3f183e1951d7b6e5c5 Mon Sep 17 00:00:00 2001 From: Your Name Date: Tue, 28 Jun 2016 17:39:58 +0800 Subject: [PATCH 168/216] default path for sonar --- .../quality_analysis_controller.rb | 3 +-- app/views/repositories/show.html.erb | 20 ++++++++++--------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index 591cef596..7b0bc5327 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -26,9 +26,8 @@ class QualityAnalysisController < ApplicationController unless @client.job.exists?(job_name) @g = Gitlab.client branch = params[:branch] - logger.error("##################################{branch}") language = params[:language] - path = params[:path] + path = params[:path].nil? ? "./" :params[:path] qa = QualityAnalysis.where(:project_id => @project.id, :author_login => user_name).first version = qa.nil? ? 1 : qa.sonar_version + 1 properties = "sonar.projectKey=#{sonar_name} diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index 6bc01c83c..0f179d150 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -1,16 +1,18 @@ <%= call_hook(:view_repositories_show_contextual, {:repository => @repository, :project => @project}) %>

        <%= render :partial => 'breadcrumbs', :locals => {:path => @path, :kind => 'dir', :revision => @rev} %>

        - ZIP下载 - <%# if is_project_manager?(User.current, @project.id) && QualityAnalysis.where(:project_id => @project.id).first.nil? %> - <%# if User.current.member_of?(@project) %> - <% if quality_analysis(User.current.try(:login), @repository.id).nil? %> - <%= link_to "质量分析", quality_analysis_path(:id => @project.id), :remote => true, :class => "btn_zipdown fr" %> - <% end %> - <%# end %> - <%# else %> + <% unless @entries.nil? %> + ZIP下载 + <%# if is_project_manager?(User.current, @project.id) && QualityAnalysis.where(:project_id => @project.id).first.nil? %> + <%# if User.current.member_of?(@project) %> + <% if quality_analysis(User.current.try(:login), @repository.id).nil? %> + <%= link_to "质量分析", quality_analysis_path(:id => @project.id), :remote => true, :class => "btn_zipdown fr" %> + <% end %> + <%# end %> + <%# else %> <%#= link_to "质量分析", project_quality_analysis_path(:project_id => @project.id, :resource_id => @proje), :class => "btn_zipdown fr" %> - <%# end %> + <%# end %> + <% end %>
        <% if @entries.nil? %> From 3c425edc3c3fb9bbb737db2d64f51775e23ff2c3 Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Tue, 28 Jun 2016 17:46:27 +0800 Subject: [PATCH 169/216] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=82=80=E8=AF=B7?= =?UTF-8?q?=E7=A0=81=E4=BC=9A=E5=8F=98=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/models/course.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/models/course.rb b/app/models/course.rb index a562f91b7..f286a2443 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -470,6 +470,7 @@ class Course < ActiveRecord::Base if !code || code.size <5 code = CODES.sample(5).join return generate_invite_code if Course.where(invite_code: code).present? + self[:invite_code] = code save! && reload end code From 222855ea796e9ea30321f18b834775c2ffcd350e Mon Sep 17 00:00:00 2001 From: guange <8863824@gmail.com> Date: Tue, 28 Jun 2016 19:19:59 +0800 Subject: [PATCH 170/216] =?UTF-8?q?=E8=B6=8A=E8=BF=87course=E8=A1=A8?= =?UTF-8?q?=E7=9A=84validate,=E4=BB=A5=E9=98=B2save=20invitecode=20?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 6 +++++- app/models/course.rb | 3 +-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Gemfile b/Gemfile index b482cb6fd..eef93c371 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,11 @@ source 'https://ruby.taobao.org/' unless RUBY_PLATFORM =~ /w32/ # unix-like only gem 'iconv' - gem "rmagick", "= 2.13.1" ## centos yum install ImageMagick-devel + if RUBY_PLATFORM =~ /darwin/ + gem "rmagick", "= 2.15.4" ## osx must be this version + else + gem "rmagick", "= 2.13.1" ## centos yum install ImageMagick-devel + end gem 'certified' end diff --git a/app/models/course.rb b/app/models/course.rb index f286a2443..0c4acce97 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -470,8 +470,7 @@ class Course < ActiveRecord::Base if !code || code.size <5 code = CODES.sample(5).join return generate_invite_code if Course.where(invite_code: code).present? - self[:invite_code] = code - save! && reload + update_attribute(:invite_code, code) end code end From 0a684227b8d58fa2d6a6b1766dc4a9b22df4e45a Mon Sep 17 00:00:00 2001 From: huang Date: Tue, 28 Jun 2016 22:01:44 +0800 Subject: [PATCH 171/216] =?UTF-8?q?=E5=A6=82=E6=9E=9Csonar=E6=B2=A1?= =?UTF-8?q?=E6=89=AB=E6=8F=8F=E5=AE=8C=E6=88=90=E5=88=99=E6=9A=82=E6=97=B6?= =?UTF-8?q?=E4=B8=8D=E8=AF=BB=E5=8F=96=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/quality_analysis_controller.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index 7b0bc5327..40e1c81de 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -77,12 +77,12 @@ class QualityAnalysisController < ApplicationController begin @resource_id = params[:resource_id] @sonar_address = Redmine::Configuration['sonar_address'] - # projects_date = open(@sonar_address + "/api/projects/index").read - # @arr = JSON.parse(projects_date).map {|m| m["nm"]} # ["Hjqreturn:cc_rep", "Hjqreturn:putong", "Hjqreturn:sonar_rep2", "shitou:sonar_rep"] if params[:resource_id].nil? @name_flag = true - # @quality_analyses = QualityAnalysis.where("sonar_name in (#{arr.empty? ? '0': arr.join(',')})") - @quality_analyses = QualityAnalysis.where(:project_id => @project.id) + projects_date = open(@sonar_address + "/api/projects/index").read + arr = JSON.parse(projects_date).map {|m| m["nm"]} # eg: ["Hjqreturn:cc_rep", "Hjqreturn:putong", "Hjqreturn:sonar_rep2", "shitou:sonar_rep"] + quality_analyses = QualityAnalysis.where(:project_id => @project.id) + @quality_analyses.collect{|qa| arr.include?(qa.sonar_name)} else complexity_date = open(@sonar_address + "/api/resources/index?resource=#{@resource_id}&depth=0&metrics=sqale_rating,function_complexity,duplicated_lines_density,comment_lines_density,sqale_index,lines,file_line,files,functions,classes,directories").read @complexity =JSON.parse(complexity_date).first From c24fdee13464843ca86f393f9737ae1df79a1ddb Mon Sep 17 00:00:00 2001 From: Linda <2294690300@qq.com> Date: Wed, 29 Jun 2016 08:48:13 +0800 Subject: [PATCH 172/216] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E8=B5=84=E6=96=99?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=96=B0=E7=89=88=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 2 +- app/views/my/account.html.erb | 47 +++++++++++------------------------ 2 files changed, 16 insertions(+), 33 deletions(-) diff --git a/Gemfile b/Gemfile index d392c6561..a1ea263f5 100644 --- a/Gemfile +++ b/Gemfile @@ -6,7 +6,7 @@ unless RUBY_PLATFORM =~ /w32/ gem 'iconv' end -gem 'certified' +# gem 'certified' gem 'wechat',path: 'lib/wechat' gem 'grack', path:'lib/grack' diff --git a/app/views/my/account.html.erb b/app/views/my/account.html.erb index 9cca5da5c..f28ad1ca2 100644 --- a/app/views/my/account.html.erb +++ b/app/views/my/account.html.erb @@ -15,14 +15,13 @@ <%= error_messages_for 'user',@user.user_extensions %> <% end %>
          -
        • 登录名 : *
        • -
        • 邮箱 : *
        • -
        • 身份 : *
        • -
        • 姓(Last Name) : *
        • -
        • 名(First Name) : *
        • +
        • *  登录名 : 
        • +
        • *  邮箱 : 
        • +
        • *  职业 : 
        • +
        • *  姓名 : 
        • 组织名 : *
        • 性别 : 
        • -
        • 工作单位 : 
        • +
        • 单位名称 : 
        • 地区 : 
        • 邮件通知 : 
        • @@ -66,34 +65,18 @@
        • <%= f.text_field :lastname,:no_label=>true, :required => true,:nh_required=>"1",:class=>"w210" %> -
        • <%= f.text_field :firstname,:no_label=>true, :required => true,:nh_required=>"1",:class=>"w210" %> +
        • <%= text_field_tag :enterprise_name,@user.firstname,:no_label=>true, :required => true,:nh_required=>"1",:class=>"w210" %>
        • - + +
        • -
        • - <% if User.current.user_extensions.nil? %> - - - - - <% elsif User.current.user_extensions.identity == 3 || User.current.user_extensions.identity == 2 %> - - - - - <% elsif User.current.user_extensions.school.nil? %> - - - - - <% else %> - - - - - <% end %> +
        • + +

          您输入的名称尚不存在,申请添加

        • @@ -140,13 +123,13 @@
        • <%= select_tag( 'user[mail_notification]', options_for_select( user_mail_notification_options(@user), @user.mail_notification) ) %> - +
        • <%= f.select :language, :Chinese => :zh, :English => :en %>
        • - 确认 + 确定
        • From 22b40c082cd71de2873af3136437908a10f8d1af Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 29 Jun 2016 09:10:47 +0800 Subject: [PATCH 173/216] resole some nil problems --- .../quality_analysis_controller.rb | 2 +- .../quality_analysis/_hightchars.html.erb | 6 +- app/views/quality_analysis/_show.html.erb | 94 +++++++++++-------- app/views/repositories/show.html.erb | 4 +- 4 files changed, 62 insertions(+), 44 deletions(-) diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index 7b0bc5327..9ea602659 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -27,7 +27,7 @@ class QualityAnalysisController < ApplicationController @g = Gitlab.client branch = params[:branch] language = params[:language] - path = params[:path].nil? ? "./" :params[:path] + path = params[:path].blank? ? "./" : params[:path] qa = QualityAnalysis.where(:project_id => @project.id, :author_login => user_name).first version = qa.nil? ? 1 : qa.sonar_version + 1 properties = "sonar.projectKey=#{sonar_name} diff --git a/app/views/quality_analysis/_hightchars.html.erb b/app/views/quality_analysis/_hightchars.html.erb index fb60eaed3..278851ad5 100644 --- a/app/views/quality_analysis/_hightchars.html.erb +++ b/app/views/quality_analysis/_hightchars.html.erb @@ -209,7 +209,7 @@ }, series: [{ name: '复杂度', - data: [<%= @complexity["msr"][6]["val"] %>] + data: [<%= @complexity["msr"][6].nil? ? 0 : @complexity["msr"][6]["val"] %>] // tooltip: { // valueSuffix: ' km/h' // } @@ -329,7 +329,7 @@ }, series: [{ name: '重复率', - data: [<%= @complexity["msr"][7]["val"] %>] + data: [<%= @complexity["msr"][7].nil? ? 0 : @complexity["msr"][7]["val"] %>] // tooltip: { // valueSuffix: ' km/h' // } @@ -454,7 +454,7 @@ }, series: [{ name: '质量等级', - data: [<%= @complexity["msr"][5]["val"] %>] + data: [<%= @complexity["msr"][5].nil? ? 0 : @complexity["msr"][5]["val"] %>] // tooltip: { // valueSuffix: ' km/h' // } diff --git a/app/views/quality_analysis/_show.html.erb b/app/views/quality_analysis/_show.html.erb index 4f8c21fe3..0a522df52 100644 --- a/app/views/quality_analysis/_show.html.erb +++ b/app/views/quality_analysis/_show.html.erb @@ -1,5 +1,4 @@ <%= javascript_include_tag 'highcharts','highcharts-more' %> -<%= render :partial => "hightchars" %>

          质量分析

          @@ -7,66 +6,85 @@
          项目代码质量分析报告
          概要信息
          -
          -
          -
          -

          -

          质量等级

          -

          <%= @complexity["msr"][9]["frmt_val"] %> borderRadius"><%= sqale_rating_status(@complexity["msr"][9]["val"].to_i)[0] %>

          +<% if @complexity["msr"].count > 3 %> + <%= render :partial => "hightchars" %> +
          +
          +
          +

          +

          质量等级

          +

          <%= @complexity["msr"][9].nil? ? 0 : @complexity["msr"][9]["frmt_val"] %> + borderRadius"><%= @complexity["msr"][9].nil? ? 0 : sqale_rating_status(@complexity["msr"][9]["val"].to_i)[0] %>

          +
          +
          +

          +

          复杂度

          +

          <%= @complexity["msr"][6].nil? ? 0 : @complexity["msr"][6]["val"] %> + borderRadius"><%= @complexity["msr"][6].nil? ? 0 : complexity_status(@complexity["msr"][6]["val"].to_i)[0] %>

          +
          -
          -

          -

          复杂度

          -

          <%= @complexity["msr"][6]["val"] %> borderRadius"><%= complexity_status(@complexity["msr"][6]["val"].to_i)[0] %>

          +
          +
          +

          +

          代码重复度

          +

          <%= @complexity["msr"][7].nil? ? 0 : @complexity["msr"][7]["frmt_val"] %> + borderRadius"><%= @complexity["msr"][7].nil? ? 0 : duplicated_lines_density_status(@complexity["msr"][7]["val"].to_i)[0] %>

          +
          +
          +

          +

          注释率

          +

          <%= @complexity["msr"][5].nil? ? 0 : @complexity["msr"][5]["frmt_val"] %> + borderRadius"><%= @complexity["msr"][5].nil? ? 0 : comment_lines_density_status(@complexity["msr"][5]["val"].to_i)[0] %>

          +
          -
          -
          -

          -

          代码重复度

          -

          <%= @complexity["msr"][7]["frmt_val"] %> borderRadius"><%= duplicated_lines_density_status(@complexity["msr"][7]["val"].to_i)[0] %>

          -
          -
          -

          -

          注释率

          -

          <%= @complexity["msr"][5]["frmt_val"] %> borderRadius"><%=comment_lines_density_status(@complexity["msr"][5]["val"].to_i)[0] %>

          -
          -
          -
          -
          质量等级<%= score_sqale_rating(@complexity["msr"][9]["val"].to_i) %>/5分可定性评价为:质量<%= sqale_rating_status(@complexity["msr"][9]["val"])[0] %>
          +<% end %> + +
          质量等级<%=@complexity["msr"][9].nil? ? 0 : score_sqale_rating(@complexity["msr"][9]["val"].to_i) %>/5分 + 可定性评价为:质量<%=@complexity["msr"][9].nil? ? 0 : sqale_rating_status(@complexity["msr"][9]["val"])[0] %>
          -
          技术债务<%= @complexity["msr"][8]["frmt_val"] %>查看详情
          +
          技术债务<%=@complexity["msr"][8].nil? ? 0 : @complexity["msr"][8]["frmt_val"] %> + 查看详情
          质量问题 - <%= @sonar_issues["msr"][0]["frmt_val"] %>问题分类如下:
          + <%=@sonar_issues["msr"][0].nil? ? 0 : @sonar_issues["msr"][0]["frmt_val"] %>问题分类如下:
          -
          阻断<%= @sonar_issues["msr"][1]["frmt_val"] %>%;">
          -
          严重<%= @sonar_issues["msr"][2]["frmt_val"] %>%;">
          -
          主要<%= @sonar_issues["msr"][3]["frmt_val"] %>%;">
          -
          次要<%= @sonar_issues["msr"][4]["frmt_val"] %>%;">
          -
          信息<%= @sonar_issues["msr"][5]["frmt_val"] %>%;">
          +
          阻断 + <%= @sonar_issues["msr"][1].nil? ? 0 : @sonar_issues["msr"][1]["frmt_val"] %> + %;">
          +
          严重 + <%= @sonar_issues["msr"][2].nil? ? 0 : @sonar_issues["msr"][2]["frmt_val"] %> + %;">
          +
          主要 + <%= @sonar_issues["msr"][3].nil? ? 0 : @sonar_issues["msr"][3]["frmt_val"] %> + %;">
          +
          次要 + <%=@sonar_issues["msr"][4].nil? ? 0 : @sonar_issues["msr"][4]["frmt_val"] %> + %;">
          +
          信息 + <%=@sonar_issues["msr"][5].nil? ? 0 : @sonar_issues["msr"][5]["frmt_val"] %>%;">
          -
          代码规模可定性评价为:<%= lines_scale(@complexity["msr"][0]["frmt_val"].to_i) %>
          +
          代码规模可定性评价为:<%=@complexity["msr"][0].nil? ? 0 : lines_scale(@complexity["msr"][0]["frmt_val"].to_i) %>

          代码行数

          -

          <%= @complexity["msr"][0]["frmt_val"] %>

          +

          <%= @complexity["msr"][0].nil? ? 0 : @complexity["msr"][0]["frmt_val"] %>

          文件

          -

          <%= @complexity["msr"][2]["frmt_val"] %>

          +

          <%= @complexity["msr"][2].nil? ? 0 : @complexity["msr"][2]["frmt_val"] %>

          目录

          -

          <%= @complexity["msr"][3]["frmt_val"] %>

          +

          <%= @complexity["msr"][3].nil? ? 0 : @complexity["msr"][3]["frmt_val"] %>

          -

          <%= @complexity["msr"][1]["frmt_val"] %>

          +

          <%= @complexity["msr"][1].nil? ? 0 : @complexity["msr"][1]["frmt_val"] %>

          方法

          -

          <%= @complexity["msr"][4]["frmt_val"] %>

          +

          <%=@complexity["msr"][4].nil? ? 0 : @complexity["msr"][4]["frmt_val"] %>

          diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index 0f179d150..92769dbbe 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -5,9 +5,9 @@ ZIP下载 <%# if is_project_manager?(User.current, @project.id) && QualityAnalysis.where(:project_id => @project.id).first.nil? %> <%# if User.current.member_of?(@project) %> - <% if quality_analysis(User.current.try(:login), @repository.id).nil? %> + <%# if quality_analysis(User.current.try(:login), @repository.id).nil? %> <%= link_to "质量分析", quality_analysis_path(:id => @project.id), :remote => true, :class => "btn_zipdown fr" %> - <% end %> + <%# end %> <%# end %> <%# else %> <%#= link_to "质量分析", project_quality_analysis_path(:project_id => @project.id, :resource_id => @proje), :class => "btn_zipdown fr" %> From c151a619800cd63dc62995b5d71496d92abe67bc Mon Sep 17 00:00:00 2001 From: yuanke <249218296@qq.com> Date: Wed, 29 Jun 2016 09:14:53 +0800 Subject: [PATCH 174/216] =?UTF-8?q?=E6=8A=8A=E5=87=A0=E4=B8=AAgem=E5=8C=85?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E6=94=BE=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Gemfile | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index eef93c371..bb94100a5 100644 --- a/Gemfile +++ b/Gemfile @@ -9,12 +9,11 @@ unless RUBY_PLATFORM =~ /w32/ gem "rmagick", "= 2.13.1" ## centos yum install ImageMagick-devel end gem 'certified' + gem 'net-ssh', '2.9.1' + gem 'jenkins_api_client' + gem 'nokogiri' end -gem 'net-ssh', '2.9.1' -gem 'jenkins_api_client' -gem 'nokogiri' - gem 'wechat',path: 'lib/wechat' gem 'grack', path:'lib/grack' gem 'gitlab', path: 'lib/gitlab-cli' From e887ac5c7c500b91d29522c47483e67316c10eaf Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 29 Jun 2016 09:38:30 +0800 Subject: [PATCH 175/216] git data from sonar --- app/controllers/quality_analysis_controller.rb | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index eb20426e3..ceac41399 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -66,10 +66,10 @@ class QualityAnalysisController < ApplicationController rescue => e puts e end - respond_to do |format| - format.html{redirect_to project_quality_analysis_path(:project_id => @project.id, :resource_id => sonar_name, :branch => branch)} - format.js - end + # respond_to do |format| + # format.html{redirect_to project_quality_analysis_path(:project_id => @project.id, :resource_id => sonar_name, :branch => branch)} + # format.js + # end end # resource_id: login + @repository.id @@ -81,8 +81,8 @@ class QualityAnalysisController < ApplicationController @name_flag = true projects_date = open(@sonar_address + "/api/projects/index").read arr = JSON.parse(projects_date).map {|m| m["nm"]} # eg: ["Hjqreturn:cc_rep", "Hjqreturn:putong", "Hjqreturn:sonar_rep2", "shitou:sonar_rep"] - quality_analyses = QualityAnalysis.where(:project_id => @project.id) - @quality_analyses.collect{|qa| arr.include?(qa.sonar_name)} + @quality_analyses = QualityAnalysis.where(:project_id => @project.id).select{|qa| arr.include?(qa.sonar_name)} + else complexity_date = open(@sonar_address + "/api/resources/index?resource=#{@resource_id}&depth=0&metrics=sqale_rating,function_complexity,duplicated_lines_density,comment_lines_density,sqale_index,lines,file_line,files,functions,classes,directories").read @complexity =JSON.parse(complexity_date).first From c8178fc02370d7046ed474dd75cd3b5702a2444e Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 29 Jun 2016 09:59:21 +0800 Subject: [PATCH 176/216] allert --- app/controllers/quality_analysis_controller.rb | 15 ++++++++++++++- app/views/quality_analysis/create.js.erb | 2 +- app/views/repositories/_quality_analysis.html.erb | 4 ++-- app/views/repositories/show.html.erb | 6 +++--- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index ceac41399..852277126 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -26,7 +26,7 @@ class QualityAnalysisController < ApplicationController unless @client.job.exists?(job_name) @g = Gitlab.client branch = params[:branch] - language = params[:language] + language = swith_language_type(params[:language]) path = params[:path].blank? ? "./" : params[:path] qa = QualityAnalysis.where(:project_id => @project.id, :author_login => user_name).first version = qa.nil? ? 1 : qa.sonar_version + 1 @@ -72,6 +72,19 @@ class QualityAnalysisController < ApplicationController # end end + # get language type + def swith_language_type language + if language = "c#" + "cs" + elsif language = "python" + "py" + elsif language = "c" + "c++" + else + language + end + end + # resource_id: login + @repository.id def index begin diff --git a/app/views/quality_analysis/create.js.erb b/app/views/quality_analysis/create.js.erb index f6955106f..4bb632b43 100644 --- a/app/views/quality_analysis/create.js.erb +++ b/app/views/quality_analysis/create.js.erb @@ -1 +1 @@ -<% %> \ No newline at end of file +alert("dengdai") \ No newline at end of file diff --git a/app/views/repositories/_quality_analysis.html.erb b/app/views/repositories/_quality_analysis.html.erb index e0240c257..b6eb62124 100644 --- a/app/views/repositories/_quality_analysis.html.erb +++ b/app/views/repositories/_quality_analysis.html.erb @@ -1,6 +1,6 @@
          代码质量分析
          - <%= form_tag( url_for(:controller => 'quality_analysis', :action => 'create', :project_id => @project.id, :user_id => User.current.id, :identifier => @repository.identifier, :rep_id => @repository.id), :id => 'quality_analyses_form') do %> + <%= form_tag( url_for(:controller => 'quality_analysis', :action => 'create', :project_id => @project.id, :user_id => User.current.id, :identifier => @repository.identifier, :rep_id => @repository.id, :remote => true), :id => 'quality_analyses_form') do %>
          @@ -12,7 +12,7 @@
          - <%= select_tag :language, options_for_select(["java","python","ruby","c++","c#", "Web"]), :id => 'branch', :class => "analysis-option-box" %> + <%= select_tag :language, options_for_select(["java","python","ruby","c++","c#","c"]), :id => 'branch', :class => "analysis-option-box" %>
          diff --git a/app/views/repositories/show.html.erb b/app/views/repositories/show.html.erb index 92769dbbe..b524e898f 100644 --- a/app/views/repositories/show.html.erb +++ b/app/views/repositories/show.html.erb @@ -5,9 +5,9 @@ ZIP下载 <%# if is_project_manager?(User.current, @project.id) && QualityAnalysis.where(:project_id => @project.id).first.nil? %> <%# if User.current.member_of?(@project) %> - <%# if quality_analysis(User.current.try(:login), @repository.id).nil? %> - <%= link_to "质量分析", quality_analysis_path(:id => @project.id), :remote => true, :class => "btn_zipdown fr" %> - <%# end %> + <% if quality_analysis(User.current.try(:login), @repository.id).nil? %> + <%= link_to "质量分析", quality_analysis_path(:id => @project.id), :remote => true, :class => "btn_zipdown fr" %> + <% end %> <%# end %> <%# else %> <%#= link_to "质量分析", project_quality_analysis_path(:project_id => @project.id, :resource_id => @proje), :class => "btn_zipdown fr" %> From 36944e8cce43be6b5c08917b26ee8ca91057321b Mon Sep 17 00:00:00 2001 From: huang Date: Wed, 29 Jun 2016 10:06:23 +0800 Subject: [PATCH 177/216] =?UTF-8?q?=E6=8F=90=E7=A4=BA=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/quality_analysis/create.js.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/quality_analysis/create.js.erb b/app/views/quality_analysis/create.js.erb index 4bb632b43..8f93f86ee 100644 --- a/app/views/quality_analysis/create.js.erb +++ b/app/views/quality_analysis/create.js.erb @@ -1 +1 @@ -alert("dengdai") \ No newline at end of file +alert("正在分析中…………(大概需要30分钟,请耐心等待)") \ No newline at end of file From e0664450364ca5d571942d2c37eeb3ac8d09fa28 Mon Sep 17 00:00:00 2001 From: cxt Date: Wed, 29 Jun 2016 10:45:56 +0800 Subject: [PATCH 178/216] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E5=A4=A7=E7=BA=B2?= =?UTF-8?q?=E7=9A=84=E6=98=BE=E7=A4=BA=E5=92=8C=E7=BC=96=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/syllabuses_controller.rb | 28 +++++--- app/controllers/users_controller.rb | 10 ++- app/helpers/owner_type_helper.rb | 3 +- app/models/attachment.rb | 1 + app/models/course.rb | 3 +- app/models/syllabus.rb | 9 +++ app/services/courses_service.rb | 1 + app/views/courses/_copy_course.html.erb | 18 +++--- app/views/courses/new.html.erb | 3 +- app/views/courses/settings.html.erb | 25 ++++---- app/views/layouts/_project_info.html.erb | 32 ++++----- app/views/layouts/_user_courses.html.erb | 4 +- app/views/layouts/base_courses.html.erb | 7 +- app/views/layouts/base_syllabus.html.erb | 47 ++++++++------ app/views/layouts/new_base_user.html.erb | 3 +- app/views/syllabuses/edit.html.erb | 82 ++++++++++++++++++++++++ app/views/syllabuses/show.html.erb | 44 +++++++++++++ app/views/users/user_courses4show.js.erb | 2 +- config/locales/courses/zh.yml | 4 +- public/javascripts/syllabus.js | 22 +++++++ 20 files changed, 262 insertions(+), 86 deletions(-) create mode 100644 app/views/syllabuses/edit.html.erb diff --git a/app/controllers/syllabuses_controller.rb b/app/controllers/syllabuses_controller.rb index 5ee3224bd..7e4e5cea8 100644 --- a/app/controllers/syllabuses_controller.rb +++ b/app/controllers/syllabuses_controller.rb @@ -1,7 +1,7 @@ class SyllabusesController < ApplicationController - before_filter :is_logged, :only => [:index, :show] - before_filter :find_syllabus, :only => [:show] + before_filter :is_logged, :only => [:index, :show, :edit, :new, :update] + before_filter :find_syllabus, :only => [:show, :edit, :update] def index user = User.current @syllabuses = user.syllabuses @@ -17,12 +17,8 @@ class SyllabusesController < ApplicationController end def new - if User.current.login? - @syllabus = Syllabus.new - render :layout => 'new_base' - else - redirect_to signin_url - end + @syllabus = Syllabus.new + render :layout => 'new_base' end def create @@ -47,6 +43,22 @@ class SyllabusesController < ApplicationController end end + def edit + respond_to do |format| + format.html{render :layout => 'base_syllabus'} + end + end + + def update + @syllabus.description = params[:syllabus][:description] + @syllabus.save_attachments(params[:attachments]) + if @syllabus.save + redirect_to syllabus_path(@syllabus) + else + redirect_to syllabus_path(@syllabus) + end + end + private def find_syllabus @syllabus = Syllabus.find params[:id] diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index b7972ff6f..39a2ae5a5 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1367,7 +1367,15 @@ class UsersController < ApplicationController #显示更多用户课程 def user_courses4show @page = params[:page].to_i + 1 - @courses = @user.courses.visible.where("is_delete =?", 0).select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS a").order("a desc").limit(5).offset(@page * 5) + @type = params[:type] + if @type == 'User' + @courses = @user.courses.visible.where("is_delete =?", 0).select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS a").order("a desc").limit(5).offset(@page * 5) + @all_count = @user.courses.visible.where("is_delete =?", 0).count + elsif @type == 'Syllabus' + @syllabus = Syllabus.where("id = #{params[:syllabus_id]}").first + @courses = User.current.courses.visible.where("is_delete =? and syllabus_id =?", 0, @syllabus.id).select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS a").order("a desc").limit(5).offset(@page * 5) + @all_count = User.current.courses.visible.where("is_delete =? and syllabus_id =?", 0, @syllabus.id).count + end end #显示更多用户项目 diff --git a/app/helpers/owner_type_helper.rb b/app/helpers/owner_type_helper.rb index 7119d4f60..01320660c 100644 --- a/app/helpers/owner_type_helper.rb +++ b/app/helpers/owner_type_helper.rb @@ -7,5 +7,6 @@ module OwnerTypeHelper BID = 6 JOURNALSFORMESSAGE = 7 HOMEWORKCOMMON = 8 - BLOGCOMMENT=9 + BLOGCOMMENT = 9 + SYLLABUS = 10 end \ No newline at end of file diff --git a/app/models/attachment.rb b/app/models/attachment.rb index aa4ef8670..88fadd644 100644 --- a/app/models/attachment.rb +++ b/app/models/attachment.rb @@ -24,6 +24,7 @@ class Attachment < ActiveRecord::Base belongs_to :course, foreign_key: 'container_id', conditions: "attachments.container_type = 'Course'" belongs_to :org_subfield, foreign_key: 'container_id', conditions: "attachements.container_type = 'OrgSubfield'" belongs_to :organization, foreign_key: 'container_id', conditions: "attachements.container_type = 'Organization'" + belongs_to :syllabus, foreign_key: 'container_id', conditions: "attachements.container_type = 'Syllabus'" belongs_to :softapplication, foreign_key: 'container_id', conditions: "attachments.container_type = 'Softapplication'" belongs_to :author, :class_name => "User", :foreign_key => "author_id" belongs_to :attachmentstype, :foreign_key => "attachtype",:primary_key => "id" diff --git a/app/models/course.rb b/app/models/course.rb index 195e7cf9f..7420e653f 100644 --- a/app/models/course.rb +++ b/app/models/course.rb @@ -90,7 +90,8 @@ class Course < ActiveRecord::Base 'description', 'class_period', 'open_student', - 'is_delete' + 'is_delete', + 'syllabus_id' acts_as_customizable diff --git a/app/models/syllabus.rb b/app/models/syllabus.rb index b1bdfd5aa..e16577ff3 100644 --- a/app/models/syllabus.rb +++ b/app/models/syllabus.rb @@ -1,7 +1,16 @@ class Syllabus < ActiveRecord::Base + include Redmine::SafeAttributes + include ApplicationHelper acts_as_taggable + acts_as_attachable + has_many_kindeditor_assets :assets, :dependent => :destroy belongs_to :user has_many :courses attr_accessible :description, :title, :eng_name, :type, :credit, :hours, :theory_hours, :practice_hours, :applicable_major, :pre_course + safe_attributes 'title', 'description', 'eng_name', 'type', 'credit', 'hours', 'theory_hours', 'practice_hours', 'credit', 'applicable_major', 'pre_course' + + def delete_kindeditor_assets + delete_kindeditor_assets_from_disk self.id,OwnerTypeHelper::SYLLABUS + end end diff --git a/app/services/courses_service.rb b/app/services/courses_service.rb index b7b5e73ac..68d062b65 100644 --- a/app/services/courses_service.rb +++ b/app/services/courses_service.rb @@ -260,6 +260,7 @@ class CoursesService course.send(:safe_attributes=, params[:course], current_user) #course.safe_attributes = params[:course] #course.password = params[:course][:password] + course.syllabus_id = params[:syllabus_id].to_i course.time = params[:time] course.term = params[:term] course.end_time = params[:end_time] diff --git a/app/views/courses/_copy_course.html.erb b/app/views/courses/_copy_course.html.erb index dbe03d67f..3fa0ee9fc 100644 --- a/app/views/courses/_copy_course.html.erb +++ b/app/views/courses/_copy_course.html.erb @@ -1,6 +1,6 @@ \ No newline at end of file diff --git a/app/views/syllabuses/edit.html.erb b/app/views/syllabuses/edit.html.erb index f4c0f75e4..395fa1c5b 100644 --- a/app/views/syllabuses/edit.html.erb +++ b/app/views/syllabuses/edit.html.erb @@ -7,42 +7,6 @@

          课程信息

          - <%= labelled_form_for @syllabus, :url =>syllabus_path(@syllabus), :html => {:nhname=>'form',:multipart => true, :id => 'syllabus-form'} do |f| %>
          @@ -64,19 +28,20 @@

          + +
          +
          + <%= render :partial => 'attachments/form_course', :locals => {:container => @syllabus, :isReply => false} %> +
          +
          + +
          + 发送 + + 取消 +
          +
          <% end %> -
          -
          - <%= render :partial => 'attachments/form_course', :locals => {:container => @syllabus, :isReply => false} %> -
          -
          - 发送 - - 取消 -
          -
          - -
          \ No newline at end of file diff --git a/app/views/syllabuses/show.html.erb b/app/views/syllabuses/show.html.erb index 57030c5d0..243f24115 100644 --- a/app/views/syllabuses/show.html.erb +++ b/app/views/syllabuses/show.html.erb @@ -1,42 +1,89 @@ +<%= content_for(:header_tags) do %> + <%= import_ke(enable_at: false, prettify: false, init_activity: true) %> +<% end %> +

          课程信息

          -
          - <% if @syllabus.description.nil?%> +<% if @syllabus.des_status == 1 && @syllabus.courses.empty? %> +
          <% if User.current == @syllabus.user %> -

          您建立的课程尚未填写课程大纲,请完善您的<%=link_to '课程大纲', edit_syllabus_path(@syllabus) %>!

          +

          您建立的课程还未创建班级,请 + <%= link_to "新建班级", new_course_path(:host=> Setting.host_course, :syllabus_id => @syllabus.id), :class => "syllabusbox_a_blue", :target => '_blank'%>。 +

          + <% elsif User.current.user_extensions && User.current.user_extensions.identity == 0 && User.current.allowed_to?(:add_course, nil, :global => true)%> +

          本课程下还未创建班级,请 + <%= link_to "新建班级", new_course_path(:host=> Setting.host_course, :syllabus_id => @syllabus.id), :class => "syllabusbox_a_blue", :target => '_blank'%>。 +

          + <% else %> +

          本课程下还未创建班级,敬请期待。 +

          + <% end %> +
          +<% end %> +
          + <% if @syllabus.des_status == 0%> + <% if User.current == @syllabus.user %> +

          您建立的课程尚未填写课程大纲,请完善您的<%=link_to '课程大纲', edit_syllabus_path(@syllabus), :class => 'syllabusbox_a_blue' %>!

          <% else %>

          <%=@syllabus.user.show_name %>老师尚未完成课程大纲的编写,敬请期待。

          <% end %> <% else %>
          - <%=@syllabus.description %> + <%=@syllabus.description.html_safe %>
          <%= render :partial=>"attachments/activity_attach", :locals=>{:activity => @syllabus} %>
          -
          -
            -
          • -
              -
            • <%=link_to '编辑', edit_syllabus_path(@syllabus),:class=>'postOptionLink' %>
            • -
            • 删除
            • + <% if User.current.logged? && User.current == @syllabus.user%> +
              +
                +
              • +
                  +
                • <%=link_to '编辑', edit_syllabus_path(@syllabus), :class => 'postOptionLink'%>
                • + <% if @syllabus.courses.empty? %> +
                • <%=link_to '删除', syllabus_path(@syllabus), :class => 'postOptionLink', :method => 'delete', :data => {:confirm => l(:text_are_you_sure)}%>
                • + <% end %> +
                +
              - -
            -
          -
          +
          +
          + <% end %> <% end %> -
          - -
          -
          用户头像
          -
          - - 发送
          + <% count=@syllabus.journals_for_messages.count %> +
          + <%= render :partial => 'users/reply_banner', :locals => {:count => count, :activity => @syllabus, :user_activity_id => @syllabus.id} %> + + <% comments = @syllabus.journals_for_messages.reorder("created_on desc").limit(3) %> + <% if count > 0 %> +
          + <%= render :partial => 'users/all_replies', :locals => {:comments => comments}%> +
          + <% end %> +
          +
          <%= link_to image_tag(url_to_avatar(User.current), :width => "33", :height => "33"), user_path(User.current), :alt => "用户头像" %>
          +
          + <% if User.current.logged? %> +
          + <%= form_for('new_form',:url => {:controller => 'words', :action => 'leave_syllabus_message', :id => @syllabus.id},:method => "post") do |f|%> +
          + + +
          +

          + <% end%> +
          + <% else %> + <%= render :partial => "users/show_unlogged" %> + <% end %> +
          +
          diff --git a/app/views/syllabuses/syllabus_courselist.html.erb b/app/views/syllabuses/syllabus_courselist.html.erb new file mode 100644 index 000000000..0b0713738 --- /dev/null +++ b/app/views/syllabuses/syllabus_courselist.html.erb @@ -0,0 +1 @@ +<%= render :partial => 'syllabus_course_list'%> \ No newline at end of file diff --git a/app/views/syllabuses/syllabus_courselist.js.erb b/app/views/syllabuses/syllabus_courselist.js.erb new file mode 100644 index 000000000..5433ea2c1 --- /dev/null +++ b/app/views/syllabuses/syllabus_courselist.js.erb @@ -0,0 +1 @@ +$("#course-list").replaceWith('<%= escape_javascript( render :partial => 'syllabus_course_list') %>'); \ No newline at end of file diff --git a/app/views/users/_course_news.html.erb b/app/views/users/_course_news.html.erb index efd3770aa..d4af9783e 100644 --- a/app/views/users/_course_news.html.erb +++ b/app/views/users/_course_news.html.erb @@ -74,7 +74,7 @@ <% end %>
          -
          <%= link_to image_tag(url_to_avatar(User.current), :width => "33", :height => "33"), user_path(activity.author_id), :alt => "用户头像" %>
          +
          <%= link_to image_tag(url_to_avatar(User.current), :width => "33", :height => "33"), user_path(User.current), :alt => "用户头像" %>
          <% if User.current.logged? %>
          diff --git a/app/views/users/_user_syllabus_list.html.erb b/app/views/users/_user_syllabus_list.html.erb new file mode 100644 index 000000000..4613e9e18 --- /dev/null +++ b/app/views/users/_user_syllabus_list.html.erb @@ -0,0 +1,75 @@ +
          +

          课程列表

          +
          + 排序: + <%= link_to "时间", {:controller => 'users', :action => 'user_courselist', :id =>@user, :type => @type, :sort => @c_sort, :order => 1 }, :class => "sortTxt fl", :remote => true %> + <% if @type.to_i == 1 %> + <%= link_to "", {:controller => 'users', :action => 'user_courselist', :id =>@user, :type => @type, :sort => @c_sort, :order => 1 }, :class => "#{@c_sort.to_i == 1 ? 'sortupbtn' : 'sortdownbtn'} fl", :remote => true %> + <% else %> + <%= link_to "", {:controller => 'users', :action => 'user_courselist', :id =>@user, :type => @type, :sort => @c_sort, :order => 1 }, :class => "sortdownbtn sort_no fl", :remote => true %> + <% end %> + <%= link_to "人气", {:controller => 'users', :action => 'user_courselist', :id =>@user, :type => @type, :sort => @c_sort, :order => 2 }, :class => "sortTxt fl", :remote => true %> + <% if @type.to_i == 2 %> + <%= link_to "", {:controller => 'users', :action => 'user_courselist', :id =>@user, :type => @type, :sort => @c_sort, :order => 2 }, :class => "#{@c_sort.to_i == 1 ? 'sortupbtn' : 'sortdownbtn'} fl", :remote => true %> + <% else %> + <%= link_to "", {:controller => 'users', :action => 'user_courselist', :id =>@user, :type => @type, :sort => @c_sort, :order => 2 }, :class => "sortdownbtn sort_no fl", :remote => true %> + <% end %> +
          +
          + +
          + <% if @syllabus.any? %> + <% @syllabus.each do |syllabus|%> +
          +
          + +

          <%=syllabus.title %>

          +
          + <%=link_to '管理课程', syllabus_path(syllabus.id), :class => 'icons_sy_setting fr' %> +

          更新时间:2016-05-05创建老师:豆蔻

          +
          +
          + + <% end %> +
          +
            + <%= pagination_links_full @atta_pages, @atta_count, :per_page_links => false, :remote => @is_remote, :flag => true %> +
          +
          +
          + <% else %> +

          <%= l(:label_no_data) %>

          + <% end %> +
          +
          + + \ No newline at end of file diff --git a/app/views/users/user_courselist.html.erb b/app/views/users/user_courselist.html.erb index de0f647e2..148cc1703 100644 --- a/app/views/users/user_courselist.html.erb +++ b/app/views/users/user_courselist.html.erb @@ -1 +1 @@ -<%= render :partial => 'users/user_course_list'%> +<%= render :partial => 'users/user_syllabus_list'%> diff --git a/app/views/users/user_courselist.js.erb b/app/views/users/user_courselist.js.erb index 98c92be02..f6a69c288 100644 --- a/app/views/users/user_courselist.js.erb +++ b/app/views/users/user_courselist.js.erb @@ -1 +1 @@ -$("#course-list").replaceWith('<%= escape_javascript( render :partial => 'users/user_course_list') %>'); \ No newline at end of file +$("#course-list").replaceWith('<%= escape_javascript( render :partial => 'users/user_syllabus_list') %>'); \ No newline at end of file diff --git a/config/routes.rb b/config/routes.rb index 7e2998262..673bb2c69 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1075,7 +1075,7 @@ RedmineApp::Application.routes.draw do #课程大纲路由设置 resources :syllabuses do member do - + match 'syllabus_courselist', :to => 'syllabuses#syllabus_courselist', :via => :get, :as => 'syllabus_courselist' end collection do @@ -1201,6 +1201,7 @@ RedmineApp::Application.routes.draw do match 'projects/:id/feedback', :to => 'projects#feedback', :via => :get, :as => 'project_feedback' match 'project/:id/share', :to => 'projects#share', :as => 'share_show' #share post 'words/:id/leave_user_message', :to => 'words#leave_user_message', :as => "leave_user_message" + post 'words/:id/leave_syllabus_message', :to => 'words#leave_syllabus_message', :as => "leave_syllabus_message" post 'words/:id/leave_homework_message', :to => 'words#leave_homework_message', :as => "leave_homework_message" post 'words/:id/reply_to_homework', :to => 'words#reply_to_homework', :as => "reply_to_homework" diff --git a/db/migrate/20160629084146_add_visits_to_syllabus.rb b/db/migrate/20160629084146_add_visits_to_syllabus.rb new file mode 100644 index 000000000..7dc997e00 --- /dev/null +++ b/db/migrate/20160629084146_add_visits_to_syllabus.rb @@ -0,0 +1,5 @@ +class AddVisitsToSyllabus < ActiveRecord::Migration + def change + add_column :syllabuses, :visits, :integer, :default => 0 + end +end diff --git a/db/migrate/20160629094716_add_des_status_to_syllabus.rb b/db/migrate/20160629094716_add_des_status_to_syllabus.rb new file mode 100644 index 000000000..aa91bdd3c --- /dev/null +++ b/db/migrate/20160629094716_add_des_status_to_syllabus.rb @@ -0,0 +1,5 @@ +class AddDesStatusToSyllabus < ActiveRecord::Migration + def change + add_column :syllabuses, :des_status, :integer, :default => 0 + end +end diff --git a/db/schema.rb b/db/schema.rb index 5147a5c73..2502a941b 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20160627074232) do +ActiveRecord::Schema.define(:version => 20160629094716) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -1865,8 +1865,8 @@ ActiveRecord::Schema.define(:version => 20160627074232) do t.string "title" t.text "description" t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.string "eng_name" t.integer "type" t.integer "credit" @@ -1875,6 +1875,8 @@ ActiveRecord::Schema.define(:version => 20160627074232) do t.integer "practice_hours" t.string "applicable_major" t.string "pre_course" + t.integer "visits", :default => 0 + t.integer "des_status", :default => 0 end add_index "syllabuses", ["user_id"], :name => "index_syllabuses_on_user_id" diff --git a/public/images/syllabus/icons_syllabus.png b/public/images/syllabus/icons_syllabus.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6c4987cc280922e84f6cc32ed3750b0af87e52 GIT binary patch literal 21845 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 FzW^EbD|7$= literal 0 HcmV?d00001 diff --git a/public/stylesheets/syllabus.css b/public/stylesheets/syllabus.css index cbdd5808f..d73bbc8bf 100644 --- a/public/stylesheets/syllabus.css +++ b/public/stylesheets/syllabus.css @@ -79,7 +79,7 @@ input.syllabus_input_min{ height:34px; } a.syllabusbox_a_blue{ - color:#3b94d6; + color:#3b94d6 !important; } .syllabus_leftinfo p{ line-height:25px; @@ -110,7 +110,7 @@ a.syllabusbox_a_blue{ .syllabus_box{ width:750px; border:1px solid #e7e7e7; background-color:#fff;} .syllabus_courses_list{ padding:15px; border-bottom:1px solid #e7e7e7; cursor:pointer;} .syllabus_courses_list:hover{ background:#f6fafd;} -.syllabus_courses_title{ font-size:16px; color:#333; width:650px; font-weight:normal;white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } +a.syllabus_courses_title{ font-size:16px; color:#333; width:650px; font-weight:normal;white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } .sy_p_grey{ margin-left:25px; color:#888; margin-top:5px; font-size:12px;} .syllabus_class_box{ padding-left:30px; background:#f6f6f6;} .syllabus_class_list{ padding:12px 0 12px 15px; height:44px;border-left:1px solid #e7e7e7;border-bottom:1px solid #e7e7e7; position:relative;} @@ -127,9 +127,9 @@ a.syllabusbox_a_blue{ .listbox{ width:730px; background-color:#fff; border:1px solid #ddd; padding:10px; } .bloglistbox{ min-height:690px;} .list-h2{ font-size:16px; font-weight:bold; color:#000; padding-bottom:5px;} -.category{ } +.category2{ } .list_title{padding:10px 0; border-bottom:1px solid #ddd;} -.category a,.category span{ float:left; margin-right:5px;} +.category2 a,.category2 span{ float:left; margin-right:5px;} .grayTxt{ color:#9093a6;} .sortTxt{ color:#000;} .sortTxt:hover{ color:#28be6c;} From ac4218bfb0cea2642f7b18e9a0b9dae3e7f83d72 Mon Sep 17 00:00:00 2001 From: cxt Date: Thu, 30 Jun 2016 15:36:46 +0800 Subject: [PATCH 188/216] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E5=A4=A7=E7=BA=B2?= =?UTF-8?q?=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/users_controller.rb | 11 +-- app/helpers/courses_helper.rb | 9 ++ app/views/layouts/base_courses.html.erb | 7 +- app/views/users/_user_syllabus_list.html.erb | 88 ++++++++++++++------ public/javascripts/application.js | 19 +++++ public/stylesheets/syllabus.css | 2 +- 6 files changed, 99 insertions(+), 37 deletions(-) diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 43d12cadf..68e7f5590 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -3190,8 +3190,8 @@ class UsersController < ApplicationController # @courses = @user.courses.visible.where("is_delete =?", 0).order("#{sort_name} #{sort_type}") #@courses = @user.courses.visible.where("is_delete =?", 0).select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS #{sort_name}").order("#{sort_name} #{sort_type}") - courses = @user.courses.visible.where("is_delete =?", 0) - syllabus_ids = courses.empty? ? '(-1)' : "(" + courses.map{|course| !course.syllabus_id.nil? && course.syllabus_id}.join(",") + ")" + @courses = @user.courses.visible.where("is_delete =?", 0) + syllabus_ids = @courses.empty? ? '(-1)' : "(" + @courses.map{|course| !course.syllabus_id.nil? && course.syllabus_id}.join(",") + ")" @syllabus = Syllabus.where("id in #{syllabus_ids} or user_id = #{User.current.id}").order("#{sort_name} #{sort_type}") #根据 作业+资源数排序 @@ -3204,11 +3204,12 @@ class UsersController < ApplicationController # end # end @syllabus.each do |syllabus| - syllabus[:infocount] = 0 - courses = courses.select("syllabus_id = #{syllabus.id}") + count = 0 + courses = @courses.select("syllabus_id = #{syllabus.id}") courses.each do |c| - syllabus[:infocount] += (User.current.admin? || User.current.allowed_to?(:as_teacher,c)) ? (c.homework_commons.count + visable_attachemnts_incourse(c).count) : (c.homework_commons.where("publish_time <= '#{Date.today}'").count + visable_attachemnts_incourse(c).count) + count += (User.current.admin? || User.current.allowed_to?(:as_teacher,c)) ? (c.homework_commons.count + visable_attachemnts_incourse(c).count) : (c.homework_commons.where("publish_time <= '#{Date.today}'").count + visable_attachemnts_incourse(c).count) end + syllabus[:infocount] = count end @c_sort == 1 ? (@syllabus = @syllabus.sort{|x,y| x[:infocount] <=> y[:infocount] }) : (@syllabus = @syllabus.sort{|x,y| y[:infocount] <=> x[:infocount]}) @syllabus = sortby_time_countcommon_nosticky @syllabus,sort_name diff --git a/app/helpers/courses_helper.rb b/app/helpers/courses_helper.rb index fd3be1369..dd3abe3a8 100644 --- a/app/helpers/courses_helper.rb +++ b/app/helpers/courses_helper.rb @@ -789,6 +789,15 @@ module CoursesHelper result end + def visable_course_homework course + if User.current.admin? || User.current.allowed_to?(:as_teacher,course) + homework_num = course.homework_commons.count + else + homework_num = course.homework_commons.where("publish_time <= '#{Date.today}'").count + end + homework_num + end + def zh_course_role role if role == "TeachingAsistant" result = l(:label_TA) diff --git a/app/views/layouts/base_courses.html.erb b/app/views/layouts/base_courses.html.erb index 4b618bef1..8f4f443c0 100644 --- a/app/views/layouts/base_courses.html.erb +++ b/app/views/layouts/base_courses.html.erb @@ -1,11 +1,8 @@ <%# course_model %> <% course_file_num = visable_attachemnts_incourse(@course).count%> <% is_teacher = User.current.logged? && (User.current.admin? || User.current.allowed_to?(:as_teacher,@course)) %> -<% if User.current.admin? || User.current.allowed_to?(:as_teacher,@course) %> - <% homework_num = @course.homework_commons.count %> -<% else %> - <% homework_num = @course.homework_commons.where("publish_time <= '#{Date.today}'").count %> -<% end %> +<% homework_num = visable_course_homework @course %> + diff --git a/app/views/users/_user_syllabus_list.html.erb b/app/views/users/_user_syllabus_list.html.erb index 4613e9e18..dbf7e301a 100644 --- a/app/views/users/_user_syllabus_list.html.erb +++ b/app/views/users/_user_syllabus_list.html.erb @@ -19,17 +19,53 @@
          <% if @syllabus.any? %> - <% @syllabus.each do |syllabus|%> -
          -
          - + <% @syllabus.each_with_index do |syllabus, index|%> + <% courses = @courses.where("syllabus_id = #{syllabus.id}").select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS time").order("time desc") %> +
          +
          +

          <%=syllabus.title %>

          - <%=link_to '管理课程', syllabus_path(syllabus.id), :class => 'icons_sy_setting fr' %> -

          更新时间:2016-05-05创建老师:豆蔻

          + <%=link_to '', syllabus_path(syllabus.id), :class => 'icons_sy_setting fr', :title => '管理课程' %> +

          更新时间:<%=format_date syllabus.updated_at %> + 创建老师:<%=syllabus.user.show_name %> + 班级:<%=courses.count %> +

          + <% end %>
            @@ -50,26 +86,26 @@ var rightHeight = $(".homepageRight").height(); if (rightHeight < leftHeight) { var diffHeight = leftHeight - rightHeight; - var tmpHeight = $(".listbox").height() + diffHeight; - $(".listbox").css("height", tmpHeight); + var tmpHeight = $(".syllabus_box").height() + diffHeight; + $(".syllabus_box").css("height", tmpHeight); } - }); - $(".sy_courses_open").toggle(function(){ - //$(this).hide(); - $(this).parent().next().hide(); - $(this).addClass("sy_courses_close").removeClass("sy_courses_open"); - //$(this).parent().next().show(); - },function(){ - $(this).parent().next().show(); - $(this).addClass("sy_courses_open").removeClass("sy_courses_close"); - }); - $(".sy_courses_close").toggle(function(){ - //$(this).hide(); - $(this).parent().next().show(); - $(this).addClass("sy_courses_open").removeClass("sy_courses_close"); - //$(this).parent().next().show(); - },function(){ - $(this).parent().next().hide(); - $(this).addClass("sy_courses_close").removeClass("sy_courses_open"); + $(".sy_courses_open").toggle(function(){ + //$(this).hide(); + $(this).parent().next().hide(); + $(this).children(":first-child").addClass("icons_sy_close").removeClass("icons_sy_open"); + //$(this).parent().next().show(); + },function(){ + $(this).parent().next().show(); + $(this).children(":first-child").addClass("icons_sy_open").removeClass("icons_sy_close"); + }); + $(".sy_courses_close").toggle(function(){ + //$(this).hide(); + $(this).parent().next().show(); + $(this).children(":first-child").addClass("icons_sy_open").removeClass("icons_sy_close"); + //$(this).parent().next().show(); + },function(){ + $(this).parent().next().hide(); + $(this).children(":first-child").addClass("icons_sy_close").removeClass("icons_sy_open"); + }); }); \ No newline at end of file diff --git a/public/javascripts/application.js b/public/javascripts/application.js index a04df39ac..142b0be42 100644 --- a/public/javascripts/application.js +++ b/public/javascripts/application.js @@ -1556,3 +1556,22 @@ function edit_file_description(url,id){ ); } +//展开课程大纲列表中的班级 +function expand_course_list(id, target, btnid, count) { + var target = $(target); + var btn = $(btnid); + if(btn.data('init')=='0'){ + btn.data('init',1); + btn.html('点击收起'); + target.show(); + }else{ + btn.data('init',0); + btn.html('共'+count+ '个课程,点击全部展开'); + target.hide(); + target.eq(0).show(); + target.eq(1).show(); + target.eq(2).show(); + btn.parent().show(); + } +} + diff --git a/public/stylesheets/syllabus.css b/public/stylesheets/syllabus.css index d73bbc8bf..83f6cefbc 100644 --- a/public/stylesheets/syllabus.css +++ b/public/stylesheets/syllabus.css @@ -110,7 +110,7 @@ a.syllabusbox_a_blue{ .syllabus_box{ width:750px; border:1px solid #e7e7e7; background-color:#fff;} .syllabus_courses_list{ padding:15px; border-bottom:1px solid #e7e7e7; cursor:pointer;} .syllabus_courses_list:hover{ background:#f6fafd;} -a.syllabus_courses_title{ font-size:16px; color:#333; width:650px; font-weight:normal;white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } +.syllabus_courses_title{ font-size:16px; color:#333; width:650px; font-weight:normal;white-space:nowrap; overflow:hidden; text-overflow:ellipsis; } .sy_p_grey{ margin-left:25px; color:#888; margin-top:5px; font-size:12px;} .syllabus_class_box{ padding-left:30px; background:#f6f6f6;} .syllabus_class_list{ padding:12px 0 12px 15px; height:44px;border-left:1px solid #e7e7e7;border-bottom:1px solid #e7e7e7; position:relative;} From 397c4cc2a5944625f453b57217537eaf0b5dd08e Mon Sep 17 00:00:00 2001 From: yuanke <249218296@qq.com> Date: Thu, 30 Jun 2016 16:08:36 +0800 Subject: [PATCH 189/216] =?UTF-8?q?1.=E9=87=8D=E6=96=B0=E5=8F=91=E9=80=81?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E9=82=AE=E4=BB=B6=E4=BF=AE=E6=94=B92.?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E8=B5=84=E6=96=99=E4=BF=AE=E6=94=B9=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E4=BF=AE=E6=94=B93.=E9=97=AE=E9=A2=98=E5=8F=8D?= =?UTF-8?q?=E9=A6=88=E5=A4=84=E5=A2=9E=E5=8A=A0=E7=9B=B4=E6=8E=A5=E5=8A=A0?= =?UTF-8?q?=E5=85=A5QQ=E7=BE=A4=E7=9A=84=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/account_controller.rb | 3 +- app/controllers/my_controller.rb | 6 +- app/controllers/school_controller.rb | 51 +++ app/models/apply_add_schools.rb | 3 + app/views/layouts/_new_feedback.html.erb | 6 +- app/views/mailer/register.html.erb | 4 + app/views/my/_apply_add_school.html.erb | 337 ++++++++++++++++++ app/views/my/account.html.erb | 106 +++++- config/routes.rb | 3 +- ...160629030320_add_school_type_to_schools.rb | 5 + ...20160629081520_create_apply_add_schools.rb | 15 + db/schema.rb | 53 +-- public/images/icons_ziliao.png | Bin 0 -> 20180 bytes public/stylesheets/new_user.css | 97 ++++- public/stylesheets/users.css | 2 +- spec/factories/apply_add_schools.rb | 12 + spec/models/apply_add_schools_spec.rb | 5 + 17 files changed, 660 insertions(+), 48 deletions(-) create mode 100644 app/models/apply_add_schools.rb create mode 100644 app/views/my/_apply_add_school.html.erb create mode 100644 db/migrate/20160629030320_add_school_type_to_schools.rb create mode 100644 db/migrate/20160629081520_create_apply_add_schools.rb create mode 100644 public/images/icons_ziliao.png create mode 100644 spec/factories/apply_add_schools.rb create mode 100644 spec/models/apply_add_schools_spec.rb diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb index 8bf40d472..62b076754 100644 --- a/app/controllers/account_controller.rb +++ b/app/controllers/account_controller.rb @@ -243,7 +243,8 @@ class AccountController < ApplicationController user = User.find(params[:user]) if params[:user] token = Token.new(:user => user, :action => "register") if token.save - Mailer.run.register(token) + # Mailer.run.register(token) + Mailer.register(token).deliver else yield if block_given? status = 0 diff --git a/app/controllers/my_controller.rb b/app/controllers/my_controller.rb index 0883b3799..32c605516 100644 --- a/app/controllers/my_controller.rb +++ b/app/controllers/my_controller.rb @@ -127,12 +127,14 @@ class MyController < ApplicationController end @user.safe_attributes = params[:user] + @user.lastname = params[:lastname] + @user.firstname = "" @user.pref.attributes = params[:pref] @user.pref[:no_self_notified] = (params[:no_self_notified] == '1') #@user.login = params[:login] unless @user.user_extensions.nil? if @user.user_extensions.identity == 2 - @user.firstname = params[:enterprise_name] + # @user.firstname = params[:enterprise_name] end end @@ -144,7 +146,7 @@ class MyController < ApplicationController # end @se.school_id = params[:occupation] - @se.gender = params[:gender] + @se.gender = params[:sex] @se.location = params[:province] if params[:province] @se.location_city = params[:city] if params[:city] @se.identity = params[:identity].to_i if params[:identity] diff --git a/app/controllers/school_controller.rb b/app/controllers/school_controller.rb index e0aff6254..44f4378fe 100644 --- a/app/controllers/school_controller.rb +++ b/app/controllers/school_controller.rb @@ -150,4 +150,55 @@ class SchoolController < ApplicationController format.js end end + + #申请高校(单位) name:名称 province:省 city:市 address:地址 remarks:备注 + def apply_add_school + + data = {result:0,name:params[:name],school_id:0} + #0 成功 1参数错误 2名称已存在 + data[:result] = 0 + + #检验参数 + if params[:name] == "" || params[:province] == "" || params[:city] == "" || params[:address] == "" + data[:result] = 1 + else + school_id = School.find_by_sql("select id from schools where name='#{params[:name]}'").first + if school_id + data[:result] = 2 + else + school = School.new + school.name = params[:name].strip + school.pinyin = Pinyin.t(params[:name].strip, splitter: '') + school.save + + #status 0未处理 1通过 2拒绝 + applyschool = ApplyAddSchools.new + applyschool.school_id = school.id + applyschool.name = school.name + applyschool.province = params[:province] + applyschool.city = params[:city] + applyschool.address = params[:address] + applyschool.remarks = params[:remarks] + applyschool.save + + data[:school_id] = school.id + end + end + render :json =>data + end + + def search_repeat_schoolname + status = 0 + name = params[:name] + + if name + school_id = School.find_by_sql("select id from schools where name='#{name}'").first + + if school_id + status = 1 + end + end + + render :json =>status + end end diff --git a/app/models/apply_add_schools.rb b/app/models/apply_add_schools.rb new file mode 100644 index 000000000..2082c0012 --- /dev/null +++ b/app/models/apply_add_schools.rb @@ -0,0 +1,3 @@ +class ApplyAddSchools < ActiveRecord::Base + attr_accessible :address, :city, :name, :province, :remarks, :school_id, :status +end diff --git a/app/views/layouts/_new_feedback.html.erb b/app/views/layouts/_new_feedback.html.erb index ffec82bce..e2e935f57 100644 --- a/app/views/layouts/_new_feedback.html.erb +++ b/app/views/layouts/_new_feedback.html.erb @@ -16,7 +16,7 @@ <%= f.text_area :subject, :id=>"subject", :class => "opnionText", :placeholder => l(:label_feedback_tips) %> <%= f.hidden_field :content,:id => 'hidden', :required => true , :value => l(:label_feedback_value) %> - + <%= l(:label_submit)%> <% end %> @@ -25,7 +25,9 @@ <%#= l(:label_technical_support) %> -

            请加入师姐师兄答疑群

            QQ群号:173184401

            + + + Trustie师姐师兄答疑群
          diff --git a/app/views/mailer/register.html.erb b/app/views/mailer/register.html.erb index 282deca90..5b4e8262b 100644 --- a/app/views/mailer/register.html.erb +++ b/app/views/mailer/register.html.erb @@ -1,2 +1,6 @@

          <%= l(:mail_body_register) %>
          <%= link_to h(@url), @url %>

          +

          如果点击链接无效请复制该链接到浏览器中打开

          +
          +

          感谢您的使用!

          +

          Trustie团队

          diff --git a/app/views/my/_apply_add_school.html.erb b/app/views/my/_apply_add_school.html.erb new file mode 100644 index 000000000..1449fa1f1 --- /dev/null +++ b/app/views/my/_apply_add_school.html.erb @@ -0,0 +1,337 @@ +

          添加新的高校(单位)

          +
          +
            +
          • + + + +
          • +
          • + + 例如:国防科学技术大学 + 国防科大计算机1班 +
          • +
          • + + + + +
          • +
          • + + +
          • +
          • +
            +
          • +
          + + diff --git a/app/views/my/account.html.erb b/app/views/my/account.html.erb index f28ad1ca2..589541c39 100644 --- a/app/views/my/account.html.erb +++ b/app/views/my/account.html.erb @@ -20,8 +20,8 @@
        • *  职业 : 
        • *  姓名 : 
        • 组织名 : *
        • -
        • 性别 : 
        • -
        • 单位名称 : 
        • +
        • *  性别 : 
        • +
        • *  单位名称 : 
        • 地区 : 
        • 邮件通知 : 
        • @@ -64,19 +64,51 @@ -
        • <%= f.text_field :lastname,:no_label=>true, :required => true,:nh_required=>"1",:class=>"w210" %> +
        • <%= text_field_tag :lastname,@user.lastname+@user.firstname,:no_label=>true, :required => true,:nh_required=>"1",:class=>"w210" %> -
        • <%= text_field_tag :enterprise_name,@user.firstname,:no_label=>true, :required => true,:nh_required=>"1",:class=>"w210" %>
        • - - + <% if User.current.user_extensions && User.current.user_extensions.gender && User.current.user_extensions.gender == 1 %> + + <% else %> + + <% end %> +
        • -
        • - -

          您输入的名称尚不存在,申请添加

          +
        • + <% if User.current.user_extensions.nil? %> + + +

          + + +

          + + <% elsif User.current.user_extensions.identity == 3 || User.current.user_extensions.identity == 2 %> + + +

          + + +

          + + <% elsif User.current.user_extensions.school.nil? %> + + +

          + + +

          + + <% else %> + + +

          + + +

          + + <% end %>
        • @@ -412,6 +444,7 @@ $("*[nh_required='1']",$(this)).attr("required",true); $(this).show() }); + $("#identity_hint").hide(); } function init_identity_and_title(pField, identity, cField, title, language) { for (var i = 0; i < pField.options.length; i++) { @@ -516,6 +549,14 @@ $("input[name='occupation']").val(data); $("#search_school_result_list").hide(); $("#hint").hide(); + $("#errortip").hide(); + + } + + function apply_add_school(){ + var htmlvalue = "<%= escape_javascript( render :partial => 'my/apply_add_school' )%>"; + pop_up_box(htmlvalue,580,20,48); + } function add_school(name){ $.ajax({ @@ -602,16 +643,19 @@ $("#search_school_result_list").show(); if($(e.target).val().trim() != '') { str = e.target.value.length > 8 ? e.target.value.substr(0, 6)+"..." : e.target.value; - $("#hint").html('找到了' + count + '个包含"' + str + '"的高校'); + $("#hint").html('找到了' + count + '个包含"' + str + '"的高校(单位)'); $("#hint").show(); + $("#errortip").hide(); }else{ $("#hint").hide(); + $("#errortip").hide(); } }else{ $("#search_school_result_list").html(''); str = e.target.value.length > 4 ? e.target.value.substr(0, 4)+"..." : e.target.value; - $("#hint").html('没有找到包含"'+str+'"的高校,创建高校'); + $("#hint").html('您输入的名称尚不存在,申请添加'); $("#hint").show(); + $("#errortip").show(); } } }); @@ -621,6 +665,7 @@ { $("#search_school_result_list").hide(); $("#hint").hide(); + $("#errortip").hide(); } }); $("input[name='province']").on('focus', function (e) { @@ -648,16 +693,19 @@ $("#search_school_result_list").show(); if($(e.target).val().trim() != '') { str = e.target.value.length > 8 ? e.target.value.substr(0, 6)+"..." : e.target.value; - $("#hint").html('找到了' + count + '个包含"' + str + '"的高校'); + $("#hint").html('找到了' + count + '个包含"' + str + '"的高校(单位)'); $("#hint").show(); + $("#errortip").hide(); }else{ $("#hint").hide(); + $("#errortip").hide(); } }else{ $("#search_school_result_list").html(''); str = e.target.value.length > 4 ? e.target.value.substr(0, 4)+"..." : e.target.value; - $("#hint").html('没有找到包含"'+str+'"的高校,创建高校'); + $("#hint").html('您输入的名称尚不存在,申请添加'); $("#hint").show(); + $("#errortip").show(); } } }); @@ -685,19 +733,41 @@ <% if( !@act.nil? && @act == 'password') %> $("#users_tb_2").click(); <% end %> - $('#my_account_form_link').click(function(e){ + + $('#my_account_form_link').on("click",(function(e){ + //$('#my_account_form_link').click(function(e){ if($("#userIdentity").val() == -1 ) { $("#identity_hint").html('请选择身份').show(); e.stopImmediatePropagation(); return; } if( $("input[name='province']").val().trim() != '' && $("input[name='occupation']").val().trim() == ''){ //学校名字和id不对的话 - $("#hint").html('学校必须是从下拉列表中选择的,不能手动修改').show(); + $("#hint").html('单位名称必须是从下拉列表中选择的,不能手动修改').show(); + e.stopImmediatePropagation(); + return; + } + + //姓名不能为空 + if( $("#lastname").val() == '' ){ + $("#lastname").focus(); + e.stopImmediatePropagation(); + return; + } + + if( $("input[name='province']").val().trim() == '' ){ //学校名字必须填写 + $("#hint").html('高校(单位)名称不能为空').show(); e.stopImmediatePropagation(); return; } + + if($("#no").is(":visible") == true && $("#no").val() == ""){ + $("#no").focus(); + e.stopImmediatePropagation(); + return; + } + $('#my_account_form_btn').click(); - }); + })); $('#my_password_form_link').click(function(){ $('#my_password_form_btn').click(); }); diff --git a/config/routes.rb b/config/routes.rb index 14ee3f0b8..d56f75ced 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -213,7 +213,8 @@ RedmineApp::Application.routes.draw do resources :school, :except => [:show] do collection do - + get 'apply_add_school' + get 'search_repeat_schoolname' end member do diff --git a/db/migrate/20160629030320_add_school_type_to_schools.rb b/db/migrate/20160629030320_add_school_type_to_schools.rb new file mode 100644 index 000000000..ad23ae555 --- /dev/null +++ b/db/migrate/20160629030320_add_school_type_to_schools.rb @@ -0,0 +1,5 @@ +class AddSchoolTypeToSchools < ActiveRecord::Migration + def change + add_column :schools, :school_type, :integer, :default => false + end +end diff --git a/db/migrate/20160629081520_create_apply_add_schools.rb b/db/migrate/20160629081520_create_apply_add_schools.rb new file mode 100644 index 000000000..3d47f55a1 --- /dev/null +++ b/db/migrate/20160629081520_create_apply_add_schools.rb @@ -0,0 +1,15 @@ +class CreateApplyAddSchools < ActiveRecord::Migration + def change + create_table :apply_add_schools do |t| + t.string :name + t.string :province + t.string :city + t.string :address + t.string :remarks + t.integer :school_id + t.integer :status, :default => false + + t.timestamps + end + end +end diff --git a/db/schema.rb b/db/schema.rb index 148a6e21b..615a9001e 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended to check this file into your version control system. -ActiveRecord::Schema.define(:version => 20160624032138) do +ActiveRecord::Schema.define(:version => 20160629081520) do create_table "activities", :force => true do |t| t.integer "act_id", :null => false @@ -57,6 +57,18 @@ ActiveRecord::Schema.define(:version => 20160624032138) do t.integer "user_id", :null => false end + create_table "apply_add_schools", :force => true do |t| + t.string "name" + t.string "province" + t.string "city" + t.string "address" + t.string "remarks" + t.integer "school_id" + t.integer "status", :default => 0 + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + create_table "apply_homeworks", :force => true do |t| t.integer "status" t.integer "user_id" @@ -1125,23 +1137,6 @@ ActiveRecord::Schema.define(:version => 20160624032138) do t.integer "viewed_count", :default => 0 end - create_table "mess", :id => false, :force => true do |t| - t.string "课程名" - t.integer "课程ID", :default => 0, :null => false - t.string "教师姓", :default => "", :null => false - t.string "教师名", :limit => 30, :default => "", :null => false - t.string "主贴名", :default => "", :null => false - t.integer "主贴或回帖ID", :default => 0, :null => false - t.integer "回帖对应主贴ID" - t.integer "帖子点赞数" - t.integer "主贴回复数", :default => 0, :null => false - t.text "主贴或回帖内容" - t.datetime "发帖时间", :null => false - t.integer "发帖或回帖用户ID", :default => 0, :null => false - t.string "发帖或回帖用户姓", :default => "", :null => false - t.string "发帖或回帖用户名", :limit => 30, :default => "", :null => false - end - create_table "message_alls", :force => true do |t| t.integer "user_id" t.integer "message_id" @@ -1539,6 +1534,18 @@ ActiveRecord::Schema.define(:version => 20160624032138) do add_index "projects_trackers", ["project_id", "tracker_id"], :name => "projects_trackers_unique", :unique => true add_index "projects_trackers", ["project_id"], :name => "projects_trackers_project_id" + create_table "quality_analyses", :force => true do |t| + t.integer "project_id" + t.string "author_login" + t.string "rep_identifier" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "sonar_version", :default => 0 + t.string "path" + t.string "branch" + t.string "language" + end + create_table "queries", :force => true do |t| t.integer "project_id" t.string "name", :default => "", :null => false @@ -1637,10 +1644,11 @@ ActiveRecord::Schema.define(:version => 20160624032138) do create_table "schools", :force => true do |t| t.string "name" t.string "province" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false t.string "logo_link" t.string "pinyin" + t.integer "school_type", :default => 0 end create_table "secdomains", :force => true do |t| @@ -1765,6 +1773,7 @@ ActiveRecord::Schema.define(:version => 20160624032138) do t.integer "status", :default => 9 t.text "results" t.text "src" + t.integer "uwait_time", :default => 0 end create_table "student_works", :force => true do |t| @@ -1783,8 +1792,8 @@ ActiveRecord::Schema.define(:version => 20160624032138) do t.integer "absence_penalty", :default => 0 t.float "system_score", :default => 0.0 t.boolean "is_test", :default => false - t.integer "simi_id" - t.integer "simi_value" + t.integer "simi_id", :default => 0 + t.integer "simi_value", :default => 0 t.float "work_score" end diff --git a/public/images/icons_ziliao.png b/public/images/icons_ziliao.png new file mode 100644 index 0000000000000000000000000000000000000000..dc72e7361419bdefbc5a26b37d2cafee3e921e6c GIT binary patch literal 20180 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 'ApplyAddSchools' do + name "MyString" +province "MyString" +city "MyString" +address "MyString" +remarks "MyString" +school_id 1 +status 1 + end + +end diff --git a/spec/models/apply_add_schools_spec.rb b/spec/models/apply_add_schools_spec.rb new file mode 100644 index 000000000..de1b7c05a --- /dev/null +++ b/spec/models/apply_add_schools_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe ApplyAddSchools, :type => :model do + pending "add some examples to (or delete) #{__FILE__}" +end From 10f52f110f09ab439cc6894b531cf2da0a320e9c Mon Sep 17 00:00:00 2001 From: Tim Date: Thu, 30 Jun 2016 16:12:25 +0800 Subject: [PATCH 190/216] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E5=A4=A7=E7=BA=B2?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E7=82=B9=E5=87=BB=E5=B1=95=E5=BC=80=E6=94=B6?= =?UTF-8?q?=E8=B5=B7=EF=BC=8C=E9=85=8D=E7=BD=AE=E6=8C=89=E9=92=AE=E9=93=BE?= =?UTF-8?q?=E6=8E=A5=E8=B7=B3=E8=BD=AC=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/users/_user_syllabus_list.html.erb | 23 +- db/schema.rb | 4514 +++++++++--------- public/stylesheets/syllabus.css | 3 +- 3 files changed, 2271 insertions(+), 2269 deletions(-) diff --git a/app/views/users/_user_syllabus_list.html.erb b/app/views/users/_user_syllabus_list.html.erb index dbf7e301a..153e11592 100644 --- a/app/views/users/_user_syllabus_list.html.erb +++ b/app/views/users/_user_syllabus_list.html.erb @@ -26,7 +26,6 @@

          <%=syllabus.title %>

        • - <%=link_to '', syllabus_path(syllabus.id), :class => 'icons_sy_setting fr', :title => '管理课程' %>

          更新时间:<%=format_date syllabus.updated_at %> 创建老师:<%=syllabus.user.show_name %> 班级:<%=courses.count %> @@ -66,6 +65,9 @@ <% end %>

        + + + <%=link_to '', syllabus_path(syllabus.id), :class => 'icons_sy_setting fr', :title => '管理课程' %> <% end %>
          @@ -89,23 +91,22 @@ var tmpHeight = $(".syllabus_box").height() + diffHeight; $(".syllabus_box").css("height", tmpHeight); } - $(".sy_courses_open").toggle(function(){ - //$(this).hide(); - $(this).parent().next().hide(); - $(this).children(":first-child").addClass("icons_sy_close").removeClass("icons_sy_open"); + $(".syllabus_courses_list").toggle(function(){ + $(this).next().hide(); + $(this).children(":first-child").children(":first-child").addClass("icons_sy_close").removeClass("icons_sy_open"); //$(this).parent().next().show(); },function(){ - $(this).parent().next().show(); - $(this).children(":first-child").addClass("icons_sy_open").removeClass("icons_sy_close"); + $(this).next().show(); + $(this).children(":first-child").children(":first-child").addClass("icons_sy_open").removeClass("icons_sy_close"); }); $(".sy_courses_close").toggle(function(){ //$(this).hide(); - $(this).parent().next().show(); - $(this).children(":first-child").addClass("icons_sy_open").removeClass("icons_sy_close"); + $(this).next().show(); + $(this).children(":first-child").children(":first-child").addClass("icons_sy_open").removeClass("icons_sy_close"); //$(this).parent().next().show(); },function(){ - $(this).parent().next().hide(); - $(this).children(":first-child").addClass("icons_sy_close").removeClass("icons_sy_open"); + $(this).next().hide(); + $(this).children(":first-child").children(":first-child").addClass("icons_sy_close").removeClass("icons_sy_open"); }); }); \ No newline at end of file diff --git a/db/schema.rb b/db/schema.rb index bf9d24b3e..9204e13e9 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -1,2257 +1,2257 @@ -# encoding: UTF-8 -# This file is auto-generated from the current state of the database. Instead -# of editing this file, please use the migrations feature of Active Record to -# incrementally modify your database, and then regenerate this schema definition. -# -# Note that this schema.rb definition is the authoritative source for your -# database schema. If you need to create the application database on another -# system, you should be using db:schema:load, not running all the migrations -# from scratch. The latter is a flawed and unsustainable approach (the more migrations -# you'll amass, the slower it'll run and the greater likelihood for issues). -# -# It's strongly recommended to check this file into your version control system. - -ActiveRecord::Schema.define(:version => 20160629094716) do - - create_table "activities", :force => true do |t| - t.integer "act_id", :null => false - t.string "act_type", :null => false - t.integer "user_id", :null => false - t.integer "activity_container_id" - t.string "activity_container_type", :default => "" - t.datetime "created_at" - end - - add_index "activities", ["act_id", "act_type"], :name => "index_activities_on_act_id_and_act_type" - add_index "activities", ["user_id", "act_type"], :name => "index_activities_on_user_id_and_act_type" - add_index "activities", ["user_id"], :name => "index_activities_on_user_id" - - create_table "activity_notifies", :force => true do |t| - t.integer "activity_container_id" - t.string "activity_container_type" - t.integer "activity_id" - t.string "activity_type" - t.integer "notify_to" - t.datetime "created_on" - t.integer "is_read" - end - - add_index "activity_notifies", ["activity_container_id", "activity_container_type"], :name => "index_an_activity_container_id" - add_index "activity_notifies", ["created_on"], :name => "index_an_created_on" - add_index "activity_notifies", ["notify_to"], :name => "index_an_notify_to" - - create_table "api_keys", :force => true do |t| - t.string "access_token" - t.datetime "expires_at" - t.integer "user_id" - t.boolean "active", :default => true - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "api_keys", ["access_token"], :name => "index_api_keys_on_access_token" - add_index "api_keys", ["user_id"], :name => "index_api_keys_on_user_id" - - create_table "applied_projects", :force => true do |t| - t.integer "project_id", :null => false - t.integer "user_id", :null => false - end - - create_table "apply_homeworks", :force => true do |t| - t.integer "status" - t.integer "user_id" - t.integer "homework_common_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "apply_homeworks", ["homework_common_id"], :name => "index_apply_homeworks_on_homework_common_id" - add_index "apply_homeworks", ["user_id"], :name => "index_apply_homeworks_on_user_id" - - create_table "apply_project_masters", :force => true do |t| - t.integer "user_id" - t.string "apply_type" - t.integer "apply_id" - t.integer "status" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "apply_resources", :force => true do |t| - t.integer "status" - t.integer "user_id" - t.integer "attachment_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "container_id" - t.string "container_type" - t.text "content" - t.integer "apply_user_id" - end - - create_table "at_messages", :force => true do |t| - t.integer "user_id" - t.integer "at_message_id" - t.string "at_message_type" - t.boolean "viewed", :default => false - t.string "container_type" - t.integer "container_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "sender_id" - end - - add_index "at_messages", ["user_id"], :name => "index_at_messages_on_user_id" - - create_table "attachment_histories", :force => true do |t| - t.integer "container_id" - t.string "container_type" - t.string "filename", :default => "" - t.string "disk_filename", :default => "" - t.integer "filesize", :default => 0 - t.string "content_type", :default => "" - t.string "digest", :limit => 40, :default => "" - t.integer "downloads", :default => 0 - t.integer "author_id" - t.datetime "created_on" - t.string "description" - t.string "disk_directory" - t.integer "attachtype" - t.integer "is_public" - t.integer "copy_from" - t.integer "quotes" - t.integer "version" - t.integer "attachment_id" - t.integer "is_publish", :default => 1 - t.date "publish_time" - end - - create_table "attachments", :force => true do |t| - t.integer "container_id" - t.string "container_type", :limit => 30 - t.string "filename", :default => "", :null => false - t.string "disk_filename", :default => "", :null => false - t.integer "filesize", :default => 0, :null => false - t.string "content_type", :default => "" - t.string "digest", :limit => 40, :default => "", :null => false - t.integer "downloads", :default => 0, :null => false - t.integer "author_id", :default => 0, :null => false - t.datetime "created_on" - t.string "description" - t.string "disk_directory" - t.integer "attachtype", :default => 1 - t.integer "is_public", :default => 1 - t.integer "copy_from" - t.integer "quotes" - t.integer "is_publish", :default => 1 - t.date "publish_time" - end - - add_index "attachments", ["author_id"], :name => "index_attachments_on_author_id" - add_index "attachments", ["container_id", "container_type"], :name => "index_attachments_on_container_id_and_container_type" - add_index "attachments", ["created_on"], :name => "index_attachments_on_created_on" - - create_table "attachmentstypes", :force => true do |t| - t.integer "typeId", :null => false - t.string "typeName", :limit => 50 - end - - create_table "auth_sources", :force => true do |t| - t.string "type", :limit => 30, :default => "", :null => false - t.string "name", :limit => 60, :default => "", :null => false - t.string "host", :limit => 60 - t.integer "port" - t.string "account" - t.string "account_password", :default => "" - t.string "base_dn" - t.string "attr_login", :limit => 30 - t.string "attr_firstname", :limit => 30 - t.string "attr_lastname", :limit => 30 - t.string "attr_mail", :limit => 30 - t.boolean "onthefly_register", :default => false, :null => false - t.boolean "tls", :default => false, :null => false - t.string "filter" - t.integer "timeout" - end - - add_index "auth_sources", ["id", "type"], :name => "index_auth_sources_on_id_and_type" - - create_table "biding_projects", :force => true do |t| - t.integer "project_id" - t.integer "bid_id" - t.integer "user_id" - t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "bids", :force => true do |t| - t.string "name" - t.string "budget", :null => false - t.integer "author_id" - t.date "deadline" - t.text "description" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - t.integer "commit" - t.integer "reward_type" - t.integer "homework_type" - t.integer "parent_id" - t.string "password" - t.integer "is_evaluation" - t.integer "proportion", :default => 60 - t.integer "comment_status", :default => 0 - t.integer "evaluation_num", :default => 3 - t.integer "open_anonymous_evaluation", :default => 1 - end - - create_table "blog_comments", :force => true do |t| - t.integer "blog_id", :null => false - t.integer "parent_id" - t.string "title", :default => "", :null => false - t.text "content" - t.integer "author_id" - t.integer "comments_count", :default => 0, :null => false - t.integer "last_comment_id" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - t.boolean "locked", :default => false - t.integer "sticky", :default => 0 - t.integer "reply_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "blogs", :force => true do |t| - t.string "name", :default => "", :null => false - t.text "description" - t.integer "position", :default => 1 - t.integer "article_count", :default => 0, :null => false - t.integer "comments_count", :default => 0, :null => false - t.integer "last_comments_id" - t.integer "parent_id" - t.integer "author_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "homepage_id" - end - - create_table "boards", :force => true do |t| - t.integer "project_id", :null => false - t.string "name", :default => "", :null => false - t.string "description" - t.integer "position", :default => 1 - t.integer "topics_count", :default => 0, :null => false - t.integer "messages_count", :default => 0, :null => false - t.integer "last_message_id" - t.integer "parent_id" - t.integer "course_id" - t.integer "org_subfield_id" - end - - add_index "boards", ["last_message_id"], :name => "index_boards_on_last_message_id" - add_index "boards", ["project_id"], :name => "boards_project_id" - - create_table "bug_to_osps", :force => true do |t| - t.integer "osp_id" - t.integer "relative_memo_id" - t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "changes", :force => true do |t| - t.integer "changeset_id", :null => false - t.string "action", :limit => 1, :default => "", :null => false - t.text "path", :null => false - t.text "from_path" - t.string "from_revision" - t.string "revision" - t.string "branch" - end - - add_index "changes", ["changeset_id"], :name => "changesets_changeset_id" - - create_table "changeset_parents", :id => false, :force => true do |t| - t.integer "changeset_id", :null => false - t.integer "parent_id", :null => false - end - - add_index "changeset_parents", ["changeset_id"], :name => "changeset_parents_changeset_ids" - add_index "changeset_parents", ["parent_id"], :name => "changeset_parents_parent_ids" - - create_table "changesets", :force => true do |t| - t.integer "repository_id", :null => false - t.string "revision", :null => false - t.string "committer" - t.datetime "committed_on", :null => false - t.text "comments" - t.date "commit_date" - t.string "scmid" - t.integer "user_id" - end - - add_index "changesets", ["committed_on"], :name => "index_changesets_on_committed_on" - add_index "changesets", ["repository_id", "revision"], :name => "changesets_repos_rev", :unique => true - add_index "changesets", ["repository_id", "scmid"], :name => "changesets_repos_scmid" - add_index "changesets", ["repository_id"], :name => "index_changesets_on_repository_id" - add_index "changesets", ["user_id"], :name => "index_changesets_on_user_id" - - create_table "changesets_issues", :id => false, :force => true do |t| - t.integer "changeset_id", :null => false - t.integer "issue_id", :null => false - end - - add_index "changesets_issues", ["changeset_id", "issue_id"], :name => "changesets_issues_ids", :unique => true - - create_table "code_review_assignments", :force => true do |t| - t.integer "issue_id" - t.integer "change_id" - t.integer "attachment_id" - t.string "file_path" - t.string "rev" - t.string "rev_to" - t.string "action_type" - t.integer "changeset_id" - end - - create_table "code_review_project_settings", :force => true do |t| - t.integer "project_id" - t.integer "tracker_id" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "updated_by" - t.boolean "hide_code_review_tab", :default => false - t.integer "auto_relation", :default => 1 - t.integer "assignment_tracker_id" - t.text "auto_assign" - t.integer "lock_version", :default => 0, :null => false - t.boolean "tracker_in_review_dialog", :default => false - end - - create_table "code_review_user_settings", :force => true do |t| - t.integer "user_id", :default => 0, :null => false - t.integer "mail_notification", :default => 0, :null => false - t.datetime "created_at" - t.datetime "updated_at" - end - - create_table "code_reviews", :force => true do |t| - t.integer "project_id" - t.integer "change_id" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "line" - t.integer "updated_by_id" - t.integer "lock_version", :default => 0, :null => false - t.integer "status_changed_from" - t.integer "status_changed_to" - t.integer "issue_id" - t.string "action_type" - t.string "file_path" - t.string "rev" - t.string "rev_to" - t.integer "attachment_id" - t.integer "file_count", :default => 0, :null => false - t.boolean "diff_all" - end - - create_table "code_tests", :force => true do |t| - t.integer "homework_id" - t.integer "wait_time", :default => 0 - t.integer "language" - t.integer "status" - t.integer "time_used", :default => 0 - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "student_work_id", :default => 0 - end - - create_table "comments", :force => true do |t| - t.string "commented_type", :limit => 30, :default => "", :null => false - t.integer "commented_id", :default => 0, :null => false - t.integer "author_id", :default => 0, :null => false - t.text "comments" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - end - - add_index "comments", ["author_id"], :name => "index_comments_on_author_id" - add_index "comments", ["commented_id", "commented_type"], :name => "index_comments_on_commented_id_and_commented_type" - - create_table "contest_notifications", :force => true do |t| - t.text "title" - t.text "content" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "contesting_projects", :force => true do |t| - t.integer "project_id" - t.string "contest_id" - t.integer "user_id" - t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "contesting_softapplications", :force => true do |t| - t.integer "softapplication_id" - t.integer "contest_id" - t.integer "user_id" - t.string "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - end - - create_table "contestnotifications", :force => true do |t| - t.integer "contest_id" - t.string "title" - t.string "summary" - t.text "description" - t.integer "author_id" - t.integer "notificationcomments_count" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "contests", :force => true do |t| - t.string "name" - t.string "budget", :default => "" - t.integer "author_id" - t.date "deadline" - t.string "description" - t.integer "commit" - t.string "password" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - end - - create_table "course_activities", :force => true do |t| - t.integer "user_id" - t.integer "course_id" - t.integer "course_act_id" - t.string "course_act_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "course_activities", ["course_id", "course_act_id", "course_act_type", "created_at"], :name => "course_act_index" - - create_table "course_attachments", :force => true do |t| - t.string "filename" - t.string "disk_filename" - t.integer "filesize" - t.string "content_type" - t.string "digest" - t.integer "downloads" - t.string "author_id" - t.string "integer" - t.string "description" - t.string "disk_directory" - t.integer "attachtype" - t.integer "is_public" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "container_id", :default => 0 - end - - create_table "course_contributor_scores", :force => true do |t| - t.integer "course_id" - t.integer "user_id" - t.integer "message_num", :default => 0 - t.integer "message_reply_num", :default => 0 - t.integer "news_reply_num", :default => 0 - t.integer "resource_num", :default => 0 - t.integer "journal_num", :default => 0 - t.integer "journal_reply_num", :default => 0 - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "total_score", :default => 0 - t.integer "homework_journal_num", :default => 0 - t.integer "news_num", :default => 0 - end - - create_table "course_groups", :force => true do |t| - t.string "name" - t.integer "course_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "course_infos", :force => true do |t| - t.integer "course_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "course_messages", :force => true do |t| - t.integer "user_id" - t.integer "course_id" - t.integer "course_message_id" - t.string "course_message_type" - t.integer "viewed" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.text "content" - t.integer "status" - t.integer "apply_user_id" - t.integer "apply_result" - end - - add_index "course_messages", ["course_message_type"], :name => "index_course_messages_on_course_message_type" - add_index "course_messages", ["user_id", "course_id", "created_at"], :name => "index_course_messages_on_user_id_and_course_id_and_created_at" - - create_table "course_statuses", :force => true do |t| - t.integer "changesets_count" - t.integer "watchers_count" - t.integer "course_id" - t.float "grade", :default => 0.0 - t.integer "course_ac_para", :default => 0 - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "courses", :force => true do |t| - t.integer "tea_id" - t.string "name" - t.integer "state" - t.string "code" - t.integer "time" - t.string "extra" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "location" - t.string "term" - t.string "string" - t.string "password" - t.string "setup_time" - t.string "endup_time" - t.string "class_period" - t.integer "school_id" - t.text "description" - t.integer "status", :default => 1 - t.integer "attachmenttype", :default => 2 - t.integer "lft" - t.integer "rgt" - t.integer "is_public", :limit => 1, :default => 1 - t.integer "inherit_members", :limit => 1, :default => 1 - t.integer "open_student", :default => 0 - t.integer "outline", :default => 0 - t.integer "publish_resource", :default => 0 - t.integer "is_delete", :default => 0 - t.integer "end_time" - t.string "end_term" - t.integer "is_excellent", :default => 0 - t.integer "excellent_option", :default => 0 - t.integer "is_copy", :default => 0 - t.integer "visits", :default => 0 - t.integer "syllabus_id" - t.string "invite_code" - t.string "qrcode" - end - - add_index "courses", ["invite_code"], :name => "index_courses_on_invite_code", :unique => true - add_index "courses", ["syllabus_id"], :name => "index_courses_on_syllabus_id" - - create_table "custom_fields", :force => true do |t| - t.string "type", :limit => 30, :default => "", :null => false - t.string "name", :limit => 30, :default => "", :null => false - t.string "field_format", :limit => 30, :default => "", :null => false - t.text "possible_values" - t.string "regexp", :default => "" - t.integer "min_length", :default => 0, :null => false - t.integer "max_length", :default => 0, :null => false - t.boolean "is_required", :default => false, :null => false - t.boolean "is_for_all", :default => false, :null => false - t.boolean "is_filter", :default => false, :null => false - t.integer "position", :default => 1 - t.boolean "searchable", :default => false - t.text "default_value" - t.boolean "editable", :default => true - t.boolean "visible", :default => true, :null => false - t.boolean "multiple", :default => false - end - - add_index "custom_fields", ["id", "type"], :name => "index_custom_fields_on_id_and_type" - - create_table "custom_fields_projects", :id => false, :force => true do |t| - t.integer "custom_field_id", :default => 0, :null => false - t.integer "project_id", :default => 0, :null => false - end - - add_index "custom_fields_projects", ["custom_field_id", "project_id"], :name => "index_custom_fields_projects_on_custom_field_id_and_project_id", :unique => true - - create_table "custom_fields_trackers", :id => false, :force => true do |t| - t.integer "custom_field_id", :default => 0, :null => false - t.integer "tracker_id", :default => 0, :null => false - end - - add_index "custom_fields_trackers", ["custom_field_id", "tracker_id"], :name => "index_custom_fields_trackers_on_custom_field_id_and_tracker_id", :unique => true - - create_table "custom_values", :force => true do |t| - t.string "customized_type", :limit => 30, :default => "", :null => false - t.integer "customized_id", :default => 0, :null => false - t.integer "custom_field_id", :default => 0, :null => false - t.text "value" - end - - add_index "custom_values", ["custom_field_id"], :name => "index_custom_values_on_custom_field_id" - add_index "custom_values", ["customized_type", "customized_id"], :name => "custom_values_customized" - - create_table "delayed_jobs", :force => true do |t| - t.integer "priority", :default => 0, :null => false - t.integer "attempts", :default => 0, :null => false - t.text "handler", :null => false - t.text "last_error" - t.datetime "run_at" - t.datetime "locked_at" - t.datetime "failed_at" - t.string "locked_by" - t.string "queue" - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "delayed_jobs", ["priority", "run_at"], :name => "delayed_jobs_priority" - - create_table "discuss_demos", :force => true do |t| - t.string "title" - t.text "body" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "documents", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.integer "category_id", :default => 0, :null => false - t.string "title", :limit => 60, :default => "", :null => false - t.text "description" - t.datetime "created_on" - t.integer "user_id", :default => 0 - t.integer "is_public", :default => 1 - end - - add_index "documents", ["category_id"], :name => "index_documents_on_category_id" - add_index "documents", ["created_on"], :name => "index_documents_on_created_on" - add_index "documents", ["project_id"], :name => "documents_project_id" - - create_table "dts", :primary_key => "Num", :force => true do |t| - t.string "Defect", :limit => 50 - t.string "Category", :limit => 50 - t.string "File" - t.string "Method" - t.string "Module", :limit => 20 - t.string "Variable", :limit => 50 - t.integer "StartLine" - t.integer "IPLine" - t.string "IPLineCode", :limit => 200 - t.string "Judge", :limit => 15 - t.integer "Review", :limit => 1 - t.string "Description" - t.text "PreConditions", :limit => 2147483647 - t.text "TraceInfo", :limit => 2147483647 - t.text "Code", :limit => 2147483647 - t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "id", :null => false - end - - create_table "editor_of_documents", :force => true do |t| - t.integer "editor_id" - t.integer "org_document_comment_id" - t.datetime "created_at" - end - - create_table "enabled_modules", :force => true do |t| - t.integer "project_id" - t.string "name", :null => false - t.integer "course_id" - end - - add_index "enabled_modules", ["project_id"], :name => "enabled_modules_project_id" - - create_table "enumerations", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.integer "position", :default => 1 - t.boolean "is_default", :default => false, :null => false - t.string "type" - t.boolean "active", :default => true, :null => false - t.integer "project_id" - t.integer "parent_id" - t.string "position_name", :limit => 30 - end - - add_index "enumerations", ["id", "type"], :name => "index_enumerations_on_id_and_type" - add_index "enumerations", ["project_id"], :name => "index_enumerations_on_project_id" - - create_table "exercise_answers", :force => true do |t| - t.integer "user_id" - t.integer "exercise_question_id" - t.integer "exercise_choice_id" - t.text "answer_text" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "exercise_choices", :force => true do |t| - t.integer "exercise_question_id" - t.text "choice_text" - t.integer "choice_position" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "exercise_questions", :force => true do |t| - t.text "question_title" - t.integer "question_type" - t.integer "question_number" - t.integer "exercise_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "question_score" - end - - create_table "exercise_standard_answers", :force => true do |t| - t.integer "exercise_question_id" - t.integer "exercise_choice_id" - t.text "answer_text" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "exercise_users", :force => true do |t| - t.integer "user_id" - t.integer "exercise_id" - t.integer "score" - t.datetime "start_at" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.datetime "end_at" - t.integer "status" - end - - create_table "exercises", :force => true do |t| - t.text "exercise_name" - t.text "exercise_description" - t.integer "course_id" - t.integer "exercise_status" - t.integer "user_id" - t.integer "time" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.datetime "publish_time" - t.datetime "end_time" - t.integer "show_result" - end - - create_table "first_pages", :force => true do |t| - t.string "web_title" - t.string "title" - t.text "description" - t.string "page_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "sort_type" - t.integer "image_width", :default => 107 - t.integer "image_height", :default => 63 - t.integer "show_course", :default => 1 - t.integer "show_contest", :default => 1 - end - - create_table "forge_activities", :force => true do |t| - t.integer "user_id" - t.integer "project_id" - t.integer "forge_act_id" - t.string "forge_act_type" - t.integer "org_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "forge_activities", ["forge_act_id"], :name => "index_forge_activities_on_forge_act_id" - add_index "forge_activities", ["project_id", "forge_act_id", "created_at", "forge_act_type"], :name => "forge_act_index" - - create_table "forge_messages", :force => true do |t| - t.integer "user_id" - t.integer "project_id" - t.integer "forge_message_id" - t.string "forge_message_type" - t.integer "viewed" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "secret_key" - t.integer "status" - end - - add_index "forge_messages", ["forge_message_id", "forge_message_type"], :name => "index_forge_messages_on_forge_message_id_and_forge_message_type" - add_index "forge_messages", ["user_id", "project_id", "created_at"], :name => "index_forge_messages_on_user_id_and_project_id_and_created_at" - - create_table "forums", :force => true do |t| - t.string "name", :null => false - t.text "description" - t.integer "topic_count", :default => 0 - t.integer "memo_count", :default => 0 - t.integer "last_memo_id", :default => 0 - t.integer "creator_id", :null => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "sticky" - t.integer "locked" - end - - create_table "forwards", :force => true do |t| - t.integer "from_id" - t.string "from_type" - t.integer "to_id" - t.string "to_type" - t.datetime "created_at" - end - - create_table "groups_users", :id => false, :force => true do |t| - t.integer "group_id", :null => false - t.integer "user_id", :null => false - end - - add_index "groups_users", ["group_id", "user_id"], :name => "groups_users_ids", :unique => true - - create_table "homework_attaches", :force => true do |t| - t.integer "bid_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "reward" - t.string "name" - t.text "description" - t.integer "state" - t.integer "project_id", :default => 0 - t.float "score", :default => 0.0 - t.integer "is_teacher_score", :default => 0 - end - - add_index "homework_attaches", ["bid_id"], :name => "index_homework_attaches_on_bid_id" - - create_table "homework_commons", :force => true do |t| - t.string "name" - t.integer "user_id" - t.text "description" - t.date "publish_time" - t.date "end_time" - t.integer "homework_type", :default => 1 - t.string "late_penalty" - t.integer "course_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "teacher_priority", :default => 1 - t.integer "anonymous_comment", :default => 0 - t.integer "quotes", :default => 0 - t.integer "is_open", :default => 0 - t.datetime "simi_time" - end - - add_index "homework_commons", ["course_id", "id"], :name => "index_homework_commons_on_course_id_and_id" - - create_table "homework_detail_groups", :force => true do |t| - t.integer "homework_common_id" - t.integer "min_num" - t.integer "max_num" - t.integer "base_on_project" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "homework_detail_groups", ["homework_common_id"], :name => "index_homework_detail_groups_on_homework_common_id" - - create_table "homework_detail_manuals", :force => true do |t| - t.float "ta_proportion" - t.integer "comment_status" - t.date "evaluation_start" - t.date "evaluation_end" - t.integer "evaluation_num" - t.integer "absence_penalty", :default => 1 - t.integer "homework_common_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "homework_detail_programings", :force => true do |t| - t.string "language" - t.text "standard_code", :limit => 2147483647 - t.integer "homework_common_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.float "ta_proportion", :default => 0.1 - t.integer "question_id" - end - - create_table "homework_evaluations", :force => true do |t| - t.string "user_id" - t.string "homework_attach_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "homework_for_courses", :force => true do |t| - t.integer "course_id" - t.integer "bid_id" - end - - add_index "homework_for_courses", ["bid_id"], :name => "index_homework_for_courses_on_bid_id" - add_index "homework_for_courses", ["course_id"], :name => "index_homework_for_courses_on_course_id" - - create_table "homework_tests", :force => true do |t| - t.text "input" - t.text "output" - t.integer "homework_common_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "result" - t.text "error_msg" - end - - create_table "homework_users", :force => true do |t| - t.string "homework_attach_id" - t.string "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "invite_lists", :force => true do |t| - t.integer "project_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "mail" - end - - create_table "issue_categories", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.string "name", :limit => 30, :default => "", :null => false - t.integer "assigned_to_id" - end - - add_index "issue_categories", ["assigned_to_id"], :name => "index_issue_categories_on_assigned_to_id" - add_index "issue_categories", ["project_id"], :name => "issue_categories_project_id" - - create_table "issue_relations", :force => true do |t| - t.integer "issue_from_id", :null => false - t.integer "issue_to_id", :null => false - t.string "relation_type", :default => "", :null => false - t.integer "delay" - end - - add_index "issue_relations", ["issue_from_id", "issue_to_id"], :name => "index_issue_relations_on_issue_from_id_and_issue_to_id", :unique => true - add_index "issue_relations", ["issue_from_id"], :name => "index_issue_relations_on_issue_from_id" - add_index "issue_relations", ["issue_to_id"], :name => "index_issue_relations_on_issue_to_id" - - create_table "issue_statuses", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.boolean "is_closed", :default => false, :null => false - t.boolean "is_default", :default => false, :null => false - t.integer "position", :default => 1 - t.integer "default_done_ratio" - end - - add_index "issue_statuses", ["is_closed"], :name => "index_issue_statuses_on_is_closed" - add_index "issue_statuses", ["is_default"], :name => "index_issue_statuses_on_is_default" - add_index "issue_statuses", ["position"], :name => "index_issue_statuses_on_position" - - create_table "issues", :force => true do |t| - t.integer "tracker_id", :null => false - t.integer "project_id", :null => false - t.string "subject", :default => "", :null => false - t.text "description" - t.date "due_date" - t.integer "category_id" - t.integer "status_id", :null => false - t.integer "assigned_to_id" - t.integer "priority_id", :null => false - t.integer "fixed_version_id" - t.integer "author_id", :null => false - t.integer "lock_version", :default => 0, :null => false - t.datetime "created_on" - t.datetime "updated_on" - t.date "start_date" - t.integer "done_ratio", :default => 0, :null => false - t.float "estimated_hours" - t.integer "parent_id" - t.integer "root_id" - t.integer "lft" - t.integer "rgt" - t.boolean "is_private", :default => false, :null => false - t.datetime "closed_on" - t.integer "project_issues_index" - end - - add_index "issues", ["assigned_to_id"], :name => "index_issues_on_assigned_to_id" - add_index "issues", ["author_id"], :name => "index_issues_on_author_id" - add_index "issues", ["category_id"], :name => "index_issues_on_category_id" - add_index "issues", ["created_on"], :name => "index_issues_on_created_on" - add_index "issues", ["fixed_version_id"], :name => "index_issues_on_fixed_version_id" - add_index "issues", ["priority_id"], :name => "index_issues_on_priority_id" - add_index "issues", ["project_id"], :name => "issues_project_id" - add_index "issues", ["root_id", "lft", "rgt"], :name => "index_issues_on_root_id_and_lft_and_rgt" - add_index "issues", ["status_id"], :name => "index_issues_on_status_id" - add_index "issues", ["tracker_id"], :name => "index_issues_on_tracker_id" - - create_table "join_in_competitions", :force => true do |t| - t.integer "user_id" - t.integer "competition_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "join_in_contests", :force => true do |t| - t.integer "user_id" - t.integer "bid_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "journal_details", :force => true do |t| - t.integer "journal_id", :default => 0, :null => false - t.string "property", :limit => 30, :default => "", :null => false - t.string "prop_key", :limit => 30, :default => "", :null => false - t.text "old_value" - t.text "value" - end - - add_index "journal_details", ["journal_id"], :name => "journal_details_journal_id" - - create_table "journal_replies", :id => false, :force => true do |t| - t.integer "journal_id" - t.integer "user_id" - t.integer "reply_id" - end - - add_index "journal_replies", ["journal_id"], :name => "index_journal_replies_on_journal_id" - add_index "journal_replies", ["reply_id"], :name => "index_journal_replies_on_reply_id" - add_index "journal_replies", ["user_id"], :name => "index_journal_replies_on_user_id" - - create_table "journals", :force => true do |t| - t.integer "journalized_id", :default => 0, :null => false - t.string "journalized_type", :limit => 30, :default => "", :null => false - t.integer "user_id", :default => 0, :null => false - t.text "notes" - t.datetime "created_on", :null => false - t.boolean "private_notes", :default => false, :null => false - end - - add_index "journals", ["created_on"], :name => "index_journals_on_created_on" - add_index "journals", ["journalized_id", "journalized_type"], :name => "journals_journalized_id" - add_index "journals", ["journalized_id"], :name => "index_journals_on_journalized_id" - add_index "journals", ["user_id"], :name => "index_journals_on_user_id" - - create_table "journals_for_messages", :force => true do |t| - t.integer "jour_id" - t.string "jour_type" - t.integer "user_id" - t.text "notes" - t.integer "status" - t.integer "reply_id" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - t.string "m_parent_id" - t.boolean "is_readed" - t.integer "m_reply_count" - t.integer "m_reply_id" - t.integer "is_comprehensive_evaluation" - t.integer "private", :default => 0 - end - - create_table "kindeditor_assets", :force => true do |t| - t.string "asset" - t.integer "file_size" - t.string "file_type" - t.integer "owner_id" - t.string "asset_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "owner_type", :default => 0 - end - - create_table "member_roles", :force => true do |t| - t.integer "member_id", :null => false - t.integer "role_id", :null => false - t.integer "inherited_from" - end - - add_index "member_roles", ["member_id"], :name => "index_member_roles_on_member_id" - add_index "member_roles", ["role_id"], :name => "index_member_roles_on_role_id" - - create_table "members", :force => true do |t| - t.integer "user_id", :default => 0, :null => false - t.integer "project_id", :default => 0 - t.datetime "created_on" - t.boolean "mail_notification", :default => false, :null => false - t.integer "course_id", :default => -1 - t.integer "course_group_id", :default => 0 - end - - add_index "members", ["project_id"], :name => "index_members_on_project_id" - add_index "members", ["user_id", "project_id", "course_id"], :name => "index_members_on_user_id_and_project_id", :unique => true - add_index "members", ["user_id"], :name => "index_members_on_user_id" - - create_table "memo_messages", :force => true do |t| - t.integer "user_id" - t.integer "forum_id" - t.integer "memo_id" - t.string "memo_type" - t.integer "viewed" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "memo_messages", ["memo_id", "memo_type"], :name => "index_memo_messages_on_memo_id_and_memo_type" - add_index "memo_messages", ["user_id", "forum_id", "created_at"], :name => "index_memo_messages_on_user_id_and_forum_id_and_created_at" - - create_table "memos", :force => true do |t| - t.integer "forum_id", :null => false - t.integer "parent_id" - t.string "subject", :null => false - t.text "content", :null => false - t.integer "author_id", :null => false - t.integer "replies_count", :default => 0 - t.integer "last_reply_id" - t.boolean "lock", :default => false - t.boolean "sticky", :default => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "viewed_count", :default => 0 - end - - create_table "message_alls", :force => true do |t| - t.integer "user_id" - t.integer "message_id" - t.string "message_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "message_alls", ["message_type"], :name => "index_message_alls_on_message_type" - add_index "message_alls", ["user_id", "message_id", "created_at"], :name => "index_message_alls_on_user_id_and_message_id_and_created_at" - - create_table "messages", :force => true do |t| - t.integer "board_id", :null => false - t.integer "parent_id" - t.string "subject", :default => "", :null => false - t.text "content" - t.integer "author_id" - t.integer "replies_count", :default => 0, :null => false - t.integer "last_reply_id" - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - t.boolean "locked", :default => false - t.integer "sticky", :default => 0 - t.integer "reply_id" - t.integer "quotes" - t.integer "status", :default => 0 - end - - add_index "messages", ["author_id"], :name => "index_messages_on_author_id" - add_index "messages", ["board_id"], :name => "messages_board_id" - add_index "messages", ["created_on"], :name => "index_messages_on_created_on" - add_index "messages", ["last_reply_id"], :name => "index_messages_on_last_reply_id" - add_index "messages", ["parent_id"], :name => "messages_parent_id" - - create_table "news", :force => true do |t| - t.integer "project_id" - t.string "title", :limit => 60, :default => "", :null => false - t.string "summary", :default => "" - t.text "description" - t.integer "author_id", :default => 0, :null => false - t.datetime "created_on" - t.integer "comments_count", :default => 0, :null => false - t.integer "course_id" - t.integer "sticky", :default => 0 - t.integer "org_subfield_id" - end - - add_index "news", ["author_id"], :name => "index_news_on_author_id" - add_index "news", ["created_on"], :name => "index_news_on_created_on" - add_index "news", ["project_id"], :name => "news_project_id" - - create_table "no_uses", :force => true do |t| - t.integer "user_id", :null => false - t.string "no_use_type" - t.integer "no_use_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "notificationcomments", :force => true do |t| - t.string "notificationcommented_type" - t.integer "notificationcommented_id" - t.integer "author_id" - t.text "notificationcomments" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "onclick_times", :force => true do |t| - t.integer "user_id" - t.datetime "onclick_time" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "open_id_authentication_associations", :force => true do |t| - t.integer "issued" - t.integer "lifetime" - t.string "handle" - t.string "assoc_type" - t.binary "server_url" - t.binary "secret" - end - - create_table "open_id_authentication_nonces", :force => true do |t| - t.integer "timestamp", :null => false - t.string "server_url" - t.string "salt", :null => false - end - - create_table "open_source_projects", :force => true do |t| - t.string "name" - t.text "description" - t.integer "commit_count", :default => 0 - t.integer "code_line", :default => 0 - t.integer "users_count", :default => 0 - t.date "last_commit_time" - t.string "url" - t.date "date_collected" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "option_numbers", :force => true do |t| - t.integer "user_id" - t.integer "memo" - t.integer "messages_for_issues" - t.integer "issues_status" - t.integer "replay_for_message" - t.integer "replay_for_memo" - t.integer "follow" - t.integer "tread" - t.integer "praise_by_one" - t.integer "praise_by_two" - t.integer "praise_by_three" - t.integer "tread_by_one" - t.integer "tread_by_two" - t.integer "tread_by_three" - t.integer "changeset" - t.integer "document" - t.integer "attachment" - t.integer "issue_done_ratio" - t.integer "post_issue" - t.integer "score_type" - t.integer "total_score" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "project_id" - end - - create_table "org_activities", :force => true do |t| - t.integer "user_id" - t.integer "org_act_id" - t.string "org_act_type" - t.integer "container_id" - t.string "container_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "org_courses", :force => true do |t| - t.integer "organization_id" - t.integer "course_id" - t.datetime "created_at" - end - - create_table "org_document_comments", :force => true do |t| - t.text "title" - t.text "content" - t.integer "organization_id" - t.integer "creator_id" - t.integer "parent_id" - t.integer "reply_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.boolean "locked", :default => false - t.integer "sticky", :default => 0 - t.integer "org_subfield_id" - t.integer "status", :default => 0 - end - - create_table "org_member_roles", :force => true do |t| - t.integer "org_member_id" - t.integer "role_id" - end - - create_table "org_members", :force => true do |t| - t.integer "user_id" - t.integer "organization_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "org_messages", :force => true do |t| - t.integer "user_id" - t.integer "sender_id" - t.integer "organization_id" - t.string "message_type" - t.integer "message_id" - t.integer "viewed" - t.string "content" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "status", :default => 0 - end - - create_table "org_projects", :force => true do |t| - t.integer "organization_id" - t.integer "project_id" - t.datetime "created_at" - end - - create_table "org_subfield_messages", :force => true do |t| - t.integer "org_subfield_id" - t.integer "message_id" - t.string "message_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "org_subfields", :force => true do |t| - t.integer "organization_id" - t.integer "priority" - t.string "name" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "field_type" - t.integer "hide", :default => 0 - t.integer "status", :default => 1 - end - - create_table "organizations", :force => true do |t| - t.string "name" - t.text "description" - t.integer "creator_id" - t.integer "home_id" - t.boolean "is_public" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.boolean "allow_guest_download", :default => true - t.integer "visits", :default => 0 - t.integer "show_mode", :default => 0 - t.integer "allow_teacher", :default => 0 - end - - create_table "phone_app_versions", :force => true do |t| - t.string "version" - t.text "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "poll_answers", :force => true do |t| - t.integer "poll_question_id" - t.text "answer_text" - t.integer "answer_position" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "poll_questions", :force => true do |t| - t.string "question_title" - t.integer "question_type" - t.integer "is_necessary" - t.integer "poll_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "question_number" - end - - create_table "poll_users", :force => true do |t| - t.integer "user_id" - t.integer "poll_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "poll_votes", :force => true do |t| - t.integer "user_id" - t.integer "poll_question_id" - t.integer "poll_answer_id" - t.text "vote_text" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "polls", :force => true do |t| - t.string "polls_name" - t.string "polls_type" - t.integer "polls_group_id" - t.integer "polls_status" - t.integer "user_id" - t.datetime "published_at" - t.datetime "closed_at" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.text "polls_description" - t.integer "show_result", :default => 1 - end - - create_table "praise_tread_caches", :force => true do |t| - t.integer "object_id", :null => false - t.string "object_type" - t.integer "praise_num" - t.integer "tread_num" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "praise_treads", :force => true do |t| - t.integer "user_id", :null => false - t.integer "praise_tread_object_id" - t.string "praise_tread_object_type" - t.integer "praise_or_tread" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "principal_activities", :force => true do |t| - t.integer "user_id" - t.integer "principal_id" - t.integer "principal_act_id" - t.string "principal_act_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "project_infos", :force => true do |t| - t.integer "project_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "project_scores", :force => true do |t| - t.string "project_id" - t.integer "score" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "issue_num", :default => 0 - t.integer "issue_journal_num", :default => 0 - t.integer "news_num", :default => 0 - t.integer "documents_num", :default => 0 - t.integer "changeset_num", :default => 0 - t.integer "board_message_num", :default => 0 - t.integer "board_num", :default => 0 - t.integer "attach_num", :default => 0 - t.datetime "commit_time" - end - - create_table "project_statuses", :force => true do |t| - t.integer "changesets_count" - t.integer "watchers_count" - t.integer "project_id" - t.integer "project_type" - t.float "grade", :default => 0.0 - t.integer "course_ac_para", :default => 0 - end - - add_index "project_statuses", ["grade"], :name => "index_project_statuses_on_grade" - - create_table "projecting_softapplictions", :force => true do |t| - t.integer "user_id" - t.integer "softapplication_id" - t.integer "project_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "projects", :force => true do |t| - t.string "name", :default => "", :null => false - t.text "description" - t.string "homepage", :default => "" - t.boolean "is_public", :default => true, :null => false - t.integer "parent_id" - t.datetime "created_on" - t.datetime "updated_on" - t.string "identifier" - t.integer "status", :default => 1, :null => false - t.integer "lft" - t.integer "rgt" - t.boolean "inherit_members", :default => false, :null => false - t.integer "project_type" - t.boolean "hidden_repo", :default => false, :null => false - t.integer "attachmenttype", :default => 1 - t.integer "user_id" - t.integer "dts_test", :default => 0 - t.string "enterprise_name" - t.integer "organization_id" - t.integer "project_new_type" - t.integer "gpid" - t.integer "forked_from_project_id" - t.integer "forked_count" - t.integer "commits_count", :default => 0 - t.integer "publish_resource", :default => 0 - t.integer "issues_count", :default => 0 - t.integer "attachments_count", :default => 0 - t.integer "boards_count", :default => 0 - t.integer "news_count", :default => 0 - t.integer "acts_count", :default => 0 - t.integer "journals_count", :default => 0 - t.integer "boards_reply_count", :default => 0 - t.integer "visits", :default => 0 - t.integer "hot", :default => 0 - end - - add_index "projects", ["lft"], :name => "index_projects_on_lft" - add_index "projects", ["rgt"], :name => "index_projects_on_rgt" - - create_table "projects_trackers", :id => false, :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.integer "tracker_id", :default => 0, :null => false - end - - add_index "projects_trackers", ["project_id", "tracker_id"], :name => "projects_trackers_unique", :unique => true - add_index "projects_trackers", ["project_id"], :name => "projects_trackers_project_id" - - create_table "quality_analyses", :force => true do |t| - t.integer "project_id" - t.string "author_login" - t.string "rep_identifier" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "sonar_version", :default => 0 - t.string "path" - t.string "branch" - t.string "language" - end - - create_table "queries", :force => true do |t| - t.integer "project_id" - t.string "name", :default => "", :null => false - t.text "filters" - t.integer "user_id", :default => 0, :null => false - t.boolean "is_public", :default => false, :null => false - t.text "column_names" - t.text "sort_criteria" - t.string "group_by" - t.string "type" - end - - add_index "queries", ["project_id"], :name => "index_queries_on_project_id" - add_index "queries", ["user_id"], :name => "index_queries_on_user_id" - - create_table "relative_memo_to_open_source_projects", :force => true do |t| - t.integer "osp_id" - t.integer "relative_memo_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "relative_memos", :force => true do |t| - t.integer "osp_id" - t.integer "parent_id" - t.string "subject", :null => false - t.text "content", :limit => 16777215, :null => false - t.integer "author_id" - t.integer "replies_count", :default => 0 - t.integer "last_reply_id" - t.boolean "lock", :default => false - t.boolean "sticky", :default => false - t.boolean "is_quote", :default => false - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "viewed_count_crawl", :default => 0 - t.integer "viewed_count_local", :default => 0 - t.string "url" - t.string "username" - t.string "userhomeurl" - t.date "date_collected" - t.string "topic_resource" - end - - create_table "rep_statics", :force => true do |t| - t.integer "project_id" - t.integer "commits_num" - t.string "uname" - t.string "email" - t.integer "add" - t.integer "del" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "changeset" - end - - create_table "repositories", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.string "url", :default => "", :null => false - t.string "login", :limit => 60, :default => "" - t.string "password", :default => "" - t.string "root_url", :default => "" - t.string "type" - t.string "path_encoding", :limit => 64 - t.string "log_encoding", :limit => 64 - t.text "extra_info" - t.string "identifier" - t.boolean "is_default", :default => false - t.boolean "hidden", :default => false - end - - add_index "repositories", ["project_id"], :name => "index_repositories_on_project_id" - - create_table "rich_rich_files", :force => true do |t| - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "rich_file_file_name" - t.string "rich_file_content_type" - t.integer "rich_file_file_size" - t.datetime "rich_file_updated_at" - t.string "owner_type" - t.integer "owner_id" - t.text "uri_cache" - t.string "simplified_type", :default => "file" - end - - create_table "roles", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.integer "position", :default => 1 - t.boolean "assignable", :default => true - t.integer "builtin", :default => 0, :null => false - t.text "permissions" - t.string "issues_visibility", :limit => 30, :default => "default", :null => false - end - - create_table "schools", :force => true do |t| - t.string "name" - t.string "province" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "logo_link" - t.string "pinyin" - end - - create_table "secdomains", :force => true do |t| - t.integer "sub_type" - t.string "subname" - t.integer "pid", :default => 0 - t.string "desc" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "seems_rateable_cached_ratings", :force => true do |t| - t.integer "cacheable_id", :limit => 8 - t.string "cacheable_type" - t.float "avg", :null => false - t.integer "cnt", :null => false - t.string "dimension" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "seems_rateable_rates", :force => true do |t| - t.integer "rater_id", :limit => 8 - t.integer "rateable_id" - t.string "rateable_type" - t.float "stars", :null => false - t.string "dimension" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "is_teacher_score", :default => 0 - end - - create_table "settings", :force => true do |t| - t.string "name", :default => "", :null => false - t.text "value" - t.datetime "updated_on" - end - - add_index "settings", ["name"], :name => "index_settings_on_name" - - create_table "shares", :force => true do |t| - t.date "created_on" - t.string "url" - t.string "title" - t.integer "share_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "project_id" - t.integer "user_id" - t.string "description" - end - - create_table "shield_activities", :force => true do |t| - t.string "container_type" - t.integer "container_id" - t.string "shield_type" - t.integer "shield_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "shield_wechat_messages", :force => true do |t| - t.integer "container_id" - t.string "container_type" - t.integer "shield_id" - t.string "shield_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "softapplications", :force => true do |t| - t.string "name" - t.text "description" - t.integer "app_type_id" - t.string "app_type_name" - t.string "android_min_version_available" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "contest_id" - t.integer "softapplication_id" - t.integer "is_public" - t.string "application_developers" - t.string "deposit_project_url" - t.string "deposit_project" - t.integer "project_id" - end - - create_table "ssos", :force => true do |t| - t.integer "user_id" - t.string "openid" - t.string "name" - t.string "password" - t.string "email" - t.integer "sex" - t.string "school" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "ssos", ["user_id"], :name => "index_ssos_on_user_id" - - create_table "student_work_projects", :force => true do |t| - t.integer "homework_common_id" - t.integer "student_work_id" - t.integer "project_id" - t.integer "user_id" - t.integer "is_leader" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "student_work_projects", ["homework_common_id"], :name => "index_student_work_projects_on_homework_common_id" - add_index "student_work_projects", ["project_id"], :name => "index_student_work_projects_on_project_id" - add_index "student_work_projects", ["student_work_id"], :name => "index_student_work_projects_on_student_work_id" - add_index "student_work_projects", ["user_id"], :name => "index_student_work_projects_on_user_id" - - create_table "student_work_tests", :force => true do |t| - t.integer "student_work_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "status", :default => 9 - t.text "results" - t.text "src" - end - - create_table "student_works", :force => true do |t| - t.string "name" - t.text "description", :limit => 2147483647 - t.integer "homework_common_id" - t.integer "user_id" - t.float "final_score" - t.float "teacher_score" - t.float "student_score" - t.float "teaching_asistant_score" - t.integer "project_id", :default => 0 - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "late_penalty", :default => 0 - t.integer "absence_penalty", :default => 0 - t.float "system_score", :default => 0.0 - t.boolean "is_test", :default => false - t.integer "simi_id" - t.integer "simi_value" - t.float "work_score" - end - - add_index "student_works", ["homework_common_id", "user_id"], :name => "index_student_works_on_homework_common_id_and_user_id" - - create_table "student_works_evaluation_distributions", :force => true do |t| - t.integer "student_work_id" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "student_works_scores", :force => true do |t| - t.integer "student_work_id" - t.integer "user_id" - t.integer "score" - t.text "comment" - t.integer "reviewer_role" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "students_for_courses", :force => true do |t| - t.integer "student_id" - t.integer "course_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "students_for_courses", ["course_id"], :name => "index_students_for_courses_on_course_id" - add_index "students_for_courses", ["student_id"], :name => "index_students_for_courses_on_student_id" - - create_table "sub_document_comments", :force => true do |t| - t.text "content" - t.text "title" - t.integer "sub_domain_id" - t.integer "creator_id" - t.integer "parent_id" - t.integer "reply_id" - t.integer "locked" - t.integer "sticky" - t.integer "org_subfield_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "sub_domains", :force => true do |t| - t.integer "org_subfield_id" - t.integer "priority", :default => 0 - t.string "name" - t.string "field_type" - t.integer "hide", :default => 0 - t.integer "status", :default => 0 - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "subfield_subdomain_dirs", :force => true do |t| - t.integer "org_subfield_id" - t.string "name" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "syllabuses", :force => true do |t| - t.string "title" - t.text "description" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "eng_name" - t.integer "type" - t.integer "credit" - t.integer "hours" - t.integer "theory_hours" - t.integer "practice_hours" - t.string "applicable_major" - t.string "pre_course" - t.integer "visits", :default => 0 - t.integer "des_status", :default => 0 - end - - add_index "syllabuses", ["user_id"], :name => "index_syllabuses_on_user_id" - - create_table "system_messages", :force => true do |t| - t.integer "user_id" - t.string "content" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.text "description" - t.string "subject" - end - - create_table "taggings", :force => true do |t| - t.integer "tag_id" - t.integer "taggable_id" - t.string "taggable_type" - t.integer "tagger_id" - t.string "tagger_type" - t.string "context", :limit => 128 - t.datetime "created_at" - end - - add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id" - add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context" - add_index "taggings", ["taggable_type"], :name => "index_taggings_on_taggable_type" - - create_table "tags", :force => true do |t| - t.string "name" - end - - create_table "teachers", :force => true do |t| - t.string "tea_name" - t.string "location" - t.integer "couurse_time" - t.integer "course_code" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "extra" - end - - create_table "time_entries", :force => true do |t| - t.integer "project_id", :null => false - t.integer "user_id", :null => false - t.integer "issue_id" - t.float "hours", :null => false - t.string "comments" - t.integer "activity_id", :null => false - t.date "spent_on", :null => false - t.integer "tyear", :null => false - t.integer "tmonth", :null => false - t.integer "tweek", :null => false - t.datetime "created_on", :null => false - t.datetime "updated_on", :null => false - end - - add_index "time_entries", ["activity_id"], :name => "index_time_entries_on_activity_id" - add_index "time_entries", ["created_on"], :name => "index_time_entries_on_created_on" - add_index "time_entries", ["issue_id"], :name => "time_entries_issue_id" - add_index "time_entries", ["project_id"], :name => "time_entries_project_id" - add_index "time_entries", ["user_id"], :name => "index_time_entries_on_user_id" - - create_table "tokens", :force => true do |t| - t.integer "user_id", :default => 0, :null => false - t.string "action", :limit => 30, :default => "", :null => false - t.string "value", :limit => 40, :default => "", :null => false - t.datetime "created_on", :null => false - end - - add_index "tokens", ["user_id"], :name => "index_tokens_on_user_id" - add_index "tokens", ["value"], :name => "tokens_value", :unique => true - - create_table "trackers", :force => true do |t| - t.string "name", :limit => 30, :default => "", :null => false - t.boolean "is_in_chlog", :default => false, :null => false - t.integer "position", :default => 1 - t.boolean "is_in_roadmap", :default => true, :null => false - t.integer "fields_bits", :default => 0 - end - - create_table "user_actions", :force => true do |t| - t.integer "user_id" - t.string "action_type" - t.integer "action_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "user_activities", :force => true do |t| - t.string "act_type" - t.integer "act_id" - t.string "container_type" - t.integer "container_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.integer "user_id" - end - - add_index "user_activities", ["act_id", "act_type", "container_id", "created_at"], :name => "user_act_index" - - create_table "user_extensions", :force => true do |t| - t.integer "user_id", :null => false - t.date "birthday" - t.string "brief_introduction" - t.integer "gender" - t.string "location" - t.string "occupation" - t.integer "work_experience" - t.integer "zip_code" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.string "technical_title" - t.integer "identity" - t.string "student_id" - t.string "teacher_realname" - t.string "student_realname" - t.string "location_city" - t.integer "school_id" - t.string "description", :default => "" - end - - create_table "user_feedback_messages", :force => true do |t| - t.integer "user_id" - t.integer "journals_for_message_id" - t.string "journals_for_message_type" - t.integer "viewed" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "user_feedback_messages", ["journals_for_message_id"], :name => "index_user_feedback_messages_on_journals_for_message_id" - add_index "user_feedback_messages", ["user_id", "created_at"], :name => "index_user_feedback_messages_on_user_id_and_created_at" - - create_table "user_grades", :force => true do |t| - t.integer "user_id", :null => false - t.integer "project_id", :null => false - t.float "grade", :default => 0.0 - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - add_index "user_grades", ["grade"], :name => "index_user_grades_on_grade" - add_index "user_grades", ["project_id"], :name => "index_user_grades_on_project_id" - add_index "user_grades", ["user_id"], :name => "index_user_grades_on_user_id" - - create_table "user_levels", :force => true do |t| - t.integer "user_id" - t.integer "level" - end - - create_table "user_preferences", :force => true do |t| - t.integer "user_id", :default => 0, :null => false - t.text "others" - t.boolean "hide_mail", :default => false - t.string "time_zone" - end - - add_index "user_preferences", ["user_id"], :name => "index_user_preferences_on_user_id" - - create_table "user_score_details", :force => true do |t| - t.integer "current_user_id" - t.integer "target_user_id" - t.string "score_type" - t.string "score_action" - t.integer "user_id" - t.integer "old_score" - t.integer "new_score" - t.integer "current_user_level" - t.integer "target_user_level" - t.integer "score_changeable_obj_id" - t.string "score_changeable_obj_type" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "user_scores", :force => true do |t| - t.integer "user_id", :null => false - t.integer "collaboration" - t.integer "influence" - t.integer "skill" - t.integer "active" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "user_statuses", :force => true do |t| - t.integer "changesets_count" - t.integer "watchers_count" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.float "grade", :default => 0.0 - end - - add_index "user_statuses", ["changesets_count"], :name => "index_user_statuses_on_changesets_count" - add_index "user_statuses", ["grade"], :name => "index_user_statuses_on_grade" - add_index "user_statuses", ["watchers_count"], :name => "index_user_statuses_on_watchers_count" - - create_table "user_wechats", :force => true do |t| - t.integer "subscribe" - t.string "openid" - t.string "nickname" - t.integer "sex" - t.string "language" - t.string "city" - t.string "province" - t.string "country" - t.string "headimgurl" - t.string "subscribe_time" - t.string "unionid" - t.string "remark" - t.integer "groupid" - t.integer "user_id" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "users", :force => true do |t| - t.string "login", :default => "", :null => false - t.string "hashed_password", :limit => 40, :default => "", :null => false - t.string "firstname", :limit => 30, :default => "", :null => false - t.string "lastname", :default => "", :null => false - t.string "mail", :limit => 60, :default => "", :null => false - t.boolean "admin", :default => false, :null => false - t.integer "status", :default => 1, :null => false - t.datetime "last_login_on" - t.string "language", :limit => 5, :default => "" - t.integer "auth_source_id" - t.datetime "created_on" - t.datetime "updated_on" - t.string "type" - t.string "identity_url" - t.string "mail_notification", :default => "", :null => false - t.string "salt", :limit => 64 - t.integer "gid" - t.integer "visits", :default => 0 - t.integer "excellent_teacher", :default => 0 - t.integer "excellent_student", :default => 0 - end - - add_index "users", ["auth_source_id"], :name => "index_users_on_auth_source_id" - add_index "users", ["id", "type"], :name => "index_users_on_id_and_type" - add_index "users", ["type"], :name => "index_users_on_type" - - create_table "versions", :force => true do |t| - t.integer "project_id", :default => 0, :null => false - t.string "name", :default => "", :null => false - t.string "description", :default => "" - t.date "effective_date" - t.datetime "created_on" - t.datetime "updated_on" - t.string "wiki_page_title" - t.string "status", :default => "open" - t.string "sharing", :default => "none", :null => false - end - - add_index "versions", ["project_id"], :name => "versions_project_id" - add_index "versions", ["sharing"], :name => "index_versions_on_sharing" - - create_table "visitors", :force => true do |t| - t.integer "user_id" - t.integer "master_id" - t.datetime "updated_on" - t.datetime "created_on" - end - - add_index "visitors", ["master_id"], :name => "index_visitors_master_id" - add_index "visitors", ["updated_on"], :name => "index_visitors_updated_on" - add_index "visitors", ["user_id"], :name => "index_visitors_user_id" - - create_table "watchers", :force => true do |t| - t.string "watchable_type", :default => "", :null => false - t.integer "watchable_id", :default => 0, :null => false - t.integer "user_id" - end - - add_index "watchers", ["user_id", "watchable_type"], :name => "watchers_user_id_type" - add_index "watchers", ["user_id"], :name => "index_watchers_on_user_id" - add_index "watchers", ["watchable_id", "watchable_type"], :name => "index_watchers_on_watchable_id_and_watchable_type" - - create_table "web_footer_companies", :force => true do |t| - t.string "name" - t.string "logo_size" - t.string "url" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "web_footer_oranizers", :force => true do |t| - t.string "name" - t.text "description" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "wechat_logs", :force => true do |t| - t.string "openid", :null => false - t.text "request_raw" - t.text "response_raw" - t.text "session_raw" - t.datetime "created_at", :null => false - end - - create_table "wiki_content_versions", :force => true do |t| - t.integer "wiki_content_id", :null => false - t.integer "page_id", :null => false - t.integer "author_id" - t.binary "data", :limit => 2147483647 - t.string "compression", :limit => 6, :default => "" - t.string "comments", :default => "" - t.datetime "updated_on", :null => false - t.integer "version", :null => false - end - - add_index "wiki_content_versions", ["updated_on"], :name => "index_wiki_content_versions_on_updated_on" - add_index "wiki_content_versions", ["wiki_content_id"], :name => "wiki_content_versions_wcid" - - create_table "wiki_contents", :force => true do |t| - t.integer "page_id", :null => false - t.integer "author_id" - t.text "text", :limit => 2147483647 - t.string "comments", :default => "" - t.datetime "updated_on", :null => false - t.integer "version", :null => false - end - - add_index "wiki_contents", ["author_id"], :name => "index_wiki_contents_on_author_id" - add_index "wiki_contents", ["page_id"], :name => "wiki_contents_page_id" - - create_table "wiki_pages", :force => true do |t| - t.integer "wiki_id", :null => false - t.string "title", :null => false - t.datetime "created_on", :null => false - t.boolean "protected", :default => false, :null => false - t.integer "parent_id" - end - - add_index "wiki_pages", ["parent_id"], :name => "index_wiki_pages_on_parent_id" - add_index "wiki_pages", ["wiki_id", "title"], :name => "wiki_pages_wiki_id_title" - add_index "wiki_pages", ["wiki_id"], :name => "index_wiki_pages_on_wiki_id" - - create_table "wiki_redirects", :force => true do |t| - t.integer "wiki_id", :null => false - t.string "title" - t.string "redirects_to" - t.datetime "created_on", :null => false - end - - add_index "wiki_redirects", ["wiki_id", "title"], :name => "wiki_redirects_wiki_id_title" - add_index "wiki_redirects", ["wiki_id"], :name => "index_wiki_redirects_on_wiki_id" - - create_table "wikis", :force => true do |t| - t.integer "project_id", :null => false - t.string "start_page", :null => false - t.integer "status", :default => 1, :null => false - end - - add_index "wikis", ["project_id"], :name => "wikis_project_id" - - create_table "workflows", :force => true do |t| - t.integer "tracker_id", :default => 0, :null => false - t.integer "old_status_id", :default => 0, :null => false - t.integer "new_status_id", :default => 0, :null => false - t.integer "role_id", :default => 0, :null => false - t.boolean "assignee", :default => false, :null => false - t.boolean "author", :default => false, :null => false - t.string "type", :limit => 30 - t.string "field_name", :limit => 30 - t.string "rule", :limit => 30 - end - - add_index "workflows", ["new_status_id"], :name => "index_workflows_on_new_status_id" - add_index "workflows", ["old_status_id"], :name => "index_workflows_on_old_status_id" - add_index "workflows", ["role_id", "tracker_id", "old_status_id"], :name => "wkfs_role_tracker_old_status" - add_index "workflows", ["role_id"], :name => "index_workflows_on_role_id" - - create_table "works_categories", :force => true do |t| - t.string "category" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - - create_table "zip_packs", :force => true do |t| - t.integer "user_id" - t.integer "homework_id" - t.string "file_digest" - t.string "file_path" - t.integer "pack_times", :default => 1 - t.integer "pack_size", :default => 0 - t.text "file_digests" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - end - -end +# encoding: UTF-8 +# This file is auto-generated from the current state of the database. Instead +# of editing this file, please use the migrations feature of Active Record to +# incrementally modify your database, and then regenerate this schema definition. +# +# Note that this schema.rb definition is the authoritative source for your +# database schema. If you need to create the application database on another +# system, you should be using db:schema:load, not running all the migrations +# from scratch. The latter is a flawed and unsustainable approach (the more migrations +# you'll amass, the slower it'll run and the greater likelihood for issues). +# +# It's strongly recommended to check this file into your version control system. + +ActiveRecord::Schema.define(:version => 20160629094716) do + + create_table "activities", :force => true do |t| + t.integer "act_id", :null => false + t.string "act_type", :null => false + t.integer "user_id", :null => false + t.integer "activity_container_id" + t.string "activity_container_type", :default => "" + t.datetime "created_at" + end + + add_index "activities", ["act_id", "act_type"], :name => "index_activities_on_act_id_and_act_type" + add_index "activities", ["user_id", "act_type"], :name => "index_activities_on_user_id_and_act_type" + add_index "activities", ["user_id"], :name => "index_activities_on_user_id" + + create_table "activity_notifies", :force => true do |t| + t.integer "activity_container_id" + t.string "activity_container_type" + t.integer "activity_id" + t.string "activity_type" + t.integer "notify_to" + t.datetime "created_on" + t.integer "is_read" + end + + add_index "activity_notifies", ["activity_container_id", "activity_container_type"], :name => "index_an_activity_container_id" + add_index "activity_notifies", ["created_on"], :name => "index_an_created_on" + add_index "activity_notifies", ["notify_to"], :name => "index_an_notify_to" + + create_table "api_keys", :force => true do |t| + t.string "access_token" + t.datetime "expires_at" + t.integer "user_id" + t.boolean "active", :default => true + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "api_keys", ["access_token"], :name => "index_api_keys_on_access_token" + add_index "api_keys", ["user_id"], :name => "index_api_keys_on_user_id" + + create_table "applied_projects", :force => true do |t| + t.integer "project_id", :null => false + t.integer "user_id", :null => false + end + + create_table "apply_homeworks", :force => true do |t| + t.integer "status" + t.integer "user_id" + t.integer "homework_common_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "apply_homeworks", ["homework_common_id"], :name => "index_apply_homeworks_on_homework_common_id" + add_index "apply_homeworks", ["user_id"], :name => "index_apply_homeworks_on_user_id" + + create_table "apply_project_masters", :force => true do |t| + t.integer "user_id" + t.string "apply_type" + t.integer "apply_id" + t.integer "status" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "apply_resources", :force => true do |t| + t.integer "status" + t.integer "user_id" + t.integer "attachment_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "container_id" + t.string "container_type" + t.text "content" + t.integer "apply_user_id" + end + + create_table "at_messages", :force => true do |t| + t.integer "user_id" + t.integer "at_message_id" + t.string "at_message_type" + t.boolean "viewed", :default => false + t.string "container_type" + t.integer "container_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "sender_id" + end + + add_index "at_messages", ["user_id"], :name => "index_at_messages_on_user_id" + + create_table "attachment_histories", :force => true do |t| + t.integer "container_id" + t.string "container_type" + t.string "filename", :default => "" + t.string "disk_filename", :default => "" + t.integer "filesize", :default => 0 + t.string "content_type", :default => "" + t.string "digest", :limit => 40, :default => "" + t.integer "downloads", :default => 0 + t.integer "author_id" + t.datetime "created_on" + t.string "description" + t.string "disk_directory" + t.integer "attachtype" + t.integer "is_public" + t.integer "copy_from" + t.integer "quotes" + t.integer "version" + t.integer "attachment_id" + t.integer "is_publish", :default => 1 + t.date "publish_time" + end + + create_table "attachments", :force => true do |t| + t.integer "container_id" + t.string "container_type", :limit => 30 + t.string "filename", :default => "", :null => false + t.string "disk_filename", :default => "", :null => false + t.integer "filesize", :default => 0, :null => false + t.string "content_type", :default => "" + t.string "digest", :limit => 40, :default => "", :null => false + t.integer "downloads", :default => 0, :null => false + t.integer "author_id", :default => 0, :null => false + t.datetime "created_on" + t.string "description" + t.string "disk_directory" + t.integer "attachtype", :default => 1 + t.integer "is_public", :default => 1 + t.integer "copy_from" + t.integer "quotes" + t.integer "is_publish", :default => 1 + t.date "publish_time" + end + + add_index "attachments", ["author_id"], :name => "index_attachments_on_author_id" + add_index "attachments", ["container_id", "container_type"], :name => "index_attachments_on_container_id_and_container_type" + add_index "attachments", ["created_on"], :name => "index_attachments_on_created_on" + + create_table "attachmentstypes", :force => true do |t| + t.integer "typeId", :null => false + t.string "typeName", :limit => 50 + end + + create_table "auth_sources", :force => true do |t| + t.string "type", :limit => 30, :default => "", :null => false + t.string "name", :limit => 60, :default => "", :null => false + t.string "host", :limit => 60 + t.integer "port" + t.string "account" + t.string "account_password", :default => "" + t.string "base_dn" + t.string "attr_login", :limit => 30 + t.string "attr_firstname", :limit => 30 + t.string "attr_lastname", :limit => 30 + t.string "attr_mail", :limit => 30 + t.boolean "onthefly_register", :default => false, :null => false + t.boolean "tls", :default => false, :null => false + t.string "filter" + t.integer "timeout" + end + + add_index "auth_sources", ["id", "type"], :name => "index_auth_sources_on_id_and_type" + + create_table "biding_projects", :force => true do |t| + t.integer "project_id" + t.integer "bid_id" + t.integer "user_id" + t.string "description" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "reward" + end + + create_table "bids", :force => true do |t| + t.string "name" + t.string "budget", :null => false + t.integer "author_id" + t.date "deadline" + t.text "description" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + t.integer "commit" + t.integer "reward_type" + t.integer "homework_type" + t.integer "parent_id" + t.string "password" + t.integer "is_evaluation" + t.integer "proportion", :default => 60 + t.integer "comment_status", :default => 0 + t.integer "evaluation_num", :default => 3 + t.integer "open_anonymous_evaluation", :default => 1 + end + + create_table "blog_comments", :force => true do |t| + t.integer "blog_id", :null => false + t.integer "parent_id" + t.string "title", :default => "", :null => false + t.text "content" + t.integer "author_id" + t.integer "comments_count", :default => 0, :null => false + t.integer "last_comment_id" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + t.boolean "locked", :default => false + t.integer "sticky", :default => 0 + t.integer "reply_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "blogs", :force => true do |t| + t.string "name", :default => "", :null => false + t.text "description" + t.integer "position", :default => 1 + t.integer "article_count", :default => 0, :null => false + t.integer "comments_count", :default => 0, :null => false + t.integer "last_comments_id" + t.integer "parent_id" + t.integer "author_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "homepage_id" + end + + create_table "boards", :force => true do |t| + t.integer "project_id", :null => false + t.string "name", :default => "", :null => false + t.string "description" + t.integer "position", :default => 1 + t.integer "topics_count", :default => 0, :null => false + t.integer "messages_count", :default => 0, :null => false + t.integer "last_message_id" + t.integer "parent_id" + t.integer "course_id" + t.integer "org_subfield_id" + end + + add_index "boards", ["last_message_id"], :name => "index_boards_on_last_message_id" + add_index "boards", ["project_id"], :name => "boards_project_id" + + create_table "bug_to_osps", :force => true do |t| + t.integer "osp_id" + t.integer "relative_memo_id" + t.string "description" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "changes", :force => true do |t| + t.integer "changeset_id", :null => false + t.string "action", :limit => 1, :default => "", :null => false + t.text "path", :null => false + t.text "from_path" + t.string "from_revision" + t.string "revision" + t.string "branch" + end + + add_index "changes", ["changeset_id"], :name => "changesets_changeset_id" + + create_table "changeset_parents", :id => false, :force => true do |t| + t.integer "changeset_id", :null => false + t.integer "parent_id", :null => false + end + + add_index "changeset_parents", ["changeset_id"], :name => "changeset_parents_changeset_ids" + add_index "changeset_parents", ["parent_id"], :name => "changeset_parents_parent_ids" + + create_table "changesets", :force => true do |t| + t.integer "repository_id", :null => false + t.string "revision", :null => false + t.string "committer" + t.datetime "committed_on", :null => false + t.text "comments" + t.date "commit_date" + t.string "scmid" + t.integer "user_id" + end + + add_index "changesets", ["committed_on"], :name => "index_changesets_on_committed_on" + add_index "changesets", ["repository_id", "revision"], :name => "changesets_repos_rev", :unique => true + add_index "changesets", ["repository_id", "scmid"], :name => "changesets_repos_scmid" + add_index "changesets", ["repository_id"], :name => "index_changesets_on_repository_id" + add_index "changesets", ["user_id"], :name => "index_changesets_on_user_id" + + create_table "changesets_issues", :id => false, :force => true do |t| + t.integer "changeset_id", :null => false + t.integer "issue_id", :null => false + end + + add_index "changesets_issues", ["changeset_id", "issue_id"], :name => "changesets_issues_ids", :unique => true + + create_table "code_review_assignments", :force => true do |t| + t.integer "issue_id" + t.integer "change_id" + t.integer "attachment_id" + t.string "file_path" + t.string "rev" + t.string "rev_to" + t.string "action_type" + t.integer "changeset_id" + end + + create_table "code_review_project_settings", :force => true do |t| + t.integer "project_id" + t.integer "tracker_id" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "updated_by" + t.boolean "hide_code_review_tab", :default => false + t.integer "auto_relation", :default => 1 + t.integer "assignment_tracker_id" + t.text "auto_assign" + t.integer "lock_version", :default => 0, :null => false + t.boolean "tracker_in_review_dialog", :default => false + end + + create_table "code_review_user_settings", :force => true do |t| + t.integer "user_id", :default => 0, :null => false + t.integer "mail_notification", :default => 0, :null => false + t.datetime "created_at" + t.datetime "updated_at" + end + + create_table "code_reviews", :force => true do |t| + t.integer "project_id" + t.integer "change_id" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "line" + t.integer "updated_by_id" + t.integer "lock_version", :default => 0, :null => false + t.integer "status_changed_from" + t.integer "status_changed_to" + t.integer "issue_id" + t.string "action_type" + t.string "file_path" + t.string "rev" + t.string "rev_to" + t.integer "attachment_id" + t.integer "file_count", :default => 0, :null => false + t.boolean "diff_all" + end + + create_table "code_tests", :force => true do |t| + t.integer "homework_id" + t.integer "wait_time", :default => 0 + t.integer "language" + t.integer "status" + t.integer "time_used", :default => 0 + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "student_work_id", :default => 0 + end + + create_table "comments", :force => true do |t| + t.string "commented_type", :limit => 30, :default => "", :null => false + t.integer "commented_id", :default => 0, :null => false + t.integer "author_id", :default => 0, :null => false + t.text "comments" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + end + + add_index "comments", ["author_id"], :name => "index_comments_on_author_id" + add_index "comments", ["commented_id", "commented_type"], :name => "index_comments_on_commented_id_and_commented_type" + + create_table "contest_notifications", :force => true do |t| + t.text "title" + t.text "content" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "contesting_projects", :force => true do |t| + t.integer "project_id" + t.string "contest_id" + t.integer "user_id" + t.string "description" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "reward" + end + + create_table "contesting_softapplications", :force => true do |t| + t.integer "softapplication_id" + t.integer "contest_id" + t.integer "user_id" + t.string "description" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "reward" + end + + create_table "contestnotifications", :force => true do |t| + t.integer "contest_id" + t.string "title" + t.string "summary" + t.text "description" + t.integer "author_id" + t.integer "notificationcomments_count" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "contests", :force => true do |t| + t.string "name" + t.string "budget", :default => "" + t.integer "author_id" + t.date "deadline" + t.string "description" + t.integer "commit" + t.string "password" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + end + + create_table "course_activities", :force => true do |t| + t.integer "user_id" + t.integer "course_id" + t.integer "course_act_id" + t.string "course_act_type" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "course_activities", ["course_id", "course_act_id", "course_act_type", "created_at"], :name => "course_act_index" + + create_table "course_attachments", :force => true do |t| + t.string "filename" + t.string "disk_filename" + t.integer "filesize" + t.string "content_type" + t.string "digest" + t.integer "downloads" + t.string "author_id" + t.string "integer" + t.string "description" + t.string "disk_directory" + t.integer "attachtype" + t.integer "is_public" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "container_id", :default => 0 + end + + create_table "course_contributor_scores", :force => true do |t| + t.integer "course_id" + t.integer "user_id" + t.integer "message_num", :default => 0 + t.integer "message_reply_num", :default => 0 + t.integer "news_reply_num", :default => 0 + t.integer "resource_num", :default => 0 + t.integer "journal_num", :default => 0 + t.integer "journal_reply_num", :default => 0 + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "total_score", :default => 0 + t.integer "homework_journal_num", :default => 0 + t.integer "news_num", :default => 0 + end + + create_table "course_groups", :force => true do |t| + t.string "name" + t.integer "course_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "course_infos", :force => true do |t| + t.integer "course_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "course_messages", :force => true do |t| + t.integer "user_id" + t.integer "course_id" + t.integer "course_message_id" + t.string "course_message_type" + t.integer "viewed" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.text "content" + t.integer "status" + t.integer "apply_user_id" + t.integer "apply_result" + end + + add_index "course_messages", ["course_message_type"], :name => "index_course_messages_on_course_message_type" + add_index "course_messages", ["user_id", "course_id", "created_at"], :name => "index_course_messages_on_user_id_and_course_id_and_created_at" + + create_table "course_statuses", :force => true do |t| + t.integer "changesets_count" + t.integer "watchers_count" + t.integer "course_id" + t.float "grade", :default => 0.0 + t.integer "course_ac_para", :default => 0 + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "courses", :force => true do |t| + t.integer "tea_id" + t.string "name" + t.integer "state" + t.string "code" + t.integer "time" + t.string "extra" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "location" + t.string "term" + t.string "string" + t.string "password" + t.string "setup_time" + t.string "endup_time" + t.string "class_period" + t.integer "school_id" + t.text "description" + t.integer "status", :default => 1 + t.integer "attachmenttype", :default => 2 + t.integer "lft" + t.integer "rgt" + t.integer "is_public", :limit => 1, :default => 1 + t.integer "inherit_members", :limit => 1, :default => 1 + t.integer "open_student", :default => 0 + t.integer "outline", :default => 0 + t.integer "publish_resource", :default => 0 + t.integer "is_delete", :default => 0 + t.integer "end_time" + t.string "end_term" + t.integer "is_excellent", :default => 0 + t.integer "excellent_option", :default => 0 + t.integer "is_copy", :default => 0 + t.integer "visits", :default => 0 + t.integer "syllabus_id" + t.string "invite_code" + t.string "qrcode" + end + + add_index "courses", ["invite_code"], :name => "index_courses_on_invite_code", :unique => true + add_index "courses", ["syllabus_id"], :name => "index_courses_on_syllabus_id" + + create_table "custom_fields", :force => true do |t| + t.string "type", :limit => 30, :default => "", :null => false + t.string "name", :limit => 30, :default => "", :null => false + t.string "field_format", :limit => 30, :default => "", :null => false + t.text "possible_values" + t.string "regexp", :default => "" + t.integer "min_length", :default => 0, :null => false + t.integer "max_length", :default => 0, :null => false + t.boolean "is_required", :default => false, :null => false + t.boolean "is_for_all", :default => false, :null => false + t.boolean "is_filter", :default => false, :null => false + t.integer "position", :default => 1 + t.boolean "searchable", :default => false + t.text "default_value" + t.boolean "editable", :default => true + t.boolean "visible", :default => true, :null => false + t.boolean "multiple", :default => false + end + + add_index "custom_fields", ["id", "type"], :name => "index_custom_fields_on_id_and_type" + + create_table "custom_fields_projects", :id => false, :force => true do |t| + t.integer "custom_field_id", :default => 0, :null => false + t.integer "project_id", :default => 0, :null => false + end + + add_index "custom_fields_projects", ["custom_field_id", "project_id"], :name => "index_custom_fields_projects_on_custom_field_id_and_project_id", :unique => true + + create_table "custom_fields_trackers", :id => false, :force => true do |t| + t.integer "custom_field_id", :default => 0, :null => false + t.integer "tracker_id", :default => 0, :null => false + end + + add_index "custom_fields_trackers", ["custom_field_id", "tracker_id"], :name => "index_custom_fields_trackers_on_custom_field_id_and_tracker_id", :unique => true + + create_table "custom_values", :force => true do |t| + t.string "customized_type", :limit => 30, :default => "", :null => false + t.integer "customized_id", :default => 0, :null => false + t.integer "custom_field_id", :default => 0, :null => false + t.text "value" + end + + add_index "custom_values", ["custom_field_id"], :name => "index_custom_values_on_custom_field_id" + add_index "custom_values", ["customized_type", "customized_id"], :name => "custom_values_customized" + + create_table "delayed_jobs", :force => true do |t| + t.integer "priority", :default => 0, :null => false + t.integer "attempts", :default => 0, :null => false + t.text "handler", :null => false + t.text "last_error" + t.datetime "run_at" + t.datetime "locked_at" + t.datetime "failed_at" + t.string "locked_by" + t.string "queue" + t.datetime "created_at" + t.datetime "updated_at" + end + + add_index "delayed_jobs", ["priority", "run_at"], :name => "delayed_jobs_priority" + + create_table "discuss_demos", :force => true do |t| + t.string "title" + t.text "body" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "documents", :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.integer "category_id", :default => 0, :null => false + t.string "title", :limit => 60, :default => "", :null => false + t.text "description" + t.datetime "created_on" + t.integer "user_id", :default => 0 + t.integer "is_public", :default => 1 + end + + add_index "documents", ["category_id"], :name => "index_documents_on_category_id" + add_index "documents", ["created_on"], :name => "index_documents_on_created_on" + add_index "documents", ["project_id"], :name => "documents_project_id" + + create_table "dts", :primary_key => "Num", :force => true do |t| + t.string "Defect", :limit => 50 + t.string "Category", :limit => 50 + t.string "File" + t.string "Method" + t.string "Module", :limit => 20 + t.string "Variable", :limit => 50 + t.integer "StartLine" + t.integer "IPLine" + t.string "IPLineCode", :limit => 200 + t.string "Judge", :limit => 15 + t.integer "Review", :limit => 1 + t.string "Description" + t.text "PreConditions", :limit => 2147483647 + t.text "TraceInfo", :limit => 2147483647 + t.text "Code", :limit => 2147483647 + t.integer "project_id" + t.datetime "created_at" + t.datetime "updated_at" + t.integer "id", :null => false + end + + create_table "editor_of_documents", :force => true do |t| + t.integer "editor_id" + t.integer "org_document_comment_id" + t.datetime "created_at" + end + + create_table "enabled_modules", :force => true do |t| + t.integer "project_id" + t.string "name", :null => false + t.integer "course_id" + end + + add_index "enabled_modules", ["project_id"], :name => "enabled_modules_project_id" + + create_table "enumerations", :force => true do |t| + t.string "name", :limit => 30, :default => "", :null => false + t.integer "position", :default => 1 + t.boolean "is_default", :default => false, :null => false + t.string "type" + t.boolean "active", :default => true, :null => false + t.integer "project_id" + t.integer "parent_id" + t.string "position_name", :limit => 30 + end + + add_index "enumerations", ["id", "type"], :name => "index_enumerations_on_id_and_type" + add_index "enumerations", ["project_id"], :name => "index_enumerations_on_project_id" + + create_table "exercise_answers", :force => true do |t| + t.integer "user_id" + t.integer "exercise_question_id" + t.integer "exercise_choice_id" + t.text "answer_text" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "exercise_choices", :force => true do |t| + t.integer "exercise_question_id" + t.text "choice_text" + t.integer "choice_position" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "exercise_questions", :force => true do |t| + t.text "question_title" + t.integer "question_type" + t.integer "question_number" + t.integer "exercise_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "question_score" + end + + create_table "exercise_standard_answers", :force => true do |t| + t.integer "exercise_question_id" + t.integer "exercise_choice_id" + t.text "answer_text" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "exercise_users", :force => true do |t| + t.integer "user_id" + t.integer "exercise_id" + t.integer "score" + t.datetime "start_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.datetime "end_at" + t.integer "status" + end + + create_table "exercises", :force => true do |t| + t.text "exercise_name" + t.text "exercise_description" + t.integer "course_id" + t.integer "exercise_status" + t.integer "user_id" + t.integer "time" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.datetime "publish_time" + t.datetime "end_time" + t.integer "show_result" + end + + create_table "first_pages", :force => true do |t| + t.string "web_title" + t.string "title" + t.text "description" + t.string "page_type" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "sort_type" + t.integer "image_width", :default => 107 + t.integer "image_height", :default => 63 + t.integer "show_course", :default => 1 + t.integer "show_contest", :default => 1 + end + + create_table "forge_activities", :force => true do |t| + t.integer "user_id" + t.integer "project_id" + t.integer "forge_act_id" + t.string "forge_act_type" + t.integer "org_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "forge_activities", ["forge_act_id"], :name => "index_forge_activities_on_forge_act_id" + add_index "forge_activities", ["project_id", "forge_act_id", "created_at", "forge_act_type"], :name => "forge_act_index" + + create_table "forge_messages", :force => true do |t| + t.integer "user_id" + t.integer "project_id" + t.integer "forge_message_id" + t.string "forge_message_type" + t.integer "viewed" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "secret_key" + t.integer "status" + end + + add_index "forge_messages", ["forge_message_id", "forge_message_type"], :name => "index_forge_messages_on_forge_message_id_and_forge_message_type" + add_index "forge_messages", ["user_id", "project_id", "created_at"], :name => "index_forge_messages_on_user_id_and_project_id_and_created_at" + + create_table "forums", :force => true do |t| + t.string "name", :null => false + t.text "description" + t.integer "topic_count", :default => 0 + t.integer "memo_count", :default => 0 + t.integer "last_memo_id", :default => 0 + t.integer "creator_id", :null => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "sticky" + t.integer "locked" + end + + create_table "forwards", :force => true do |t| + t.integer "from_id" + t.string "from_type" + t.integer "to_id" + t.string "to_type" + t.datetime "created_at" + end + + create_table "groups_users", :id => false, :force => true do |t| + t.integer "group_id", :null => false + t.integer "user_id", :null => false + end + + add_index "groups_users", ["group_id", "user_id"], :name => "groups_users_ids", :unique => true + + create_table "homework_attaches", :force => true do |t| + t.integer "bid_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "reward" + t.string "name" + t.text "description" + t.integer "state" + t.integer "project_id", :default => 0 + t.float "score", :default => 0.0 + t.integer "is_teacher_score", :default => 0 + end + + add_index "homework_attaches", ["bid_id"], :name => "index_homework_attaches_on_bid_id" + + create_table "homework_commons", :force => true do |t| + t.string "name" + t.integer "user_id" + t.text "description" + t.date "publish_time" + t.date "end_time" + t.integer "homework_type", :default => 1 + t.string "late_penalty" + t.integer "course_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "teacher_priority", :default => 1 + t.integer "anonymous_comment", :default => 0 + t.integer "quotes", :default => 0 + t.integer "is_open", :default => 0 + t.datetime "simi_time" + end + + add_index "homework_commons", ["course_id", "id"], :name => "index_homework_commons_on_course_id_and_id" + + create_table "homework_detail_groups", :force => true do |t| + t.integer "homework_common_id" + t.integer "min_num" + t.integer "max_num" + t.integer "base_on_project" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "homework_detail_groups", ["homework_common_id"], :name => "index_homework_detail_groups_on_homework_common_id" + + create_table "homework_detail_manuals", :force => true do |t| + t.float "ta_proportion" + t.integer "comment_status" + t.date "evaluation_start" + t.date "evaluation_end" + t.integer "evaluation_num" + t.integer "absence_penalty", :default => 1 + t.integer "homework_common_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "homework_detail_programings", :force => true do |t| + t.string "language" + t.text "standard_code", :limit => 2147483647 + t.integer "homework_common_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.float "ta_proportion", :default => 0.1 + t.integer "question_id" + end + + create_table "homework_evaluations", :force => true do |t| + t.string "user_id" + t.string "homework_attach_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "homework_for_courses", :force => true do |t| + t.integer "course_id" + t.integer "bid_id" + end + + add_index "homework_for_courses", ["bid_id"], :name => "index_homework_for_courses_on_bid_id" + add_index "homework_for_courses", ["course_id"], :name => "index_homework_for_courses_on_course_id" + + create_table "homework_tests", :force => true do |t| + t.text "input" + t.text "output" + t.integer "homework_common_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "result" + t.text "error_msg" + end + + create_table "homework_users", :force => true do |t| + t.string "homework_attach_id" + t.string "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "invite_lists", :force => true do |t| + t.integer "project_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "mail" + end + + create_table "issue_categories", :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.string "name", :limit => 30, :default => "", :null => false + t.integer "assigned_to_id" + end + + add_index "issue_categories", ["assigned_to_id"], :name => "index_issue_categories_on_assigned_to_id" + add_index "issue_categories", ["project_id"], :name => "issue_categories_project_id" + + create_table "issue_relations", :force => true do |t| + t.integer "issue_from_id", :null => false + t.integer "issue_to_id", :null => false + t.string "relation_type", :default => "", :null => false + t.integer "delay" + end + + add_index "issue_relations", ["issue_from_id", "issue_to_id"], :name => "index_issue_relations_on_issue_from_id_and_issue_to_id", :unique => true + add_index "issue_relations", ["issue_from_id"], :name => "index_issue_relations_on_issue_from_id" + add_index "issue_relations", ["issue_to_id"], :name => "index_issue_relations_on_issue_to_id" + + create_table "issue_statuses", :force => true do |t| + t.string "name", :limit => 30, :default => "", :null => false + t.boolean "is_closed", :default => false, :null => false + t.boolean "is_default", :default => false, :null => false + t.integer "position", :default => 1 + t.integer "default_done_ratio" + end + + add_index "issue_statuses", ["is_closed"], :name => "index_issue_statuses_on_is_closed" + add_index "issue_statuses", ["is_default"], :name => "index_issue_statuses_on_is_default" + add_index "issue_statuses", ["position"], :name => "index_issue_statuses_on_position" + + create_table "issues", :force => true do |t| + t.integer "tracker_id", :null => false + t.integer "project_id", :null => false + t.string "subject", :default => "", :null => false + t.text "description" + t.date "due_date" + t.integer "category_id" + t.integer "status_id", :null => false + t.integer "assigned_to_id" + t.integer "priority_id", :null => false + t.integer "fixed_version_id" + t.integer "author_id", :null => false + t.integer "lock_version", :default => 0, :null => false + t.datetime "created_on" + t.datetime "updated_on" + t.date "start_date" + t.integer "done_ratio", :default => 0, :null => false + t.float "estimated_hours" + t.integer "parent_id" + t.integer "root_id" + t.integer "lft" + t.integer "rgt" + t.boolean "is_private", :default => false, :null => false + t.datetime "closed_on" + t.integer "project_issues_index" + end + + add_index "issues", ["assigned_to_id"], :name => "index_issues_on_assigned_to_id" + add_index "issues", ["author_id"], :name => "index_issues_on_author_id" + add_index "issues", ["category_id"], :name => "index_issues_on_category_id" + add_index "issues", ["created_on"], :name => "index_issues_on_created_on" + add_index "issues", ["fixed_version_id"], :name => "index_issues_on_fixed_version_id" + add_index "issues", ["priority_id"], :name => "index_issues_on_priority_id" + add_index "issues", ["project_id"], :name => "issues_project_id" + add_index "issues", ["root_id", "lft", "rgt"], :name => "index_issues_on_root_id_and_lft_and_rgt" + add_index "issues", ["status_id"], :name => "index_issues_on_status_id" + add_index "issues", ["tracker_id"], :name => "index_issues_on_tracker_id" + + create_table "join_in_competitions", :force => true do |t| + t.integer "user_id" + t.integer "competition_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "join_in_contests", :force => true do |t| + t.integer "user_id" + t.integer "bid_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "journal_details", :force => true do |t| + t.integer "journal_id", :default => 0, :null => false + t.string "property", :limit => 30, :default => "", :null => false + t.string "prop_key", :limit => 30, :default => "", :null => false + t.text "old_value" + t.text "value" + end + + add_index "journal_details", ["journal_id"], :name => "journal_details_journal_id" + + create_table "journal_replies", :id => false, :force => true do |t| + t.integer "journal_id" + t.integer "user_id" + t.integer "reply_id" + end + + add_index "journal_replies", ["journal_id"], :name => "index_journal_replies_on_journal_id" + add_index "journal_replies", ["reply_id"], :name => "index_journal_replies_on_reply_id" + add_index "journal_replies", ["user_id"], :name => "index_journal_replies_on_user_id" + + create_table "journals", :force => true do |t| + t.integer "journalized_id", :default => 0, :null => false + t.string "journalized_type", :limit => 30, :default => "", :null => false + t.integer "user_id", :default => 0, :null => false + t.text "notes" + t.datetime "created_on", :null => false + t.boolean "private_notes", :default => false, :null => false + end + + add_index "journals", ["created_on"], :name => "index_journals_on_created_on" + add_index "journals", ["journalized_id", "journalized_type"], :name => "journals_journalized_id" + add_index "journals", ["journalized_id"], :name => "index_journals_on_journalized_id" + add_index "journals", ["user_id"], :name => "index_journals_on_user_id" + + create_table "journals_for_messages", :force => true do |t| + t.integer "jour_id" + t.string "jour_type" + t.integer "user_id" + t.text "notes" + t.integer "status" + t.integer "reply_id" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + t.string "m_parent_id" + t.boolean "is_readed" + t.integer "m_reply_count" + t.integer "m_reply_id" + t.integer "is_comprehensive_evaluation" + t.integer "private", :default => 0 + end + + create_table "kindeditor_assets", :force => true do |t| + t.string "asset" + t.integer "file_size" + t.string "file_type" + t.integer "owner_id" + t.string "asset_type" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "owner_type", :default => 0 + end + + create_table "member_roles", :force => true do |t| + t.integer "member_id", :null => false + t.integer "role_id", :null => false + t.integer "inherited_from" + end + + add_index "member_roles", ["member_id"], :name => "index_member_roles_on_member_id" + add_index "member_roles", ["role_id"], :name => "index_member_roles_on_role_id" + + create_table "members", :force => true do |t| + t.integer "user_id", :default => 0, :null => false + t.integer "project_id", :default => 0 + t.datetime "created_on" + t.boolean "mail_notification", :default => false, :null => false + t.integer "course_id", :default => -1 + t.integer "course_group_id", :default => 0 + end + + add_index "members", ["project_id"], :name => "index_members_on_project_id" + add_index "members", ["user_id", "project_id", "course_id"], :name => "index_members_on_user_id_and_project_id", :unique => true + add_index "members", ["user_id"], :name => "index_members_on_user_id" + + create_table "memo_messages", :force => true do |t| + t.integer "user_id" + t.integer "forum_id" + t.integer "memo_id" + t.string "memo_type" + t.integer "viewed" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "memo_messages", ["memo_id", "memo_type"], :name => "index_memo_messages_on_memo_id_and_memo_type" + add_index "memo_messages", ["user_id", "forum_id", "created_at"], :name => "index_memo_messages_on_user_id_and_forum_id_and_created_at" + + create_table "memos", :force => true do |t| + t.integer "forum_id", :null => false + t.integer "parent_id" + t.string "subject", :null => false + t.text "content", :null => false + t.integer "author_id", :null => false + t.integer "replies_count", :default => 0 + t.integer "last_reply_id" + t.boolean "lock", :default => false + t.boolean "sticky", :default => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "viewed_count", :default => 0 + end + + create_table "message_alls", :force => true do |t| + t.integer "user_id" + t.integer "message_id" + t.string "message_type" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "message_alls", ["message_type"], :name => "index_message_alls_on_message_type" + add_index "message_alls", ["user_id", "message_id", "created_at"], :name => "index_message_alls_on_user_id_and_message_id_and_created_at" + + create_table "messages", :force => true do |t| + t.integer "board_id", :null => false + t.integer "parent_id" + t.string "subject", :default => "", :null => false + t.text "content" + t.integer "author_id" + t.integer "replies_count", :default => 0, :null => false + t.integer "last_reply_id" + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + t.boolean "locked", :default => false + t.integer "sticky", :default => 0 + t.integer "reply_id" + t.integer "quotes" + t.integer "status", :default => 0 + end + + add_index "messages", ["author_id"], :name => "index_messages_on_author_id" + add_index "messages", ["board_id"], :name => "messages_board_id" + add_index "messages", ["created_on"], :name => "index_messages_on_created_on" + add_index "messages", ["last_reply_id"], :name => "index_messages_on_last_reply_id" + add_index "messages", ["parent_id"], :name => "messages_parent_id" + + create_table "news", :force => true do |t| + t.integer "project_id" + t.string "title", :limit => 60, :default => "", :null => false + t.string "summary", :default => "" + t.text "description" + t.integer "author_id", :default => 0, :null => false + t.datetime "created_on" + t.integer "comments_count", :default => 0, :null => false + t.integer "course_id" + t.integer "sticky", :default => 0 + t.integer "org_subfield_id" + end + + add_index "news", ["author_id"], :name => "index_news_on_author_id" + add_index "news", ["created_on"], :name => "index_news_on_created_on" + add_index "news", ["project_id"], :name => "news_project_id" + + create_table "no_uses", :force => true do |t| + t.integer "user_id", :null => false + t.string "no_use_type" + t.integer "no_use_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "notificationcomments", :force => true do |t| + t.string "notificationcommented_type" + t.integer "notificationcommented_id" + t.integer "author_id" + t.text "notificationcomments" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "onclick_times", :force => true do |t| + t.integer "user_id" + t.datetime "onclick_time" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "open_id_authentication_associations", :force => true do |t| + t.integer "issued" + t.integer "lifetime" + t.string "handle" + t.string "assoc_type" + t.binary "server_url" + t.binary "secret" + end + + create_table "open_id_authentication_nonces", :force => true do |t| + t.integer "timestamp", :null => false + t.string "server_url" + t.string "salt", :null => false + end + + create_table "open_source_projects", :force => true do |t| + t.string "name" + t.text "description" + t.integer "commit_count", :default => 0 + t.integer "code_line", :default => 0 + t.integer "users_count", :default => 0 + t.date "last_commit_time" + t.string "url" + t.date "date_collected" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "option_numbers", :force => true do |t| + t.integer "user_id" + t.integer "memo" + t.integer "messages_for_issues" + t.integer "issues_status" + t.integer "replay_for_message" + t.integer "replay_for_memo" + t.integer "follow" + t.integer "tread" + t.integer "praise_by_one" + t.integer "praise_by_two" + t.integer "praise_by_three" + t.integer "tread_by_one" + t.integer "tread_by_two" + t.integer "tread_by_three" + t.integer "changeset" + t.integer "document" + t.integer "attachment" + t.integer "issue_done_ratio" + t.integer "post_issue" + t.integer "score_type" + t.integer "total_score" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "project_id" + end + + create_table "org_activities", :force => true do |t| + t.integer "user_id" + t.integer "org_act_id" + t.string "org_act_type" + t.integer "container_id" + t.string "container_type" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "org_courses", :force => true do |t| + t.integer "organization_id" + t.integer "course_id" + t.datetime "created_at" + end + + create_table "org_document_comments", :force => true do |t| + t.text "title" + t.text "content" + t.integer "organization_id" + t.integer "creator_id" + t.integer "parent_id" + t.integer "reply_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.boolean "locked", :default => false + t.integer "sticky", :default => 0 + t.integer "org_subfield_id" + t.integer "status", :default => 0 + end + + create_table "org_member_roles", :force => true do |t| + t.integer "org_member_id" + t.integer "role_id" + end + + create_table "org_members", :force => true do |t| + t.integer "user_id" + t.integer "organization_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "org_messages", :force => true do |t| + t.integer "user_id" + t.integer "sender_id" + t.integer "organization_id" + t.string "message_type" + t.integer "message_id" + t.integer "viewed" + t.string "content" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "status", :default => 0 + end + + create_table "org_projects", :force => true do |t| + t.integer "organization_id" + t.integer "project_id" + t.datetime "created_at" + end + + create_table "org_subfield_messages", :force => true do |t| + t.integer "org_subfield_id" + t.integer "message_id" + t.string "message_type" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "org_subfields", :force => true do |t| + t.integer "organization_id" + t.integer "priority" + t.string "name" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "field_type" + t.integer "hide", :default => 0 + t.integer "status", :default => 1 + end + + create_table "organizations", :force => true do |t| + t.string "name" + t.text "description" + t.integer "creator_id" + t.integer "home_id" + t.boolean "is_public" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.boolean "allow_guest_download", :default => true + t.integer "visits", :default => 0 + t.integer "show_mode", :default => 0 + t.integer "allow_teacher", :default => 0 + end + + create_table "phone_app_versions", :force => true do |t| + t.string "version" + t.text "description" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "poll_answers", :force => true do |t| + t.integer "poll_question_id" + t.text "answer_text" + t.integer "answer_position" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "poll_questions", :force => true do |t| + t.string "question_title" + t.integer "question_type" + t.integer "is_necessary" + t.integer "poll_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "question_number" + end + + create_table "poll_users", :force => true do |t| + t.integer "user_id" + t.integer "poll_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "poll_votes", :force => true do |t| + t.integer "user_id" + t.integer "poll_question_id" + t.integer "poll_answer_id" + t.text "vote_text" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "polls", :force => true do |t| + t.string "polls_name" + t.string "polls_type" + t.integer "polls_group_id" + t.integer "polls_status" + t.integer "user_id" + t.datetime "published_at" + t.datetime "closed_at" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.text "polls_description" + t.integer "show_result", :default => 1 + end + + create_table "praise_tread_caches", :force => true do |t| + t.integer "object_id", :null => false + t.string "object_type" + t.integer "praise_num" + t.integer "tread_num" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "praise_treads", :force => true do |t| + t.integer "user_id", :null => false + t.integer "praise_tread_object_id" + t.string "praise_tread_object_type" + t.integer "praise_or_tread" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "principal_activities", :force => true do |t| + t.integer "user_id" + t.integer "principal_id" + t.integer "principal_act_id" + t.string "principal_act_type" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "project_infos", :force => true do |t| + t.integer "project_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "project_scores", :force => true do |t| + t.string "project_id" + t.integer "score" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "issue_num", :default => 0 + t.integer "issue_journal_num", :default => 0 + t.integer "news_num", :default => 0 + t.integer "documents_num", :default => 0 + t.integer "changeset_num", :default => 0 + t.integer "board_message_num", :default => 0 + t.integer "board_num", :default => 0 + t.integer "attach_num", :default => 0 + t.datetime "commit_time" + end + + create_table "project_statuses", :force => true do |t| + t.integer "changesets_count" + t.integer "watchers_count" + t.integer "project_id" + t.integer "project_type" + t.float "grade", :default => 0.0 + t.integer "course_ac_para", :default => 0 + end + + add_index "project_statuses", ["grade"], :name => "index_project_statuses_on_grade" + + create_table "projecting_softapplictions", :force => true do |t| + t.integer "user_id" + t.integer "softapplication_id" + t.integer "project_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "projects", :force => true do |t| + t.string "name", :default => "", :null => false + t.text "description" + t.string "homepage", :default => "" + t.boolean "is_public", :default => true, :null => false + t.integer "parent_id" + t.datetime "created_on" + t.datetime "updated_on" + t.string "identifier" + t.integer "status", :default => 1, :null => false + t.integer "lft" + t.integer "rgt" + t.boolean "inherit_members", :default => false, :null => false + t.integer "project_type" + t.boolean "hidden_repo", :default => false, :null => false + t.integer "attachmenttype", :default => 1 + t.integer "user_id" + t.integer "dts_test", :default => 0 + t.string "enterprise_name" + t.integer "organization_id" + t.integer "project_new_type" + t.integer "gpid" + t.integer "forked_from_project_id" + t.integer "forked_count" + t.integer "commits_count", :default => 0 + t.integer "publish_resource", :default => 0 + t.integer "issues_count", :default => 0 + t.integer "attachments_count", :default => 0 + t.integer "boards_count", :default => 0 + t.integer "news_count", :default => 0 + t.integer "acts_count", :default => 0 + t.integer "journals_count", :default => 0 + t.integer "boards_reply_count", :default => 0 + t.integer "visits", :default => 0 + t.integer "hot", :default => 0 + end + + add_index "projects", ["lft"], :name => "index_projects_on_lft" + add_index "projects", ["rgt"], :name => "index_projects_on_rgt" + + create_table "projects_trackers", :id => false, :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.integer "tracker_id", :default => 0, :null => false + end + + add_index "projects_trackers", ["project_id", "tracker_id"], :name => "projects_trackers_unique", :unique => true + add_index "projects_trackers", ["project_id"], :name => "projects_trackers_project_id" + + create_table "quality_analyses", :force => true do |t| + t.integer "project_id" + t.string "author_login" + t.string "rep_identifier" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "sonar_version", :default => 0 + t.string "path" + t.string "branch" + t.string "language" + end + + create_table "queries", :force => true do |t| + t.integer "project_id" + t.string "name", :default => "", :null => false + t.text "filters" + t.integer "user_id", :default => 0, :null => false + t.boolean "is_public", :default => false, :null => false + t.text "column_names" + t.text "sort_criteria" + t.string "group_by" + t.string "type" + end + + add_index "queries", ["project_id"], :name => "index_queries_on_project_id" + add_index "queries", ["user_id"], :name => "index_queries_on_user_id" + + create_table "relative_memo_to_open_source_projects", :force => true do |t| + t.integer "osp_id" + t.integer "relative_memo_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "relative_memos", :force => true do |t| + t.integer "osp_id" + t.integer "parent_id" + t.string "subject", :null => false + t.text "content", :limit => 16777215, :null => false + t.integer "author_id" + t.integer "replies_count", :default => 0 + t.integer "last_reply_id" + t.boolean "lock", :default => false + t.boolean "sticky", :default => false + t.boolean "is_quote", :default => false + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "viewed_count_crawl", :default => 0 + t.integer "viewed_count_local", :default => 0 + t.string "url" + t.string "username" + t.string "userhomeurl" + t.date "date_collected" + t.string "topic_resource" + end + + create_table "rep_statics", :force => true do |t| + t.integer "project_id" + t.integer "commits_num" + t.string "uname" + t.string "email" + t.integer "add" + t.integer "del" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "changeset" + end + + create_table "repositories", :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.string "url", :default => "", :null => false + t.string "login", :limit => 60, :default => "" + t.string "password", :default => "" + t.string "root_url", :default => "" + t.string "type" + t.string "path_encoding", :limit => 64 + t.string "log_encoding", :limit => 64 + t.text "extra_info" + t.string "identifier" + t.boolean "is_default", :default => false + t.boolean "hidden", :default => false + end + + add_index "repositories", ["project_id"], :name => "index_repositories_on_project_id" + + create_table "rich_rich_files", :force => true do |t| + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "rich_file_file_name" + t.string "rich_file_content_type" + t.integer "rich_file_file_size" + t.datetime "rich_file_updated_at" + t.string "owner_type" + t.integer "owner_id" + t.text "uri_cache" + t.string "simplified_type", :default => "file" + end + + create_table "roles", :force => true do |t| + t.string "name", :limit => 30, :default => "", :null => false + t.integer "position", :default => 1 + t.boolean "assignable", :default => true + t.integer "builtin", :default => 0, :null => false + t.text "permissions" + t.string "issues_visibility", :limit => 30, :default => "default", :null => false + end + + create_table "schools", :force => true do |t| + t.string "name" + t.string "province" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "logo_link" + t.string "pinyin" + end + + create_table "secdomains", :force => true do |t| + t.integer "sub_type" + t.string "subname" + t.integer "pid", :default => 0 + t.string "desc" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "seems_rateable_cached_ratings", :force => true do |t| + t.integer "cacheable_id", :limit => 8 + t.string "cacheable_type" + t.float "avg", :null => false + t.integer "cnt", :null => false + t.string "dimension" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "seems_rateable_rates", :force => true do |t| + t.integer "rater_id", :limit => 8 + t.integer "rateable_id" + t.string "rateable_type" + t.float "stars", :null => false + t.string "dimension" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "is_teacher_score", :default => 0 + end + + create_table "settings", :force => true do |t| + t.string "name", :default => "", :null => false + t.text "value" + t.datetime "updated_on" + end + + add_index "settings", ["name"], :name => "index_settings_on_name" + + create_table "shares", :force => true do |t| + t.date "created_on" + t.string "url" + t.string "title" + t.integer "share_type" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "project_id" + t.integer "user_id" + t.string "description" + end + + create_table "shield_activities", :force => true do |t| + t.string "container_type" + t.integer "container_id" + t.string "shield_type" + t.integer "shield_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "shield_wechat_messages", :force => true do |t| + t.integer "container_id" + t.string "container_type" + t.integer "shield_id" + t.string "shield_type" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "softapplications", :force => true do |t| + t.string "name" + t.text "description" + t.integer "app_type_id" + t.string "app_type_name" + t.string "android_min_version_available" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "contest_id" + t.integer "softapplication_id" + t.integer "is_public" + t.string "application_developers" + t.string "deposit_project_url" + t.string "deposit_project" + t.integer "project_id" + end + + create_table "ssos", :force => true do |t| + t.integer "user_id" + t.string "openid" + t.string "name" + t.string "password" + t.string "email" + t.integer "sex" + t.string "school" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "ssos", ["user_id"], :name => "index_ssos_on_user_id" + + create_table "student_work_projects", :force => true do |t| + t.integer "homework_common_id" + t.integer "student_work_id" + t.integer "project_id" + t.integer "user_id" + t.integer "is_leader" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "student_work_projects", ["homework_common_id"], :name => "index_student_work_projects_on_homework_common_id" + add_index "student_work_projects", ["project_id"], :name => "index_student_work_projects_on_project_id" + add_index "student_work_projects", ["student_work_id"], :name => "index_student_work_projects_on_student_work_id" + add_index "student_work_projects", ["user_id"], :name => "index_student_work_projects_on_user_id" + + create_table "student_work_tests", :force => true do |t| + t.integer "student_work_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "status", :default => 9 + t.text "results" + t.text "src" + end + + create_table "student_works", :force => true do |t| + t.string "name" + t.text "description", :limit => 2147483647 + t.integer "homework_common_id" + t.integer "user_id" + t.float "final_score" + t.float "teacher_score" + t.float "student_score" + t.float "teaching_asistant_score" + t.integer "project_id", :default => 0 + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "late_penalty", :default => 0 + t.integer "absence_penalty", :default => 0 + t.float "system_score", :default => 0.0 + t.boolean "is_test", :default => false + t.integer "simi_id" + t.integer "simi_value" + t.float "work_score" + end + + add_index "student_works", ["homework_common_id", "user_id"], :name => "index_student_works_on_homework_common_id_and_user_id" + + create_table "student_works_evaluation_distributions", :force => true do |t| + t.integer "student_work_id" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "student_works_scores", :force => true do |t| + t.integer "student_work_id" + t.integer "user_id" + t.integer "score" + t.text "comment" + t.integer "reviewer_role" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "students_for_courses", :force => true do |t| + t.integer "student_id" + t.integer "course_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "students_for_courses", ["course_id"], :name => "index_students_for_courses_on_course_id" + add_index "students_for_courses", ["student_id"], :name => "index_students_for_courses_on_student_id" + + create_table "sub_document_comments", :force => true do |t| + t.text "content" + t.text "title" + t.integer "sub_domain_id" + t.integer "creator_id" + t.integer "parent_id" + t.integer "reply_id" + t.integer "locked" + t.integer "sticky" + t.integer "org_subfield_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "sub_domains", :force => true do |t| + t.integer "org_subfield_id" + t.integer "priority", :default => 0 + t.string "name" + t.string "field_type" + t.integer "hide", :default => 0 + t.integer "status", :default => 0 + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "subfield_subdomain_dirs", :force => true do |t| + t.integer "org_subfield_id" + t.string "name" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "syllabuses", :force => true do |t| + t.string "title" + t.text "description" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "eng_name" + t.integer "type" + t.integer "credit" + t.integer "hours" + t.integer "theory_hours" + t.integer "practice_hours" + t.string "applicable_major" + t.string "pre_course" + t.integer "visits", :default => 0 + t.integer "des_status", :default => 0 + end + + add_index "syllabuses", ["user_id"], :name => "index_syllabuses_on_user_id" + + create_table "system_messages", :force => true do |t| + t.integer "user_id" + t.string "content" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.text "description" + t.string "subject" + end + + create_table "taggings", :force => true do |t| + t.integer "tag_id" + t.integer "taggable_id" + t.string "taggable_type" + t.integer "tagger_id" + t.string "tagger_type" + t.string "context", :limit => 128 + t.datetime "created_at" + end + + add_index "taggings", ["tag_id"], :name => "index_taggings_on_tag_id" + add_index "taggings", ["taggable_id", "taggable_type", "context"], :name => "index_taggings_on_taggable_id_and_taggable_type_and_context" + add_index "taggings", ["taggable_type"], :name => "index_taggings_on_taggable_type" + + create_table "tags", :force => true do |t| + t.string "name" + end + + create_table "teachers", :force => true do |t| + t.string "tea_name" + t.string "location" + t.integer "couurse_time" + t.integer "course_code" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "extra" + end + + create_table "time_entries", :force => true do |t| + t.integer "project_id", :null => false + t.integer "user_id", :null => false + t.integer "issue_id" + t.float "hours", :null => false + t.string "comments" + t.integer "activity_id", :null => false + t.date "spent_on", :null => false + t.integer "tyear", :null => false + t.integer "tmonth", :null => false + t.integer "tweek", :null => false + t.datetime "created_on", :null => false + t.datetime "updated_on", :null => false + end + + add_index "time_entries", ["activity_id"], :name => "index_time_entries_on_activity_id" + add_index "time_entries", ["created_on"], :name => "index_time_entries_on_created_on" + add_index "time_entries", ["issue_id"], :name => "time_entries_issue_id" + add_index "time_entries", ["project_id"], :name => "time_entries_project_id" + add_index "time_entries", ["user_id"], :name => "index_time_entries_on_user_id" + + create_table "tokens", :force => true do |t| + t.integer "user_id", :default => 0, :null => false + t.string "action", :limit => 30, :default => "", :null => false + t.string "value", :limit => 40, :default => "", :null => false + t.datetime "created_on", :null => false + end + + add_index "tokens", ["user_id"], :name => "index_tokens_on_user_id" + add_index "tokens", ["value"], :name => "tokens_value", :unique => true + + create_table "trackers", :force => true do |t| + t.string "name", :limit => 30, :default => "", :null => false + t.boolean "is_in_chlog", :default => false, :null => false + t.integer "position", :default => 1 + t.boolean "is_in_roadmap", :default => true, :null => false + t.integer "fields_bits", :default => 0 + end + + create_table "user_actions", :force => true do |t| + t.integer "user_id" + t.string "action_type" + t.integer "action_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "user_activities", :force => true do |t| + t.string "act_type" + t.integer "act_id" + t.string "container_type" + t.integer "container_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "user_id" + end + + add_index "user_activities", ["act_id", "act_type", "container_id", "created_at"], :name => "user_act_index" + + create_table "user_extensions", :force => true do |t| + t.integer "user_id", :null => false + t.date "birthday" + t.string "brief_introduction" + t.integer "gender" + t.string "location" + t.string "occupation" + t.integer "work_experience" + t.integer "zip_code" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.string "technical_title" + t.integer "identity" + t.string "student_id" + t.string "teacher_realname" + t.string "student_realname" + t.string "location_city" + t.integer "school_id" + t.string "description", :default => "" + end + + create_table "user_feedback_messages", :force => true do |t| + t.integer "user_id" + t.integer "journals_for_message_id" + t.string "journals_for_message_type" + t.integer "viewed" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "user_feedback_messages", ["journals_for_message_id"], :name => "index_user_feedback_messages_on_journals_for_message_id" + add_index "user_feedback_messages", ["user_id", "created_at"], :name => "index_user_feedback_messages_on_user_id_and_created_at" + + create_table "user_grades", :force => true do |t| + t.integer "user_id", :null => false + t.integer "project_id", :null => false + t.float "grade", :default => 0.0 + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + add_index "user_grades", ["grade"], :name => "index_user_grades_on_grade" + add_index "user_grades", ["project_id"], :name => "index_user_grades_on_project_id" + add_index "user_grades", ["user_id"], :name => "index_user_grades_on_user_id" + + create_table "user_levels", :force => true do |t| + t.integer "user_id" + t.integer "level" + end + + create_table "user_preferences", :force => true do |t| + t.integer "user_id", :default => 0, :null => false + t.text "others" + t.boolean "hide_mail", :default => false + t.string "time_zone" + end + + add_index "user_preferences", ["user_id"], :name => "index_user_preferences_on_user_id" + + create_table "user_score_details", :force => true do |t| + t.integer "current_user_id" + t.integer "target_user_id" + t.string "score_type" + t.string "score_action" + t.integer "user_id" + t.integer "old_score" + t.integer "new_score" + t.integer "current_user_level" + t.integer "target_user_level" + t.integer "score_changeable_obj_id" + t.string "score_changeable_obj_type" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "user_scores", :force => true do |t| + t.integer "user_id", :null => false + t.integer "collaboration" + t.integer "influence" + t.integer "skill" + t.integer "active" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "user_statuses", :force => true do |t| + t.integer "changesets_count" + t.integer "watchers_count" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.float "grade", :default => 0.0 + end + + add_index "user_statuses", ["changesets_count"], :name => "index_user_statuses_on_changesets_count" + add_index "user_statuses", ["grade"], :name => "index_user_statuses_on_grade" + add_index "user_statuses", ["watchers_count"], :name => "index_user_statuses_on_watchers_count" + + create_table "user_wechats", :force => true do |t| + t.integer "subscribe" + t.string "openid" + t.string "nickname" + t.integer "sex" + t.string "language" + t.string "city" + t.string "province" + t.string "country" + t.string "headimgurl" + t.string "subscribe_time" + t.string "unionid" + t.string "remark" + t.integer "groupid" + t.integer "user_id" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "users", :force => true do |t| + t.string "login", :default => "", :null => false + t.string "hashed_password", :limit => 40, :default => "", :null => false + t.string "firstname", :limit => 30, :default => "", :null => false + t.string "lastname", :default => "", :null => false + t.string "mail", :limit => 60, :default => "", :null => false + t.boolean "admin", :default => false, :null => false + t.integer "status", :default => 1, :null => false + t.datetime "last_login_on" + t.string "language", :limit => 5, :default => "" + t.integer "auth_source_id" + t.datetime "created_on" + t.datetime "updated_on" + t.string "type" + t.string "identity_url" + t.string "mail_notification", :default => "", :null => false + t.string "salt", :limit => 64 + t.integer "gid" + t.integer "visits", :default => 0 + t.integer "excellent_teacher", :default => 0 + t.integer "excellent_student", :default => 0 + end + + add_index "users", ["auth_source_id"], :name => "index_users_on_auth_source_id" + add_index "users", ["id", "type"], :name => "index_users_on_id_and_type" + add_index "users", ["type"], :name => "index_users_on_type" + + create_table "versions", :force => true do |t| + t.integer "project_id", :default => 0, :null => false + t.string "name", :default => "", :null => false + t.string "description", :default => "" + t.date "effective_date" + t.datetime "created_on" + t.datetime "updated_on" + t.string "wiki_page_title" + t.string "status", :default => "open" + t.string "sharing", :default => "none", :null => false + end + + add_index "versions", ["project_id"], :name => "versions_project_id" + add_index "versions", ["sharing"], :name => "index_versions_on_sharing" + + create_table "visitors", :force => true do |t| + t.integer "user_id" + t.integer "master_id" + t.datetime "updated_on" + t.datetime "created_on" + end + + add_index "visitors", ["master_id"], :name => "index_visitors_master_id" + add_index "visitors", ["updated_on"], :name => "index_visitors_updated_on" + add_index "visitors", ["user_id"], :name => "index_visitors_user_id" + + create_table "watchers", :force => true do |t| + t.string "watchable_type", :default => "", :null => false + t.integer "watchable_id", :default => 0, :null => false + t.integer "user_id" + end + + add_index "watchers", ["user_id", "watchable_type"], :name => "watchers_user_id_type" + add_index "watchers", ["user_id"], :name => "index_watchers_on_user_id" + add_index "watchers", ["watchable_id", "watchable_type"], :name => "index_watchers_on_watchable_id_and_watchable_type" + + create_table "web_footer_companies", :force => true do |t| + t.string "name" + t.string "logo_size" + t.string "url" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "web_footer_oranizers", :force => true do |t| + t.string "name" + t.text "description" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "wechat_logs", :force => true do |t| + t.string "openid", :null => false + t.text "request_raw" + t.text "response_raw" + t.text "session_raw" + t.datetime "created_at", :null => false + end + + create_table "wiki_content_versions", :force => true do |t| + t.integer "wiki_content_id", :null => false + t.integer "page_id", :null => false + t.integer "author_id" + t.binary "data", :limit => 2147483647 + t.string "compression", :limit => 6, :default => "" + t.string "comments", :default => "" + t.datetime "updated_on", :null => false + t.integer "version", :null => false + end + + add_index "wiki_content_versions", ["updated_on"], :name => "index_wiki_content_versions_on_updated_on" + add_index "wiki_content_versions", ["wiki_content_id"], :name => "wiki_content_versions_wcid" + + create_table "wiki_contents", :force => true do |t| + t.integer "page_id", :null => false + t.integer "author_id" + t.text "text", :limit => 2147483647 + t.string "comments", :default => "" + t.datetime "updated_on", :null => false + t.integer "version", :null => false + end + + add_index "wiki_contents", ["author_id"], :name => "index_wiki_contents_on_author_id" + add_index "wiki_contents", ["page_id"], :name => "wiki_contents_page_id" + + create_table "wiki_pages", :force => true do |t| + t.integer "wiki_id", :null => false + t.string "title", :null => false + t.datetime "created_on", :null => false + t.boolean "protected", :default => false, :null => false + t.integer "parent_id" + end + + add_index "wiki_pages", ["parent_id"], :name => "index_wiki_pages_on_parent_id" + add_index "wiki_pages", ["wiki_id", "title"], :name => "wiki_pages_wiki_id_title" + add_index "wiki_pages", ["wiki_id"], :name => "index_wiki_pages_on_wiki_id" + + create_table "wiki_redirects", :force => true do |t| + t.integer "wiki_id", :null => false + t.string "title" + t.string "redirects_to" + t.datetime "created_on", :null => false + end + + add_index "wiki_redirects", ["wiki_id", "title"], :name => "wiki_redirects_wiki_id_title" + add_index "wiki_redirects", ["wiki_id"], :name => "index_wiki_redirects_on_wiki_id" + + create_table "wikis", :force => true do |t| + t.integer "project_id", :null => false + t.string "start_page", :null => false + t.integer "status", :default => 1, :null => false + end + + add_index "wikis", ["project_id"], :name => "wikis_project_id" + + create_table "workflows", :force => true do |t| + t.integer "tracker_id", :default => 0, :null => false + t.integer "old_status_id", :default => 0, :null => false + t.integer "new_status_id", :default => 0, :null => false + t.integer "role_id", :default => 0, :null => false + t.boolean "assignee", :default => false, :null => false + t.boolean "author", :default => false, :null => false + t.string "type", :limit => 30 + t.string "field_name", :limit => 30 + t.string "rule", :limit => 30 + end + + add_index "workflows", ["new_status_id"], :name => "index_workflows_on_new_status_id" + add_index "workflows", ["old_status_id"], :name => "index_workflows_on_old_status_id" + add_index "workflows", ["role_id", "tracker_id", "old_status_id"], :name => "wkfs_role_tracker_old_status" + add_index "workflows", ["role_id"], :name => "index_workflows_on_role_id" + + create_table "works_categories", :force => true do |t| + t.string "category" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + + create_table "zip_packs", :force => true do |t| + t.integer "user_id" + t.integer "homework_id" + t.string "file_digest" + t.string "file_path" + t.integer "pack_times", :default => 1 + t.integer "pack_size", :default => 0 + t.text "file_digests" + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + end + +end diff --git a/public/stylesheets/syllabus.css b/public/stylesheets/syllabus.css index 83f6cefbc..88c8cebbf 100644 --- a/public/stylesheets/syllabus.css +++ b/public/stylesheets/syllabus.css @@ -101,7 +101,8 @@ a.syllabusbox_a_blue{ .icon_course{ background: url(../images/syllabus/icons_syllabus.png) 0 -35px no-repeat; width:18px; height:15px; display:block;} .icons_sy_open{background: url(../images/syllabus/icons_syllabus.png) 0 -53px no-repeat; width:20px; height:23px; display:block; cursor:pointer; } .icons_sy_close{background: url(../images/syllabus/icons_syllabus.png) -26px -53px no-repeat; width:20px; height:23px; display:block; } -.icons_sy_setting{background: url(../images/syllabus/icons_syllabus.png) -51px -33px no-repeat; width:20px; height:20px; display:block; } +.syllabus_courses_box {position:relative;} +.icons_sy_setting{background: url(../images/syllabus/icons_syllabus.png) -51px -33px no-repeat; width:20px; height:20px; display:block; position:absolute; right:10px; top:10px; } .icons_sy_setting:hover{background: url(../images/syllabus/icons_syllabus.png) -25px -33px no-repeat; } .icons_sy_cir{background: url(../images/syllabus/icons_syllabus.png) 0px -82px no-repeat; width:15px; height:15px; display:block; position:absolute; left:-8px; top:25px;} .icons_sy_arrow{background: url(../images/syllabus/icons_syllabus.png) -31px -81px no-repeat; width:20px; height:20px; display:block; } From 5cc40408eea01dd53701b67ea9f80b2a4c48c811 Mon Sep 17 00:00:00 2001 From: yuanke <249218296@qq.com> Date: Thu, 30 Jun 2016 16:30:02 +0800 Subject: [PATCH 191/216] =?UTF-8?q?=E4=BF=AE=E6=94=B9KE=E5=8D=95=E5=80=8D?= =?UTF-8?q?=E8=A1=8C=E8=B7=9D=E6=98=BE=E7=A4=BA=E7=9A=84=E6=97=B6=E5=80=99?= =?UTF-8?q?=E4=B8=8D=E4=B8=80=E8=87=B4=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config/locales/my/zh.yml | 2 +- config/locales/zh.yml | 2 +- public/stylesheets/courses.css | 3 ++- public/stylesheets/new_user.css | 1 + public/stylesheets/project.css | 1 + public/stylesheets/public.css | 1 + 6 files changed, 7 insertions(+), 3 deletions(-) diff --git a/config/locales/my/zh.yml b/config/locales/my/zh.yml index 25a949df4..39c7c3167 100644 --- a/config/locales/my/zh.yml +++ b/config/locales/my/zh.yml @@ -28,7 +28,7 @@ zh: label_account_identity_choose: --请选择身份-- label_account_identity_teacher: 教师 label_account_identity_student: 学生 - label_account_identity_developer: 开发者 + label_account_identity_developer: 从业者 label_account_identity_enterprise: 组织 label_account_identity_studentID: 请输入学号 diff --git a/config/locales/zh.yml b/config/locales/zh.yml index 3dbd2e8ef..c80a39891 100644 --- a/config/locales/zh.yml +++ b/config/locales/zh.yml @@ -1665,7 +1665,7 @@ zh: #add by men label_account_identity_teacher: 教师 label_account_identity_student: 学生 - label_account_identity_developer: 开发者 + label_account_identity_developer: 从业者 label_account_identity_enterprise: 组织 label_teaching_course: 我执教的课程 diff --git a/public/stylesheets/courses.css b/public/stylesheets/courses.css index d0a5e7ab3..a94e61d1d 100644 --- a/public/stylesheets/courses.css +++ b/public/stylesheets/courses.css @@ -152,6 +152,7 @@ a.postTypeGrey:hover {color:#269ac9;} .homepagePostIntro ul li{list-style-type: disc;margin-left: 40px;} .homepagePostIntro td,.homepagePostIntro tr {border: 1px solid; border-color: inherit;} .homepagePostIntro a{color: #136ec2;} +.homepagePostIntro p{line-height: 1;} .homepagePostDeadline {font-size:12px; color:#888888; float:left; margin-top: 2px;} .homepagePostDate {font-size:12px; color:#888888;margin-bottom: 5px;} .homepagePostReply {width:710px; margin:0px auto; background-color:#f1f1f1; margin-top:10px;} @@ -1426,4 +1427,4 @@ a.pages-big{ width:50px;} .H60 {height:60px !important;} .W420 {width:420px;} .W300 {width:300px !important;} -.W600{ width:600px;} +.W600{ width:600px;} diff --git a/public/stylesheets/new_user.css b/public/stylesheets/new_user.css index b931dff6b..a65edc490 100644 --- a/public/stylesheets/new_user.css +++ b/public/stylesheets/new_user.css @@ -683,6 +683,7 @@ a.postTypeGrey:hover {color:#269ac9;} .homepagePostIntro ul li{list-style-type: disc;margin-left: 40px;} .homepagePostIntro td,.homepagePostIntro tr {border: 1px solid; border-color: inherit;} .homepagePostIntro a{color: #136ec2;} +.homepagePostIntro p{line-height: 1;} .homepagePostReplyBanner {width:718px; height:33px; border:1px solid #e4e4e4; line-height:33px; vertical-align:middle; font-size:12px; color:#888888; position: relative;} .borderBottomNone {border-bottom:none !important;} .homepagePostReplyBanner {width:718px; height:33px; border:1px solid #e4e4e4; line-height:33px; vertical-align:middle; font-size:12px; color:#888888;} diff --git a/public/stylesheets/project.css b/public/stylesheets/project.css index bde560613..354c0f1ac 100644 --- a/public/stylesheets/project.css +++ b/public/stylesheets/project.css @@ -969,6 +969,7 @@ a:hover.Reply_pic{border:1px solid #64bdd9;} color: #484848; overflow: hidden; } +.homepagePostIntro p{line-height: 1;} .homepagePostReply { width: 710px; margin: 10px auto 0px; diff --git a/public/stylesheets/public.css b/public/stylesheets/public.css index 500923519..bf7d288a7 100644 --- a/public/stylesheets/public.css +++ b/public/stylesheets/public.css @@ -632,6 +632,7 @@ a.postTypeGrey:hover {color:#269ac9;} .homepagePostIntro ul li{list-style-type: disc;margin-left: 40px;} .homepagePostIntro td,.homepagePostIntro tr {border: 1px solid; border-color: inherit;} .homepagePostIntro a{color: #136ec2;} +.homepagePostIntro p{line-height: 1;} .homepagePostDeadline {font-size:12px; color:#888888; float:left; margin-top: 2px;} .homepagePostDate {font-size:12px; color:#888888;margin-bottom: 5px;} .homepagePostReplyBanner {width:708px; height:33px; border:1px solid #e4e4e4; line-height:33px; vertical-align:middle; font-size:12px; color:#888888; position: relative;} From 24f1375a4e2bc0d1a08d7a360a8048861654dbbf Mon Sep 17 00:00:00 2001 From: txz Date: Thu, 30 Jun 2016 17:36:33 +0800 Subject: [PATCH 192/216] modified job --- app/views/quality_analysis/_edit.html.erb | 23 +++++++++++++++++++++++ app/views/quality_analysis/edit.js.erb | 0 2 files changed, 23 insertions(+) create mode 100644 app/views/quality_analysis/_edit.html.erb create mode 100644 app/views/quality_analysis/edit.js.erb diff --git a/app/views/quality_analysis/_edit.html.erb b/app/views/quality_analysis/_edit.html.erb new file mode 100644 index 000000000..d5cd49d0c --- /dev/null +++ b/app/views/quality_analysis/_edit.html.erb @@ -0,0 +1,23 @@ +
          代码质量分析
          +
          + <%= form_tag( url_for(:controller => 'quality_analysis', :action => 'create', :project_id => @project.id, :user_id => User.current.id, :identifier => @repository.identifier, :rep_id => @repository.id), :remote => true, :id => 'quality_analyses_form') do %> +
          +
          + +
          +
          +
          + <%= select_tag :branch, options_for_select(["#{@gitlab_default_branch}"]+ @branch_names, @rev), :id => 'branch', :class => "analysis-option-box" %> +
          +
          +
          +
          + <%= select_tag :language, options_for_select(["java","python","ruby","c++","c#","c"]), :id => 'branch', :class => "analysis-option-box" %> +
          +
          + + +
          +
          + <% end %> +
          diff --git a/app/views/quality_analysis/edit.js.erb b/app/views/quality_analysis/edit.js.erb new file mode 100644 index 000000000..e69de29bb From a8bd91754d348ac6e5c2770fe3574d85e03482a5 Mon Sep 17 00:00:00 2001 From: yuanke <249218296@qq.com> Date: Fri, 1 Jul 2016 09:27:46 +0800 Subject: [PATCH 193/216] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8D=9A=E5=AE=A2?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E9=87=8C=E9=9D=A2=E5=86=85=E5=AE=B9=E5=89=8D?= =?UTF-8?q?=E9=9D=A2=E5=A4=9A=E7=A9=BA=E6=A0=BC=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/views/blog_comments/show.html.erb | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/app/views/blog_comments/show.html.erb b/app/views/blog_comments/show.html.erb index 7d8aaed86..b1cd86484 100644 --- a/app/views/blog_comments/show.html.erb +++ b/app/views/blog_comments/show.html.erb @@ -91,9 +91,10 @@
        <%= format_time( @article.created_on)%>
        -
        - <%= @article.content.html_safe%> -
        + + + + <%=render :partial =>"users/intro_content", :locals=>{:user_activity_id =>@article.id, :content=>@article.content} %>
        <%#= link_to_attachments_course @topic, :author => false %> @@ -192,12 +193,12 @@
        From db1ad932c61409bdc2327bbb4a60c86cec457784 Mon Sep 17 00:00:00 2001 From: txz Date: Fri, 1 Jul 2016 09:31:05 +0800 Subject: [PATCH 194/216] Function : update jenkins job --- .../quality_analysis_controller.rb | 62 ++- app/views/quality_analysis/_edit.html.erb | 8 +- .../quality_analysis/_result_list.html.erb | 19 +- app/views/quality_analysis/edit.js.erb | 8 + config/routes.rb | 3 +- db/schema.rb | 402 +----------------- 6 files changed, 86 insertions(+), 416 deletions(-) diff --git a/app/controllers/quality_analysis_controller.rb b/app/controllers/quality_analysis_controller.rb index 15fdcef61..1f5695605 100644 --- a/app/controllers/quality_analysis_controller.rb +++ b/app/controllers/quality_analysis_controller.rb @@ -1,7 +1,8 @@ class QualityAnalysisController < ApplicationController before_filter :find_project_by_project_id#, :except => [:getattachtype] + before_filter :find_quality_analysis, :only => [:edit, :update_jenkins_job] before_filter :authorize - before_filter :connect_jenkins, :only => [:create] + before_filter :connect_jenkins, :only => [:create, :edit, :update_jenkins_job] layout "base_projects" include ApplicationHelper require 'jenkins_api_client' @@ -54,7 +55,7 @@ class QualityAnalysisController < ApplicationController # return '201' if build successed code = @client.job.build("#{job_name}") logger.error("build result ==> #{code}") - d = @client.delete("#{job_name}") if jenkins_job == '200' && code != '201' + d = @client.job.delete("#{job_name}") if jenkins_job == '200' && code != '201' logger.error("delete result ==> #{code}") if qa.blank? && code == '201' QualityAnalysis.create(:project_id => @project.id, :author_login => user_name, :rep_identifier => identifier, @@ -86,11 +87,54 @@ class QualityAnalysisController < ApplicationController end def edit - @quality_analysis = QualityAnalysis.where(:id => params[:id]) + @g = Gitlab.client + gitlab_branches = @g.branches(@project.gpid) + @branch_names = gitlab_branches.map{|b| b.name} + @gitlab_default_branch = @g.project(@project.gpid).default_branch end - def update - @quality_analysis = QualityAnalysis.where(:id => params[:id]) + def update_jenkins_job + begin + rep_id = Repository.where(:project_id => @project.id).first.try(:id) + logger.error("#############################===>666") + sonar_name = @quality_analysis.sonar_name + job_name = "#{@quality_analysis.author_login}-#{rep_id}" + version = @quality_analysis.sonar_version + path = params[:path].blank? ? "./" : params[:path] + language = swith_language_type(params[:language]) + branch = params[:branch] + identifier = @quality_analysis.rep_identifier + properties = "sonar.projectKey=#{sonar_name} + sonar.projectName=#{sonar_name} + sonar.projectVersion=#{version} + sonar.sources=#{path} + sonar.language=#{language.downcase} + sonar.sourceEncoding=utf-8" + git_url = @gitlab_address.to_s+"/"+@project.owner.to_s+"/"+ identifier + "."+"git" + + # modify config.yml + @doc = Nokogiri::XML(File.open(File.join(Rails.root, 'tmp', 'config.xml'))) + @doc.at_xpath("//hudson.plugins.git.UserRemoteConfig/url").content = git_url + @doc.at_xpath("//hudson.plugins.git.BranchSpec/name").content = "*/#{branch}" + @doc.at_xpath("//hudson.plugins.sonar.SonarRunnerBuilder/properties").content = properties # sonar-properties + + # return '200' if successed + jenkins_job = @client.job.update("#{job_name}", @doc.to_xml) + logger.error("Failed to update job: ==> #{jenkins_job}") unless jenkins_job == '200' + if jenkins_job == '200' + logger.info("quality_ananlysis will be updated: ==> #{jenkins_job}") + @quality_analysis.path = path + @quality_analysis.language = language + @quality_analysis.branch = branch + @quality_analysis.save + end + rescue Exception => e + logger.error("Update jenkins job: #{e}") + end + respond_to do |format| + format.html{redirect_to project_quality_analysis_path(:project_id => @project.id)} + format.js + end end # resource_id: login + @repository.id @@ -123,6 +167,14 @@ class QualityAnalysisController < ApplicationController render_404 end + def find_quality_analysis + begin + @quality_analysis = QualityAnalysis.find(params[:id]) + rescue + render_404 + end + end + # Authorize the user for the requested action def authorize(ctrl = params[:controller], action = params[:action], global = false) unless @project.archived? && @project.gpid.nil? diff --git a/app/views/quality_analysis/_edit.html.erb b/app/views/quality_analysis/_edit.html.erb index d5cd49d0c..f508ee5de 100644 --- a/app/views/quality_analysis/_edit.html.erb +++ b/app/views/quality_analysis/_edit.html.erb @@ -1,21 +1,21 @@
        代码质量分析
        - <%= form_tag( url_for(:controller => 'quality_analysis', :action => 'create', :project_id => @project.id, :user_id => User.current.id, :identifier => @repository.identifier, :rep_id => @repository.id), :remote => true, :id => 'quality_analyses_form') do %> + <%= form_tag( url_for(:controller => 'quality_analysis', :action => 'update_jenkins_job', :project_id => @project.id), :id => 'quality_analyses_edit_form') do %>
        - <%= select_tag :branch, options_for_select(["#{@gitlab_default_branch}"]+ @branch_names, @rev), :id => 'branch', :class => "analysis-option-box" %> + <%= select_tag :branch, options_for_select(["#{@gitlab_default_branch}"]+ @branch_names, @quality_analysis.branch), :value => 77, :id => 'branch', :class => "analysis-option-box" %>
        - <%= select_tag :language, options_for_select(["java","python","ruby","c++","c#","c"]), :id => 'branch', :class => "analysis-option-box" %> + <%= select_tag :language, options_for_select(["java","python","ruby","c++","c#","c"], "#{@quality_analysis.language}"), :id => 'branch', :class => "analysis-option-box" %>
        - +
        diff --git a/app/views/quality_analysis/_result_list.html.erb b/app/views/quality_analysis/_result_list.html.erb index b4a40de0d..c47d51f1f 100644 --- a/app/views/quality_analysis/_result_list.html.erb +++ b/app/views/quality_analysis/_result_list.html.erb @@ -3,22 +3,21 @@
        • 名称
        • -
        • 版本
        • -
        • 分支
        • -
        • 语言
        • -
        • 路径
        • -
        • bianji
        • +
        • 分支
        • +
        • 语言
        • +
        • 路径
        • +
        • 编辑
        • +
        <% if @quality_analyses.count >0 %> <% @quality_analyses.each do |qa| %>
        • <%=link_to "#{qa.author_login}:#{qa.rep_identifier}", project_quality_analysis_path(:resource_id => qa.sonar_name, :branch => (qa.branch.nil? ? "master" : qa.branch)), :class => "analysis-result-name fl fontBlue2" %>
        • -
        • 1.0
        • -
        • <%= qa.branch %>
        • -
        • <%= qa.language %>
        • -
        • <%= qa.path %>
        • -
        • <%=link_to "bianji", edit_project__quality_analysis_path(@quality_analysis) %>
        • +
        • <%= qa.branch %>
        • +
        • <%= qa.language %>
        • +
        • <%= qa.path %>
        • +
        • <%=link_to "编辑", edit_project_quality_analysi_path(qa, :project_id => @project.id), :remote => true %>
        <% end %> diff --git a/app/views/quality_analysis/edit.js.erb b/app/views/quality_analysis/edit.js.erb index e69de29bb..4277ae28e 100644 --- a/app/views/quality_analysis/edit.js.erb +++ b/app/views/quality_analysis/edit.js.erb @@ -0,0 +1,8 @@ +$('#ajax-modal').html('<%= escape_javascript( render :partial => 'quality_analysis/edit', :locals => {}) %>'); +showModal('ajax-modal', '615px'); +$('#ajax-modal').siblings().remove(); +$('#ajax-modal').before(""); +$('#ajax-modal').parent().css("top","20%").css("left","32%").css("border","3px solid #269ac9"); +$('#ajax-modal').parent().addClass("popbox_polls"); + + diff --git a/config/routes.rb b/config/routes.rb index 5404e4ecf..075aff6e1 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -790,7 +790,8 @@ RedmineApp::Application.routes.draw do collection do end member do - + match 'update_jenkins_job' + match 'edit' end end # resources :files, :only => [:index, :new, :create] do diff --git a/db/schema.rb b/db/schema.rb index 16f39f6a1..3258f89c1 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -52,28 +52,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do add_index "api_keys", ["access_token"], :name => "index_api_keys_on_access_token" add_index "api_keys", ["user_id"], :name => "index_api_keys_on_user_id" - create_table "application_settings", :force => true do |t| - t.integer "default_projects_limit" - t.boolean "signup_enabled" - t.boolean "signin_enabled" - t.boolean "gravatar_enabled" - t.text "sign_in_text" - t.datetime "created_at" - t.datetime "updated_at" - t.string "home_page_url" - t.integer "default_branch_protection", :default => 2 - t.boolean "twitter_sharing_enabled", :default => true - t.text "restricted_visibility_levels" - t.boolean "version_check_enabled", :default => true - t.integer "max_attachment_size", :default => 10, :null => false - t.integer "default_project_visibility" - t.integer "default_snippet_visibility" - t.text "restricted_signup_domains" - t.boolean "user_oauth_applications", :default => true - t.string "after_sign_out_path" - t.integer "session_expire_delay", :default => 10080, :null => false - end - create_table "applied_projects", :force => true do |t| t.integer "project_id", :null => false t.integer "user_id", :null => false @@ -178,20 +156,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do t.string "typeName", :limit => 50 end - create_table "audit_events", :force => true do |t| - t.integer "author_id", :null => false - t.string "type", :null => false - t.integer "entity_id", :null => false - t.string "entity_type", :null => false - t.text "details" - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "audit_events", ["author_id"], :name => "index_audit_events_on_author_id" - add_index "audit_events", ["entity_id", "entity_type"], :name => "index_audit_events_on_entity_id_and_entity_type" - add_index "audit_events", ["type"], :name => "index_audit_events_on_type" - create_table "auth_sources", :force => true do |t| t.string "type", :limit => 30, :default => "", :null => false t.string "name", :limit => 60, :default => "", :null => false @@ -289,17 +253,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do add_index "boards", ["last_message_id"], :name => "index_boards_on_last_message_id" add_index "boards", ["project_id"], :name => "boards_project_id" - create_table "broadcast_messages", :force => true do |t| - t.text "message", :null => false - t.datetime "starts_at" - t.datetime "ends_at" - t.integer "alert_type" - t.datetime "created_at" - t.datetime "updated_at" - t.string "color" - t.string "font" - end - create_table "bug_to_osps", :force => true do |t| t.integer "osp_id" t.integer "relative_memo_id" @@ -598,8 +551,11 @@ ActiveRecord::Schema.define(:version => 20160627090316) do t.integer "is_copy", :default => 0 t.integer "visits", :default => 0 t.integer "syllabus_id" + t.string "invite_code" + t.string "qrcode" end + add_index "courses", ["invite_code"], :name => "index_courses_on_invite_code", :unique => true add_index "courses", ["syllabus_id"], :name => "index_courses_on_syllabus_id" create_table "custom_fields", :force => true do |t| @@ -663,15 +619,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do add_index "delayed_jobs", ["priority", "run_at"], :name => "delayed_jobs_priority" - create_table "deploy_keys_projects", :force => true do |t| - t.integer "deploy_key_id", :null => false - t.integer "project_id", :null => false - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "deploy_keys_projects", ["project_id"], :name => "index_deploy_keys_projects_on_project_id" - create_table "discuss_demos", :force => true do |t| t.string "title" t.text "body" @@ -721,16 +668,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do t.datetime "created_at" end - create_table "emails", :force => true do |t| - t.integer "user_id", :null => false - t.string "email", :null => false - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "emails", ["email"], :name => "index_emails_on_email", :unique => true - add_index "emails", ["user_id"], :name => "index_emails_on_user_id" - create_table "enabled_modules", :force => true do |t| t.integer "project_id" t.string "name", :null => false @@ -753,25 +690,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do add_index "enumerations", ["id", "type"], :name => "index_enumerations_on_id_and_type" add_index "enumerations", ["project_id"], :name => "index_enumerations_on_project_id" - create_table "events", :force => true do |t| - t.string "target_type" - t.integer "target_id" - t.string "title" - t.text "data" - t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "action" - t.integer "author_id" - end - - add_index "events", ["action"], :name => "index_events_on_action" - add_index "events", ["author_id"], :name => "index_events_on_author_id" - add_index "events", ["created_at"], :name => "index_events_on_created_at" - add_index "events", ["project_id"], :name => "index_events_on_project_id" - add_index "events", ["target_id"], :name => "index_events_on_target_id" - add_index "events", ["target_type"], :name => "index_events_on_target_type" - create_table "exercise_answers", :force => true do |t| t.integer "user_id" t.integer "exercise_question_id" @@ -874,15 +792,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do add_index "forge_messages", ["forge_message_id", "forge_message_type"], :name => "index_forge_messages_on_forge_message_id_and_forge_message_type" add_index "forge_messages", ["user_id", "project_id", "created_at"], :name => "index_forge_messages_on_user_id_and_project_id_and_created_at" - create_table "forked_project_links", :force => true do |t| - t.integer "forked_to_project_id", :null => false - t.integer "forked_from_project_id", :null => false - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "forked_project_links", ["forked_to_project_id"], :name => "index_forked_project_links_on_forked_to_project_id", :unique => true - create_table "forums", :force => true do |t| t.string "name", :null => false t.text "description" @@ -1012,17 +921,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do t.datetime "updated_at", :null => false end - create_table "identities", :force => true do |t| - t.string "extern_uid" - t.string "provider" - t.integer "user_id" - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "identities", ["created_at", "id"], :name => "index_identities_on_created_at_and_id" - add_index "identities", ["user_id"], :name => "index_identities_on_user_id" - create_table "invite_lists", :force => true do |t| t.integer "project_id" t.integer "user_id" @@ -1166,20 +1064,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do t.integer "private", :default => 0 end - create_table "keys", :force => true do |t| - t.integer "user_id" - t.datetime "created_at" - t.datetime "updated_at" - t.text "key" - t.string "title" - t.string "type" - t.string "fingerprint" - t.boolean "public", :default => false, :null => false - end - - add_index "keys", ["created_at", "id"], :name => "index_keys_on_created_at_and_id" - add_index "keys", ["user_id"], :name => "index_keys_on_user_id" - create_table "kindeditor_assets", :force => true do |t| t.string "asset" t.integer "file_size" @@ -1191,27 +1075,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do t.integer "owner_type", :default => 0 end - create_table "label_links", :force => true do |t| - t.integer "label_id" - t.integer "target_id" - t.string "target_type" - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "label_links", ["label_id"], :name => "index_label_links_on_label_id" - add_index "label_links", ["target_id", "target_type"], :name => "index_label_links_on_target_id_and_target_type" - - create_table "labels", :force => true do |t| - t.string "title" - t.string "color" - t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "labels", ["project_id"], :name => "index_labels_on_project_id" - create_table "member_roles", :force => true do |t| t.integer "member_id", :null => false t.integer "role_id", :null => false @@ -1262,47 +1125,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do t.integer "viewed_count", :default => 0 end - create_table "merge_request_diffs", :force => true do |t| - t.string "state" - t.text "st_commits", :limit => 2147483647 - t.text "st_diffs", :limit => 2147483647 - t.integer "merge_request_id", :null => false - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "merge_request_diffs", ["merge_request_id"], :name => "index_merge_request_diffs_on_merge_request_id", :unique => true - - create_table "merge_requests", :force => true do |t| - t.string "target_branch", :null => false - t.string "source_branch", :null => false - t.integer "source_project_id", :null => false - t.integer "author_id" - t.integer "assignee_id" - t.string "title" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "milestone_id" - t.string "state" - t.string "merge_status" - t.integer "target_project_id", :null => false - t.integer "iid" - t.text "description" - t.integer "position", :default => 0 - t.datetime "locked_at" - end - - add_index "merge_requests", ["assignee_id"], :name => "index_merge_requests_on_assignee_id" - add_index "merge_requests", ["author_id"], :name => "index_merge_requests_on_author_id" - add_index "merge_requests", ["created_at", "id"], :name => "index_merge_requests_on_created_at_and_id" - add_index "merge_requests", ["created_at"], :name => "index_merge_requests_on_created_at" - add_index "merge_requests", ["milestone_id"], :name => "index_merge_requests_on_milestone_id" - add_index "merge_requests", ["source_branch"], :name => "index_merge_requests_on_source_branch" - add_index "merge_requests", ["source_project_id"], :name => "index_merge_requests_on_source_project_id" - add_index "merge_requests", ["target_branch"], :name => "index_merge_requests_on_target_branch" - add_index "merge_requests", ["target_project_id", "iid"], :name => "index_merge_requests_on_target_project_id_and_iid", :unique => true - add_index "merge_requests", ["title"], :name => "index_merge_requests_on_title" - create_table "message_alls", :force => true do |t| t.integer "user_id" t.integer "message_id" @@ -1337,39 +1159,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do add_index "messages", ["last_reply_id"], :name => "index_messages_on_last_reply_id" add_index "messages", ["parent_id"], :name => "messages_parent_id" - create_table "milestones", :force => true do |t| - t.string "title", :null => false - t.integer "project_id", :null => false - t.text "description" - t.date "due_date" - t.datetime "created_at" - t.datetime "updated_at" - t.string "state" - t.integer "iid" - end - - add_index "milestones", ["created_at", "id"], :name => "index_milestones_on_created_at_and_id" - add_index "milestones", ["due_date"], :name => "index_milestones_on_due_date" - add_index "milestones", ["project_id", "iid"], :name => "index_milestones_on_project_id_and_iid", :unique => true - add_index "milestones", ["project_id"], :name => "index_milestones_on_project_id" - - create_table "namespaces", :force => true do |t| - t.string "name", :null => false - t.string "path", :null => false - t.integer "owner_id" - t.datetime "created_at" - t.datetime "updated_at" - t.string "type" - t.string "description", :default => "", :null => false - t.string "avatar" - end - - add_index "namespaces", ["created_at", "id"], :name => "index_namespaces_on_created_at_and_id" - add_index "namespaces", ["name"], :name => "index_namespaces_on_name", :unique => true - add_index "namespaces", ["owner_id"], :name => "index_namespaces_on_owner_id" - add_index "namespaces", ["path"], :name => "index_namespaces_on_path", :unique => true - add_index "namespaces", ["type"], :name => "index_namespaces_on_type" - create_table "news", :force => true do |t| t.integer "project_id" t.string "title", :limit => 60, :default => "", :null => false @@ -1395,31 +1184,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do t.datetime "updated_at", :null => false end - create_table "notes", :force => true do |t| - t.text "note" - t.string "noteable_type" - t.integer "author_id" - t.datetime "created_at" - t.datetime "updated_at" - t.integer "project_id" - t.string "attachment" - t.string "line_code" - t.string "commit_id" - t.integer "noteable_id" - t.boolean "system", :default => false, :null => false - t.text "st_diff", :limit => 2147483647 - end - - add_index "notes", ["author_id"], :name => "index_notes_on_author_id" - add_index "notes", ["commit_id"], :name => "index_notes_on_commit_id" - add_index "notes", ["created_at", "id"], :name => "index_notes_on_created_at_and_id" - add_index "notes", ["created_at"], :name => "index_notes_on_created_at" - add_index "notes", ["noteable_id", "noteable_type"], :name => "index_notes_on_noteable_id_and_noteable_type" - add_index "notes", ["noteable_type"], :name => "index_notes_on_noteable_type" - add_index "notes", ["project_id", "noteable_type"], :name => "index_notes_on_project_id_and_noteable_type" - add_index "notes", ["project_id"], :name => "index_notes_on_project_id" - add_index "notes", ["updated_at"], :name => "index_notes_on_updated_at" - create_table "notificationcomments", :force => true do |t| t.string "notificationcommented_type" t.integer "notificationcommented_id" @@ -1429,49 +1193,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do t.datetime "updated_at", :null => false end - create_table "oauth_access_grants", :force => true do |t| - t.integer "resource_owner_id", :null => false - t.integer "application_id", :null => false - t.string "token", :null => false - t.integer "expires_in", :null => false - t.text "redirect_uri", :null => false - t.datetime "created_at", :null => false - t.datetime "revoked_at" - t.string "scopes" - end - - add_index "oauth_access_grants", ["token"], :name => "index_oauth_access_grants_on_token", :unique => true - - create_table "oauth_access_tokens", :force => true do |t| - t.integer "resource_owner_id" - t.integer "application_id" - t.string "token", :null => false - t.string "refresh_token" - t.integer "expires_in" - t.datetime "revoked_at" - t.datetime "created_at", :null => false - t.string "scopes" - end - - add_index "oauth_access_tokens", ["refresh_token"], :name => "index_oauth_access_tokens_on_refresh_token", :unique => true - add_index "oauth_access_tokens", ["resource_owner_id"], :name => "index_oauth_access_tokens_on_resource_owner_id" - add_index "oauth_access_tokens", ["token"], :name => "index_oauth_access_tokens_on_token", :unique => true - - create_table "oauth_applications", :force => true do |t| - t.string "name", :null => false - t.string "uid", :null => false - t.string "secret", :null => false - t.text "redirect_uri", :null => false - t.string "scopes", :default => "", :null => false - t.datetime "created_at" - t.datetime "updated_at" - t.integer "owner_id" - t.string "owner_type" - end - - add_index "oauth_applications", ["owner_id", "owner_type"], :name => "index_oauth_applications_on_owner_id_and_owner_type" - add_index "oauth_applications", ["uid"], :name => "index_oauth_applications_on_uid", :unique => true - create_table "onclick_times", :force => true do |t| t.integer "user_id" t.datetime "onclick_time" @@ -1629,23 +1350,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do t.integer "allow_teacher", :default => 0 end - create_table "permissions", :force => true do |t| - t.string "controller", :limit => 30, :default => "", :null => false - t.string "action", :limit => 30, :default => "", :null => false - t.string "description", :limit => 60, :default => "", :null => false - t.boolean "is_public", :default => false, :null => false - t.integer "sort", :default => 0, :null => false - t.boolean "mail_option", :default => false, :null => false - t.boolean "mail_enabled", :default => false, :null => false - end - - create_table "permissions_roles", :id => false, :force => true do |t| - t.integer "permission_id", :default => 0, :null => false - t.integer "role_id", :default => 0, :null => false - end - - add_index "permissions_roles", ["role_id"], :name => "permissions_roles_role_id" - create_table "phone_app_versions", :force => true do |t| t.string "version" t.text "description" @@ -1728,11 +1432,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do t.datetime "updated_at", :null => false end - create_table "project_import_data", :force => true do |t| - t.integer "project_id" - t.text "data" - end - create_table "project_infos", :force => true do |t| t.integer "project_id" t.integer "user_id" @@ -1823,24 +1522,13 @@ ActiveRecord::Schema.define(:version => 20160627090316) do add_index "projects_trackers", ["project_id", "tracker_id"], :name => "projects_trackers_unique", :unique => true add_index "projects_trackers", ["project_id"], :name => "projects_trackers_project_id" - create_table "protected_branches", :force => true do |t| - t.integer "project_id", :null => false - t.string "name", :null => false - t.datetime "created_at" - t.datetime "updated_at" - t.boolean "developers_can_push", :default => false, :null => false - end - - add_index "protected_branches", ["project_id"], :name => "index_protected_branches_on_project_id" - create_table "quality_analyses", :force => true do |t| t.integer "project_id" t.string "author_login" t.string "rep_identifier" - t.datetime "created_at", :null => false - t.datetime "updated_at", :null => false - t.float "version", :default => 0.0 - t.integer "sonar_version", :default => 1 + t.datetime "created_at", :null => false + t.datetime "updated_at", :null => false + t.integer "sonar_version", :default => 0 t.string "path" t.string "branch" t.string "language" @@ -1981,25 +1669,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do t.integer "is_teacher_score", :default => 0 end - create_table "services", :force => true do |t| - t.string "type" - t.string "title" - t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" - t.boolean "active", :default => false, :null => false - t.text "properties" - t.boolean "template", :default => false - t.boolean "push_events", :default => true - t.boolean "issues_events", :default => true - t.boolean "merge_requests_events", :default => true - t.boolean "tag_push_events", :default => true - t.boolean "note_events", :default => true, :null => false - end - - add_index "services", ["created_at", "id"], :name => "index_services_on_created_at_and_id" - add_index "services", ["project_id"], :name => "index_services_on_project_id" - create_table "settings", :force => true do |t| t.string "name", :default => "", :null => false t.text "value" @@ -2038,26 +1707,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do t.datetime "updated_at", :null => false end - create_table "snippets", :force => true do |t| - t.string "title" - t.text "content", :limit => 2147483647 - t.integer "author_id", :null => false - t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" - t.string "file_name" - t.datetime "expires_at" - t.string "type" - t.integer "visibility_level", :default => 0, :null => false - end - - add_index "snippets", ["author_id"], :name => "index_snippets_on_author_id" - add_index "snippets", ["created_at", "id"], :name => "index_snippets_on_created_at_and_id" - add_index "snippets", ["created_at"], :name => "index_snippets_on_created_at" - add_index "snippets", ["expires_at"], :name => "index_snippets_on_expires_at" - add_index "snippets", ["project_id"], :name => "index_snippets_on_project_id" - add_index "snippets", ["visibility_level"], :name => "index_snippets_on_visibility_level" - create_table "softapplications", :force => true do |t| t.string "name" t.text "description" @@ -2196,17 +1845,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do t.datetime "updated_at", :null => false end - create_table "subscriptions", :force => true do |t| - t.integer "user_id" - t.integer "subscribable_id" - t.string "subscribable_type" - t.boolean "subscribed" - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "subscriptions", ["subscribable_id", "subscribable_type", "user_id"], :name => "subscriptions_user_id_and_ref_fields", :unique => true - create_table "syllabuses", :force => true do |t| t.string "title" t.text "description" @@ -2457,17 +2095,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do add_index "users", ["id", "type"], :name => "index_users_on_id_and_type" add_index "users", ["type"], :name => "index_users_on_type" - create_table "users_star_projects", :force => true do |t| - t.integer "project_id", :null => false - t.integer "user_id", :null => false - t.datetime "created_at" - t.datetime "updated_at" - end - - add_index "users_star_projects", ["project_id"], :name => "index_users_star_projects_on_project_id" - add_index "users_star_projects", ["user_id", "project_id"], :name => "index_users_star_projects_on_user_id_and_project_id", :unique => true - add_index "users_star_projects", ["user_id"], :name => "index_users_star_projects_on_user_id" - create_table "versions", :force => true do |t| t.integer "project_id", :default => 0, :null => false t.string "name", :default => "", :null => false @@ -2519,23 +2146,6 @@ ActiveRecord::Schema.define(:version => 20160627090316) do t.datetime "updated_at", :null => false end - create_table "web_hooks", :force => true do |t| - t.string "url" - t.integer "project_id" - t.datetime "created_at" - t.datetime "updated_at" - t.string "type", :default => "ProjectHook" - t.integer "service_id" - t.boolean "push_events", :default => true, :null => false - t.boolean "issues_events", :default => false, :null => false - t.boolean "merge_requests_events", :default => false, :null => false - t.boolean "tag_push_events", :default => false - t.boolean "note_events", :default => false, :null => false - end - - add_index "web_hooks", ["created_at", "id"], :name => "index_web_hooks_on_created_at_and_id" - add_index "web_hooks", ["project_id"], :name => "index_web_hooks_on_project_id" - create_table "wechat_logs", :force => true do |t| t.string "openid", :null => false t.text "request_raw" From 2c1e0f534c7e0a5653f4fd081e1290720b8da76a Mon Sep 17 00:00:00 2001 From: cxt Date: Fri, 1 Jul 2016 11:11:53 +0800 Subject: [PATCH 195/216] =?UTF-8?q?=E8=AF=BE=E7=A8=8B=E5=A4=A7=E7=BA=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/controllers/syllabuses_controller.rb | 26 ++++- app/controllers/users_controller.rb | 4 +- app/helpers/syllabuses_helper.rb | 34 +++++++ app/helpers/users_helper.rb | 8 +- app/models/syllabus.rb | 21 ++++- app/views/admin/course_resource_list.html.erb | 2 +- app/views/boards/_course_show.html.erb | 2 +- app/views/courses/_copy_course.html.erb | 2 +- .../courses/_course_activity_users.html.erb | 8 +- app/views/courses/_course_heroes.html.erb | 4 +- .../courses/_join_private_course.html.erb | 10 +- .../courses/_show_member_act_score.html.erb | 4 +- app/views/courses/new.html.erb | 2 +- app/views/courses/show.html.erb | 2 +- app/views/files/_import_files.html.erb | 16 ++-- app/views/files/_show_quote_resource.html.erb | 2 +- app/views/layouts/_logined_header.html.erb | 2 +- app/views/layouts/_project_info.html.erb | 6 +- .../layouts/_show_messages_list.html.erb | 24 ++--- .../layouts/_syllabus_base_info.html.erb | 58 ++++++++++++ .../layouts/_syllabus_edit_info.html.erb | 27 ++++++ app/views/layouts/_syllabus_eng_name.html.erb | 8 ++ app/views/layouts/_syllabus_info.html.erb | 18 ++-- app/views/layouts/_unlogin_header.html.erb | 2 +- app/views/layouts/_user_courses.html.erb | 8 +- app/views/layouts/base_syllabus.html.erb | 34 +------ app/views/layouts/base_users_new.html.erb | 2 +- app/views/layouts/new_base_user.html.erb | 4 +- app/views/news/_course_news.html.erb | 2 +- .../organizations/_org_course_create.html.erb | 2 +- .../_org_course_homework.html.erb | 2 +- .../_org_course_message.html.erb | 2 +- .../organizations/_org_course_news.html.erb | 2 +- .../syllabuses/edit_syllabus_eng_name.js.erb | 3 + app/views/syllabuses/new.html.erb | 6 +- app/views/syllabuses/show.html.erb | 4 +- app/views/syllabuses/update_base_info.js.erb | 2 + app/views/test/courselist.html.erb | 2 +- app/views/users/_course_attachment.html.erb | 2 +- app/views/users/_course_create.html.erb | 2 +- app/views/users/_course_form.html.erb | 4 +- app/views/users/_course_homework.html.erb | 2 +- .../users/_course_journalsformessage.html.erb | 2 +- app/views/users/_course_message.html.erb | 2 +- app/views/users/_course_news.html.erb | 2 +- .../users/_selector_for_messages.html.erb | 6 +- app/views/users/_user_message_course.html.erb | 94 +++++++++---------- .../users/_user_resource_type_filter.html.erb | 2 +- app/views/users/_user_syllabus_list.html.erb | 4 +- app/views/users/show.html.erb | 2 +- .../welcome/_search_all_results.html.erb | 2 +- .../welcome/_search_course_results.html.erb | 6 +- app/views/welcome/search.html.erb | 2 +- config/locales/courses/en.yml | 2 +- config/locales/courses/zh.yml | 6 +- config/locales/zh.yml | 26 ++--- config/routes.rb | 2 + .../20160630112733_rename_syllabus_column.rb | 8 ++ db/schema.rb | 21 ++++- public/assets/wechat/course_discussion.html | 2 +- public/assets/wechat/course_notice.html | 2 +- public/javascripts/application.js | 11 --- public/javascripts/course.js | 18 ++-- public/javascripts/syllabus.js | 80 ++++++++++++++++ 64 files changed, 465 insertions(+), 214 deletions(-) create mode 100644 app/views/layouts/_syllabus_base_info.html.erb create mode 100644 app/views/layouts/_syllabus_edit_info.html.erb create mode 100644 app/views/layouts/_syllabus_eng_name.html.erb create mode 100644 app/views/syllabuses/edit_syllabus_eng_name.js.erb create mode 100644 app/views/syllabuses/update_base_info.js.erb create mode 100644 db/migrate/20160630112733_rename_syllabus_column.rb diff --git a/app/controllers/syllabuses_controller.rb b/app/controllers/syllabuses_controller.rb index 54d1c7569..b1d7bf32d 100644 --- a/app/controllers/syllabuses_controller.rb +++ b/app/controllers/syllabuses_controller.rb @@ -1,3 +1,4 @@ +# encoding: utf-8 class SyllabusesController < ApplicationController include ApplicationHelper helper :attachments @@ -5,7 +6,7 @@ class SyllabusesController < ApplicationController include CoursesHelper before_filter :is_logged, :only => [:index, :show, :edit, :new, :update, :destroy] - before_filter :find_syllabus, :only => [:show, :edit, :update, :destroy, :syllabus_courselist] + before_filter :find_syllabus, :only => [:show, :edit, :update, :destroy, :syllabus_courselist, :edit_syllabus_eng_name, :update_base_info] def index user = User.current @syllabuses = user.syllabuses @@ -71,7 +72,7 @@ class SyllabusesController < ApplicationController #删除课程大纲的描述 def destroy - if @syllabus and @syllabus.courses.empty? + if @syllabus && @syllabus.courses.empty? @syllabus.destroy redirect_to user_path(User.current.id) end @@ -122,6 +123,27 @@ class SyllabusesController < ApplicationController end end + #修改英文名称 + def edit_syllabus_eng_name + if @syllabus + @syllabus.update_column("eng_name",params[:eng_name]) + end + respond_to do |format| + format.js + end + end + + #编辑属性 + def update_base_info + if @syllabus + @syllabus.update_attributes(:credit => params[:credit], :hours => params[:hours], :theory_hours => params[:theory_hours], :practice_hours => params[:practice_hours], :applicable_major => params[:applicable_major], :pre_course => params[:pre_course]) + @syllabus.update_attributes(:syllabus_type => params[:syllabus_type]) + respond_to do |format| + format.js + end + end + end + private def find_syllabus @syllabus = Syllabus.find params[:id] diff --git a/app/controllers/users_controller.rb b/app/controllers/users_controller.rb index 68e7f5590..411f47f1e 100644 --- a/app/controllers/users_controller.rb +++ b/app/controllers/users_controller.rb @@ -1372,7 +1372,7 @@ class UsersController < ApplicationController @courses = @user.courses.visible.where("is_delete =?", 0).select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS a").order("a desc").limit(5).offset(@page * 5) @all_count = @user.courses.visible.where("is_delete =?", 0).count elsif @type == 'Syllabus' - @syllabus = Syllabus.where("id = #{params[:syllabus_id]}").first + @syllabus = Syllabus.where("id = #{params[:syllabus]}").first @courses = User.current.courses.visible.where("is_delete =? and syllabus_id =?", 0, @syllabus.id).select("courses.*,(SELECT MAX(updated_at) FROM `course_activities` WHERE course_activities.course_id = courses.id) AS a").order("a desc").limit(5).offset(@page * 5) @all_count = User.current.courses.visible.where("is_delete =? and syllabus_id =?", 0, @syllabus.id).count end @@ -3205,7 +3205,7 @@ class UsersController < ApplicationController # end @syllabus.each do |syllabus| count = 0 - courses = @courses.select("syllabus_id = #{syllabus.id}") + courses = @courses.where("syllabus_id = #{syllabus.id}") courses.each do |c| count += (User.current.admin? || User.current.allowed_to?(:as_teacher,c)) ? (c.homework_commons.count + visable_attachemnts_incourse(c).count) : (c.homework_commons.where("publish_time <= '#{Date.today}'").count + visable_attachemnts_incourse(c).count) end diff --git a/app/helpers/syllabuses_helper.rb b/app/helpers/syllabuses_helper.rb index af5472ee1..00331e0dc 100644 --- a/app/helpers/syllabuses_helper.rb +++ b/app/helpers/syllabuses_helper.rb @@ -1,3 +1,4 @@ +# encoding: utf-8 module SyllabusesHelper def get_syllabuses_by_tag(tag_name) Syllabus.tagged_with(tag_name).order('updated_at desc') @@ -35,4 +36,37 @@ module SyllabusesHelper end count end + + #课程性质下拉框 + def syllabus_type + type = [] + option1 = [] + option2 = [] + option3 = [] + option4 = [] + option5 = [] + option6 = [] + + option1 << "请选择" + option1 << 1 + option2 << "公共必修课" + option2 << 2 + option3 << "学科必修课" + option3 << 3 + option4 << "专业选修课" + option4 << 4 + option5 << "实践必修课" + option5 << 5 + option6 << "实践选修课" + option6 << 6 + + type << option1 + type << option2 + type << option3 + type << option4 + type << option5 + type << option6 + + type + end end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 4a6dbc6b6..f312d2275 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -32,7 +32,7 @@ module UsersHelper def get_resource_type type case type when 'Course' - '课程资源' + '班级资源' when 'Project' '项目资源' when 'Issue' @@ -122,11 +122,11 @@ module UsersHelper when 'homework' '作业消息' when 'course_message' - '课程讨论' + '班级讨论' when 'course_news' - '课程通知' + '班级通知' when 'poll' - '课程问卷' + '班级问卷' when 'issue' '项目任务' when 'forge_message' diff --git a/app/models/syllabus.rb b/app/models/syllabus.rb index 2f2ec495f..5e368f341 100644 --- a/app/models/syllabus.rb +++ b/app/models/syllabus.rb @@ -1,3 +1,4 @@ +# encoding: utf-8 class Syllabus < ActiveRecord::Base include Redmine::SafeAttributes include ApplicationHelper @@ -8,13 +9,29 @@ class Syllabus < ActiveRecord::Base belongs_to :user has_many :courses has_many :journals_for_messages, :as => :jour, :dependent => :destroy - attr_accessible :description, :title, :eng_name, :type, :credit, :hours, :theory_hours, :practice_hours, :applicable_major, :pre_course - safe_attributes 'title', 'description', 'eng_name', 'type', 'credit', 'hours', 'theory_hours', 'practice_hours', 'credit', 'applicable_major', 'pre_course' + attr_accessible :description, :title, :eng_name, :syllabus_type, :credit, :hours, :theory_hours, :practice_hours, :applicable_major, :pre_course + safe_attributes 'title', 'description', 'eng_name', 'syllabus_type', 'credit', 'hours', 'theory_hours', 'practice_hours', 'credit', 'applicable_major', 'pre_course' def delete_kindeditor_assets delete_kindeditor_assets_from_disk self.id,OwnerTypeHelper::SYLLABUS end + def syllabus_type_str + case self.syllabus_type + when 1 + type = "公共必修课" + when 2 + type = "学科必修课" + when 3 + type = "专业选修课" + when 4 + type = "实践必修课" + when 5 + type = "实践选修课" + end + type + end + ###添加回复 def self.add_syllabus_jour(user, notes, id , options = {}) syllabus = Syllabus.find(id) diff --git a/app/views/admin/course_resource_list.html.erb b/app/views/admin/course_resource_list.html.erb index 2e83a96aa..4786bbe89 100644 --- a/app/views/admin/course_resource_list.html.erb +++ b/app/views/admin/course_resource_list.html.erb @@ -39,7 +39,7 @@ <%= number_to_human_size(resource.filesize)%> - 课程资源 + 班级资源 <%= format_date(resource.created_on)%> diff --git a/app/views/boards/_course_show.html.erb b/app/views/boards/_course_show.html.erb index d33b75f82..46191b5d3 100644 --- a/app/views/boards/_course_show.html.erb +++ b/app/views/boards/_course_show.html.erb @@ -22,7 +22,7 @@
        - 课程问答区 + 班级问答区
        diff --git a/app/views/courses/_copy_course.html.erb b/app/views/courses/_copy_course.html.erb index 3fa0ee9fc..c1c4d1c2f 100644 --- a/app/views/courses/_copy_course.html.erb +++ b/app/views/courses/_copy_course.html.erb @@ -98,7 +98,7 @@
      • id="course_is_public" name="course[is_public]" type="checkbox" value="<%=@course.is_public.to_i %>"> - (选中后班级外用户可见该课程,否则仅对班级内成员可见) + (选中后班级外用户可见该班级,否则仅对班级内成员可见)
      • diff --git a/app/views/courses/_course_activity_users.html.erb b/app/views/courses/_course_activity_users.html.erb index 93e0e7b77..3b19de355 100644 --- a/app/views/courses/_course_activity_users.html.erb +++ b/app/views/courses/_course_activity_users.html.erb @@ -2,9 +2,9 @@

          <% if (User.current.logged? && course.open_student == 1) || (User.current.member_of_course?(course)) || User.current.admin? %> - <%= link_to "课程活跃度", course_member_path(course, :role => 2, :sort_type => 'act_score'), :class => '' %> + <%= link_to "班级活跃度", course_member_path(course, :role => 2, :sort_type => 'act_score'), :class => '' %> <% else %> - 课程活跃度 + 班级活跃度 <% end %> 积分规则

          @@ -17,7 +17,7 @@ 问答回复:回复数 x 1
          作业留言:留言数 x 1
          通知留言:留言数 x 1
          - 课程留言:留言数 x 1
          + 班级留言:留言数 x 1
          总得分为以上得分之和
      • <% contributor_course_scor(course.id).each do |contributor_score| %> @@ -47,7 +47,7 @@ 通知留言数 x 1 = <%= contributor_score.news_reply_num.to_i %> x 1 = <%= contributor_score.news_reply_num.to_i %>
        <%# end %> <%# unless contributor_score.journal_num.to_i == 0 %> - 课程留言数 x 1 = <%= contributor_score.journal_num.to_i %> x 1 = <%= contributor_score.journal_num.to_i %>
        + 班级留言数 x 1 = <%= contributor_score.journal_num.to_i %> x 1 = <%= contributor_score.journal_num.to_i %>
        <%# end %> <%# unless contributor_score.homework_journal_num.to_i == 0 %> <%# end %> diff --git a/app/views/courses/_course_heroes.html.erb b/app/views/courses/_course_heroes.html.erb index 9542f87a9..ea05eea53 100644 --- a/app/views/courses/_course_heroes.html.erb +++ b/app/views/courses/_course_heroes.html.erb @@ -3,9 +3,9 @@

          <% if (User.current.logged? && course.open_student == 1) || (User.current.member_of_course?(course)) || User.current.admin? %> - <%= link_to "课程英雄榜", course_member_path(course, :role => 2), :class => '' %> + <%= link_to "班级英雄榜", course_member_path(course, :role => 2), :class => '' %> <% else %> - 课程英雄榜 + 班级英雄榜 <% end %> 积分规则

          diff --git a/app/views/courses/_join_private_course.html.erb b/app/views/courses/_join_private_course.html.erb index 96c9a2b7d..ec5d18c7e 100644 --- a/app/views/courses/_join_private_course.html.erb +++ b/app/views/courses/_join_private_course.html.erb @@ -2,7 +2,7 @@ - 快速进入课程通道 + 快速进入班级通道