From f2bde62acddeeaa8c231daa18dc7f8cf80651670 Mon Sep 17 00:00:00 2001
From: hjm <63528605@qq.com>
Date: Fri, 24 May 2019 18:03:17 +0800
Subject: [PATCH 008/212] md
---
app/views/layouts/base_ec.html.erb | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/app/views/layouts/base_ec.html.erb b/app/views/layouts/base_ec.html.erb
index 0e1c6279..d8c45746 100644
--- a/app/views/layouts/base_ec.html.erb
+++ b/app/views/layouts/base_ec.html.erb
@@ -9,7 +9,9 @@
<%= favicon %>
<%= javascript_heads %>
<%= heads_for_theme %>
- <%= javascript_include_tag 'educoder/edu_application', 'educoder/edu_shixun','educoder/edu_shixunCommentsStar','educoder/jquery.raty' %>
+ <%= stylesheet_link_tag "/assets/codemirror/codemirror" %>
+ <%= stylesheet_link_tag '/editormd/css/editormd.min.css' %>
+ <%= javascript_include_tag 'educoder/edu_application', 'educoder/edu_shixun','educoder/edu_shixunCommentsStar','educoder/jquery.raty', '/editormd/editormd.min.js' %>
<%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2','css/edu-popup','css/edu-common','educoder/edu-main','educoder/edu-all', "css/edu-public", 'css/ketang', 'css/common', 'css/taskstyle', 'css/structure','scm','css/public', 'css/project','css/popup','repository','css/gantt', 'css/calendar', 'css/moduel', 'css/font-awesome', 'css/edu-tooltipster', 'educoder/magic-check','/assets/iconfont/iconfont.css' %>
<%= call_hook :view_layouts_base_html_head %>
From add56f399bec74970e10edb6b824f7ab43512572 Mon Sep 17 00:00:00 2001
From: hjm <63528605@qq.com>
Date: Fri, 24 May 2019 18:05:30 +0800
Subject: [PATCH 009/212] md
---
app/views/layouts/base_ec.html.erb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/views/layouts/base_ec.html.erb b/app/views/layouts/base_ec.html.erb
index d8c45746..306d3785 100644
--- a/app/views/layouts/base_ec.html.erb
+++ b/app/views/layouts/base_ec.html.erb
@@ -11,7 +11,7 @@
<%= heads_for_theme %>
<%= stylesheet_link_tag "/assets/codemirror/codemirror" %>
<%= stylesheet_link_tag '/editormd/css/editormd.min.css' %>
- <%= javascript_include_tag 'educoder/edu_application', 'educoder/edu_shixun','educoder/edu_shixunCommentsStar','educoder/jquery.raty', '/editormd/editormd.min.js' %>
+ <%= javascript_include_tag 'educoder/edu_application', 'educoder/edu_shixun','educoder/edu_shixunCommentsStar','educoder/jquery.raty', '/editormd/editormd.min.js', '/editormd/lib/marked.min.js' %>
<%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2','css/edu-popup','css/edu-common','educoder/edu-main','educoder/edu-all', "css/edu-public", 'css/ketang', 'css/common', 'css/taskstyle', 'css/structure','scm','css/public', 'css/project','css/popup','repository','css/gantt', 'css/calendar', 'css/moduel', 'css/font-awesome', 'css/edu-tooltipster', 'educoder/magic-check','/assets/iconfont/iconfont.css' %>
<%= call_hook :view_layouts_base_html_head %>
From 78a2cfb0440eb2f419c67bc113ae63db27f945f6 Mon Sep 17 00:00:00 2001
From: hjm <63528605@qq.com>
Date: Fri, 24 May 2019 18:07:31 +0800
Subject: [PATCH 010/212] md
---
app/views/layouts/base_ec.html.erb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/views/layouts/base_ec.html.erb b/app/views/layouts/base_ec.html.erb
index 306d3785..756d1706 100644
--- a/app/views/layouts/base_ec.html.erb
+++ b/app/views/layouts/base_ec.html.erb
@@ -11,7 +11,7 @@
<%= heads_for_theme %>
<%= stylesheet_link_tag "/assets/codemirror/codemirror" %>
<%= stylesheet_link_tag '/editormd/css/editormd.min.css' %>
- <%= javascript_include_tag 'educoder/edu_application', 'educoder/edu_shixun','educoder/edu_shixunCommentsStar','educoder/jquery.raty', '/editormd/editormd.min.js', '/editormd/lib/marked.min.js' %>
+ <%= javascript_include_tag 'educoder/edu_application', 'educoder/edu_shixun','educoder/edu_shixunCommentsStar','educoder/jquery.raty', '/editormd/editormd.min.js', '/editormd/lib/marked.min.js', '/editormd/lib/flowchart.min.js', '/editormd/lib/jquery.flowchart.min.js' %>
<%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2','css/edu-popup','css/edu-common','educoder/edu-main','educoder/edu-all', "css/edu-public", 'css/ketang', 'css/common', 'css/taskstyle', 'css/structure','scm','css/public', 'css/project','css/popup','repository','css/gantt', 'css/calendar', 'css/moduel', 'css/font-awesome', 'css/edu-tooltipster', 'educoder/magic-check','/assets/iconfont/iconfont.css' %>
<%= call_hook :view_layouts_base_html_head %>
From 0e2dcf12fdfd8ff9e88baea820250ec07dce8d36 Mon Sep 17 00:00:00 2001
From: hjm <63528605@qq.com>
Date: Fri, 24 May 2019 18:09:51 +0800
Subject: [PATCH 011/212] md
---
app/views/layouts/base_ec.html.erb | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/app/views/layouts/base_ec.html.erb b/app/views/layouts/base_ec.html.erb
index 756d1706..10113aa8 100644
--- a/app/views/layouts/base_ec.html.erb
+++ b/app/views/layouts/base_ec.html.erb
@@ -11,7 +11,11 @@
<%= heads_for_theme %>
<%= stylesheet_link_tag "/assets/codemirror/codemirror" %>
<%= stylesheet_link_tag '/editormd/css/editormd.min.css' %>
- <%= javascript_include_tag 'educoder/edu_application', 'educoder/edu_shixun','educoder/edu_shixunCommentsStar','educoder/jquery.raty', '/editormd/editormd.min.js', '/editormd/lib/marked.min.js', '/editormd/lib/flowchart.min.js', '/editormd/lib/jquery.flowchart.min.js' %>
+
+ <%= javascript_include_tag '/editormd/lib/marked.min.js', '/editormd/lib/prettify.min.js', '/editormd/lib/raphael.min.js', '/editormd/lib/underscore.min.js', '/editormd/lib/sequence-diagram.min.js',
+ '/editormd/lib/flowchart.min.js', '/editormd/lib/jquery.flowchart.min.js', '/editormd/editormd.js' %>
+
+ <%= javascript_include_tag 'educoder/edu_application', 'educoder/edu_shixun','educoder/edu_shixunCommentsStar','educoder/jquery.raty'%>
<%= stylesheet_link_tag 'jquery/jquery-ui-1.9.2','css/edu-popup','css/edu-common','educoder/edu-main','educoder/edu-all', "css/edu-public", 'css/ketang', 'css/common', 'css/taskstyle', 'css/structure','scm','css/public', 'css/project','css/popup','repository','css/gantt', 'css/calendar', 'css/moduel', 'css/font-awesome', 'css/edu-tooltipster', 'educoder/magic-check','/assets/iconfont/iconfont.css' %>
<%= call_hook :view_layouts_base_html_head %>
From 95ded6f4caa62674c72ee025531886d8e366af9e Mon Sep 17 00:00:00 2001
From: hjm <63528605@qq.com>
Date: Fri, 24 May 2019 18:11:34 +0800
Subject: [PATCH 012/212] b
---
app/views/common/index.html.erb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/views/common/index.html.erb b/app/views/common/index.html.erb
index 6e2b93b5..553fa3db 100644
--- a/app/views/common/index.html.erb
+++ b/app/views/common/index.html.erb
@@ -1 +1 @@
-
Educoder
\ No newline at end of file
+
Educoder
\ No newline at end of file
From a316a9cebf22c9c2716eccd29c7da5842680c283 Mon Sep 17 00:00:00 2001
From: hjm <63528605@qq.com>
Date: Fri, 24 May 2019 18:20:49 +0800
Subject: [PATCH 013/212] http
---
public/react/src/modules/page/MainContent.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/public/react/src/modules/page/MainContent.js b/public/react/src/modules/page/MainContent.js
index afd0d2d9..9f4b9fd4 100644
--- a/public/react/src/modules/page/MainContent.js
+++ b/public/react/src/modules/page/MainContent.js
@@ -80,7 +80,7 @@ class MainContent extends Component {
.page--body { z-index: ${showIframeContent ? '9999': '1'} ; }
.b-label>.resize-helper { top: ${showIframeContent ? '10px': '50%'} }
`}
- { showIframeContent ?
:
+ { showIframeContent ?
:
{/* 旧版本、评测等待提示--更新提示块*/}
{/*
From af37894dbb321c595912b3931461d8145631c5e7 Mon Sep 17 00:00:00 2001
From: hjm <63528605@qq.com>
Date: Fri, 24 May 2019 18:28:17 +0800
Subject: [PATCH 014/212] 7999
---
public/react/src/modules/page/MainContent.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/public/react/src/modules/page/MainContent.js b/public/react/src/modules/page/MainContent.js
index 9f4b9fd4..ee3fcdf9 100644
--- a/public/react/src/modules/page/MainContent.js
+++ b/public/react/src/modules/page/MainContent.js
@@ -77,7 +77,7 @@ class MainContent extends Component {
height: 100%;
background: #fff;
}
- .page--body { z-index: ${showIframeContent ? '9999': '1'} ; }
+ .page--body { z-index: ${showIframeContent ? '7999': '1'} ; }
.b-label>.resize-helper { top: ${showIframeContent ? '10px': '50%'} }
`}
{ showIframeContent ?
:
From 478b73bbfbb56b1033b720255b2c626023e197b9 Mon Sep 17 00:00:00 2001
From: hjm <63528605@qq.com>
Date: Fri, 24 May 2019 18:30:27 +0800
Subject: [PATCH 015/212] b
---
app/views/common/index.html.erb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/views/common/index.html.erb b/app/views/common/index.html.erb
index 553fa3db..5762eefe 100644
--- a/app/views/common/index.html.erb
+++ b/app/views/common/index.html.erb
@@ -1 +1 @@
-
Educoder
\ No newline at end of file
+
Educoder
\ No newline at end of file
From bef79a52c29bf231d29a1e1dc21b367902afc786 Mon Sep 17 00:00:00 2001
From: p31729568
Date: Fri, 24 May 2019 18:59:14 +0800
Subject: [PATCH 016/212] fix copy ec year
---
app/services/copy_ec_year_service.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/services/copy_ec_year_service.rb b/app/services/copy_ec_year_service.rb
index cbbcd5f1..15a95ea0 100644
--- a/app/services/copy_ec_year_service.rb
+++ b/app/services/copy_ec_year_service.rb
@@ -224,7 +224,7 @@
to_relate.attributes = relate.attributes.except('id', 'ec_course_achievement_method_id', 'ec_course_target_id',
'ec_course_evaluation_subitem_id', 'created_at', 'updated_at')
to_relate.ec_course_target_id = course_target_map[relate.ec_course_target_id]
- to_relate.ec_course_evaluation_subitem_id = course_target_map[relate.ec_course_evaluation_subitem_id]
+ to_relate.ec_course_evaluation_subitem_id = course_evaluation_subitem_map[relate.ec_course_evaluation_subitem_id]
to_relate.save!
achievement_evaluation_relates_map[relate.id] = to_relate.id
From 27acd561c0c42966b17d4d4e8d9a3b78366662bc Mon Sep 17 00:00:00 2001
From: p31729568
Date: Fri, 24 May 2019 19:11:06 +0800
Subject: [PATCH 017/212] fix copy ec year bug
---
app/services/copy_ec_year_service.rb | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/services/copy_ec_year_service.rb b/app/services/copy_ec_year_service.rb
index 15a95ea0..31bac9f9 100644
--- a/app/services/copy_ec_year_service.rb
+++ b/app/services/copy_ec_year_service.rb
@@ -224,7 +224,8 @@
to_relate.attributes = relate.attributes.except('id', 'ec_course_achievement_method_id', 'ec_course_target_id',
'ec_course_evaluation_subitem_id', 'created_at', 'updated_at')
to_relate.ec_course_target_id = course_target_map[relate.ec_course_target_id]
- to_relate.ec_course_evaluation_subitem_id = course_evaluation_subitem_map[relate.ec_course_evaluation_subitem_id]
+ # 可能不存在,所以为 -1
+ to_relate.ec_course_evaluation_subitem_id = course_evaluation_subitem_map[relate.ec_course_evaluation_subitem_id] || -1
to_relate.save!
achievement_evaluation_relates_map[relate.id] = to_relate.id
From 02194f5503b83d241027286d414cb0565b10d5c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com>
Date: Fri, 24 May 2019 20:18:14 +0800
Subject: [PATCH 018/212] b
---
app/views/common/index.html.erb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/views/common/index.html.erb b/app/views/common/index.html.erb
index 5762eefe..15d6d3b5 100644
--- a/app/views/common/index.html.erb
+++ b/app/views/common/index.html.erb
@@ -1 +1 @@
-Educoder
\ No newline at end of file
+Educoder
\ No newline at end of file
From 39801556976f8f49f00485522536ae62668c6b53 Mon Sep 17 00:00:00 2001
From: caishi <1149225589@qq.com>
Date: Fri, 24 May 2019 20:40:04 +0800
Subject: [PATCH 019/212] =?UTF-8?q?=E5=9D=97=E7=8A=B6=E6=A0=B7=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
public/stylesheets/educoder/edu-all.css | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/public/stylesheets/educoder/edu-all.css b/public/stylesheets/educoder/edu-all.css
index 3da912bb..bbd05a56 100644
--- a/public/stylesheets/educoder/edu-all.css
+++ b/public/stylesheets/educoder/edu-all.css
@@ -74,7 +74,7 @@ em.vertical-line{display: inline-block;width: 2px;background: #999;height: 10px}
.moreitem{position: absolute;right: 5px;top:35px;height: 15px;color:#656565}
/*块状列表*/
.square-list{width: 100%;box-sizing: border-box;margin-top:20px}
-.square-Item{position: relative;width:280px;margin-right: 26px;margin-bottom: 26px;float: left;border-radius: 6px;background-color:#fff;box-shadow: 0px 0px 12px rgba(0,0,0,0.1); height: 301px;}
+.square-Item{position: relative;width:280px;margin-right: 26px;margin-bottom: 26px;float: left;border-radius: 6px;background-color:#fff;box-shadow: 0px 0px 12px rgba(0,0,0,0.1); min-height: 301px;}
.square-Item:hover{bottom: 3px; box-shadow: 0px 0px 12px rgba(0,0,0,0.3);}
.square-Item:hover .closeSquare{display: block}
.square-Item:nth-child(4n+0){margin-right: 0px;}
From 543bb3e4c9652f100538959db852b75c7f2678a1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com>
Date: Fri, 24 May 2019 20:48:24 +0800
Subject: [PATCH 020/212] =?UTF-8?q?=E8=B0=83=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
public/react/src/modules/ec/ecTitle/ecTitle.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/public/react/src/modules/ec/ecTitle/ecTitle.js b/public/react/src/modules/ec/ecTitle/ecTitle.js
index f2440901..77daf2d4 100644
--- a/public/react/src/modules/ec/ecTitle/ecTitle.js
+++ b/public/react/src/modules/ec/ecTitle/ecTitle.js
@@ -51,7 +51,7 @@ class EcTitleCourseEvaluations extends Component {
毕业要求 vs 通用标准
- 5
+ 5
学生
From 2c20ad2ed58d04ec9d7e43ee916eb53a8351a5c0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com>
Date: Fri, 24 May 2019 20:54:12 +0800
Subject: [PATCH 021/212] b
---
app/views/common/index.html.erb | 2 +-
public/react/src/modules/ec/ecTitle/ecTitle.css | 2 ++
public/react/src/modules/ec/ecTitle/ecTitle.js | 2 +-
3 files changed, 4 insertions(+), 2 deletions(-)
diff --git a/app/views/common/index.html.erb b/app/views/common/index.html.erb
index 15d6d3b5..bc3cb422 100644
--- a/app/views/common/index.html.erb
+++ b/app/views/common/index.html.erb
@@ -1 +1 @@
-Educoder
\ No newline at end of file
+Educoder
\ No newline at end of file
diff --git a/public/react/src/modules/ec/ecTitle/ecTitle.css b/public/react/src/modules/ec/ecTitle/ecTitle.css
index c6e612bc..3f6796cd 100644
--- a/public/react/src/modules/ec/ecTitle/ecTitle.css
+++ b/public/react/src/modules/ec/ecTitle/ecTitle.css
@@ -22,6 +22,8 @@
}
#traningNav>li>.ecTitles {
line-height: 16px !important;
+ height: 18px!important;
+ width: 18px!important;
}
#traningNav>li>.ecTitlefont:hover{
diff --git a/public/react/src/modules/ec/ecTitle/ecTitle.js b/public/react/src/modules/ec/ecTitle/ecTitle.js
index 77daf2d4..f2440901 100644
--- a/public/react/src/modules/ec/ecTitle/ecTitle.js
+++ b/public/react/src/modules/ec/ecTitle/ecTitle.js
@@ -51,7 +51,7 @@ class EcTitleCourseEvaluations extends Component {
毕业要求 vs 通用标准
- 5
+ 5
学生
From c677f58ca198c8f43bc1e95239abe82ceca64f48 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com>
Date: Fri, 24 May 2019 20:56:38 +0800
Subject: [PATCH 022/212] b
---
app/views/common/index.html.erb | 2 +-
public/react/src/modules/ec/ecStudentList/ecStudentList.js | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/views/common/index.html.erb b/app/views/common/index.html.erb
index bc3cb422..df334ea8 100644
--- a/app/views/common/index.html.erb
+++ b/app/views/common/index.html.erb
@@ -1 +1 @@
-Educoder
\ No newline at end of file
+Educoder
\ No newline at end of file
diff --git a/public/react/src/modules/ec/ecStudentList/ecStudentList.js b/public/react/src/modules/ec/ecStudentList/ecStudentList.js
index 911ee1c2..4208b2bc 100644
--- a/public/react/src/modules/ec/ecStudentList/ecStudentList.js
+++ b/public/react/src/modules/ec/ecStudentList/ecStudentList.js
@@ -323,7 +323,7 @@ class ecStudentList extends Component {
schooldata={schooldata}
ecpath={this.state.ecComponentState}
/>
-
+
From 29cf900c9973eea230be5521ab50f62e4d2e15c5 Mon Sep 17 00:00:00 2001
From: jingquan huang
Date: Sat, 25 May 2019 14:14:28 +0800
Subject: [PATCH 023/212] =?UTF-8?q?shixun=E9=BB=98=E8=AE=A4=E5=80=BC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/views/shixuns/_settings_show.html.erb | 1 +
db/migrate/20190525060616_modify_exec_time_for_shixun.rb | 8 ++++++++
2 files changed, 9 insertions(+)
create mode 100644 db/migrate/20190525060616_modify_exec_time_for_shixun.rb
diff --git a/app/views/shixuns/_settings_show.html.erb b/app/views/shixuns/_settings_show.html.erb
index 92417f49..72752703 100644
--- a/app/views/shixuns/_settings_show.html.erb
+++ b/app/views/shixuns/_settings_show.html.erb
@@ -1,3 +1,4 @@
+
配置
diff --git a/db/migrate/20190525060616_modify_exec_time_for_shixun.rb b/db/migrate/20190525060616_modify_exec_time_for_shixun.rb
new file mode 100644
index 00000000..a5602ca8
--- /dev/null
+++ b/db/migrate/20190525060616_modify_exec_time_for_shixun.rb
@@ -0,0 +1,8 @@
+class ModifyExecTimeForShixun < ActiveRecord::Migration
+ def up
+ change_column(:shixuns, :exec_time, :integer, :default => 20)
+ end
+
+ def down
+ end
+end
From a5d2976f172003eaa2b502f3fde5ffb69b7455f1 Mon Sep 17 00:00:00 2001
From: jingquan huang
Date: Sat, 25 May 2019 15:05:04 +0800
Subject: [PATCH 024/212] =?UTF-8?q?=E8=AF=84=E6=B5=8B=E6=B7=BB=E5=8A=A0?=
=?UTF-8?q?=E4=B8=80=E4=BA=9B=E6=97=A5=E5=BF=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/services/games_service.rb | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/app/services/games_service.rb b/app/services/games_service.rb
index 2139715e..f946effa 100644
--- a/app/services/games_service.rb
+++ b/app/services/games_service.rb
@@ -801,6 +801,7 @@ class GamesService
# 轮询获取状态
# resubmit是在file_update中生成的,从game_build中传入的
def game_status params, current_user
+ Rails.logger("sec_key is #{params[:sec_key]}**1")
game = Game.find_by_identifier(params[:identifier])
resubmit_identifier = game.resubmit_identifier
# 如果没有超时并且正在评测中
@@ -812,6 +813,7 @@ class GamesService
return {:running_code_status => running_code_status, :running_code_message => running_code_message}
end
+ Rails.logger("sec_key is #{params[:sec_key]}**2")
Rails.logger.info("##### resubmit_identifier is #{resubmit_identifier}")
port = params[:port]
score = 0
@@ -838,6 +840,7 @@ class GamesService
end
end
+ Rails.logger("sec_key is #{params[:sec_key]}**3")
# 实训的最大评测次数,这个值是为了优化查询,每次只取最新的最新一次评测的结果集
max_query_index = game.query_index - 1
# 区分评测过未评测过,未评测过按需求取数据
@@ -854,7 +857,7 @@ class GamesService
# 能进入到此处,肯定是已经返回了结果,也就是说outputs中肯定有了数据
-
+ Rails.logger("sec_key is #{params[:sec_key]}**4")
test_sets_count = qurey_test_sets.size
# had_test = Output.where(:game_id => game.id, :query_index => max_query_index)
# had_test_count = had_test.count
@@ -881,6 +884,7 @@ class GamesService
web_route = game_challenge.try(:web_route)
mirror_name = shixun.mirror_name
+ Rails.logger("sec_key is #{params[:sec_key]}**5")
# 轮询结束,更新评测耗时
e_record = EvaluateRecord.where(:identifier => params[:sec_key]).first
if game_status == 0 || game_status == 2
@@ -898,12 +902,14 @@ class GamesService
# 实训制作者当前拥有的金币
grade = User.where(:id => game.user_id).pluck(:grade).first
+ Rails.logger("sec_key is #{params[:sec_key]}**6")
# 高性能取上一关、下一关
prev_game = Game.prev_identifier(shixun.id, game.myshixun_id, game_challenge.position)
next_game = Game.next_game(shixun.id, game.myshixun_id, game_challenge.position).try(:identifier)
output_hash = {:test_sets => test_sets, :had_test_count => test_sets_count, :test_sets_count => test_sets_count, :had_passed_testsests_error_count => had_passed_testsests_error_count}
+ Rails.logger("sec_key is #{params[:sec_key]}**7")
return {:grade => grade, :gold => score, :experience => experience, :status => game_status, :had_done => had_done,
:position => game_challenge.position, :port => port, :power => power, :record => record,
:mirror_name => mirror_name, :picture => picture, :web_route => web_route, :latest_output => latest_output,
From bfc78eb673801ab1666e2cfe44741bf378f6259a Mon Sep 17 00:00:00 2001
From: jingquan huang
Date: Sat, 25 May 2019 15:19:26 +0800
Subject: [PATCH 025/212] =?UTF-8?q?=E8=B0=83=E6=95=B4=E6=97=A5=E5=BF=97?=
=?UTF-8?q?=E7=9B=91=E6=8E=A7=E7=AD=89=E7=BA=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/services/games_service.rb | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/app/services/games_service.rb b/app/services/games_service.rb
index f946effa..f6f9926b 100644
--- a/app/services/games_service.rb
+++ b/app/services/games_service.rb
@@ -801,7 +801,7 @@ class GamesService
# 轮询获取状态
# resubmit是在file_update中生成的,从game_build中传入的
def game_status params, current_user
- Rails.logger("sec_key is #{params[:sec_key]}**1")
+ Rails.logger.info("sec_key is #{params[:sec_key]}**1")
game = Game.find_by_identifier(params[:identifier])
resubmit_identifier = game.resubmit_identifier
# 如果没有超时并且正在评测中
@@ -813,7 +813,7 @@ class GamesService
return {:running_code_status => running_code_status, :running_code_message => running_code_message}
end
- Rails.logger("sec_key is #{params[:sec_key]}**2")
+ Rails.logger.info("sec_key is #{params[:sec_key]}**2")
Rails.logger.info("##### resubmit_identifier is #{resubmit_identifier}")
port = params[:port]
score = 0
@@ -840,7 +840,7 @@ class GamesService
end
end
- Rails.logger("sec_key is #{params[:sec_key]}**3")
+ Rails.logger.info("sec_key is #{params[:sec_key]}**3")
# 实训的最大评测次数,这个值是为了优化查询,每次只取最新的最新一次评测的结果集
max_query_index = game.query_index - 1
# 区分评测过未评测过,未评测过按需求取数据
@@ -857,7 +857,7 @@ class GamesService
# 能进入到此处,肯定是已经返回了结果,也就是说outputs中肯定有了数据
- Rails.logger("sec_key is #{params[:sec_key]}**4")
+ Rails.logger.info("sec_key is #{params[:sec_key]}**4")
test_sets_count = qurey_test_sets.size
# had_test = Output.where(:game_id => game.id, :query_index => max_query_index)
# had_test_count = had_test.count
@@ -884,7 +884,7 @@ class GamesService
web_route = game_challenge.try(:web_route)
mirror_name = shixun.mirror_name
- Rails.logger("sec_key is #{params[:sec_key]}**5")
+ Rails.logger.info("sec_key is #{params[:sec_key]}**5")
# 轮询结束,更新评测耗时
e_record = EvaluateRecord.where(:identifier => params[:sec_key]).first
if game_status == 0 || game_status == 2
@@ -902,14 +902,14 @@ class GamesService
# 实训制作者当前拥有的金币
grade = User.where(:id => game.user_id).pluck(:grade).first
- Rails.logger("sec_key is #{params[:sec_key]}**6")
+ Rails.logger.info("sec_key is #{params[:sec_key]}**6")
# 高性能取上一关、下一关
prev_game = Game.prev_identifier(shixun.id, game.myshixun_id, game_challenge.position)
next_game = Game.next_game(shixun.id, game.myshixun_id, game_challenge.position).try(:identifier)
output_hash = {:test_sets => test_sets, :had_test_count => test_sets_count, :test_sets_count => test_sets_count, :had_passed_testsests_error_count => had_passed_testsests_error_count}
- Rails.logger("sec_key is #{params[:sec_key]}**7")
+ Rails.logger.info("sec_key is #{params[:sec_key]}**7")
return {:grade => grade, :gold => score, :experience => experience, :status => game_status, :had_done => had_done,
:position => game_challenge.position, :port => port, :power => power, :record => record,
:mirror_name => mirror_name, :picture => picture, :web_route => web_route, :latest_output => latest_output,
From 334d0a800d6a3c3ff1c4bf1ca0d135a0961d7359 Mon Sep 17 00:00:00 2001
From: jingquan huang
Date: Sat, 25 May 2019 15:24:26 +0800
Subject: [PATCH 026/212] =?UTF-8?q?=E8=AF=84=E6=B5=8B=E7=9B=91=E6=8E=A712?=
=?UTF-8?q?=E5=B0=8F=E6=97=B6=E4=B8=80=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/managements_controller.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb
index 769481b0..e3ecc2ce 100644
--- a/app/controllers/managements_controller.rb
+++ b/app/controllers/managements_controller.rb
@@ -853,7 +853,7 @@ class ManagementsController < ApplicationController
def evaluate_simple
page = params[:page]
- @recodes = EvaluateRecord.where("created_at > ?", Time.now - 1.days).reorder("consume_time desc")
+ @recodes = EvaluateRecord.where("created_at > ?", Time.now - 0.5.days).reorder("consume_time desc")
@recodes_count = @recodes.size
@record_pages = Paginator.new @recodes_count, 20, page || 1
@offset ||= @record_pages.offset
From 768881c1c332a6565f2e64b716154f66c662d394 Mon Sep 17 00:00:00 2001
From: jingquan huang
Date: Sat, 25 May 2019 15:43:02 +0800
Subject: [PATCH 027/212] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BF=A1=E6=81=AF?=
=?UTF-8?q?=E5=8C=BA=E5=88=86=E7=94=A8=E6=88=B7=E6=8F=90=E4=BA=A4=E5=92=8C?=
=?UTF-8?q?=E8=87=AA=E5=8A=A8=E4=BF=9D=E5=AD=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/services/games_service.rb | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/services/games_service.rb b/app/services/games_service.rb
index f6f9926b..e413c101 100644
--- a/app/services/games_service.rb
+++ b/app/services/games_service.rb
@@ -371,7 +371,8 @@ class GamesService
end
if content != last_content
content_modified = 1
- code_file = @g.edit_file(@myshixun.gpid, current_user.login, :content => content, :file_path => path, :branch_name => "master", :commit_message => "auto commit")
+ code_file = @g.edit_file(@myshixun.gpid, current_user.login, :content => content, :file_path => path, :branch_name => "master",
+ :commit_message => (params[:evaluate] == 1 ? "commit by author" : "auto commit" ))
end
# REDO:是否有读写分离的问题
if record.present?
From 88fa6989fecf9eba73e09f26fa05a055657615d2 Mon Sep 17 00:00:00 2001
From: jingquan huang
Date: Sat, 25 May 2019 15:57:05 +0800
Subject: [PATCH 028/212] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/services/games_service.rb | 3 +++
1 file changed, 3 insertions(+)
diff --git a/app/services/games_service.rb b/app/services/games_service.rb
index e413c101..d4fd733a 100644
--- a/app/services/games_service.rb
+++ b/app/services/games_service.rb
@@ -371,6 +371,9 @@ class GamesService
end
if content != last_content
content_modified = 1
+
+ Rails.logger.info("@@@@@####{params[:evaluate]}")
+ Rails.logger.info("@@@@@####{params[:evaluate] == 1 ? "commit by author" : "auto commit" }")
code_file = @g.edit_file(@myshixun.gpid, current_user.login, :content => content, :file_path => path, :branch_name => "master",
:commit_message => (params[:evaluate] == 1 ? "commit by author" : "auto commit" ))
end
From 9ccd8c1c52920bf77c90c2016c7643dc3a8fe5f5 Mon Sep 17 00:00:00 2001
From: jingquan huang
Date: Sat, 25 May 2019 16:00:05 +0800
Subject: [PATCH 029/212] =?UTF-8?q?=E5=8E=BB=E6=8E=89=E6=97=A5=E5=BF=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/services/games_service.rb | 3 ---
1 file changed, 3 deletions(-)
diff --git a/app/services/games_service.rb b/app/services/games_service.rb
index d4fd733a..e413c101 100644
--- a/app/services/games_service.rb
+++ b/app/services/games_service.rb
@@ -371,9 +371,6 @@ class GamesService
end
if content != last_content
content_modified = 1
-
- Rails.logger.info("@@@@@####{params[:evaluate]}")
- Rails.logger.info("@@@@@####{params[:evaluate] == 1 ? "commit by author" : "auto commit" }")
code_file = @g.edit_file(@myshixun.gpid, current_user.login, :content => content, :file_path => path, :branch_name => "master",
:commit_message => (params[:evaluate] == 1 ? "commit by author" : "auto commit" ))
end
From 07b7fe630e49f3f9de9db202a116ed143ad04508 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Sat, 25 May 2019 19:31:20 +0800
Subject: [PATCH 030/212] =?UTF-8?q?fork=E5=AE=9E=E8=AE=AD=E4=B8=8D?=
=?UTF-8?q?=E5=A4=8D=E5=88=B6=E8=83=8C=E6=99=AF=E7=9F=A5=E8=AF=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/shixuns_controller.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/controllers/shixuns_controller.rb b/app/controllers/shixuns_controller.rb
index c60a9959..ecc5ce46 100644
--- a/app/controllers/shixuns_controller.rb
+++ b/app/controllers/shixuns_controller.rb
@@ -850,7 +850,7 @@ class ShixunsController < ApplicationController
begin
raise "请先绑定邮箱" if User.current.mail.blank?
new_shixun = Shixun.new
- new_shixun.attributes = @shixun.attributes.dup.except("id","user_id","visits","gpid","status", "identifier", "homepage_show","git_url")
+ new_shixun.attributes = @shixun.attributes.dup.except("id","user_id","visits","gpid","status", "identifier", "homepage_show","git_url", "propaedeutics")
new_shixun.user_id = User.current.id
new_shixun.identifier = generate_identifier
new_shixun.status = 0
From 58bf8a994734cd1f65eae884d8817d5fa52728c2 Mon Sep 17 00:00:00 2001
From: cxt <853663049@qq.com>
Date: Mon, 27 May 2019 09:10:09 +0800
Subject: [PATCH 031/212] =?UTF-8?q?=E5=AE=9E=E8=AE=AD=E4=BD=9C=E4=B8=9A?=
=?UTF-8?q?=E7=9A=84=E9=87=8D=E5=91=BD=E5=90=8D=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/homework_common_controller.rb | 18 +++++++++--
.../_homework_index_list.html.erb | 6 +++-
.../_rename_shixun_homework.html.erb | 30 +++++++++++++++++++
.../homework_common/rename_homework.js.erb | 5 ++++
app/views/homework_common/rename_modal.js.erb | 2 ++
config/routes.rb | 2 ++
6 files changed, 60 insertions(+), 3 deletions(-)
create mode 100644 app/views/homework_common/_rename_shixun_homework.html.erb
create mode 100644 app/views/homework_common/rename_homework.js.erb
create mode 100644 app/views/homework_common/rename_modal.js.erb
diff --git a/app/controllers/homework_common_controller.rb b/app/controllers/homework_common_controller.rb
index e404c5ee..0e5ac1d6 100644
--- a/app/controllers/homework_common_controller.rb
+++ b/app/controllers/homework_common_controller.rb
@@ -12,11 +12,12 @@ class HomeworkCommonController < ApplicationController
before_filter :find_homework, :only => [:edit,:update,:alert_anonymous_comment,:start_anonymous_comment,:stop_anonymous_comment,:destroy,:start_evaluation_set,
:set_evaluation_attr,:score_rule_set,:alert_forbidden_anonymous_comment,:alert_open_student_works,:open_student_works,
:set_score_open,:alert_score_open_modal,:add_to_homework_bank,:publish_notice,:publish_homework,:end_notice,:end_homework,
- :setting,:set_public,:homework_setting,:update_explanation,:cancel_publish, :homework_code_repeat, :review_detail,:move_to_category]
+ :setting,:set_public,:homework_setting,:update_explanation,:cancel_publish, :homework_code_repeat, :review_detail,:move_to_category,
+ :rename_modal, :rename_homework]
before_filter :teacher_of_course, :only => [:new, :create, :edit, :update, :destroy, :start_anonymous_comment, :stop_anonymous_comment, :alert_anonymous_comment,
:start_evaluation_set,:set_evaluation_attr,:score_rule_set,:alert_forbidden_anonymous_comment,:alert_open_student_works,
:open_student_works,:add_to_homework_bank,:publish_notice,:end_notice,:publish_homework,:end_homework,:update_explanation,
- :cancel_publish, :move_to_category,:homework_setting]
+ :cancel_publish, :move_to_category,:homework_setting, :rename_homework, :rename_modal]
# before_filter :member_of_course, :only => [:index,:setting]
@@ -275,6 +276,19 @@ class HomeworkCommonController < ApplicationController
@groups = paginateHelper @groups, 5
end
+ def rename_modal
+
+ end
+
+ def rename_homework
+ if params[:name].blank?
+ @notice = true
+ else
+ @homework.update_attributes(:name => params[:name].strip)
+ redirect_to homework_common_index_path(:course => @course.id, :homework_type => @homework.homework_type)
+ end
+ end
+
def setting
@is_new = params[:is_new].to_i if params[:is_new]
@is_empty = @homework.publish_time.nil?
diff --git a/app/views/homework_common/_homework_index_list.html.erb b/app/views/homework_common/_homework_index_list.html.erb
index 884fd0b9..bcc9bae8 100644
--- a/app/views/homework_common/_homework_index_list.html.erb
+++ b/app/views/homework_common/_homework_index_list.html.erb
@@ -11,7 +11,8 @@
# <%= get_hw_index(homework_common, @is_teacher, @homework_type) + 1 %>
<% homework_curr_status = homework_curr_time(homework_common) %>
- <%= link_to homework_common.name.to_s, student_work_index_path(:homework => homework_common.id,:host=> Setting.host_course), :class => "edu-class-inner-list fl color-grey-3"%>
+ <%= link_to homework_common.name.to_s, student_work_index_path(:homework => homework_common.id,:host=> Setting.host_course),
+ :id => "homework_name_#{homework_common.id}", :class => "edu-class-inner-list fl color-grey-3"%>
<% unless homework_common.is_public %>
<% end %>
@@ -144,6 +145,9 @@
<%= link_to "设置", student_work_index_path(:homework => homework_common.id, :tab => 4) %>
+
+ <%= link_to "重命名", rename_modal_homework_common_path(homework_common), :remote => true %>
+
<% if homework_common.homework_detail_manual.try(:comment_status) == 0 %>
<%= link_to '立即发布', publish_notice_homework_common_path(homework_common), :remote => true %>
diff --git a/app/views/homework_common/_rename_shixun_homework.html.erb b/app/views/homework_common/_rename_shixun_homework.html.erb
new file mode 100644
index 00000000..78f8eb27
--- /dev/null
+++ b/app/views/homework_common/_rename_shixun_homework.html.erb
@@ -0,0 +1,30 @@
+
+
\ No newline at end of file
diff --git a/app/views/homework_common/rename_homework.js.erb b/app/views/homework_common/rename_homework.js.erb
new file mode 100644
index 00000000..1022f747
--- /dev/null
+++ b/app/views/homework_common/rename_homework.js.erb
@@ -0,0 +1,5 @@
+<% if @notice %>
+ notice_box("作业名称不能为空");
+<% else %>
+ $("#homework_name_<%= @homework.id %>").html(<%= @homework.name %>);
+<% end %>
\ No newline at end of file
diff --git a/app/views/homework_common/rename_modal.js.erb b/app/views/homework_common/rename_modal.js.erb
new file mode 100644
index 00000000..e691dff3
--- /dev/null
+++ b/app/views/homework_common/rename_modal.js.erb
@@ -0,0 +1,2 @@
+var html = '<%= escape_javascript(render :partial => "homework_common/rename_shixun_homework") %>';
+pop_box_new(html, 460, 227);
\ No newline at end of file
diff --git a/config/routes.rb b/config/routes.rb
index e4dfe08d..137a1231 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -1103,6 +1103,8 @@ RedmineApp::Application.routes.draw do ## oauth相关
match 'move_to_category', :via => [:get,:post]
match 'homework_code_repeat', :via => [:get,:post]
get 'review_detail'
+ post 'rename_homework'
+ get 'rename_modal'
end
collection do
From ecff82dc0c161c2906a2faf73959f95064c499ff Mon Sep 17 00:00:00 2001
From: cxt <853663049@qq.com>
Date: Mon, 27 May 2019 09:56:08 +0800
Subject: [PATCH 032/212] =?UTF-8?q?=E8=B6=85=E7=BA=A7=E7=AE=A1=E7=90=86?=
=?UTF-8?q?=E5=91=98=E7=9A=84=E8=AF=BE=E5=A0=82=E5=88=97=E8=A1=A8=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0=E6=8C=89=E8=AF=BE=E5=A0=82=E5=90=8D=E7=A7=B0=E6=90=9C?=
=?UTF-8?q?=E7=B4=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/managements_controller.rb | 8 +++++---
app/views/managements/classroom_classment.html.erb | 1 +
2 files changed, 6 insertions(+), 3 deletions(-)
diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb
index e3ecc2ce..5df43ed6 100644
--- a/app/controllers/managements_controller.rb
+++ b/app/controllers/managements_controller.rb
@@ -2023,7 +2023,7 @@ end
# @schools = School.where(:id =>user_exs.map(&:school_id))
# end
@search = params[:search] # 搜索字
- @keyword = params[:keyword].blank? ? "u_name" : params[:keyword] # 根据姓名/课程名搜索
+ @keyword = params[:keyword].blank? ? "c_name" : params[:keyword] # 根据姓名/课程名搜索
@status = params[:status]
@school_id = params[:school_id]
@@ -2044,11 +2044,13 @@ end
if params[:status] && params[:status]!=''
@courses = @courses.where(:is_end => @status.to_i)
end
- if "u_name" == @keyword
+ if "c_name" == @keyword
+ @courses = @courses.where("name like ?", "%#{@search}%")
+ elsif "u_name" == @keyword
if @search.blank?
@courses = @courses
else
- user_id = User.where("concat(lastname, firstname) like '%#{@search}%'")
+ # user_id = User.where("concat(lastname, firstname) like '%#{@search}%'")
@courses = @courses.joins("join users u on courses.tea_id = u.id").where("concat(u.lastname, u.firstname) like '%#{@search}%'")
end
elsif "dep_name" == @keyword
diff --git a/app/views/managements/classroom_classment.html.erb b/app/views/managements/classroom_classment.html.erb
index 06ea072d..f9417d74 100644
--- a/app/views/managements/classroom_classment.html.erb
+++ b/app/views/managements/classroom_classment.html.erb
@@ -14,6 +14,7 @@
From c10ed929da3248d99f93257c2f69cbf75c807357 Mon Sep 17 00:00:00 2001
From: jingquan huang
Date: Mon, 27 May 2019 11:05:29 +0800
Subject: [PATCH 033/212] =?UTF-8?q?=E8=AF=84=E6=B5=8B=E8=AE=B0=E5=BD=95?=
=?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=94=AF=E4=B8=80=E8=A1=A8=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/managements_controller.rb | 2 +-
.../managements/evaluate_simple.html.erb | 42 ++++---------------
2 files changed, 10 insertions(+), 34 deletions(-)
diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb
index e3ecc2ce..636d4edb 100644
--- a/app/controllers/managements_controller.rb
+++ b/app/controllers/managements_controller.rb
@@ -853,7 +853,7 @@ class ManagementsController < ApplicationController
def evaluate_simple
page = params[:page]
- @recodes = EvaluateRecord.where("created_at > ?", Time.now - 0.5.days).reorder("consume_time desc")
+ @recodes = EvaluateRecord.where("created_at > ?", Time.now - 10000.days).reorder("consume_time desc")
@recodes_count = @recodes.size
@record_pages = Paginator.new @recodes_count, 20, page || 1
@offset ||= @record_pages.offset
diff --git a/app/views/managements/evaluate_simple.html.erb b/app/views/managements/evaluate_simple.html.erb
index cecfe4a9..a278395c 100644
--- a/app/views/managements/evaluate_simple.html.erb
+++ b/app/views/managements/evaluate_simple.html.erb
@@ -1,54 +1,29 @@
-<% if false %>
-
-
-<% end %>
-
<% if @recodes.present? %>
- 序号 |
- 总耗时 |
+ ID |
+ 总耗时 |
作品更新 |
文件更新 |
中间层总耗时 |
pull代码 |
pod启动 |
pod执行 |
- 中间层回传 |
+ 回传时间 |
前端轮询 |
- 回调结果存储 |
+ 结果存储 |
创建时间 |
- 实训名称 |
+ 唯一表示 |
+ 实训名称 |
- <% @recodes.each_with_index do |record, index| %>
+ <% @recodes.each do |record| %>
- <%= index %> |
+ <%= record.id %> |
<%= record.consume_time %> |
<%= record.student_work %> |
<%= record.file_update %> |
@@ -60,6 +35,7 @@
<%= record.front_js %> |
<%= record.test_cases %> |
<%= format_time record.created_at %> |
+ <%= record.identifier %> |
<%= link_to record.shixun.try(:name), task_path(record.game), :target => "_blank", :title => "#{record.shixun.try(:name)}" %> |
<% end %>
From c49f3813452460e6a0bb26b46b8d45f6c3cc3a90 Mon Sep 17 00:00:00 2001
From: cxt <853663049@qq.com>
Date: Mon, 27 May 2019 14:16:48 +0800
Subject: [PATCH 034/212] =?UTF-8?q?=E8=B0=83=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/student_work_controller.rb | 8 ++++----
app/views/student_work/index.html.erb | 9 +++------
2 files changed, 7 insertions(+), 10 deletions(-)
diff --git a/app/controllers/student_work_controller.rb b/app/controllers/student_work_controller.rb
index 8885353c..1afaefc3 100644
--- a/app/controllers/student_work_controller.rb
+++ b/app/controllers/student_work_controller.rb
@@ -584,16 +584,16 @@ class StudentWorkController < ApplicationController
@stundet_works = @stundet_works.where(:work_status => @status)
end
+ @stundet_works = search_work_member @stundet_works, @name
+
if @stundet_works.size != 0
if @order == "student_id"
- @stundet_works = @stundet_works.includes(:user => {:user_extensions => []}).order("user_extensions.student_id #{@b_sort}")
+ @stundet_works = @stundet_works.joins(:user => {:user_extensions => []}).order("user_extensions.student_id #{@b_sort}")
else
@stundet_works = @stundet_works.order("#{@order} #{@b_sort}")
end
end
- @stundet_works = search_work_member @stundet_works, @name
-
@score = @b_sort == "desc" ? "asc" : "desc"
# @is_focus = params[:is_focus] ? params[:is_focus].to_i : 0
# 消息传过来的ID
@@ -615,6 +615,7 @@ class StudentWorkController < ApplicationController
_index
@stundet_works = paginateHelper @stundet_works, @limit
+ @members = @course.members.select([:user_id, :course_group_id])
if @stundet_works.size != 0
@stundet_works = if @homework.homework_type == 1
@stundet_works.includes(:student_works_scores, [user: :user_extensions])
@@ -623,7 +624,6 @@ class StudentWorkController < ApplicationController
elsif @homework.homework_type == 4
@stundet_works.includes(:student_works_scores, [myshixun: :games], [user: :user_extensions])
end
- @members = @course.members.where(user_id: @stundet_works.pluck(:user_id)).select([:user_id, :course_group_id])
end
respond_to do |format|
format.js
diff --git a/app/views/student_work/index.html.erb b/app/views/student_work/index.html.erb
index 99384dfc..0e66401c 100644
--- a/app/views/student_work/index.html.erb
+++ b/app/views/student_work/index.html.erb
@@ -199,14 +199,11 @@
不限
>
-
+
>
-
+
>
-
+
From 5afb8d00d687c4df021efec95c557fc03a413744 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Mon, 27 May 2019 17:09:48 +0800
Subject: [PATCH 035/212] =?UTF-8?q?=E5=A5=BD=E5=A4=A7=E5=AD=A6=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3=E6=95=B0=E6=8D=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/api/mobile/api.rb | 13 +++++-
app/api/mobile/apis/cnmooc.rb | 54 ++++++++++++++++++++++
app/services/cnmoocs_service.rb | 82 +++++++++++++++++++++++++++++++++
3 files changed, 148 insertions(+), 1 deletion(-)
create mode 100644 app/api/mobile/apis/cnmooc.rb
create mode 100644 app/services/cnmoocs_service.rb
diff --git a/app/api/mobile/api.rb b/app/api/mobile/api.rb
index eefedb5b..d13dc61f 100644
--- a/app/api/mobile/api.rb
+++ b/app/api/mobile/api.rb
@@ -36,7 +36,7 @@ module Mobile
content_type :json, "application/json;charset=UTF-8"
# use ActionDispatch::Session::CookieStore
-
+ require 'digest'
use Mobile::Middleware::ErrorHandler
helpers do
@@ -53,6 +53,16 @@ module Mobile
error!('401 Unauthorized', 401) if params[:private_token] != "hriEn3UwXfJs3PmyXnSG"
end
+ def cnmooc_access_key!
+ ## 签名
+ accessKeyId = 'LTAISM4HFWpQHh3g'.freeze
+ accessKeySecret = '9NMU8ushmFu8SN1EKHOhvo9jmv1qp0'.freeze
+ sign = Digest::MD5.hexdigest("AccessKeyId=#{accessKeyId}AccessKeySecret=#{accessKeySecret}").upcase
+ if params[:sign] != sign
+ error!('401 Unauthorized', 401)
+ end
+ end
+
# 有一些接口没登录也能查看数据
def career_authenticate!
pass = request.path.include?("introduction") || request.path.include?("get_published_careers")|| request.path.include?("get_current_user")
@@ -160,6 +170,7 @@ module Mobile
mount Apis::Careers
mount Apis::Assets
mount Apis::Ecloud
+ mount Apis::Cnmooc
diff --git a/app/api/mobile/apis/cnmooc.rb b/app/api/mobile/apis/cnmooc.rb
new file mode 100644
index 00000000..f49b4f66
--- /dev/null
+++ b/app/api/mobile/apis/cnmooc.rb
@@ -0,0 +1,54 @@
+# encoding=utf-8
+# 好大学接口数据
+module Mobile
+ module Apis
+ class Cnmooc < Grape::API
+ before {cnmooc_access_key!}
+ content_type :json, 'application/json;charset=UTF-8'
+
+ resources :cnmoocs do
+ desc '获取实训数据'
+ get "get_resources_data" do
+ CnmoocsService.new.get_resources_data params
+ end
+
+ desc "实训搜索功能"
+ params do
+ requires :name, type: String, desc: "搜索名称"
+ end
+ get 'search_resources' do
+ CnmoocsService.new.search_resources params
+ end
+
+ desc " 查找用户"
+ params do
+ requires :mail, type: String, desc: "邮箱地址"
+ end
+ get 'find_user' do
+ CnmoocsService.new.find_user params
+ end
+
+ desc "创建用户"
+ params do
+ requires :mail, type: String, desc: "邮箱地址"
+ requires :name, type: String, desc: "昵称"
+ requires :password, type: String, desc: "密码"
+ end
+ post "create_user" do
+ CnmoocsService.new.create_user params
+ end
+
+ desc "远程登录"
+ params do
+ requires :mail, type: String, desc: "邮箱地址"
+ requires :password, type: String, desc: "密码"
+ end
+ get "login_educoder" do
+ CnmoocsService.new.login_educoder params
+ end
+
+
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
new file mode 100644
index 00000000..02e6d54b
--- /dev/null
+++ b/app/services/cnmoocs_service.rb
@@ -0,0 +1,82 @@
+class CnmoocsService
+ include ApplicationHelper
+ include GamesHelper
+
+ def get_resources_data params
+ page = params[:pageNo].to_i
+ limit = params[:pageSize] || 16
+ offset = page * limit.to_i
+ shixuns = Shixun.select([:id, :identifier, :name, :myshixuns_count, :averge_star, :challenges_count, :trainee]).
+ where(status: 0, hidden: 0).order("myshixun_count desc")
+ shixun_count = shixuns.count
+ pageCount = ((shixun_count / limit.to_f) == (shixun_count / limit)) ? (shixun_count / limit) : ((shixun_count / limit) + 1)
+ shixuns = shixuns.offset(offset).limit(limit)
+ shixun_list = shixun_data shixuns
+ {error: 0, messages: "请求成功",
+ page: {count: shixuns.count, totalCount: shixun_count, pageNo: page, pageSize: limit, pageCount: pageCount},
+ data: shixun_list }
+ end
+
+ def search_resources params
+ page = params[:pageNo].to_i
+ limit = params[:pageSize] || 16
+ offset = page * limit.to_i
+ shixuns = Shixun.select([:id, :identifier, :name, :myshixuns_count, :averge_star, :challenges_count, :trainee]).
+ where(status: 2, hidden: 0).where("name like ?", "%#{params[:name]}%").offset(offset).limit(limit)
+ shixun_count = shixuns.count
+ pageCount = ((shixun_count / limit.to_f) == (shixun_count / limit)) ? (shixun_count / limit) : ((shixun_count / limit) + 1)
+ shixuns = shixuns.offset(offset).limit(limit)
+ shixun_list = shixun_data shixuns
+ {error: 0, messages: "请求成功",
+ page: {count: shixuns.count, totalCount: shixun_count, pageNo: page, pageSize: limit, pageCount: pageCount},
+ data: shixun_list }
+ end
+
+ def find_user params
+ user = User.find_by_mail params[:mail]
+ if user
+ {error: 0, message: "找到用户"}
+ else
+ {error: -1, message: "找不到用户"}
+ end
+ end
+
+ def create_user params
+ user = User.find_by_mail params[:mail]
+ if user.blank?
+ ActiveRecord::Base.transaction do
+ # 如果Educoder中已存在与该OpenI用户的邮箱相同的用户,则会直接跳转到登录educoder的登录页面
+ user = User.new(lastname: params[:name], mail: params[:mail], mail_notification: email)
+ user.login = generate_login('m')
+ user.password = params[:password]
+ user.certification = 1
+ user.save!
+ UserExtensions.create!(user_id: user.id, school_id: School.first.id, identity: 4, gender: 0)
+ end
+ {error: 0, message: "创建成功"}
+ else
+ {error: -1, message: "邮箱已经存在,请直接使用邮箱登录"}
+ end
+ end
+
+ def login_educoder params
+ user, last_login_on = User.try_to_login(params[:mail], params[:password])
+ self.logged_user = user
+ {error: 0, message: "登录成功"}
+ end
+
+
+ private
+ def shixun_data shixuns
+ shixun_list = []
+ shixuns.includes(:tag_repertoires).find_each do |shixun|
+ tag_name = shixun.tag_repertoires.first.try(:name)
+ level = %W(初级 中级 高级 顶级)[shixun.trainee - 1]
+ shixun_list << {identifier: shixun.identifier, name: shixun.name, students_count: shixun.myshixuns_count,
+ challenges_count: shixun.challenges_count, score_info: shixun.averge_star, level: level}
+
+ end
+ {resouces: shixun_list}
+ end
+
+end
\ No newline at end of file
From 6db6d8cd8d9cd18e64c3ca771a1e2816ad6aa4f7 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Mon, 27 May 2019 17:19:11 +0800
Subject: [PATCH 036/212] =?UTF-8?q?=E8=AF=84=E6=B5=8B=E6=97=B6=E9=97=B4?=
=?UTF-8?q?=E5=8F=96=E6=97=B6=E5=9C=A8=E4=B8=80=E5=A4=A9=E4=B9=8B=E5=86=85?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/managements_controller.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb
index 851c50e6..202f90b3 100644
--- a/app/controllers/managements_controller.rb
+++ b/app/controllers/managements_controller.rb
@@ -853,7 +853,7 @@ class ManagementsController < ApplicationController
def evaluate_simple
page = params[:page]
- @recodes = EvaluateRecord.where("created_at > ?", Time.now - 10000.days).reorder("consume_time desc")
+ @recodes = EvaluateRecord.where("created_at > ?", Time.now - 1.days).reorder("consume_time desc")
@recodes_count = @recodes.size
@record_pages = Paginator.new @recodes_count, 20, page || 1
@offset ||= @record_pages.offset
From d56728da62240b50159773b858916cc4e70e1248 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Mon, 27 May 2019 17:44:07 +0800
Subject: [PATCH 037/212] =?UTF-8?q?=E5=A5=BD=E5=A4=A7=E5=AD=A6=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/services/cnmoocs_service.rb | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index 02e6d54b..fbb8d55c 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -7,10 +7,12 @@ class CnmoocsService
limit = params[:pageSize] || 16
offset = page * limit.to_i
shixuns = Shixun.select([:id, :identifier, :name, :myshixuns_count, :averge_star, :challenges_count, :trainee]).
- where(status: 0, hidden: 0).order("myshixun_count desc")
+ where(status: 0, hidden: 0)
shixun_count = shixuns.count
pageCount = ((shixun_count / limit.to_f) == (shixun_count / limit)) ? (shixun_count / limit) : ((shixun_count / limit) + 1)
- shixuns = shixuns.offset(offset).limit(limit)
+ Rails.logger.info("#####{pageCount}")
+ Rails.logger.info("#####{limit}")
+ shixuns = shixuns.order("myshixuns_count desc").offset(offset).limit(limit)
shixun_list = shixun_data shixuns
{error: 0, messages: "请求成功",
page: {count: shixuns.count, totalCount: shixun_count, pageNo: page, pageSize: limit, pageCount: pageCount},
@@ -22,10 +24,10 @@ class CnmoocsService
limit = params[:pageSize] || 16
offset = page * limit.to_i
shixuns = Shixun.select([:id, :identifier, :name, :myshixuns_count, :averge_star, :challenges_count, :trainee]).
- where(status: 2, hidden: 0).where("name like ?", "%#{params[:name]}%").offset(offset).limit(limit)
+ where(status: 2, hidden: 0).where("name like ?", "%#{params[:name]}%")
shixun_count = shixuns.count
pageCount = ((shixun_count / limit.to_f) == (shixun_count / limit)) ? (shixun_count / limit) : ((shixun_count / limit) + 1)
- shixuns = shixuns.offset(offset).limit(limit)
+ shixuns = shixuns.order("myshixuns_count desc").offset(offset).limit(limit)
shixun_list = shixun_data shixuns
{error: 0, messages: "请求成功",
page: {count: shixuns.count, totalCount: shixun_count, pageNo: page, pageSize: limit, pageCount: pageCount},
@@ -69,7 +71,7 @@ class CnmoocsService
private
def shixun_data shixuns
shixun_list = []
- shixuns.includes(:tag_repertoires).find_each do |shixun|
+ shixuns.includes(:tag_repertoires).each do |shixun|
tag_name = shixun.tag_repertoires.first.try(:name)
level = %W(初级 中级 高级 顶级)[shixun.trainee - 1]
shixun_list << {identifier: shixun.identifier, name: shixun.name, students_count: shixun.myshixuns_count,
From f027b52e4a874bfd4ea9c6300cfdc9c5a513d9f0 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Mon, 27 May 2019 17:58:52 +0800
Subject: [PATCH 038/212] =?UTF-8?q?=E5=A5=BD=E5=A4=A7=E5=AD=A6=E4=BB=A3?=
=?UTF-8?q?=E7=A0=81=E4=BF=AE=E5=A4=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/services/cnmoocs_service.rb | 17 +++++++++++------
1 file changed, 11 insertions(+), 6 deletions(-)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index fbb8d55c..40f75a8c 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -37,9 +37,9 @@ class CnmoocsService
def find_user params
user = User.find_by_mail params[:mail]
if user
- {error: 0, message: "找到用户"}
+ {error: 0, messages: "找到用户"}
else
- {error: -1, message: "找不到用户"}
+ {error: -1, messages: "找不到用户"}
end
end
@@ -55,16 +55,21 @@ class CnmoocsService
user.save!
UserExtensions.create!(user_id: user.id, school_id: School.first.id, identity: 4, gender: 0)
end
- {error: 0, message: "创建成功"}
+ {error: 0, messages: "创建成功"}
else
- {error: -1, message: "邮箱已经存在,请直接使用邮箱登录"}
+ {error: -1, messages: "邮箱已经存在,请直接使用邮箱登录"}
end
end
def login_educoder params
user, last_login_on = User.try_to_login(params[:mail], params[:password])
- self.logged_user = user
- {error: 0, message: "登录成功"}
+ if user
+ self.logged_user = user
+ {error: 0, messages: "登录成功"}
+ else
+ {error: -1, messages: "登录失败,请检查邮箱和密码是否正确"}
+ end
+
end
From d48ec8974e2267d2e09c12028df046bcf59e9465 Mon Sep 17 00:00:00 2001
From: cxt <853663049@qq.com>
Date: Tue, 28 May 2019 08:58:43 +0800
Subject: [PATCH 039/212] =?UTF-8?q?=E5=AD=A6=E9=99=A2=E7=BB=9F=E8=AE=A1?=
=?UTF-8?q?=E7=9A=84=E8=AF=BE=E5=A0=82=E8=B0=83=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/colleges_controller.rb | 2 +-
app/controllers/courses_controller.rb | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/controllers/colleges_controller.rb b/app/controllers/colleges_controller.rb
index fff508a8..1ffcdb46 100644
--- a/app/controllers/colleges_controller.rb
+++ b/app/controllers/colleges_controller.rb
@@ -131,7 +131,7 @@ class CollegesController < ApplicationController
(select count(m.id) from messages m inner join boards b on b.id=m.board_id and b.parent_id=0 where b.course_id=c.id group by c.id) as messages_count,
c.tea_id, c.name, c.is_end,
(SELECT MAX(created_at) FROM `course_activities` ca WHERE ca.course_id = c.id) AS update_time
- FROM `courses` c WHERE (c.school_id = #{@school.id} and c.is_delete = 0)")
+ FROM `courses` c join user_extensions ue on ue.user_id = c.tea_id WHERE (ue.school_id = #{@school.id} and c.is_delete = 0)")
@courses.each do |course|
course[:evaluating_count] = Output.find_by_sql("select sum(g.evaluate_count) as evaluating_count from games g inner join
diff --git a/app/controllers/courses_controller.rb b/app/controllers/courses_controller.rb
index e87c7297..669cc58f 100644
--- a/app/controllers/courses_controller.rb
+++ b/app/controllers/courses_controller.rb
@@ -577,7 +577,7 @@ class CoursesController < ApplicationController
cha_member.member_roles.where("role_id = 10").first.destroy
StudentsForCourse.where(:course_id => @course.id, :student_id => cha_member.user_id).destroy_all
end
- @course.update_attributes(:tea_id => cha_member.user_id)
+ @course.update_attributes(:tea_id => cha_member.user_id, :school_id => cha_member.user.try(:user_extensions).try(:school_id))
man_member.member_roles.first.update_attributes(:role_id => 9)
course_act = CourseActivity.where(:course_id => @course.id, :course_act_id => @course.id, :course_act_type => 'Course').first
course_act.update_column('user_id', cha_member.user_id)
From f14bf75b307fb7f3ae90ea8d9c16f75f2789fb36 Mon Sep 17 00:00:00 2001
From: cxt <853663049@qq.com>
Date: Tue, 28 May 2019 09:15:13 +0800
Subject: [PATCH 040/212] =?UTF-8?q?=E7=BB=9F=E8=AE=A1=E8=B0=83=E6=95=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/colleges_controller.rb | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/controllers/colleges_controller.rb b/app/controllers/colleges_controller.rb
index 1ffcdb46..ad831e78 100644
--- a/app/controllers/colleges_controller.rb
+++ b/app/controllers/colleges_controller.rb
@@ -50,7 +50,8 @@ class CollegesController < ApplicationController
# Redo:这样做内存会卡死的
# user_ids = User.find_by_sql("SELECT users.id FROM users LEFT JOIN user_extensions ON users.id=user_extensions.user_id WHERE user_extensions.`school_id` = #{@school.id}").map(&:id)
# Redo:是否直接使用count会更好
- all_course_ids = Course.joins("join users u on courses.tea_id = u.id").joins("join user_extensions ue on u.id = ue.user_id").where("courses.id != 1309 and ue.school_id = #{@school.id}")
+ all_course_ids = Course.joins("join users u on courses.tea_id = u.id").joins("join user_extensions ue on u.id = ue.user_id").
+ where("courses.id != 1309 and courses.is_delete = 0 and ue.school_id = #{@school.id}")
@courses_count = all_course_ids.size
# Redo:对于量比较大的尽量不使用笛卡尔积
From 00e4170593e53843aeed2f91dfa49fd2aa4fd6d4 Mon Sep 17 00:00:00 2001
From: cxt <853663049@qq.com>
Date: Tue, 28 May 2019 09:46:58 +0800
Subject: [PATCH 041/212] =?UTF-8?q?=E8=AF=BE=E5=A0=82=E7=9A=84school=5Fid?=
=?UTF-8?q?=E8=BF=81=E7=A7=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/colleges_controller.rb | 5 ++---
db/migrate/20190528013018_migrate_course_school_id.rb | 11 +++++++++++
2 files changed, 13 insertions(+), 3 deletions(-)
create mode 100644 db/migrate/20190528013018_migrate_course_school_id.rb
diff --git a/app/controllers/colleges_controller.rb b/app/controllers/colleges_controller.rb
index ad831e78..418015fd 100644
--- a/app/controllers/colleges_controller.rb
+++ b/app/controllers/colleges_controller.rb
@@ -50,8 +50,7 @@ class CollegesController < ApplicationController
# Redo:这样做内存会卡死的
# user_ids = User.find_by_sql("SELECT users.id FROM users LEFT JOIN user_extensions ON users.id=user_extensions.user_id WHERE user_extensions.`school_id` = #{@school.id}").map(&:id)
# Redo:是否直接使用count会更好
- all_course_ids = Course.joins("join users u on courses.tea_id = u.id").joins("join user_extensions ue on u.id = ue.user_id").
- where("courses.id != 1309 and courses.is_delete = 0 and ue.school_id = #{@school.id}")
+ all_course_ids = Course.where("id != 1309 and is_delete = 0 and school_id = #{@school.id}")
@courses_count = all_course_ids.size
# Redo:对于量比较大的尽量不使用笛卡尔积
@@ -132,7 +131,7 @@ class CollegesController < ApplicationController
(select count(m.id) from messages m inner join boards b on b.id=m.board_id and b.parent_id=0 where b.course_id=c.id group by c.id) as messages_count,
c.tea_id, c.name, c.is_end,
(SELECT MAX(created_at) FROM `course_activities` ca WHERE ca.course_id = c.id) AS update_time
- FROM `courses` c join user_extensions ue on ue.user_id = c.tea_id WHERE (ue.school_id = #{@school.id} and c.is_delete = 0)")
+ FROM `courses` c WHERE c.school_id = #{@school.id} and c.is_delete = 0")
@courses.each do |course|
course[:evaluating_count] = Output.find_by_sql("select sum(g.evaluate_count) as evaluating_count from games g inner join
diff --git a/db/migrate/20190528013018_migrate_course_school_id.rb b/db/migrate/20190528013018_migrate_course_school_id.rb
new file mode 100644
index 00000000..b0669591
--- /dev/null
+++ b/db/migrate/20190528013018_migrate_course_school_id.rb
@@ -0,0 +1,11 @@
+class MigrateCourseSchoolId < ActiveRecord::Migration
+ def up
+ courses = Course.includes(teacher: :user_extensions).where("courses.school_id != user_extensions.school_id or courses.school_id is null")
+ courses.each do |course|
+ course.update_column('school_id', course.teacher.try(:user_extensions).try(:school_id))
+ end
+ end
+
+ def down
+ end
+end
From 40a1e1d0341e536af7f731e6db6a7056a8287e7c Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Tue, 28 May 2019 09:49:24 +0800
Subject: [PATCH 042/212] =?UTF-8?q?=E5=AE=9E=E8=AE=AD=E5=8F=8D=E9=A6=88?=
=?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=A2=9E=E5=8A=A0=E8=B4=A6=E5=8F=B7=E5=9B=9E?=
=?UTF-8?q?=E5=A4=8D=E5=86=85=E5=AE=B9=E5=92=8C=E6=97=B6=E9=97=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/managements_controller.rb | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb
index 851c50e6..0f62dbe8 100644
--- a/app/controllers/managements_controller.rb
+++ b/app/controllers/managements_controller.rb
@@ -4295,7 +4295,7 @@ end
count_row = 1
shixuns = Shixun.where(:id => shixun_ids).includes(discusses: [:user])
sheet1.row(0).concat(["序号", "实训ID", "实训名称", "实训作者", "作者单位", "评论数", "评论内容", "关卡", "评论者", "评论者职业",
- "评论者单位", "评论时间", "社区导师是否已回复"])
+ "评论者单位", "评论时间", "社区导师是否已回复", "我的账号回复内容", "回复时间"])
shixuns.each_with_index do |shixun, i|
discusses = shixun.discusses.where("user_id != ?", 1)
if beginTime.present?
@@ -4313,6 +4313,7 @@ end
discusses.each_with_index do |discuss, j|
user = discuss.user
content = discuss.content.gsub(//, "【图片评论】").gsub(/!\[\].+\)/, "【图片评论】")
+ myself_discuss = discuss.children.where(user_id: User.current.id).last
sheet1[count_row, 6] = strip_html content
sheet1[count_row, 7] = "第#{discuss.position}关"
sheet1[count_row, 8] = user.show_real_name
@@ -4320,6 +4321,8 @@ end
sheet1[count_row, 10] = user.school_name
sheet1[count_row, 11] = format_time discuss.created_at
sheet1[count_row, 12] = discuss.children.pluck(:user_id).include?(1) ? "是" : "否"
+ sheet1[count_row, 13] = myself_discuss.try(:content)
+ sheet1[count_row, 14] = myself_discuss ? (format_time myself_discuss.created_at) : ""
count_row += 1
end
#count_row += 1
From f17754c1480c140ad289bc7d16a5257996dac965 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Tue, 28 May 2019 11:13:43 +0800
Subject: [PATCH 043/212] 1
---
app/services/cnmoocs_service.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index 40f75a8c..33f166da 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -7,7 +7,7 @@ class CnmoocsService
limit = params[:pageSize] || 16
offset = page * limit.to_i
shixuns = Shixun.select([:id, :identifier, :name, :myshixuns_count, :averge_star, :challenges_count, :trainee]).
- where(status: 0, hidden: 0)
+ where(status: 2, hidden: 0)
shixun_count = shixuns.count
pageCount = ((shixun_count / limit.to_f) == (shixun_count / limit)) ? (shixun_count / limit) : ((shixun_count / limit) + 1)
Rails.logger.info("#####{pageCount}")
From ee2ae75ecc65f616c6a7cfa38f691f30545d3526 Mon Sep 17 00:00:00 2001
From: p31729568
Date: Tue, 28 May 2019 14:10:01 +0800
Subject: [PATCH 044/212] fix axlsx gem
---
Gemfile | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Gemfile b/Gemfile
index 11029470..7909cb17 100644
--- a/Gemfile
+++ b/Gemfile
@@ -63,8 +63,8 @@ gem 'elasticsearch-rails'
gem 'oauth2'
# xlsx
-#gem 'axlsx', '3.0.0.pre'
-#gem 'axlsx_rails', '0.3.0'
+gem 'axlsx', '3.0.0.pre'
+gem 'axlsx_rails', '0.3.0'
#Ruby 2.2+ has removed test/unit from the core library.
if RUBY_VERSION>='2.2'
From 924448efaacacaf628a0da91485284d1774129bd Mon Sep 17 00:00:00 2001
From: guange <8863824@gmail.com>
Date: Tue, 28 May 2019 15:02:09 +0800
Subject: [PATCH 045/212] =?UTF-8?q?=E5=8F=96=E5=87=BA=E8=A1=A5=E4=BA=A4?=
=?UTF-8?q?=E7=9A=84=E4=BD=9C=E4=B8=9A?=
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 8885353c..464a2842 100644
--- a/app/controllers/student_work_controller.rb
+++ b/app/controllers/student_work_controller.rb
@@ -647,7 +647,7 @@ class StudentWorkController < ApplicationController
uid: "#{work.user.user_extensions.student_id}",
downloadUrl: ''
}
- attachment = work.attachments.first
+ attachment = work.attachments.last
if attachment
o[:downloadUrl] = "https://#{Setting.host_name}/"+download_named_attachment_path(attachment.id, attachment.filename)
end
From 50e0bf1a92eb79b1633df92b40ea95ae2e37cf48 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Tue, 28 May 2019 15:07:33 +0800
Subject: [PATCH 046/212] 1
---
app/services/cnmoocs_service.rb | 2 --
1 file changed, 2 deletions(-)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index 33f166da..e3bb8cee 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -10,8 +10,6 @@ class CnmoocsService
where(status: 2, hidden: 0)
shixun_count = shixuns.count
pageCount = ((shixun_count / limit.to_f) == (shixun_count / limit)) ? (shixun_count / limit) : ((shixun_count / limit) + 1)
- Rails.logger.info("#####{pageCount}")
- Rails.logger.info("#####{limit}")
shixuns = shixuns.order("myshixuns_count desc").offset(offset).limit(limit)
shixun_list = shixun_data shixuns
{error: 0, messages: "请求成功",
From 2f9fb67479a4537a2e861a6b67426e60e4bdb200 Mon Sep 17 00:00:00 2001
From: guange <8863824@gmail.com>
Date: Tue, 28 May 2019 15:10:51 +0800
Subject: [PATCH 047/212] =?UTF-8?q?sonar=E8=AF=84=E6=B5=8B=E5=8F=96?=
=?UTF-8?q?=E6=9C=80=E5=90=8E=E4=B8=80=E4=B8=AA=E9=99=84=E4=BB=B6?=
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 1afaefc3..89fddb36 100644
--- a/app/controllers/student_work_controller.rb
+++ b/app/controllers/student_work_controller.rb
@@ -647,7 +647,7 @@ class StudentWorkController < ApplicationController
uid: "#{work.user.user_extensions.student_id}",
downloadUrl: ''
}
- attachment = work.attachments.first
+ attachment = work.attachments.last
if attachment
o[:downloadUrl] = "https://#{Setting.host_name}/"+download_named_attachment_path(attachment.id, attachment.filename)
end
From 02aa938fe48f5b2a5399e34adec09ca5308730c5 Mon Sep 17 00:00:00 2001
From: p31729568
Date: Tue, 28 May 2019 16:26:57 +0800
Subject: [PATCH 048/212] add cnmooc use create api
---
app/api/mobile/apis/cnmooc.rb | 5 +--
app/models/cnmooc_user.rb | 8 ++++
app/models/user_source.rb | 21 ++++++++++
app/services/cnmoocs_service.rb | 41 +++++++++++--------
.../20190528075558_create_user_sources.rb | 15 +++++++
5 files changed, 71 insertions(+), 19 deletions(-)
create mode 100644 app/models/cnmooc_user.rb
create mode 100644 app/models/user_source.rb
create mode 100644 db/migrate/20190528075558_create_user_sources.rb
diff --git a/app/api/mobile/apis/cnmooc.rb b/app/api/mobile/apis/cnmooc.rb
index f49b4f66..a45989c3 100644
--- a/app/api/mobile/apis/cnmooc.rb
+++ b/app/api/mobile/apis/cnmooc.rb
@@ -30,9 +30,8 @@ module Mobile
desc "创建用户"
params do
- requires :mail, type: String, desc: "邮箱地址"
- requires :name, type: String, desc: "昵称"
- requires :password, type: String, desc: "密码"
+ requires :userName, type: String, desc: "好大学用户名"
+ optional :name, type: String, desc: "用户姓名"
end
post "create_user" do
CnmoocsService.new.create_user params
diff --git a/app/models/cnmooc_user.rb b/app/models/cnmooc_user.rb
new file mode 100644
index 00000000..e834c768
--- /dev/null
+++ b/app/models/cnmooc_user.rb
@@ -0,0 +1,8 @@
+class CnmoocUser < UserSource
+
+ private
+
+ def email_prefix
+ 'cnmooc_'
+ end
+end
diff --git a/app/models/user_source.rb b/app/models/user_source.rb
new file mode 100644
index 00000000..d8fb350d
--- /dev/null
+++ b/app/models/user_source.rb
@@ -0,0 +1,21 @@
+class UserSource < ActiveRecord::Base
+ belongs_to :user
+
+ def generate_email
+ email = rand_email
+ while User.exists?(mail: email) do
+ email = rand_email
+ end
+ email
+ end
+
+ private
+
+ def rand_email
+ email_prefix + Random.rand.to_s[2..8] + '@educoder.com'
+ end
+
+ def email_prefix
+ ''
+ end
+end
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index 33f166da..5057fabe 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -43,22 +43,32 @@ class CnmoocsService
end
end
- def create_user params
- user = User.find_by_mail params[:mail]
- if user.blank?
- ActiveRecord::Base.transaction do
- # 如果Educoder中已存在与该OpenI用户的邮箱相同的用户,则会直接跳转到登录educoder的登录页面
- user = User.new(lastname: params[:name], mail: params[:mail], mail_notification: email)
- user.login = generate_login('m')
- user.password = params[:password]
- user.certification = 1
- user.save!
- UserExtensions.create!(user_id: user.id, school_id: School.first.id, identity: 4, gender: 0)
- end
- {error: 0, messages: "创建成功"}
- else
- {error: -1, messages: "邮箱已经存在,请直接使用邮箱登录"}
+ def create_user(params)
+ c_user = CnmoocUser.find_by_uuid(params[:userName])
+
+ if c_user.present?
+ return { error: -1, messages: '用户已存在' }
end
+
+ mail = c_user.generate_email
+ create_params = {
+ lastname: params[:name],
+ mail: mail,
+ mail_notification: mail,
+ login: generate_login('m'),
+ password: OauthController::DEFAULT_PASSWORD,
+ certification: 1
+ }
+ ActiveRecord::Base.transaction do
+ user = User.create!(create_params)
+
+ UserExtensions.create!(user_id: user.id, school_id: School.first.id, identity: 4, gender: 0)
+
+ c_user.user_id = user.id
+ c_user.save!
+ end
+
+ { error: 0, messages: "创建成功", data: { userId: user.id } }
end
def login_educoder params
@@ -85,5 +95,4 @@ class CnmoocsService
end
{resouces: shixun_list}
end
-
end
\ No newline at end of file
diff --git a/db/migrate/20190528075558_create_user_sources.rb b/db/migrate/20190528075558_create_user_sources.rb
new file mode 100644
index 00000000..03f6c12a
--- /dev/null
+++ b/db/migrate/20190528075558_create_user_sources.rb
@@ -0,0 +1,15 @@
+class CreateUserSources < ActiveRecord::Migration
+ def change
+ create_table :user_sources do |t|
+ t.string :type
+ t.integer :user_id
+ t.string :uuid
+ t.string :name
+
+ t.timestamps
+ end
+
+ add_index :user_sources, [:type, :uuid], unique: true
+ add_index :user_sources, :user_id
+ end
+end
From 3d1e29cf0a7b73029042ef9a51428231660e1aee Mon Sep 17 00:00:00 2001
From: p31729568
Date: Tue, 28 May 2019 16:46:59 +0800
Subject: [PATCH 049/212] cnmooc source url
---
app/api/mobile/apis/cnmooc.rb | 10 ++++++++++
app/controllers/application_controller.rb | 3 +++
app/models/user.rb | 2 ++
app/services/cnmoocs_service.rb | 14 ++++++++++++++
4 files changed, 29 insertions(+)
diff --git a/app/api/mobile/apis/cnmooc.rb b/app/api/mobile/apis/cnmooc.rb
index a45989c3..42a6cfe3 100644
--- a/app/api/mobile/apis/cnmooc.rb
+++ b/app/api/mobile/apis/cnmooc.rb
@@ -37,6 +37,16 @@ module Mobile
CnmoocsService.new.create_user params
end
+ desc "获取资源访问地址"
+ params do
+ requires :userId, type: Integer, desc: "用户ID"
+ requires :resouceId, type: String, desc: "资源唯一标示"
+ requires :accessType, type: Integer, desc: "资源类型"
+ end
+ get "source_url" do
+ CnmoocsService.new.source_url(params)
+ end
+
desc "远程登录"
params do
requires :mail, type: String, desc: "邮箱地址"
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 435c71fc..42dd6e1e 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -207,6 +207,9 @@ class ApplicationController < ActionController::Base
elsif session[:wechat_openid]
uw = UserWechat.find_by_openid(session[:wechat_openid])
user = uw.user if uw
+ elsif session[:third_party_user_id]
+ c_user = UserSource.find_by_id(session[:third_party_user_id])
+ user = c_user.user if c_user
end
end
if user.nil? && Setting.rest_api_enabled? && accept_api_auth?
diff --git a/app/models/user.rb b/app/models/user.rb
index 752ea113..3e89e4f2 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -269,6 +269,8 @@ class User < Principal
has_many :article_homepages, :dependent => :destroy
has_many :competition_lists, :dependent => :destroy
+ has_one :user_source
+
## end
# default_scope -> { includes(:user_extensions, :user_score) }
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index 5057fabe..04df260d 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -82,6 +82,20 @@ class CnmoocsService
end
+ def source_url(params)
+ if session[:third_party_user_id].blank?
+ user = User.find(params[:userId])
+ session[:third_party_user_id] = user.user_source.id
+ end
+
+ shixun = Shixun.find_by_identifier(params[:resouceId])
+ if shixun.blank?
+ return { error: -1, messages: '资源不存在' }
+ end
+
+ { error: 0, messages: '成功', accessUrl: "#{Redmine::Configuration['educoder_domain']}/shixuns/#{shixun.id}" }
+ end
+
private
def shixun_data shixuns
From f06a1b5df6e6753960dbb4dd09e559abf00469b1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=98=8E?= <775174143@qq.com>
Date: Tue, 28 May 2019 17:32:44 +0800
Subject: [PATCH 050/212] =?UTF-8?q?=E5=AE=9E=E8=AE=AD=E9=A2=98=20=E5=89=8D?=
=?UTF-8?q?=E7=AB=AF=E5=A2=9E=E5=8A=A0=E9=A2=98=E7=9B=AE=E4=BF=AE=E6=94=B9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/views/exercise/_edit_shixun.html.erb | 5 ++++-
app/views/exercise/_exercise_form.html.erb | 6 +++++-
2 files changed, 9 insertions(+), 2 deletions(-)
diff --git a/app/views/exercise/_edit_shixun.html.erb b/app/views/exercise/_edit_shixun.html.erb
index b7caa087..9c0f130b 100644
--- a/app/views/exercise/_edit_shixun.html.erb
+++ b/app/views/exercise/_edit_shixun.html.erb
@@ -1,7 +1,10 @@
<%= form_for("",:url => update_exercise_question_exercise_index_path(:exercise_question => exercise_question.id),:html => {:id => "update_exercise_question_#{exercise_question.id}"}) do |f|%>
实训题
-
<%= exercise_question.shixun.name %>
+
+
+
+
diff --git a/app/views/exercise/_exercise_form.html.erb b/app/views/exercise/_exercise_form.html.erb
index 677e7014..ca3080e4 100644
--- a/app/views/exercise/_exercise_form.html.erb
+++ b/app/views/exercise/_exercise_form.html.erb
@@ -106,11 +106,15 @@
//修改标题时确定按钮
function edit_poll_question(doc,id,quest_type)
{
+ var name = $.trim($("#poll_questions_name_" + id).val());
var title = $.trim($("#poll_questions_title_" + id).val());
var score = $.trim($("#poll_question_score_"+ id).val());
var standard_ans = $.trim($("#exercise_choice_" + id).val());
+ if(name===""){
+ notice_box("题目标题");
+ }
if(title.length == 0 || score.length == 0){
- notice_box("题目标题/分数不能为空");
+ notice_box("要求/分数不能为空");
}else if(!/^[1-9][0-9]*$/.test(score)) {
notice_box("分数必须是非零开头的数字");
}else if(quest_type !=3 && quest_type !=4 && standard_ans.length == 0) {
From 84466f113d41d6aec86f090e44a034a62669e5d3 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Tue, 28 May 2019 19:36:13 +0800
Subject: [PATCH 051/212] 1
---
app/api/mobile/apis/cnmooc.rb | 8 ++++
app/services/cnmoocs_service.rb | 68 +++++++++++++++++++++++++++------
2 files changed, 64 insertions(+), 12 deletions(-)
diff --git a/app/api/mobile/apis/cnmooc.rb b/app/api/mobile/apis/cnmooc.rb
index 42a6cfe3..026581cd 100644
--- a/app/api/mobile/apis/cnmooc.rb
+++ b/app/api/mobile/apis/cnmooc.rb
@@ -56,6 +56,14 @@ module Mobile
CnmoocsService.new.login_educoder params
end
+ desc "资源学习情况查询"
+ params do
+ requires :userId, type: Integer, desc: "用户ID"
+ requires :resouceId, type: String, desc: "资源唯一标示"
+ end
+ get 'get_students_data' do
+ CnmoocsService.new.get_students_data params
+ end
end
end
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index da119452..ba4271e4 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -6,15 +6,43 @@ class CnmoocsService
page = params[:pageNo].to_i
limit = params[:pageSize] || 16
offset = page * limit.to_i
- shixuns = Shixun.select([:id, :identifier, :name, :myshixuns_count, :averge_star, :challenges_count, :trainee]).
- where(status: 2, hidden: 0)
- shixun_count = shixuns.count
- pageCount = ((shixun_count / limit.to_f) == (shixun_count / limit)) ? (shixun_count / limit) : ((shixun_count / limit) + 1)
- shixuns = shixuns.order("myshixuns_count desc").offset(offset).limit(limit)
- shixun_list = shixun_data shixuns
+ resouces = []
+ if params[:level].to_s == "1"
+ subjects = Subject.find_by_sql("SELECT subjects.id, subjects.name, subjects.status, COUNT(myshixuns.id) AS myshixun_member_count
+ FROM myshixuns, stage_shixuns, subjects WHERE myshixuns.shixun_id = stage_shixuns.shixun_id
+ AND stage_shixuns.subject_id = subjects.id AND `subjects`.`hidden` = 0 AND `subjects`.`status` = 2
+ GROUP BY subjects.id ORDER BY myshixun_member_count DESC limit #{offset},#{limit}")
+
+ subjects.each do |subject|
+ resouces << {resouceId: subject.id, parentId: nil, resouceName: subject.name, accessType: 0, nodeType: 0,
+ resouceType: 2}
+ end
+ totalCount = Subject.where(:status => 2, :hidden => 0).count
+ count = subjects.count
+ elsif params[:level].to_s == "2"
+ return {error: -1, messages: "请求二级及其更高目录时,parentId不能为空"} if params[:parentId].blank?
+ stages = Stage.where(:subject_id => params[:parentId]).offset(offset).limit(limit)
+ stages.each do |stage|
+ resouces << {resouceId: stage.id, parentId: params[:parentId], resouceName: stage.name, accessType: 0, nodeType: 0,
+ resouceType: 2}
+ end
+ totalCount = Stage.where(:subject_id => params[:parentId]).count
+ count = stages.count
+ elsif params[:level].to_s == "3"
+ return {error: -1, messages: "请求二级及其更高目录时,parentId不能为空"} if params[:parentId].blank?
+ shixun_ids = StageShixun.where(:stage_id => params[:parentId]).pluck(:shixun_id)
+ shixuns = Shixun.where(:id => shixun_ids).offset(offset).limit(limit)
+ shixuns.each do |shixun|
+ resouces << {resouceId: shixun.identifier, parentId: params[:parentId], resouceName: shixun.name, accessType: 2,
+ nodeType: 1, resouceType: 1}
+ end
+ totalCount = Shixun.where(:id => shixun_ids).count
+ count = shixuns.count
+ end
+ pageCount = ((totalCount / limit.to_f) == (totalCount / limit)) ? (totalCount / limit) : ((totalCount / limit) + 1)
{error: 0, messages: "请求成功",
- page: {count: shixuns.count, totalCount: shixun_count, pageNo: page, pageSize: limit, pageCount: pageCount},
- data: shixun_list }
+ page: {count: count, totalCount: totalCount, pageNo: page, pageSize: limit, pageCount: pageCount},
+ data: {resouces: resouces} }
end
def search_resources params
@@ -33,9 +61,9 @@ class CnmoocsService
end
def find_user params
- user = User.find_by_mail params[:mail]
- if user
- {error: 0, messages: "找到用户"}
+ c_user = CnmoocUser.find_by_uuid(params[:userName])
+ if c_user
+ {error: 0, messages: "找到用户", data: { userId: user.id } }
else
{error: -1, messages: "找不到用户"}
end
@@ -48,7 +76,7 @@ class CnmoocsService
return { error: -1, messages: '用户已存在' }
end
- mail = c_user.generate_email
+ mail = params[:email] || c_user.generate_email
create_params = {
lastname: params[:name],
mail: mail,
@@ -94,6 +122,22 @@ class CnmoocsService
{ error: 0, messages: '成功', accessUrl: "#{Redmine::Configuration['educoder_domain']}/shixuns/#{shixun.id}" }
end
+ def get_students_data params
+ subject = Subject.find_by_id params[:resouceId]
+ return {error: -1, messages: "资源id不对,请使用一级目录资源查找"} if subject.blank?
+ shixun_ids = StageShixun.where(:stage_id => subject.stages).pluck(:shixun_id)
+ myshixuns = Myshixun.where(:user_id => params[:userId], shixun_id: shixun_ids).includes(:games)
+ score = 0
+ time = 0
+ myshixuns.each do |myshixun|
+ score += myshixun.total_score
+ myshixun.games.each do |game|
+ time += game.consumes_time_int
+ end
+ end
+ {error: 0, messages: '成功', data: {totalTime: time, score: score * 10}}
+ end
+
private
def shixun_data shixuns
From 40e15f9f1dd6609df740b08cd409b7ee72acf799 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Tue, 28 May 2019 19:47:00 +0800
Subject: [PATCH 052/212] =?UTF-8?q?=E5=A5=BD=E5=A4=A7=E5=AD=A6api=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/services/cnmoocs_service.rb | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index ba4271e4..6740a706 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -77,8 +77,9 @@ class CnmoocsService
end
mail = params[:email] || c_user.generate_email
+ name = params[:name] || "好大学_#{params[:userName]}"
create_params = {
- lastname: params[:name],
+ lastname: name,
mail: mail,
mail_notification: mail,
login: generate_login('m'),
From 7dd479f689ba820d3fa1dbdb6fece0609ac067b4 Mon Sep 17 00:00:00 2001
From: p31729568
Date: Tue, 28 May 2019 19:57:17 +0800
Subject: [PATCH 053/212] fix cnmooc create user api
---
app/services/cnmoocs_service.rb | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index ba4271e4..36b69301 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -75,6 +75,7 @@ class CnmoocsService
if c_user.present?
return { error: -1, messages: '用户已存在' }
end
+ c_user = CnmoocUser.new(uuid: params[:userName], name: params[:name])
mail = params[:email] || c_user.generate_email
create_params = {
From 528361da6fa355b20ccbc0a32824fbbc1b2b2776 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Tue, 28 May 2019 20:00:44 +0800
Subject: [PATCH 054/212] 1
---
app/services/cnmoocs_service.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index 054a765d..3a68055d 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -137,7 +137,7 @@ class CnmoocsService
time += game.consumes_time_int
end
end
- {error: 0, messages: '成功', data: {totalTime: time, score: score * 10}}
+ {error: 0, messages: '成功', data: {time: time, score: score * 10}}
end
From b1263a1cd088dd72a56a7a96fa5687e2359ceb03 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Tue, 28 May 2019 20:03:53 +0800
Subject: [PATCH 055/212] 1
---
app/services/cnmoocs_service.rb | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index 3a68055d..a7605110 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -153,4 +153,10 @@ class CnmoocsService
end
{resouces: shixun_list}
end
+
+ # 为新创建的用户随机生成以m为前缀的用户名,m表示该用户是用邮箱注册
+ def generate_login(login_pre)
+ us = UsersService.new
+ us.generate_user_login(login_pre)
+ end
end
\ No newline at end of file
From b252983b7d9520dc58401e265a78b8ebe307c7b9 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Tue, 28 May 2019 20:07:05 +0800
Subject: [PATCH 056/212] 1
---
app/api/mobile/apis/cnmooc.rb | 1 -
app/services/cnmoocs_service.rb | 3 ++-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/api/mobile/apis/cnmooc.rb b/app/api/mobile/apis/cnmooc.rb
index 026581cd..1f37af91 100644
--- a/app/api/mobile/apis/cnmooc.rb
+++ b/app/api/mobile/apis/cnmooc.rb
@@ -31,7 +31,6 @@ module Mobile
desc "创建用户"
params do
requires :userName, type: String, desc: "好大学用户名"
- optional :name, type: String, desc: "用户姓名"
end
post "create_user" do
CnmoocsService.new.create_user params
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index a7605110..52514a67 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -79,11 +79,12 @@ class CnmoocsService
mail = params[:email] || c_user.generate_email
name = params[:name] || "好大学_#{params[:userName]}"
+ login = generate_login('m')
create_params = {
lastname: name,
mail: mail,
mail_notification: mail,
- login: generate_login('m'),
+ login: login,
password: OauthController::DEFAULT_PASSWORD,
certification: 1
}
From 965b320e2c07f8ad5c412e37deadbcc7f569d905 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Tue, 28 May 2019 20:07:47 +0800
Subject: [PATCH 057/212] 1
---
app/services/cnmoocs_service.rb | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index 52514a67..4c287455 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -80,6 +80,7 @@ class CnmoocsService
mail = params[:email] || c_user.generate_email
name = params[:name] || "好大学_#{params[:userName]}"
login = generate_login('m')
+ Rails.logger.info("#######mail: #{mail}, #{name}, #{login}")
create_params = {
lastname: name,
mail: mail,
From 41195aaa6e372cc477d341d2c8ddfcb246e234f0 Mon Sep 17 00:00:00 2001
From: p31729568
Date: Tue, 28 May 2019 20:27:10 +0800
Subject: [PATCH 058/212] fix create cnmooc
---
app/services/cnmoocs_service.rb | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index 4c287455..d231ceae 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -85,12 +85,14 @@ class CnmoocsService
lastname: name,
mail: mail,
mail_notification: mail,
- login: login,
password: OauthController::DEFAULT_PASSWORD,
certification: 1
}
ActiveRecord::Base.transaction do
- user = User.create!(create_params)
+ user = User.new(create_params)
+ # login 有问题,只能这样赋值
+ user.login = login
+ user.save!
UserExtensions.create!(user_id: user.id, school_id: School.first.id, identity: 4, gender: 0)
From 30cd567050ef67c9a853e5c720296d08e8eaf0f0 Mon Sep 17 00:00:00 2001
From: p31729568
Date: Tue, 28 May 2019 20:31:12 +0800
Subject: [PATCH 059/212] fix
---
app/services/cnmoocs_service.rb | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index d231ceae..fb04ded8 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -88,10 +88,10 @@ class CnmoocsService
password: OauthController::DEFAULT_PASSWORD,
certification: 1
}
+ user = User.new(create_params)
+ # login 有问题,只能这样赋值
+ user.login = login
ActiveRecord::Base.transaction do
- user = User.new(create_params)
- # login 有问题,只能这样赋值
- user.login = login
user.save!
UserExtensions.create!(user_id: user.id, school_id: School.first.id, identity: 4, gender: 0)
From e8fd8b97a3d62d4e62c1acc437a43f09a02abc2f Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Tue, 28 May 2019 20:35:33 +0800
Subject: [PATCH 060/212] 1
---
app/api/mobile/apis/cnmooc.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/api/mobile/apis/cnmooc.rb b/app/api/mobile/apis/cnmooc.rb
index 1f37af91..96b10101 100644
--- a/app/api/mobile/apis/cnmooc.rb
+++ b/app/api/mobile/apis/cnmooc.rb
@@ -22,7 +22,7 @@ module Mobile
desc " 查找用户"
params do
- requires :mail, type: String, desc: "邮箱地址"
+ requires :userName, type: String, desc: "好大学用户名"
end
get 'find_user' do
CnmoocsService.new.find_user params
From f47cf352337eeeeb05bca4a3c5f940645ef93036 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Tue, 28 May 2019 20:37:19 +0800
Subject: [PATCH 061/212] 1
---
app/services/cnmoocs_service.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index fb04ded8..903db58d 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -63,7 +63,7 @@ class CnmoocsService
def find_user params
c_user = CnmoocUser.find_by_uuid(params[:userName])
if c_user
- {error: 0, messages: "找到用户", data: { userId: user.id } }
+ {error: 0, messages: "找到用户", data: { userId: c_user.user_id } }
else
{error: -1, messages: "找不到用户"}
end
From b4ec3363efa4f9c733b12765dbf8d0b8f396b2a6 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Tue, 28 May 2019 20:51:43 +0800
Subject: [PATCH 062/212] 1
---
app/api/mobile/api.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/api/mobile/api.rb b/app/api/mobile/api.rb
index d13dc61f..958fe6a9 100644
--- a/app/api/mobile/api.rb
+++ b/app/api/mobile/api.rb
@@ -34,7 +34,7 @@ module Mobile
version 'v1', using: :path
format :json
content_type :json, "application/json;charset=UTF-8"
- # use ActionDispatch::Session::CookieStore
+ use ActionDispatch::Session::CookieStore
require 'digest'
use Mobile::Middleware::ErrorHandler
From 1fb7c35c30e73b1890a61718197e6ea8eb62f4de Mon Sep 17 00:00:00 2001
From: p31729568
Date: Tue, 28 May 2019 20:56:53 +0800
Subject: [PATCH 063/212] fix session
---
app/api/mobile/api.rb | 6 ++++++
app/api/mobile/apis/cnmooc.rb | 5 +++++
app/services/cnmoocs_service.rb | 5 -----
3 files changed, 11 insertions(+), 5 deletions(-)
diff --git a/app/api/mobile/api.rb b/app/api/mobile/api.rb
index 958fe6a9..69bd4d44 100644
--- a/app/api/mobile/api.rb
+++ b/app/api/mobile/api.rb
@@ -109,6 +109,12 @@ module Mobile
return uw.user if uw
end
+ third_party_user_id = session[:third_party_user_id]
+ if third_party_user_id
+ c_user = UserSource.find_by_id(session[:third_party_user_id])
+ return c_user.user if c_user
+ end
+
token = ApiKey.where(access_token: params[:token]).first
if token && !token.expired?
return User.find(token.user_id)
diff --git a/app/api/mobile/apis/cnmooc.rb b/app/api/mobile/apis/cnmooc.rb
index 96b10101..d67a390d 100644
--- a/app/api/mobile/apis/cnmooc.rb
+++ b/app/api/mobile/apis/cnmooc.rb
@@ -43,6 +43,11 @@ module Mobile
requires :accessType, type: Integer, desc: "资源类型"
end
get "source_url" do
+ if session[:third_party_user_id].blank?
+ user = User.find(params[:userId])
+ session[:third_party_user_id] = user.user_source.id
+ end
+
CnmoocsService.new.source_url(params)
end
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index 903db58d..caba8ebb 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -115,11 +115,6 @@ class CnmoocsService
end
def source_url(params)
- if session[:third_party_user_id].blank?
- user = User.find(params[:userId])
- session[:third_party_user_id] = user.user_source.id
- end
-
shixun = Shixun.find_by_identifier(params[:resouceId])
if shixun.blank?
return { error: -1, messages: '资源不存在' }
From 23d8e023dfe747a4e7ff1c790487ecd1fee597a6 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Tue, 28 May 2019 21:01:33 +0800
Subject: [PATCH 064/212] 1
---
app/services/cnmoocs_service.rb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index caba8ebb..34d97d6c 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -33,7 +33,7 @@ class CnmoocsService
shixun_ids = StageShixun.where(:stage_id => params[:parentId]).pluck(:shixun_id)
shixuns = Shixun.where(:id => shixun_ids).offset(offset).limit(limit)
shixuns.each do |shixun|
- resouces << {resouceId: shixun.identifier, parentId: params[:parentId], resouceName: shixun.name, accessType: 2,
+ resouces << {resouceId: shixun.id, parentId: params[:parentId], resouceName: shixun.name, accessType: 2,
nodeType: 1, resouceType: 1}
end
totalCount = Shixun.where(:id => shixun_ids).count
@@ -120,7 +120,7 @@ class CnmoocsService
return { error: -1, messages: '资源不存在' }
end
- { error: 0, messages: '成功', accessUrl: "#{Redmine::Configuration['educoder_domain']}/shixuns/#{shixun.id}" }
+ { error: 0, messages: '成功', accessUrl: "#{Redmine::Configuration['educoder_domain']}/shixuns/#{shixun.identifier}" }
end
def get_students_data params
From 3e416f2538c1b56a8082958b0d4345e3458a2a81 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Tue, 28 May 2019 21:12:06 +0800
Subject: [PATCH 065/212] 1
---
app/services/cnmoocs_service.rb | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index 34d97d6c..e1bae88d 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -124,19 +124,22 @@ class CnmoocsService
end
def get_students_data params
- subject = Subject.find_by_id params[:resouceId]
- return {error: -1, messages: "资源id不对,请使用一级目录资源查找"} if subject.blank?
- shixun_ids = StageShixun.where(:stage_id => subject.stages).pluck(:shixun_id)
- myshixuns = Myshixun.where(:user_id => params[:userId], shixun_id: shixun_ids).includes(:games)
- score = 0
- time = 0
- myshixuns.each do |myshixun|
- score += myshixun.total_score
+ shixun = Shixun.find_by_id params[:resouceId]
+ return {error: -1, messages: "资源id不对,请使用资源的id查找"} if shixun.blank?
+ # shixun_ids = StageShixun.where(:stage_id => subject.stages).pluck(:shixun_id)
+ #myshixuns = Myshixun.where(:user_id => params[:userId], shixun_id: shixun_ids).includes(:games)
+ myshixun = shixun.myshixuns.where(:user_id => params[:userId]).includes(:games)
+ if myshixun
+ score = myshixun.total_score
+ time = 0
myshixun.games.each do |game|
time += game.consumes_time_int
end
+ {error: 0, messages: '成功', data: {time: time, score: score * 10}}
+ else
+ {error: -1, messages: '用户还未开始学习此资源'}
end
- {error: 0, messages: '成功', data: {time: time, score: score * 10}}
+
end
From dce940523ae7a3ce10d8ee01da60a75e84edfc07 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Tue, 28 May 2019 21:21:21 +0800
Subject: [PATCH 066/212] 1
---
app/services/cnmoocs_service.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index e1bae88d..a30e2ef2 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -129,7 +129,7 @@ class CnmoocsService
# shixun_ids = StageShixun.where(:stage_id => subject.stages).pluck(:shixun_id)
#myshixuns = Myshixun.where(:user_id => params[:userId], shixun_id: shixun_ids).includes(:games)
myshixun = shixun.myshixuns.where(:user_id => params[:userId]).includes(:games)
- if myshixun
+ if myshixun.present?
score = myshixun.total_score
time = 0
myshixun.games.each do |game|
From 257f55ec006bc6a1ecfecab5aacdd23d6729fde7 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Tue, 28 May 2019 21:26:41 +0800
Subject: [PATCH 067/212] 1
---
app/services/cnmoocs_service.rb | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index a30e2ef2..9ec02bfd 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -126,9 +126,7 @@ class CnmoocsService
def get_students_data params
shixun = Shixun.find_by_id params[:resouceId]
return {error: -1, messages: "资源id不对,请使用资源的id查找"} if shixun.blank?
- # shixun_ids = StageShixun.where(:stage_id => subject.stages).pluck(:shixun_id)
- #myshixuns = Myshixun.where(:user_id => params[:userId], shixun_id: shixun_ids).includes(:games)
- myshixun = shixun.myshixuns.where(:user_id => params[:userId]).includes(:games)
+ myshixun = shixun.myshixuns.where(:user_id => params[:userId]).includes(:games).first
if myshixun.present?
score = myshixun.total_score
time = 0
From 0f359082e5df1b7e0c06b687857b1d7440ec9c37 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 08:51:22 +0800
Subject: [PATCH 068/212] =?UTF-8?q?=E8=B6=85=E7=BA=A7=E7=AE=A1=E7=90=86?=
=?UTF-8?q?=E5=91=98=E8=AF=84=E6=B5=8B=E6=97=B6=E9=97=B4=E8=AF=A6=E6=83=85?=
=?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=A2=9E=E5=8A=A0=E6=9C=80=E5=A4=A7=E6=89=A7?=
=?UTF-8?q?=E8=A1=8C=E6=97=B6=E9=97=B4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/views/managements/evaluate_simple.html.erb | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/app/views/managements/evaluate_simple.html.erb b/app/views/managements/evaluate_simple.html.erb
index a278395c..c01b58bc 100644
--- a/app/views/managements/evaluate_simple.html.erb
+++ b/app/views/managements/evaluate_simple.html.erb
@@ -14,8 +14,9 @@
回传时间 |
前端轮询 |
结果存储 |
- 创建时间 |
- 唯一表示 |
+ 创建时间 |
+ 最大执行时间 |
+ 唯一标识 |
实训名称 |
@@ -35,7 +36,8 @@
<%= record.front_js %> |
<%= record.test_cases %> |
<%= format_time record.created_at %> |
- <%= record.identifier %> |
+ <%= record.shixun.exec_time %> |
+ <%= record.shixun.identifier %> |
<%= link_to record.shixun.try(:name), task_path(record.game), :target => "_blank", :title => "#{record.shixun.try(:name)}" %> |
<% end %>
From 83373311033932f1797451fc89db83aabeffde36 Mon Sep 17 00:00:00 2001
From: cxt <853663049@qq.com>
Date: Wed, 29 May 2019 10:38:41 +0800
Subject: [PATCH 069/212] =?UTF-8?q?=E5=90=8E=E7=AB=AF-=E8=AF=95=E5=8D=B7?=
=?UTF-8?q?=E3=80=81=E8=AF=95=E5=8D=B7=E9=A2=98=E5=BA=93=E7=9A=84=E5=AE=9E?=
=?UTF-8?q?=E8=AE=AD=E9=A2=98=E5=A2=9E=E5=8A=A0=E6=94=B9=E5=90=8D=E7=A7=B0?=
=?UTF-8?q?=E7=9A=84=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/exercise_bank_controller.rb | 2 ++
app/controllers/exercise_controller.rb | 5 ++++-
app/controllers/question_banks_controller.rb | 2 +-
app/helpers/application_helper.rb | 3 ++-
app/views/exercise/_edit_shixun.html.erb | 2 +-
app/views/exercise/_exercise_form.html.erb | 2 +-
app/views/exercise/_exercise_student.html.erb | 2 +-
.../exercise/_exercise_student_result.html.erb | 2 +-
app/views/exercise/_new_shixun.html.erb | 5 ++++-
app/views/exercise/_show_shixun.html.erb | 2 +-
.../exercise/student_exercise_list.html.erb | 2 +-
app/views/exercise_bank/_edit_shixun.html.erb | 5 ++++-
app/views/exercise_bank/_new_shixun.html.erb | 5 ++++-
app/views/exercise_bank/_show_shixun.html.erb | 2 +-
app/views/exercise_bank/show.html.erb | 2 +-
.../homework_bank/_send_homework_bank.html.erb | 15 ++++++++++++++-
...90529014121_add_shixun_name_to_ex_question.rb | 14 ++++++++++++++
public/javascripts/edu/base_edu.js | 10 ----------
public/javascripts/edu/course.js | 16 ++++++++++++++++
19 files changed, 73 insertions(+), 25 deletions(-)
create mode 100644 db/migrate/20190529014121_add_shixun_name_to_ex_question.rb
diff --git a/app/controllers/exercise_bank_controller.rb b/app/controllers/exercise_bank_controller.rb
index e4fa6727..6b8090dd 100644
--- a/app/controllers/exercise_bank_controller.rb
+++ b/app/controllers/exercise_bank_controller.rb
@@ -104,6 +104,7 @@ class ExerciseBankController < ApplicationController
:question_type => params[:question_type] || 1,
:question_number => @exercise.exercise_bank_questions.count + 1,
:question_score => params[:question_score],
+ :shixun_name => params[:question_type] == '5' ? params[:shixun_name] : nil,
:shixun_id => params[:shixun],
:max_choices => params[:max_choices].to_i || 0,
:min_choices => params[:min_choices].to_i || 0
@@ -271,6 +272,7 @@ class ExerciseBankController < ApplicationController
end
end
if @exercise_question.question_type == 5
+ @exercise_question.shixun_name = params[:shixun_name].strip if !params[:shixun_name].blank?
question_score = 0
@exercise_question.exercise_bank_shixun_challenges.each_with_index do |challenge, index|
challenge.question_score = params[:question_score][index]
diff --git a/app/controllers/exercise_controller.rb b/app/controllers/exercise_controller.rb
index 23024a78..ee5705fb 100644
--- a/app/controllers/exercise_controller.rb
+++ b/app/controllers/exercise_controller.rb
@@ -372,6 +372,7 @@ class ExerciseController < ApplicationController
:question_type => params[:question_type] || 1,
:question_number => @exercise.exercise_questions.count + 1,
:question_score => params[:question_type] == '5' ? 0 : params[:question_score],
+ :shixun_name => params[:question_type] == '5' ? params[:shixun_name] : nil,
:shixun_id => params[:shixun]
}
@exercise_questions = @exercise.exercise_questions.new option
@@ -512,6 +513,7 @@ class ExerciseController < ApplicationController
end
end
if @exercise_question.question_type == 5
+ @exercise_question.shixun_name = params[:shixun_name].strip if !params[:shixun_name].blank?
question_score = 0
@exercise_question.exercise_shixun_challenges.each_with_index do |challenge, index|
challenge.question_score = params[:question_score][index]
@@ -1508,7 +1510,8 @@ class ExerciseController < ApplicationController
:question_type => q[:question_type] || 1,
:question_number => q[:question_number],
:question_score => q[:question_score],
- :shixun_id => q[:shixun_id]
+ :shixun_id => q[:shixun_id],
+ :shixun_name => q[:shixun_name]
}
exercise_bank_question = exercise_bank.exercise_bank_questions.new option
diff --git a/app/controllers/question_banks_controller.rb b/app/controllers/question_banks_controller.rb
index 96f6db3b..cffecba1 100644
--- a/app/controllers/question_banks_controller.rb
+++ b/app/controllers/question_banks_controller.rb
@@ -117,7 +117,7 @@ class QuestionBanksController < ApplicationController
else
@courses = User.current.courses.where("is_delete = 0 and is_end = 0").select{ |course| User.current.has_teacher_role(course)}
end
- @homework_ids = params[:check_homework_bank] || params[:bank_id].split(" ")
+ @homework_ids = params[:check_homework_bank] || params[:bank_id].split(" ") unless params[:is_observe]
@search = params[:search]
respond_to do |format|
format.js
diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb
index 35449aad..34fa1a8d 100644
--- a/app/helpers/application_helper.rb
+++ b/app/helpers/application_helper.rb
@@ -7034,7 +7034,8 @@ def quote_exercise_bank exercise, course
:question_type => q[:question_type] || 1,
:question_number => q[:question_number],
:question_score => q[:question_score],
- :shixun_id => q[:shixun_id]
+ :shixun_id => q[:shixun_id],
+ :shixun_name => q[:shixun_name]
}
exercise_question = new_exercise.exercise_questions.new option
diff --git a/app/views/exercise/_edit_shixun.html.erb b/app/views/exercise/_edit_shixun.html.erb
index 9c0f130b..ef96f3b7 100644
--- a/app/views/exercise/_edit_shixun.html.erb
+++ b/app/views/exercise/_edit_shixun.html.erb
@@ -3,7 +3,7 @@
实训题
-
+
diff --git a/app/views/exercise/_exercise_form.html.erb b/app/views/exercise/_exercise_form.html.erb
index ca3080e4..bee149fd 100644
--- a/app/views/exercise/_exercise_form.html.erb
+++ b/app/views/exercise/_exercise_form.html.erb
@@ -111,7 +111,7 @@
var score = $.trim($("#poll_question_score_"+ id).val());
var standard_ans = $.trim($("#exercise_choice_" + id).val());
if(name===""){
- notice_box("题目标题");
+ notice_box("题目标题不能为空");
}
if(title.length == 0 || score.length == 0){
notice_box("要求/分数不能为空");
diff --git a/app/views/exercise/_exercise_student.html.erb b/app/views/exercise/_exercise_student.html.erb
index add9d655..ec47f1c0 100644
--- a/app/views/exercise/_exercise_student.html.erb
+++ b/app/views/exercise/_exercise_student.html.erb
@@ -162,7 +162,7 @@
<% end %>
<% if exercise_question.question_type == 5 %>
- <%= exercise_question.shixun.name %>
+ <%= exercise_question.shixun_name %>
<% end %>
<%= exercise_question.question_title.html_safe %>
<% case exercise_question.question_type %>
diff --git a/app/views/exercise/_exercise_student_result.html.erb b/app/views/exercise/_exercise_student_result.html.erb
index 0dd656be..6d48573f 100644
--- a/app/views/exercise/_exercise_student_result.html.erb
+++ b/app/views/exercise/_exercise_student_result.html.erb
@@ -140,7 +140,7 @@
<% end %>
<% if exercise_question.question_type == 5 %>
- <%= exercise_question.shixun.name %>
+ <%= exercise_question.shixun_name %>
<% end %>
<%= exercise_question.question_title.html_safe %>
<% case exercise_question.question_type %>
diff --git a/app/views/exercise/_new_shixun.html.erb b/app/views/exercise/_new_shixun.html.erb
index 1cff068f..6ce2cd68 100644
--- a/app/views/exercise/_new_shixun.html.erb
+++ b/app/views/exercise/_new_shixun.html.erb
@@ -8,7 +8,10 @@
- <%= @shixun.name %>
+
+
+
+
diff --git a/app/views/exercise/_show_shixun.html.erb b/app/views/exercise/_show_shixun.html.erb
index 92feef9d..75f460ec 100644
--- a/app/views/exercise/_show_shixun.html.erb
+++ b/app/views/exercise/_show_shixun.html.erb
@@ -16,7 +16,7 @@
<% end %>
- <%= exercise_question.shixun.name %>
+ <%= exercise_question.shixun_name %>
<%= exercise_question.question_title.html_safe %>
<% exercise_question.exercise_shixun_challenges.each_with_index do |exercise_challenge,index| %>
diff --git a/app/views/exercise/student_exercise_list.html.erb b/app/views/exercise/student_exercise_list.html.erb
index 3632b4d7..b8335515 100644
--- a/app/views/exercise/student_exercise_list.html.erb
+++ b/app/views/exercise/student_exercise_list.html.erb
@@ -256,7 +256,7 @@
<% end %>
<% if exercise_question.question_type == 5 %>
- <%= exercise_question.shixun.name %>
+ <%= exercise_question.shixun_name %>
<% end %>
<%= exercise_question.question_title.html_safe %>
diff --git a/app/views/exercise_bank/_edit_shixun.html.erb b/app/views/exercise_bank/_edit_shixun.html.erb
index 41383767..7aa84e9f 100644
--- a/app/views/exercise_bank/_edit_shixun.html.erb
+++ b/app/views/exercise_bank/_edit_shixun.html.erb
@@ -1,7 +1,10 @@
<%= form_for("",:url => update_exercise_question_exercise_bank_index_path(:exercise_question => exercise_question.id),:html => {:id => "update_exercise_question_#{exercise_question.id}"}) do |f|%>
实训题
-
<%= exercise_question.shixun.name %>
+
+
+
+
diff --git a/app/views/exercise_bank/_new_shixun.html.erb b/app/views/exercise_bank/_new_shixun.html.erb
index 36af84ad..140ee9b2 100644
--- a/app/views/exercise_bank/_new_shixun.html.erb
+++ b/app/views/exercise_bank/_new_shixun.html.erb
@@ -8,7 +8,10 @@
- <%= @shixun.name %>
+
+
+
+
diff --git a/app/views/exercise_bank/_show_shixun.html.erb b/app/views/exercise_bank/_show_shixun.html.erb
index cf2a9b2b..e426fd0e 100644
--- a/app/views/exercise_bank/_show_shixun.html.erb
+++ b/app/views/exercise_bank/_show_shixun.html.erb
@@ -14,7 +14,7 @@
-
<%= exercise_question.shixun.name %>
+
<%= exercise_question.shixun_name %>
<%= exercise_question.question_title.html_safe %>
<% exercise_question.exercise_bank_shixun_challenges.each_with_index do |exercise_challenge,index| %>
diff --git a/app/views/exercise_bank/show.html.erb b/app/views/exercise_bank/show.html.erb
index 0fb5e2ca..14712a92 100644
--- a/app/views/exercise_bank/show.html.erb
+++ b/app/views/exercise_bank/show.html.erb
@@ -80,7 +80,7 @@
<% end %>
<% if exercise_question.question_type == 5 %>
-
<%= exercise_question.shixun.name %>
+
<%= exercise_question.shixun_name %>
<% end %>
<%= exercise_question.question_title.html_safe %>
<% case exercise_question.question_type %>
diff --git a/app/views/homework_bank/_send_homework_bank.html.erb b/app/views/homework_bank/_send_homework_bank.html.erb
index 3127aecd..6b935521 100644
--- a/app/views/homework_bank/_send_homework_bank.html.erb
+++ b/app/views/homework_bank/_send_homework_bank.html.erb
@@ -31,4 +31,17 @@
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/db/migrate/20190529014121_add_shixun_name_to_ex_question.rb b/db/migrate/20190529014121_add_shixun_name_to_ex_question.rb
new file mode 100644
index 00000000..8aa02878
--- /dev/null
+++ b/db/migrate/20190529014121_add_shixun_name_to_ex_question.rb
@@ -0,0 +1,14 @@
+class AddShixunNameToExQuestion < ActiveRecord::Migration
+ def change
+ add_column :exercise_questions, :shixun_name, :string
+ add_column :exercise_bank_questions, :shixun_name, :string
+
+ ExerciseQuestion.where(question_type: 5).each do |question|
+ question.update_column("shixun_name", question.shixun.try(:name))
+ end
+
+ ExerciseBankQuestion.where(question_type: 5).each do |question|
+ question.update_column("shixun_name", question.shixun.try(:name))
+ end
+ end
+end
diff --git a/public/javascripts/edu/base_edu.js b/public/javascripts/edu/base_edu.js
index 8167249c..1963d1cb 100644
--- a/public/javascripts/edu/base_edu.js
+++ b/public/javascripts/edu/base_edu.js
@@ -1361,16 +1361,6 @@ function choose_course_to_send_hb(){
}
}
-function search_hw_course(url){
- $.ajax({
- url: url,
- type: 'post',
- data: {search: $("#hb_search_course_input").val(), is_observe: true},
- success: function(data){
- }
- });
-}
-
function submit_send_hb_to_course(){
if($("input[name='course_id']:checked").length >= 1){
$("#search_course_notice_h").html("").hide();
diff --git a/public/javascripts/edu/course.js b/public/javascripts/edu/course.js
index 330dbea7..98163bda 100644
--- a/public/javascripts/edu/course.js
+++ b/public/javascripts/edu/course.js
@@ -1103,6 +1103,15 @@ function add_ex_question(doc,quest_type)
var title = $.trim($("#poll_questions_title").val());
var score = $.trim($("#question_score").val());
var standard_ans = $.trim($("#exercise_choice_" + quest_type).val());
+
+ if (quest_type == 5) {
+ var name = $.trim($("#poll_questions_name").val());
+ if(name===""){
+ notice_box("题目标题不能为空");
+ result = false;
+ }
+ }
+
if(title.length == 0){
if(quest_type != 5){
notice_box("题目标题不能为空");
@@ -1414,6 +1423,13 @@ function edit_poll_question(doc,id,quest_type) {
var title = $.trim($("#poll_questions_title_" + id).val());
var score = $.trim($("#poll_question_score_" + id).val());
var standard_ans = $.trim($("#exercise_choice_" + id).val());
+ if (quest_type == 5) {
+ var name = $.trim($("#poll_questions_name_" + id).val());
+ if(name===""){
+ notice_box("题目标题不能为空");
+ result = false;
+ }
+ }
if (title.length == 0) {
if (quest_type != 5) {
notice_box("题目标题不能为空");
From 92a08caf9506f9029ffe3d6d62a096b5bafc021a Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 10:53:48 +0800
Subject: [PATCH 070/212] 1
---
app/views/managements/evaluate_simple.html.erb | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/app/views/managements/evaluate_simple.html.erb b/app/views/managements/evaluate_simple.html.erb
index c01b58bc..6d05aedf 100644
--- a/app/views/managements/evaluate_simple.html.erb
+++ b/app/views/managements/evaluate_simple.html.erb
@@ -36,8 +36,8 @@
<%= record.front_js %> |
<%= record.test_cases %> |
<%= format_time record.created_at %> |
- <%= record.shixun.exec_time %> |
- <%= record.shixun.identifier %> |
+ <%= record.shixun.try(:exec_time) %> |
+ <%= record.shixun.try(:identifier) %> |
<%= link_to record.shixun.try(:name), task_path(record.game), :target => "_blank", :title => "#{record.shixun.try(:name)}" %> |
<% end %>
From c86d364744b93fa428c77f85c831dfc059842e27 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 13:56:12 +0800
Subject: [PATCH 071/212] =?UTF-8?q?=E8=AF=95=E7=94=A8=E6=8E=88=E6=9D=83?=
=?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=A2=9E=E5=8A=A0=E9=82=AE=E7=AE=B1?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/managements_controller.rb | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/controllers/managements_controller.rb b/app/controllers/managements_controller.rb
index 0f62dbe8..54b7ffe6 100644
--- a/app/controllers/managements_controller.rb
+++ b/app/controllers/managements_controller.rb
@@ -4185,7 +4185,7 @@ end
sheet1 = book.create_worksheet :name => "users"
blue = Spreadsheet::Format.new :color => :blue, :weight => :bold, :size => 10
sheet1.row(0).default_format = blue
- sheet1.row(0).concat(["用户姓名","性别","职业","职称","地区"," 单位","子单位","注册时间","最后登录时间","授权"])
+ sheet1.row(0).concat(["用户姓名","性别","职业","职称","地区"," 单位","子单位","注册时间","最后登录时间","授权", "邮箱"])
count_row = 1
users.each do |user|
sheet1[count_row,0] = user.try(:show_real_name)
@@ -4198,6 +4198,7 @@ end
sheet1[count_row,7] = format_time user.created_on
sheet1[count_row,8] = format_time user.last_login_on
sheet1[count_row,9] = user.trial_authorization
+ sheet1[count_row,10] = user.mail
count_row += 1
end
book.write xls_report
From 9dc838f430690a5397062a7bd7774b31e8048551 Mon Sep 17 00:00:00 2001
From: hjm <63528605@qq.com>
Date: Wed, 29 May 2019 16:21:33 +0800
Subject: [PATCH 072/212] pointer-events
---
public/react/public/js/edu_tpi.js | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/public/react/public/js/edu_tpi.js b/public/react/public/js/edu_tpi.js
index d1df64aa..8743a0ac 100644
--- a/public/react/public/js/edu_tpi.js
+++ b/public/react/public/js/edu_tpi.js
@@ -26,7 +26,7 @@ $(function(){
var nRow = 0;
//var nCol = 0;
lab.live('mousedown touchstart',function(){
- $('#game_webssh').css('pointer-events', 'none')
+ $('#contentIframe').css('pointer-events', 'none')
dragging = true;
leftOffset = $(".labelN").offset().left;
wrapWidth = $(".labelN").width();
@@ -35,7 +35,7 @@ $(function(){
);
cen.live('mousedown',function(){
// 使得iframe不捕获事件
- $('#game_webssh').css('pointer-events', 'none')
+ $('#contentIframe').css('pointer-events', 'none')
flag = true;
topOffset = $(".centerH").offset().top;
wrapHeight = $(".centerH").height();
@@ -111,7 +111,7 @@ $(function(){
doc.live("mouseup touchend", function(e) {
// 使得iframe可以继续捕获事件
- $('#game_webssh').css('pointer-events', 'inherit')
+ $('#contentIframe').css('pointer-events', 'inherit')
flag = false;
dragging = false;
e.cancelBubble = true;
From 8a24cf69dee01584eb30d2b42e17c00e7197cfae Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 16:30:22 +0800
Subject: [PATCH 073/212] 1
---
app/services/games_service.rb | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/services/games_service.rb b/app/services/games_service.rb
index e413c101..9e1ea356 100644
--- a/app/services/games_service.rb
+++ b/app/services/games_service.rb
@@ -19,6 +19,7 @@ class GamesService
shixun = Shixun.min.find(myshixun.shixun_id)
unless ((myshixun.user_id == current_user.id || current_user.business? || current_user.id == shixun.try(:user_id) ||
current_user.is_certification_teacher) && (shixun.operable?)) || current_user.admin?
+ Rails.logger.info("######403???")
return{:status => 403}
end
game_challenge = Challenge.min.find(game.challenge_id)
From 4a42989a33f1b26fbaf47e9fa66afb565936e67c Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 16:45:52 +0800
Subject: [PATCH 074/212] 1
---
app/api/mobile/api.rb | 1 +
1 file changed, 1 insertion(+)
diff --git a/app/api/mobile/api.rb b/app/api/mobile/api.rb
index 69bd4d44..0be7d4b2 100644
--- a/app/api/mobile/api.rb
+++ b/app/api/mobile/api.rb
@@ -110,6 +110,7 @@ module Mobile
end
third_party_user_id = session[:third_party_user_id]
+ Rails.logger.info("#########third_party_user_id: #{third_party_user_id}")
if third_party_user_id
c_user = UserSource.find_by_id(session[:third_party_user_id])
return c_user.user if c_user
From 833a99dfb65560b6e3a8ffa6eecf4d3b20b50262 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 16:50:14 +0800
Subject: [PATCH 075/212] 1
---
app/api/mobile/api.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/api/mobile/api.rb b/app/api/mobile/api.rb
index 0be7d4b2..bce3f24f 100644
--- a/app/api/mobile/api.rb
+++ b/app/api/mobile/api.rb
@@ -34,7 +34,7 @@ module Mobile
version 'v1', using: :path
format :json
content_type :json, "application/json;charset=UTF-8"
- use ActionDispatch::Session::CookieStore
+ use ActionDispatch::Session::CookieStore, key: '_educoder_session'
require 'digest'
use Mobile::Middleware::ErrorHandler
From 51e4759bcc04a80b1b0cc28bfc5bda7a8d149001 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 17:00:14 +0800
Subject: [PATCH 076/212] 1
---
app/services/cnmoocs_service.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index 9ec02bfd..3161eeac 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -115,7 +115,7 @@ class CnmoocsService
end
def source_url(params)
- shixun = Shixun.find_by_identifier(params[:resouceId])
+ shixun = Shixun.find_by_id(params[:resouceId])
if shixun.blank?
return { error: -1, messages: '资源不存在' }
end
From c6f4da31879350a1c58c34a11270b3ee9c0700d4 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 17:07:59 +0800
Subject: [PATCH 077/212] 1
---
app/api/mobile/api.rb | 2 +-
app/api/mobile/apis/cnmooc.rb | 4 +++-
app/controllers/account_controller.rb | 1 +
3 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/app/api/mobile/api.rb b/app/api/mobile/api.rb
index bce3f24f..0be7d4b2 100644
--- a/app/api/mobile/api.rb
+++ b/app/api/mobile/api.rb
@@ -34,7 +34,7 @@ module Mobile
version 'v1', using: :path
format :json
content_type :json, "application/json;charset=UTF-8"
- use ActionDispatch::Session::CookieStore, key: '_educoder_session'
+ use ActionDispatch::Session::CookieStore
require 'digest'
use Mobile::Middleware::ErrorHandler
diff --git a/app/api/mobile/apis/cnmooc.rb b/app/api/mobile/apis/cnmooc.rb
index d67a390d..06467765 100644
--- a/app/api/mobile/apis/cnmooc.rb
+++ b/app/api/mobile/apis/cnmooc.rb
@@ -43,11 +43,13 @@ module Mobile
requires :accessType, type: Integer, desc: "资源类型"
end
get "source_url" do
+
if session[:third_party_user_id].blank?
user = User.find(params[:userId])
session[:third_party_user_id] = user.user_source.id
+ #self.logged_user = user
end
-
+ Rails.logger.info("####session: #{session}")
CnmoocsService.new.source_url(params)
end
diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb
index 60096a22..6409114f 100644
--- a/app/controllers/account_controller.rb
+++ b/app/controllers/account_controller.rb
@@ -293,6 +293,7 @@ class AccountController < ApplicationController
UserActions.create(:action_id => User.current.id, :action_type => "Logout", :user_id => User.current.id)
logout_user
# 记录用户登出行为
+ logger.info("#########logout_session: #{session}")
redirect_to home_path
end
# display the logout form
From c3c0b8db98e8b3d2b3c47a89452f10ba7156b9d4 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 17:17:53 +0800
Subject: [PATCH 078/212] 1
---
app/api/mobile/apis/cnmooc.rb | 7 -------
app/services/cnmoocs_service.rb | 3 +++
2 files changed, 3 insertions(+), 7 deletions(-)
diff --git a/app/api/mobile/apis/cnmooc.rb b/app/api/mobile/apis/cnmooc.rb
index 06467765..96b10101 100644
--- a/app/api/mobile/apis/cnmooc.rb
+++ b/app/api/mobile/apis/cnmooc.rb
@@ -43,13 +43,6 @@ module Mobile
requires :accessType, type: Integer, desc: "资源类型"
end
get "source_url" do
-
- if session[:third_party_user_id].blank?
- user = User.find(params[:userId])
- session[:third_party_user_id] = user.user_source.id
- #self.logged_user = user
- end
- Rails.logger.info("####session: #{session}")
CnmoocsService.new.source_url(params)
end
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index 3161eeac..dd07cd57 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -115,6 +115,9 @@ class CnmoocsService
end
def source_url(params)
+ user_source = UserSource.find_by_user_id(params[:userId])
+ return {error: -1, messages: "用户不存在,请先创建用户"} if user_source
+ self.logged_user = user_source.user
shixun = Shixun.find_by_id(params[:resouceId])
if shixun.blank?
return { error: -1, messages: '资源不存在' }
From d99036f918de9db8b5c3a18a248493ba6c3d9770 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 17:19:57 +0800
Subject: [PATCH 079/212] 1
---
app/controllers/application_controller.rb | 3 ---
1 file changed, 3 deletions(-)
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 42dd6e1e..435c71fc 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -207,9 +207,6 @@ class ApplicationController < ActionController::Base
elsif session[:wechat_openid]
uw = UserWechat.find_by_openid(session[:wechat_openid])
user = uw.user if uw
- elsif session[:third_party_user_id]
- c_user = UserSource.find_by_id(session[:third_party_user_id])
- user = c_user.user if c_user
end
end
if user.nil? && Setting.rest_api_enabled? && accept_api_auth?
From b13bf24330bb323ae9c72e737262f5c95121469d Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 17:20:53 +0800
Subject: [PATCH 080/212] 1
---
app/api/mobile/api.rb | 8 --------
1 file changed, 8 deletions(-)
diff --git a/app/api/mobile/api.rb b/app/api/mobile/api.rb
index 0be7d4b2..a0004c3c 100644
--- a/app/api/mobile/api.rb
+++ b/app/api/mobile/api.rb
@@ -108,14 +108,6 @@ module Mobile
uw = UserWechat.find_by_openid(openid)
return uw.user if uw
end
-
- third_party_user_id = session[:third_party_user_id]
- Rails.logger.info("#########third_party_user_id: #{third_party_user_id}")
- if third_party_user_id
- c_user = UserSource.find_by_id(session[:third_party_user_id])
- return c_user.user if c_user
- end
-
token = ApiKey.where(access_token: params[:token]).first
if token && !token.expired?
return User.find(token.user_id)
From 582e0b19c61c9386d540aa4f98fd4d59745c8fe5 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 17:23:16 +0800
Subject: [PATCH 081/212] 1
---
app/services/cnmoocs_service.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index dd07cd57..24a9950e 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -116,7 +116,7 @@ class CnmoocsService
def source_url(params)
user_source = UserSource.find_by_user_id(params[:userId])
- return {error: -1, messages: "用户不存在,请先创建用户"} if user_source
+ return {error: -1, messages: "用户不存在,请先创建用户"} if user_source.blank?
self.logged_user = user_source.user
shixun = Shixun.find_by_id(params[:resouceId])
if shixun.blank?
From 2a3bbc290961517912dfc905d73503bc68ad5ad7 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 17:24:53 +0800
Subject: [PATCH 082/212] 1
---
app/api/mobile/apis/cnmooc.rb | 3 +++
app/services/cnmoocs_service.rb | 3 ---
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/app/api/mobile/apis/cnmooc.rb b/app/api/mobile/apis/cnmooc.rb
index 96b10101..7546fd58 100644
--- a/app/api/mobile/apis/cnmooc.rb
+++ b/app/api/mobile/apis/cnmooc.rb
@@ -43,6 +43,9 @@ module Mobile
requires :accessType, type: Integer, desc: "资源类型"
end
get "source_url" do
+ user_source = UserSource.find_by_user_id(params[:userId])
+ return {error: -1, messages: "用户不存在,请先创建用户"} if user_source.blank?
+ self.logged_user = user_source.user
CnmoocsService.new.source_url(params)
end
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index 24a9950e..3161eeac 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -115,9 +115,6 @@ class CnmoocsService
end
def source_url(params)
- user_source = UserSource.find_by_user_id(params[:userId])
- return {error: -1, messages: "用户不存在,请先创建用户"} if user_source.blank?
- self.logged_user = user_source.user
shixun = Shixun.find_by_id(params[:resouceId])
if shixun.blank?
return { error: -1, messages: '资源不存在' }
From 6ecea79dc3f50ea778b995363f7a2bf78cbc5b3c Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 17:28:00 +0800
Subject: [PATCH 083/212] 1
---
app/api/mobile/apis/cnmooc.rb | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/app/api/mobile/apis/cnmooc.rb b/app/api/mobile/apis/cnmooc.rb
index 7546fd58..720ac26b 100644
--- a/app/api/mobile/apis/cnmooc.rb
+++ b/app/api/mobile/apis/cnmooc.rb
@@ -43,9 +43,11 @@ module Mobile
requires :accessType, type: Integer, desc: "资源类型"
end
get "source_url" do
- user_source = UserSource.find_by_user_id(params[:userId])
- return {error: -1, messages: "用户不存在,请先创建用户"} if user_source.blank?
- self.logged_user = user_source.user
+ if session[:user_id].blank?
+ user = User.find(params[:userId])
+ return { error: -1, messages: "用户不存在,请先创建用户" } unless user.user_source
+ session[:user_id] = user.user_source.id
+ end
CnmoocsService.new.source_url(params)
end
From d36972bec91ae67fcc69b8ff39741f5ec68e3333 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 17:29:02 +0800
Subject: [PATCH 084/212] 1
---
app/api/mobile/apis/cnmooc.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/api/mobile/apis/cnmooc.rb b/app/api/mobile/apis/cnmooc.rb
index 720ac26b..2d1f41b3 100644
--- a/app/api/mobile/apis/cnmooc.rb
+++ b/app/api/mobile/apis/cnmooc.rb
@@ -46,7 +46,7 @@ module Mobile
if session[:user_id].blank?
user = User.find(params[:userId])
return { error: -1, messages: "用户不存在,请先创建用户" } unless user.user_source
- session[:user_id] = user.user_source.id
+ session[:user_id] = user.id
end
CnmoocsService.new.source_url(params)
end
From 46e1c04e016e2dac368944d61b1ddd733db6811d Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 17:34:42 +0800
Subject: [PATCH 085/212] 1
---
app/api/mobile/api.rb | 8 ++++++++
app/api/mobile/apis/cnmooc.rb | 5 ++---
app/controllers/account_controller.rb | 1 -
app/controllers/application_controller.rb | 4 ++++
4 files changed, 14 insertions(+), 4 deletions(-)
diff --git a/app/api/mobile/api.rb b/app/api/mobile/api.rb
index a0004c3c..0be7d4b2 100644
--- a/app/api/mobile/api.rb
+++ b/app/api/mobile/api.rb
@@ -108,6 +108,14 @@ module Mobile
uw = UserWechat.find_by_openid(openid)
return uw.user if uw
end
+
+ third_party_user_id = session[:third_party_user_id]
+ Rails.logger.info("#########third_party_user_id: #{third_party_user_id}")
+ if third_party_user_id
+ c_user = UserSource.find_by_id(session[:third_party_user_id])
+ return c_user.user if c_user
+ end
+
token = ApiKey.where(access_token: params[:token]).first
if token && !token.expired?
return User.find(token.user_id)
diff --git a/app/api/mobile/apis/cnmooc.rb b/app/api/mobile/apis/cnmooc.rb
index 2d1f41b3..b813d559 100644
--- a/app/api/mobile/apis/cnmooc.rb
+++ b/app/api/mobile/apis/cnmooc.rb
@@ -43,10 +43,9 @@ module Mobile
requires :accessType, type: Integer, desc: "资源类型"
end
get "source_url" do
- if session[:user_id].blank?
+ if session[:third_party_user_id].blank?
user = User.find(params[:userId])
- return { error: -1, messages: "用户不存在,请先创建用户" } unless user.user_source
- session[:user_id] = user.id
+ session[:third_party_user_id] = user.user_source.id
end
CnmoocsService.new.source_url(params)
end
diff --git a/app/controllers/account_controller.rb b/app/controllers/account_controller.rb
index 6409114f..60096a22 100644
--- a/app/controllers/account_controller.rb
+++ b/app/controllers/account_controller.rb
@@ -293,7 +293,6 @@ class AccountController < ApplicationController
UserActions.create(:action_id => User.current.id, :action_type => "Logout", :user_id => User.current.id)
logout_user
# 记录用户登出行为
- logger.info("#########logout_session: #{session}")
redirect_to home_path
end
# display the logout form
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 435c71fc..d1b7d21a 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -207,6 +207,9 @@ class ApplicationController < ActionController::Base
elsif session[:wechat_openid]
uw = UserWechat.find_by_openid(session[:wechat_openid])
user = uw.user if uw
+ elsif session[:third_party_user_id]
+ c_user = UserSource.find_by_id(session[:third_party_user_id])
+ user = c_user.user if c_user
end
end
if user.nil? && Setting.rest_api_enabled? && accept_api_auth?
@@ -300,6 +303,7 @@ class ApplicationController < ActionController::Base
end
# Token.delete_all(["user_id = ? AND action = ?", User.current.id, 'autologin'])
self.logged_user = nil
+ session[:third_party_user_id] = nil
end
end
From 7e87cd2f822f0f8bfb1b6704f18146c24a764896 Mon Sep 17 00:00:00 2001
From: jingquan huang
Date: Wed, 29 May 2019 20:34:07 +0800
Subject: [PATCH 086/212] vnc
---
app/models/shixun.rb | 2 +-
app/views/shixuns/_form.html.erb | 2 +-
app/views/shixuns/_settings_edit.html.erb | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/app/models/shixun.rb b/app/models/shixun.rb
index 439c0e44..bf06b583 100644
--- a/app/models/shixun.rb
+++ b/app/models/shixun.rb
@@ -57,7 +57,7 @@ class Shixun < ActiveRecord::Base
scope :visible, lambda{where(status: [2,3])}
scope :min, lambda { select([:id, :name, :gpid, :modify_time, :reset_time, :language, :propaedeutics, :status, :identifier,
:test_set_permission, :hide_code, :forbid_copy, :hidden, :webssh, :user_id, :code_hidden,
- :task_pass, :exec_time, :multi_webssh]) }
+ :task_pass, :exec_time, :multi_webssh, :vnc]) }
scope :published, lambda{where(status: 2)}
scope :field_for_recommend, lambda{ select([:id, :name, :identifier, :myshixuns_count]) }
diff --git a/app/views/shixuns/_form.html.erb b/app/views/shixuns/_form.html.erb
index 53d38a63..337ecee2 100644
--- a/app/views/shixuns/_form.html.erb
+++ b/app/views/shixuns/_form.html.erb
@@ -156,7 +156,7 @@
- <% if Redmine::Configuration['gitlab_address'].include?("test") %>
+ <% if User.current.admin? %>
VNC图形化
diff --git a/app/views/shixuns/_settings_edit.html.erb b/app/views/shixuns/_settings_edit.html.erb
index 6ebbf633..6ebd6138 100644
--- a/app/views/shixuns/_settings_edit.html.erb
+++ b/app/views/shixuns/_settings_edit.html.erb
@@ -211,7 +211,7 @@
- <% if Redmine::Configuration['gitlab_address'].include?("test") %>
+ <% if User.current.admin? %>
VNC图形化:
From 2c980c14f5c59bcb9313b0f3406118a6e5073a9c Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 21:54:33 +0800
Subject: [PATCH 087/212] 1
---
app/api/mobile/api.rb | 12 ++++++------
app/api/mobile/apis/cnmooc.rb | 4 ----
app/controllers/application_controller.rb | 6 +++---
app/services/cnmoocs_service.rb | 5 +++--
4 files changed, 12 insertions(+), 15 deletions(-)
diff --git a/app/api/mobile/api.rb b/app/api/mobile/api.rb
index 0be7d4b2..6085d00f 100644
--- a/app/api/mobile/api.rb
+++ b/app/api/mobile/api.rb
@@ -109,12 +109,12 @@ module Mobile
return uw.user if uw
end
- third_party_user_id = session[:third_party_user_id]
- Rails.logger.info("#########third_party_user_id: #{third_party_user_id}")
- if third_party_user_id
- c_user = UserSource.find_by_id(session[:third_party_user_id])
- return c_user.user if c_user
- end
+ # third_party_user_id = session[:third_party_user_id]
+ # Rails.logger.info("#########third_party_user_id: #{third_party_user_id}")
+ # if third_party_user_id
+ # c_user = UserSource.find_by_id(session[:third_party_user_id])
+ # return c_user.user if c_user
+ # end
token = ApiKey.where(access_token: params[:token]).first
if token && !token.expired?
diff --git a/app/api/mobile/apis/cnmooc.rb b/app/api/mobile/apis/cnmooc.rb
index b813d559..96b10101 100644
--- a/app/api/mobile/apis/cnmooc.rb
+++ b/app/api/mobile/apis/cnmooc.rb
@@ -43,10 +43,6 @@ module Mobile
requires :accessType, type: Integer, desc: "资源类型"
end
get "source_url" do
- if session[:third_party_user_id].blank?
- user = User.find(params[:userId])
- session[:third_party_user_id] = user.user_source.id
- end
CnmoocsService.new.source_url(params)
end
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index d1b7d21a..9018cc6c 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -207,9 +207,9 @@ class ApplicationController < ActionController::Base
elsif session[:wechat_openid]
uw = UserWechat.find_by_openid(session[:wechat_openid])
user = uw.user if uw
- elsif session[:third_party_user_id]
- c_user = UserSource.find_by_id(session[:third_party_user_id])
- user = c_user.user if c_user
+ elsif params[:authToken]
+ user = Token.find_by_value(params[:authToken]).user
+ session[:user_id] = user.id
end
end
if user.nil? && Setting.rest_api_enabled? && accept_api_auth?
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index 3161eeac..6de07203 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -115,12 +115,13 @@ class CnmoocsService
end
def source_url(params)
+ user = User.find_by_id(params[:userId])
+ token = Token.get_or_create_permanent_login_token(user)
shixun = Shixun.find_by_id(params[:resouceId])
if shixun.blank?
return { error: -1, messages: '资源不存在' }
end
-
- { error: 0, messages: '成功', accessUrl: "#{Redmine::Configuration['educoder_domain']}/shixuns/#{shixun.identifier}" }
+ { error: 0, messages: '成功', accessUrl: "#{Redmine::Configuration['educoder_domain']}/shixuns/#{shixun.identifier}/challenges?authToken=#{token.value}" }
end
def get_students_data params
From ba6df7b9b1d8667da30586ea46d469a2a49adc56 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 22:00:44 +0800
Subject: [PATCH 088/212] 1
---
app/controllers/application_controller.rb | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 9018cc6c..e6240714 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -193,6 +193,21 @@ class ApplicationController < ActionController::Base
find_current_user
end
+ def set_autologin_cookie(user)
+ token = Token.get_or_create_permanent_login_token(user)
+ cookie_options = {
+ :value => token.value,
+ :expires => 1.month.from_now,
+ :path => (Redmine::Configuration['autologin_cookie_path'] || '/'),
+ :secure => (Redmine::Configuration['autologin_cookie_secure'] ? true : false),
+ :httponly => true
+ }
+ if Redmine::Configuration['cookie_domain'].present?
+ cookie_options = cookie_options.merge(domain: Redmine::Configuration['cookie_domain'])
+ end
+ cookies[autologin_cookie_name] = cookie_options
+ end
+
def find_current_user
user = nil
unless api_request?
@@ -209,6 +224,7 @@ class ApplicationController < ActionController::Base
user = uw.user if uw
elsif params[:authToken]
user = Token.find_by_value(params[:authToken]).user
+ set_autologin_cookie(user)
session[:user_id] = user.id
end
end
From 99511fe5e6e09614ac88d7edbc0d1d0ee9f750a9 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 22:14:43 +0800
Subject: [PATCH 089/212] 1
---
app/controllers/application_controller.rb | 1 -
app/services/cnmoocs_service.rb | 1 +
2 files changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index e6240714..535a75b6 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -319,7 +319,6 @@ class ApplicationController < ActionController::Base
end
# Token.delete_all(["user_id = ? AND action = ?", User.current.id, 'autologin'])
self.logged_user = nil
- session[:third_party_user_id] = nil
end
end
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index 6de07203..fa6e67ea 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -116,6 +116,7 @@ class CnmoocsService
def source_url(params)
user = User.find_by_id(params[:userId])
+ return {error: -1, messages: "用户不存在,请先创建用户"} unless user
token = Token.get_or_create_permanent_login_token(user)
shixun = Shixun.find_by_id(params[:resouceId])
if shixun.blank?
From 151ab55dbb15a6bbdc323990f1a4b0d925322d50 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 22:24:22 +0800
Subject: [PATCH 090/212] 1
---
app/controllers/application_controller.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 535a75b6..dd1f5967 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -225,7 +225,7 @@ class ApplicationController < ActionController::Base
elsif params[:authToken]
user = Token.find_by_value(params[:authToken]).user
set_autologin_cookie(user)
- session[:user_id] = user.id
+ start_user_session(user)
end
end
if user.nil? && Setting.rest_api_enabled? && accept_api_auth?
From 2df0d65ce7f9ff7ad7c06bc7f89a329611b01127 Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Wed, 29 May 2019 23:44:00 +0800
Subject: [PATCH 091/212] 1
---
app/api/mobile/apis/cnmooc.rb | 16 +++++++++++++++-
app/controllers/application_controller.rb | 5 +++--
app/controllers/challenges_controller.rb | 9 +++++++++
app/services/cnmoocs_service.rb | 5 +----
4 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/app/api/mobile/apis/cnmooc.rb b/app/api/mobile/apis/cnmooc.rb
index 96b10101..7745cf8e 100644
--- a/app/api/mobile/apis/cnmooc.rb
+++ b/app/api/mobile/apis/cnmooc.rb
@@ -43,7 +43,21 @@ module Mobile
requires :accessType, type: Integer, desc: "资源类型"
end
get "source_url" do
- CnmoocsService.new.source_url(params)
+ user = User.find_by_id(params[:userId])
+ return {error: -1, messages: "用户不存在,请先创建用户"} unless user
+ token = Token.get_or_create_permanent_login_token(user)
+ cookie_options = {
+ :value => token.value,
+ :expires => 1.month.from_now,
+ :path => (Redmine::Configuration['autologin_cookie_path'] || '/'),
+ :secure => (Redmine::Configuration['autologin_cookie_secure'] ? true : false),
+ :httponly => true
+ }
+ if Redmine::Configuration['cookie_domain'].present?
+ cookie_options = cookie_options.merge(domain: Redmine::Configuration['cookie_domain'])
+ end
+ cookies[Redmine::Configuration['autologin_cookie_name'].presence || 'autologin'] = cookie_options
+ CnmoocsService.new.source_url(params, token)
end
desc "远程登录"
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index dd1f5967..4185e367 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -224,8 +224,9 @@ class ApplicationController < ActionController::Base
user = uw.user if uw
elsif params[:authToken]
user = Token.find_by_value(params[:authToken]).user
- set_autologin_cookie(user)
- start_user_session(user)
+ #set_autologin_cookie(user)
+ #start_user_session(user)
+ session[:user_id] = user.id
end
end
if user.nil? && Setting.rest_api_enabled? && accept_api_auth?
diff --git a/app/controllers/challenges_controller.rb b/app/controllers/challenges_controller.rb
index bf01ffb0..3322f1f2 100644
--- a/app/controllers/challenges_controller.rb
+++ b/app/controllers/challenges_controller.rb
@@ -16,6 +16,7 @@ class ChallengesController < ApplicationController
#before_filter :find_shixun_language, :only => [:show, :new, :edit]
before_filter :base_index, :only => [:index, :index_down, :index_up, :destroy]
before_filter :view_allow, :only => [:show]
+ # before_filter :check_cnmooc, :only => [:index]
include ApplicationHelper
@@ -487,4 +488,12 @@ class ChallengesController < ApplicationController
response.headers['content--type'] = 'text/javascript'
request.format = 'js'
end
+
+ # def check_cnmooc
+ # if params[:authToken]
+ # user = User.find_by_id(session[:user_id])
+ # set_autologin_cookie(user)
+ # end
+ # end
+
end
diff --git a/app/services/cnmoocs_service.rb b/app/services/cnmoocs_service.rb
index fa6e67ea..41705eb6 100644
--- a/app/services/cnmoocs_service.rb
+++ b/app/services/cnmoocs_service.rb
@@ -114,10 +114,7 @@ class CnmoocsService
end
- def source_url(params)
- user = User.find_by_id(params[:userId])
- return {error: -1, messages: "用户不存在,请先创建用户"} unless user
- token = Token.get_or_create_permanent_login_token(user)
+ def source_url(params, token)
shixun = Shixun.find_by_id(params[:resouceId])
if shixun.blank?
return { error: -1, messages: '资源不存在' }
From 9c01b6ff77b0ab90ea54b62a4060db548226509e Mon Sep 17 00:00:00 2001
From: jingquan huang
Date: Thu, 30 May 2019 08:46:30 +0800
Subject: [PATCH 092/212] =?UTF-8?q?vnc=E5=9C=A8gameshow=E4=B8=AD=E8=BF=94?=
=?UTF-8?q?=E5=9B=9E?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/services/games_service.rb | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/services/games_service.rb b/app/services/games_service.rb
index 9e1ea356..a53ee086 100644
--- a/app/services/games_service.rb
+++ b/app/services/games_service.rb
@@ -75,7 +75,8 @@ class GamesService
:challenge => game_challenge.try(:attributes), :game => game.try(:attributes), :shixun => shixun.try(:attributes),
:record => record, :grade => grade, :prev_game => prev_game, :next_game => next_game, :username => username,
:image_url => image_url, :user_url => user_url, :praise_count => praise_count, :user_praise => user_praise, :time_limit => time_limit,
- :tomcat_url => Redmine::Configuration['tomcat_php'], :is_teacher => is_teacher, :power => power, :myshixun_manager => myshixun_manager}
+ :tomcat_url => Redmine::Configuration['tomcat_php'], :is_teacher => is_teacher, :power => power, :myshixun_manager => myshixun_manager,
+ :vnc => shixun.vnc}
# 区分选择题和编程题,st:0编程题;
if st == 0
From 048c8571bcdae20221a5fac7c7e003f35c4166ca Mon Sep 17 00:00:00 2001
From: jingquan huang
Date: Thu, 30 May 2019 08:57:33 +0800
Subject: [PATCH 093/212] vnc..
---
app/controllers/myshixuns_controller.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb
index f6854c7a..d95cdc96 100644
--- a/app/controllers/myshixuns_controller.rb
+++ b/app/controllers/myshixuns_controller.rb
@@ -1,7 +1,7 @@
# encoding: utf-8
class MyshixunsController < ApplicationController
layout 'base_myshixun'
- skip_before_filter :verify_authenticity_token, :only => [:training_task_status, :close_webssh, :code_runinng_message]
+ skip_before_filter :verify_authenticity_token, :only => [:training_task_status, :close_webssh, :code_runinng_message, :vnc]
before_filter :require_login, :except => [:training_task_status, :close_webssh, :code_runinng_message]
before_filter :check_authentication, :except => [:training_task_status, :close_webssh, :mul_test_home, :mul_test_user,
:mul_test_myshixun, :mul_test_shixun, :mul_test_start, :code_runinng_message]
From 8a45a61ef89cbc78e8b59ff6d1b31e3836db0d80 Mon Sep 17 00:00:00 2001
From: jingquan huang
Date: Thu, 30 May 2019 08:59:35 +0800
Subject: [PATCH 094/212] =?UTF-8?q?vnc=E5=85=8D=E7=99=BB=E9=99=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/myshixuns_controller.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb
index d95cdc96..add6511c 100644
--- a/app/controllers/myshixuns_controller.rb
+++ b/app/controllers/myshixuns_controller.rb
@@ -2,7 +2,7 @@
class MyshixunsController < ApplicationController
layout 'base_myshixun'
skip_before_filter :verify_authenticity_token, :only => [:training_task_status, :close_webssh, :code_runinng_message, :vnc]
- before_filter :require_login, :except => [:training_task_status, :close_webssh, :code_runinng_message]
+ before_filter :require_login, :except => [:training_task_status, :close_webssh, :code_runinng_message, :vnc]
before_filter :check_authentication, :except => [:training_task_status, :close_webssh, :mul_test_home, :mul_test_user,
:mul_test_myshixun, :mul_test_shixun, :mul_test_start, :code_runinng_message]
before_filter :find_myshixun, :only => [:show, :myshixun_reset, :open_webssh, :sync_reset_time, :destroy, :search_file_list, :vnc]
From eddd5e6144a3206648d6dbbdd288ba8c6a3d39ed Mon Sep 17 00:00:00 2001
From: daiao <358551898@qq.com>
Date: Thu, 30 May 2019 09:57:21 +0800
Subject: [PATCH 095/212] 1
---
app/controllers/application_controller.rb | 2 ++
1 file changed, 2 insertions(+)
diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb
index 4185e367..e44005a4 100644
--- a/app/controllers/application_controller.rb
+++ b/app/controllers/application_controller.rb
@@ -352,6 +352,8 @@ class ApplicationController < ActionController::Base
end
def require_login
+ logger.info("#########login?: #{User.current.logged?}")
+ logger.info("#########get?: #{request.get?}")
if !User.current.logged?
# Extract only the basic url parameters on non-GET requests
if request.get?
From 972ad7551868f0f31522b51156407b55b3e90bdf Mon Sep 17 00:00:00 2001
From: jingquan huang
Date: Thu, 30 May 2019 09:58:21 +0800
Subject: [PATCH 096/212] =?UTF-8?q?vnc=E6=B7=BB=E5=8A=A0containers?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/myshixuns_controller.rb | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb
index add6511c..1029c37d 100644
--- a/app/controllers/myshixuns_controller.rb
+++ b/app/controllers/myshixuns_controller.rb
@@ -357,7 +357,8 @@ class MyshixunsController < ApplicationController
host = Redmine::Configuration['tomcat_php']
begin
uri = "#{shixun_tomcat}/bridge/vnc/getvnc"
- params = {tpiID:@myshixun.id}
+ shixun = myshixun.shixun
+ params = {tpiID: @myshixun.id, :containers => "#{Base64.urlsafe_encode64(container_limit(shixun.mirror_repositories))}"}
res = uri_exec uri, params
if res && res['code'].to_i != 0
raise("实训云平台繁忙(繁忙等级:99)")
From 0ddf6a7efda6b9edf40abc7e0f118cfa3e466ee6 Mon Sep 17 00:00:00 2001
From: jingquan huang
Date: Thu, 30 May 2019 10:01:53 +0800
Subject: [PATCH 097/212] =?UTF-8?q?vnc=E6=9D=83=E9=99=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/myshixuns_controller.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb
index 1029c37d..e9f412ab 100644
--- a/app/controllers/myshixuns_controller.rb
+++ b/app/controllers/myshixuns_controller.rb
@@ -4,7 +4,7 @@ class MyshixunsController < ApplicationController
skip_before_filter :verify_authenticity_token, :only => [:training_task_status, :close_webssh, :code_runinng_message, :vnc]
before_filter :require_login, :except => [:training_task_status, :close_webssh, :code_runinng_message, :vnc]
before_filter :check_authentication, :except => [:training_task_status, :close_webssh, :mul_test_home, :mul_test_user,
- :mul_test_myshixun, :mul_test_shixun, :mul_test_start, :code_runinng_message]
+ :mul_test_myshixun, :mul_test_shixun, :mul_test_start, :code_runinng_message, :vnc]
before_filter :find_myshixun, :only => [:show, :myshixun_reset, :open_webssh, :sync_reset_time, :destroy, :search_file_list, :vnc]
DCODES = %W(2 3 4 5 6 7 8 9 a b c f e f g h i j k l m n o p q r s t u v w x y z)
From 03843caf39c84e4c54befcfc5a242b1d9df0f14d Mon Sep 17 00:00:00 2001
From: jingquan huang
Date: Thu, 30 May 2019 10:17:55 +0800
Subject: [PATCH 098/212] 500
---
app/controllers/myshixuns_controller.rb | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/controllers/myshixuns_controller.rb b/app/controllers/myshixuns_controller.rb
index e9f412ab..802bb8b9 100644
--- a/app/controllers/myshixuns_controller.rb
+++ b/app/controllers/myshixuns_controller.rb
@@ -357,7 +357,7 @@ class MyshixunsController < ApplicationController
host = Redmine::Configuration['tomcat_php']
begin
uri = "#{shixun_tomcat}/bridge/vnc/getvnc"
- shixun = myshixun.shixun
+ shixun = @myshixun.shixun
params = {tpiID: @myshixun.id, :containers => "#{Base64.urlsafe_encode64(container_limit(shixun.mirror_repositories))}"}
res = uri_exec uri, params
if res && res['code'].to_i != 0
From 89acf0b0cd991ace8fb8598a6c7ccce6746d5c1e Mon Sep 17 00:00:00 2001
From: p31729568
Date: Thu, 30 May 2019 10:51:39 +0800
Subject: [PATCH 099/212] modify school manager statistic text
---
.../schools/_contrast_search_form.html.erb | 11 ++++-------
.../managements/schools/_data_contrast_list.html.erb | 4 ++--
.../managements/schools/_data_grow_list.html.erb | 4 ++--
config/locales/school_daily_reports/zh.yml | 2 +-
4 files changed, 9 insertions(+), 12 deletions(-)
diff --git a/app/views/managements/schools/_contrast_search_form.html.erb b/app/views/managements/schools/_contrast_search_form.html.erb
index 4d24a810..9597a9c7 100644
--- a/app/views/managements/schools/_contrast_search_form.html.erb
+++ b/app/views/managements/schools/_contrast_search_form.html.erb
@@ -26,13 +26,10 @@
<%= hidden_field_tag :data_type, params[:data_type] || 'grow' %>
- <% if params[:data_type] == 'contrast' %>
-
时间对比
-
新增数据
- <% else %>
-
时间对比
-
新增数据
- <% end %>
+
时段对比
+
数据变化
<%= text_field_tag :keyword, params[:keyword], placeholder: '请输入单位名称或者ID关键字进行搜索',
diff --git a/app/views/managements/schools/_data_contrast_list.html.erb b/app/views/managements/schools/_data_contrast_list.html.erb
index d77d4b70..83f7a11b 100644
--- a/app/views/managements/schools/_data_contrast_list.html.erb
+++ b/app/views/managements/schools/_data_contrast_list.html.erb
@@ -21,8 +21,8 @@
序号 |
ID |
单位名称 |
- 时段一 <%= "(#{params[:begin_date]}至#{params[:end_date]})" %> |
- 时段二 <%= "(#{params[:other_begin_date]}至#{params[:other_end_date]})" %> |
+ 时段一 <%= "(#{params[:begin_date]} 05:00至#{params[:end_date]} 05:00)" %> |
+ 时段二 <%= "(#{params[:other_begin_date]} 05:00至#{params[:other_end_date]} 05:00)" %> |
<%= sort_tag('变化情况', name: 'percentage', path: school_data_contrast_managements_path) %>
( 新 增 数 | 新增百分比)
diff --git a/app/views/managements/schools/_data_grow_list.html.erb b/app/views/managements/schools/_data_grow_list.html.erb
index 27a1ccf3..8f502979 100644
--- a/app/views/managements/schools/_data_grow_list.html.erb
+++ b/app/views/managements/schools/_data_grow_list.html.erb
@@ -9,7 +9,7 @@
新增教师<%= @grow_summary.teacher_increase_count || 0 %>人,
新增学生<%= @grow_summary.student_increase_count || 0 %>人,
新增课堂<%= @grow_summary.course_increase_count || 0 %>个,
- 新增实训<%= @grow_summary.shixun_increase_count || 0 %>个,
+ 新增实训作业<%= @grow_summary.shixun_increase_count || 0 %>个,
活跃用户<%= @grow_summary.active_user_count || 0 %>个
@@ -22,7 +22,7 @@
<%= sort_tag('新增教师', name: 'teacher_increase_count', path: school_data_grow_managements_path) %> |
<%= sort_tag('新增学生', name: 'student_increase_count', path: school_data_grow_managements_path) %> |
<%= sort_tag('新增课堂', name: 'course_increase_count', path: school_data_grow_managements_path) %> |
- <%= sort_tag('新增实训', name: 'shixun_increase_count', path: school_data_grow_managements_path) %> |
+ <%= sort_tag('新增实训作业', name: 'shixun_increase_count', path: school_data_grow_managements_path) %> |
<%= sort_tag('活跃用户', name: 'active_user_count', path: school_data_grow_managements_path) %> |
diff --git a/config/locales/school_daily_reports/zh.yml b/config/locales/school_daily_reports/zh.yml
index 57caf343..2db8a429 100644
--- a/config/locales/school_daily_reports/zh.yml
+++ b/config/locales/school_daily_reports/zh.yml
@@ -3,5 +3,5 @@ zh:
teacher_increase_count: 新增教师
student_increase_count: 新增学生
course_increase_count: 新增课堂
- shixun_increase_count: 新增实训
+ shixun_increase_count: 新增实训作业
active_user_count: 活跃用户
\ No newline at end of file
From 9cd71b8159b150902df0ccedad663487f1cf18e8 Mon Sep 17 00:00:00 2001
From: hjm <63528605@qq.com>
Date: Thu, 30 May 2019 11:02:05 +0800
Subject: [PATCH 100/212] iconfont
---
public/assets/iconfont/demo_index.html | 278 ++++++++++++++++++++++---
public/assets/iconfont/iconfont.css | 28 ++-
public/assets/iconfont/iconfont.eot | Bin 43808 -> 45896 bytes
public/assets/iconfont/iconfont.js | 2 +-
public/assets/iconfont/iconfont.svg | 36 +++-
public/assets/iconfont/iconfont.ttf | Bin 43640 -> 45728 bytes
public/assets/iconfont/iconfont.woff | Bin 28644 -> 29980 bytes
public/assets/iconfont/iconfont.woff2 | Bin 24360 -> 25504 bytes
8 files changed, 310 insertions(+), 34 deletions(-)
diff --git a/public/assets/iconfont/demo_index.html b/public/assets/iconfont/demo_index.html
index ae1000a0..1ef8180e 100644
--- a/public/assets/iconfont/demo_index.html
+++ b/public/assets/iconfont/demo_index.html
@@ -48,12 +48,6 @@

-
-
- 章节
- 
-
-
css3
@@ -72,6 +66,12 @@

+
+
+ 章节
+ 
+
+
关闭
@@ -90,6 +90,12 @@

+
+
+ pdf
+ 
+
+
时间
@@ -168,6 +174,12 @@

+
+
+ 复制
+ 
+
+
点赞1
@@ -216,12 +228,24 @@

+
+
+ 提示
+ 
+
+
net

+
+
+ edit
+ 
+
+
锁
@@ -234,6 +258,12 @@

+
+
+ 下载
+ 
+
+
撤销
@@ -246,6 +276,12 @@

+
+
+ 标签
+ 
+
+
大数据存储
@@ -258,6 +294,12 @@

+
+
+ 添加成员
+ 
+
+
三角形
@@ -306,6 +348,12 @@

+
+
+ 三点
+ 
+
+
base
@@ -396,6 +444,12 @@

+
+
+ 上传图片
+ 
+
+
登录Ip监控
@@ -996,6 +1050,12 @@

+
+
+ 添加导航
+ 
+
+
Unicode 引用
@@ -1073,15 +1133,6 @@
-
-
-
- 章节
-
- .icon-zhangjie
-
-
-
@@ -1109,6 +1160,15 @@
+
+
+
+ 章节
+
+ .icon-zhangjie1
+
+
+
@@ -1136,6 +1196,15 @@
+
+
+
+ pdf
+
+ .icon-pdf
+
+
+
@@ -1253,6 +1322,15 @@
+
+
+
+ 复制
+
+ .icon-fuzhi
+
+
+
@@ -1325,6 +1403,15 @@
+
+
+
+ 提示
+
+ .icon-tishi1
+
+
+
@@ -1334,6 +1421,15 @@
+
+
+
+ edit
+
+ .icon-edit
+
+
+
@@ -1352,6 +1448,15 @@
+
+
+
+ 下载
+
+ .icon-xiazai1
+
+
+
@@ -1370,6 +1475,15 @@
+
+
+
+ 标签
+
+ .icon-biaoqian
+
+
+
@@ -1388,6 +1502,15 @@
+
+
+
+ 添加成员
+
+ .icon-tianjiachengyuan
+
+
+
@@ -1460,6 +1583,15 @@
+
+
+
+ 三点
+
+ .icon-sandian
+
+
+
@@ -1595,6 +1727,15 @@
+
+
+
+ 上传图片
+
+ .icon-shangchuantupian1
+
+
+
@@ -2495,6 +2636,15 @@
+
+
+
+ 添加导航
+
+ .icon-tianjiadaohang
+
+
+
font-class 引用
@@ -2513,7 +2663,7 @@
<link rel="stylesheet" href="./iconfont.css">
第二步:挑选相应图标并获取类名,应用于页面:
- <span class="iconfont icon--xxx"></span>
+<span class="iconfont icon-xxx"></span>
"
@@ -2548,14 +2698,6 @@
#icon-roundaddfill
-
-
- 章节
- #icon-zhangjie
-
-
+
+
+ 章节
+ #icon-zhangjie1
+
+
+
+
+ pdf
+ #icon-pdf
+
+
+
+
+ 复制
+ #icon-fuzhi
+
+
+
+
+ 提示
+ #icon-tishi1
+
+
+
+
+ edit
+ #icon-edit
+
+
+
+
+ 下载
+ #icon-xiazai1
+
+
+
+
+ 标签
+ #icon-biaoqian
+
+
+
+
+ 添加成员
+ #icon-tianjiachengyuan
+
+
+
+
+ 三点
+ #icon-sandian
+
+
+
+
+ 上传图片
+ #icon-shangchuantupian1
+
+
+
+
+ 添加导航
+ #icon-tianjiadaohang
+
+
Symbol 引用
diff --git a/public/assets/iconfont/iconfont.css b/public/assets/iconfont/iconfont.css
index 6d4400d5..f4db5e84 100644
--- a/public/assets/iconfont/iconfont.css
+++ b/public/assets/iconfont/iconfont.css
@@ -1,10 +1,10 @@
@font-face {font-family: "iconfont";
- src: url('iconfont.eot?t=1555121827981'); /* IE9 */
- src: url('iconfont.eot?t=1555121827981#iefix') format('embedded-opentype'), /* IE6-IE8 */
- url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'),
- url('iconfont.woff?t=1555121827981') format('woff'),
- url('iconfont.ttf?t=1555121827981') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
- url('iconfont.svg?t=1555121827981#iconfont') format('svg'); /* iOS 4.1- */
+ src: url('iconfont.eot?t=1559184647273'); /* IE9 */
+ src: url('iconfont.eot?t=1559184647273#iefix') format('embedded-opentype'), /* IE6-IE8 */
+ url('data:application/x-font-woff2;charset=utf-8;base64,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') format('woff2'),
+ url('iconfont.woff?t=1559184647273') format('woff'),
+ url('iconfont.ttf?t=1559184647273') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
+ url('iconfont.svg?t=1559184647273#iconfont') format('svg'); /* iOS 4.1- */
}
.iconfont {
@@ -147,10 +147,18 @@
content: "\e727";
}
+.icon-tishi1:before {
+ content: "\e690";
+}
+
.icon-net:before {
content: "\e607";
}
+.icon-edit:before {
+ content: "\e691";
+}
+
.icon-suo:before {
content: "\e6c9";
}
@@ -159,6 +167,10 @@
content: "\e67f";
}
+.icon-xiazai1:before {
+ content: "\e6ac";
+}
+
.icon-chexiao:before {
content: "\e657";
}
@@ -179,6 +191,10 @@
content: "\e686";
}
+.icon-tianjiachengyuan:before {
+ content: "\e69a";
+}
+
.icon-triangle:before {
content: "\e600";
}
diff --git a/public/assets/iconfont/iconfont.eot b/public/assets/iconfont/iconfont.eot
index acf4d5619f7e0b1045320820c3f9f053b542dc79..861e815a94875d15b4a495809bd60b0d8ca71bc0 100644
GIT binary patch
delta 5524
zcmaKw3vg6bp2oj(Z+AMOJDu)MKazA_oleprBs85zcX)*+@-i@r$gqNlM3R`WB)|}!
zq8(-!6vjcZQISDJl*cGjrG~X!hn;1dkz#z5yGqTt>(-VvHG6soDNCzns~jrn?05RO
ztF^ncx%KOF?z!jQ+xPsx|M$P0Q@=H?N+WN{7;x&fBYAPl{xk2bK9W3`dhpJF1jJqd
zt2PYvY`OQ EKnUwP-s?1RAh
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
WGVB#oUi;ap7s7eJ%5}NatN#L7|6NM}
diff --git a/public/assets/iconfont/iconfont.js b/public/assets/iconfont/iconfont.js
index c65b3873..4b2ab675 100644
--- a/public/assets/iconfont/iconfont.js
+++ b/public/assets/iconfont/iconfont.js
@@ -1 +1 @@
-!function(z){var c,o='',l=(c=document.getElementsByTagName("script"))[c.length-1].getAttribute("data-injectcss");if(l&&!z.__iconfont__svg__cssinject__){z.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}!function(c){if(document.addEventListener)if(~["complete","loaded","interactive"].indexOf(document.readyState))setTimeout(c,0);else{var l=function(){document.removeEventListener("DOMContentLoaded",l,!1),c()};document.addEventListener("DOMContentLoaded",l,!1)}else document.attachEvent&&(h=c,i=z.document,a=!1,t=function(){a||(a=!0,h())},(o=function(){try{i.documentElement.doScroll("left")}catch(c){return void setTimeout(o,50)}t()})(),i.onreadystatechange=function(){"complete"==i.readyState&&(i.onreadystatechange=null,t())});var h,i,a,t,o}(function(){var c,l,h,i,a,t;(c=document.createElement("div")).innerHTML=o,o=null,(l=c.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",h=l,(i=document.body).firstChild?(a=h,(t=i.firstChild).parentNode.insertBefore(a,t)):i.appendChild(h))})}(window);
\ No newline at end of file
+!function(z){var c,h='',l=(c=document.getElementsByTagName("script"))[c.length-1].getAttribute("data-injectcss");if(l&&!z.__iconfont__svg__cssinject__){z.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}!function(c){if(document.addEventListener)if(~["complete","loaded","interactive"].indexOf(document.readyState))setTimeout(c,0);else{var l=function(){document.removeEventListener("DOMContentLoaded",l,!1),c()};document.addEventListener("DOMContentLoaded",l,!1)}else document.attachEvent&&(i=c,a=z.document,t=!1,(o=function(){try{a.documentElement.doScroll("left")}catch(c){return void setTimeout(o,50)}h()})(),a.onreadystatechange=function(){"complete"==a.readyState&&(a.onreadystatechange=null,h())});function h(){t||(t=!0,i())}var i,a,t,o}(function(){var c,l;(c=document.createElement("div")).innerHTML=h,h=null,(l=c.getElementsByTagName("svg")[0])&&(l.setAttribute("aria-hidden","true"),l.style.position="absolute",l.style.width=0,l.style.height=0,l.style.overflow="hidden",function(c,l){l.firstChild?function(c,l){l.parentNode.insertBefore(c,l)}(c,l.firstChild):l.appendChild(c)}(l,document.body))})}(window);
\ No newline at end of file
diff --git a/public/assets/iconfont/iconfont.svg b/public/assets/iconfont/iconfont.svg
index a56bc3bb..c4477efd 100644
--- a/public/assets/iconfont/iconfont.svg
+++ b/public/assets/iconfont/iconfont.svg
@@ -29,9 +29,6 @@ Created by iconfont
-
-
-
@@ -41,6 +38,9 @@ Created by iconfont
+
+
+
@@ -50,6 +50,9 @@ Created by iconfont
+
+
+
@@ -89,6 +92,9 @@ Created by iconfont
+
+
+
@@ -113,27 +119,42 @@ Created by iconfont
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -158,6 +179,9 @@ Created by iconfont
+
+
+
@@ -203,6 +227,9 @@ Created by iconfont
+
+
+
@@ -503,6 +530,9 @@ Created by iconfont
+
+
+
diff --git a/public/assets/iconfont/iconfont.ttf b/public/assets/iconfont/iconfont.ttf
index 08cd53afc6e2a37f56c3620cc3d801e5a75dc037..9e09e9f96b5020ca95f8408cf1f2ca78ebdfc2f8 100644
GIT binary patch
delta 5526
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
R;mapqjttE%bvo6!{|2FpY83zg
diff --git a/public/assets/iconfont/iconfont.woff b/public/assets/iconfont/iconfont.woff
index 109a76f551bc0544152c0a925daeded210c4fa4d..c90364930fc69c45f7ea1561039b7126f2c83767 100644
GIT binary patch
delta 29730
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
B{%-&P
delta 28360
zcmV)7K*ztF>H*~60Tg#nMn(Vu00000Z{z?A00000s(6tUJ%7qm(PM34Z~y=SfB*ml
zY5)KW0Gu4&O=oO*W&i*M>;M2_761T`?8VB7;%H@IWB>qY1ONa4F#rGnHWk;`l4xjU
zVE_PVH~;_uAOHXWBnh?$b!csLcmM!sSO5S3Jpcd#h>VZ_2X;s{kIRz?0c?Na3Q(94BnJTVIt?LsoZZ&hZdPRqobBP!W*IjLaaE
zNoEv88Oo$G4+5f$rGPRDDx(ZCN
|