From 7d889ad2a7c55a51de699524583cdb7a62b18679 Mon Sep 17 00:00:00 2001
From: guagne <8863824@gmail.com>
Date: Fri, 20 Dec 2019 20:11:08 +0800
Subject: [PATCH 1/4] =?UTF-8?q?jupyter=E5=8A=A0=E5=85=A5=E5=AF=BC=E5=85=A5?=
=?UTF-8?q?=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/controllers/jupyters_controller.rb | 26 ++++++++++++++++++++++++++
config/routes.rb | 2 ++
2 files changed, 28 insertions(+)
diff --git a/app/controllers/jupyters_controller.rb b/app/controllers/jupyters_controller.rb
index 4c03e0dd3..988cef01a 100644
--- a/app/controllers/jupyters_controller.rb
+++ b/app/controllers/jupyters_controller.rb
@@ -1,9 +1,35 @@
+require 'base64'
class JupytersController < ApplicationController
include JupyterService
before_action :shixun, only: [:open, :open1, :test, :save]
+
+ def import_with_tpm
+ shixun = Shixun.find_by(identifier: params[:identifier])
+
+ upload_file = params["file"] || params["#{params[:file_param_name]}"] # 这里的file_param_name是为了方便其他插件名称
+ uid_logger("#########################file_params####{params["#{params[:file]}"]}")
+ raise "未上传文件" unless upload_file
+
+ content = Base64.encode64(upload_file.tempfile.read)
+
+ # upload to server
+ shixun_tomcat = edu_setting('cloud_bridge')
+ uri = "#{shixun_tomcat}/bridge/jupyter/update"
+ tpiID = "tpm#{shixun.id}"
+ params = {tpiID: tpiID, content: content}
+
+ logger.info "test_juypter: uri->#{uri}, params->#{params}"
+ res = uri_post uri, params
+ if res && res['code'].to_i != 0
+ raise("实训云平台繁忙(繁忙等级:100)")
+ end
+
+ render json: {status: 0}
+ end
+
def save_with_tpi
myshixun = Myshixun.find_by(identifier: params[:identifier])
jupyter_save_with_game(myshixun, params[:jupyter_port])
diff --git a/config/routes.rb b/config/routes.rb
index 151cc0b32..73756ece3 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -35,6 +35,8 @@ Rails.application.routes.draw do
get :reset_with_tpm
get :active_with_tpm
get :active_with_tpi
+
+ post :import_with_tpm
end
end
From bc6aabffb4e669c7e69866ea569901a6e551caaa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com>
Date: Fri, 20 Dec 2019 20:14:12 +0800
Subject: [PATCH 2/4] =?UTF-8?q?=E8=B0=83=E6=95=B4jupyte=20=E6=A0=B7?=
=?UTF-8?q?=E5=BC=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
public/react/src/modules/tpm/jupyter/index.js | 44 ++++++++++---------
.../react/src/modules/tpm/jupyter/index.scss | 30 ++++++++++---
.../modules/tpm/jupyter/leftPane/index.scss | 4 +-
.../Challenges/Challengesjupyter.js | 13 ++----
4 files changed, 53 insertions(+), 38 deletions(-)
diff --git a/public/react/src/modules/tpm/jupyter/index.js b/public/react/src/modules/tpm/jupyter/index.js
index 0e209523f..4fa712214 100644
--- a/public/react/src/modules/tpm/jupyter/index.js
+++ b/public/react/src/modules/tpm/jupyter/index.js
@@ -1,7 +1,7 @@
/*
* @Description: jupyter tpi
* @Author: tangjiang
- * @Github:
+ * @Github:
* @Date: 2019-12-11 08:35:23
* @LastEditors: tangjiang
* @LastEditTime: 2019-12-13 15:25:50
@@ -69,7 +69,7 @@ function JupyterTPI (props) {
);
- const {identifier} = params;
+ const {identifier} = params;
const [userInfo, setUserInfo] = useState({});
const [jupyterInfo, setJupyterInfo] = useState({});
const [updateTip, setUpdateTip] = useState(true);
@@ -94,8 +94,8 @@ function JupyterTPI (props) {
useEffect(() => {
- /* 先调用 jupyter的 TPI 接口,
- * 获取 用户信息,
+ /* 先调用 jupyter的 TPI 接口,
+ * 获取 用户信息,
* 实训的 identifier, 状态, 名称, 是否被修改等信息
*/
addEventListeners()
@@ -109,7 +109,7 @@ function JupyterTPI (props) {
if (user) {
setUserInfo(user);
}
-
+
if (myshixun_identifier) {
setMyIdentifier(myshixun_identifier);
}
@@ -199,7 +199,7 @@ function JupyterTPI (props) {
saveJupyterTpi();
}
- // 分页信息改变时
+ // 分页信息改变时
const handlePageChange = (current) => {
// 改变当前页
changeCurrentPage(current);
@@ -232,13 +232,15 @@ function JupyterTPI (props) {
// title={item.file_path}
mouseLeaveDelay={0.3}
>
-
- {item.title}
- {
- jsCopy("file_path"+i)
- }}>复制地址
-
+
+
);
@@ -265,9 +267,9 @@ function JupyterTPI (props) {
{/* sync | poweroff */}
-
@@ -279,12 +281,12 @@ function JupyterTPI (props) {
onClick={handleEnvironmentTpi}
>重置环境
-
+ >退出实训
@@ -347,7 +349,7 @@ function JupyterTPI (props) {
const mapStateToProps = (state) => {
const {
jupyter_info,
- jupyter_tpi_url,
+ jupyter_tpi_url,
jupyter_data_set,
jupyter_tpi_url_state,
jupyter_data_set_count,
diff --git a/public/react/src/modules/tpm/jupyter/index.scss b/public/react/src/modules/tpm/jupyter/index.scss
index 76c8bedd1..a9cb3d96c 100644
--- a/public/react/src/modules/tpm/jupyter/index.scss
+++ b/public/react/src/modules/tpm/jupyter/index.scss
@@ -14,7 +14,7 @@
-webkit-transition: all 2s ease;
transition: all 2s ease;
}
-
+
.Resizer.horizontal {
height: 11px;
margin: -5px 0;
@@ -23,12 +23,12 @@
cursor: row-resize;
width: 100%;
}
-
+
.Resizer.horizontal:hover {
border-top: 5px solid rgba(0, 0, 0, 0.5);
border-bottom: 5px solid rgba(0, 0, 0, 0.5);
}
-
+
.Resizer.vertical {
width: 11px;
margin: 0 -5px;
@@ -36,7 +36,7 @@
border-right: 5px solid rgba(255, 255, 255, 0);
cursor: col-resize;
}
-
+
.Resizer.vertical:hover {
border-left: 5px solid rgba(0, 0, 0, 0.5);
border-right: 5px solid rgba(0, 0, 0, 0.5);
@@ -89,7 +89,7 @@
}
}
}
-
+
.jupyter_ctx{
position: relative;
@@ -122,7 +122,6 @@
.ant-drawer-wrapper-body{
padding-top: 60px;
background: #070F1A;
- overflow: hidden !important;
}
.ant-pagination{
@@ -159,3 +158,22 @@
}
}
+.maxnamewidth150 {
+ max-width: 150px;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ cursor: default;
+ width: 150px;
+}
+.sortinxdirection{
+ display: flex;
+ flex-direction:row;
+}
+
+.lineheighttaj{
+line-height: 50px !important;
+}
+.colorlineheighttaj{
+ color: #ffffff;
+}
diff --git a/public/react/src/modules/tpm/jupyter/leftPane/index.scss b/public/react/src/modules/tpm/jupyter/leftPane/index.scss
index 495e21f20..fdffdf5e7 100644
--- a/public/react/src/modules/tpm/jupyter/leftPane/index.scss
+++ b/public/react/src/modules/tpm/jupyter/leftPane/index.scss
@@ -33,7 +33,7 @@
.jupyter_item{
line-height:45px;
//border-bottom: 1px solid rgba(238,238,238, 1);
- padding: 0 30px 0 60px;
+ padding: 0 30px 0 45px;
overflow: hidden;
text-overflow:ellipsis;
white-space: nowrap;
@@ -70,4 +70,4 @@
box-sizing: border-box;
border-top: 1px solid rgba(238,238,238,1);
}
-}
\ No newline at end of file
+}
diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js
index a08825936..0c00f2bb2 100644
--- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js
+++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js
@@ -243,14 +243,9 @@ class Challengesjupyter extends Component {
enlarge:bool
})
}
- daoruzhon=()=>{
- var _iframe = document.getElementById("frame");
- if(_iframe == null || _iframe == undefined || _iframe == ""){
- console.log("framenull");
- return;
- }
- console.log("framego");
- _iframe.contentWindow.postMessage("Parentwindow", "*");
+ Importingfiles=()=>{
+ // 导入文件
+
}
render() {
@@ -414,7 +409,7 @@ class Challengesjupyter extends Component {
}} onClick={()=>this.onclki(true)}>
}
this.daoruzhon()}>导入
+ className="challenbaocuntest" onClick={()=>this.Importingfiles()}>导入
From f1ae306ec1ab7ba9b83504959c9a51c5e83e8c6c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com>
Date: Fri, 20 Dec 2019 20:41:34 +0800
Subject: [PATCH 3/4] =?UTF-8?q?=E8=B0=83=E6=95=B4jupyter=20=E4=B8=8A?=
=?UTF-8?q?=E4=BC=A0=E5=8A=9F=E8=83=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
public/react/src/common/UrlTool.js | 4 +
public/react/src/common/educoder.js | 2 +-
.../Challenges/Challengesjupyter.js | 85 +++++++++++++++++--
3 files changed, 85 insertions(+), 6 deletions(-)
diff --git a/public/react/src/common/UrlTool.js b/public/react/src/common/UrlTool.js
index bc463e662..d7a49ea63 100644
--- a/public/react/src/common/UrlTool.js
+++ b/public/react/src/common/UrlTool.js
@@ -75,6 +75,10 @@ export function getUploadActionUrltwo(id) {
return `${getUrlmys()}/api/shixuns/${id}/upload_data_sets.json${isDev ? `?debug=${window._debugType || 'admin'}` : ''}`
}
+export function getUploadActionUrlthree() {
+
+ return `${getUrlmys()}/api/jupyters/import_with_tpm.json${isDev ? `?debug=${window._debugType || 'admin'}` : ''}`
+}
export function getUploadActionUrlOfAuth(id) {
return `${getUrl()}/api/users/accounts/${id}/auth_attachment.json${isDev ? `?debug=${window._debugType || 'admin'}` : ''}`
}
diff --git a/public/react/src/common/educoder.js b/public/react/src/common/educoder.js
index c9aa7ac77..3d11ee3cb 100644
--- a/public/react/src/common/educoder.js
+++ b/public/react/src/common/educoder.js
@@ -3,7 +3,7 @@
// export { default as OrderStateUtil } from '../routes/Order/components/OrderStateUtil';
export { getImageUrl as getImageUrl, getUrl as getUrl, getUrlmys as getUrlmys, getUrl2 as getUrl2, setImagesUrl as setImagesUrl
- , getUploadActionUrl as getUploadActionUrl,getUploadActionUrltwo as getUploadActionUrltwo , getUploadActionUrlOfAuth as getUploadActionUrlOfAuth
+ , getUploadActionUrl as getUploadActionUrl,getUploadActionUrltwo as getUploadActionUrltwo ,getUploadActionUrlthree as getUploadActionUrlthree, getUploadActionUrlOfAuth as getUploadActionUrlOfAuth
, getTaskUrlById as getTaskUrlById, TEST_HOST ,htmlEncode as htmlEncode } from './UrlTool';
export { default as queryString } from './UrlTool2';
diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js
index 0c00f2bb2..3a132b814 100644
--- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js
+++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js
@@ -1,7 +1,7 @@
import React, { Component } from 'react';
import { Link } from "react-router-dom";
-import { markdownToHTML, configShareForCustom,getImageUrl} from 'educoder'
-import { Divider, Tooltip } from 'antd';
+import { markdownToHTML, configShareForCustom,getImageUrl,getUploadActionUrlthree,appendFileSizeToUploadFileAll} from 'educoder'
+import { Divider, Tooltip,Upload} from 'antd';
import LoadingSpin from '../../../../common/LoadingSpin';
import 'antd/lib/pagination/style/index.css';
import '../shixunchildCss/Challenges.css';
@@ -26,6 +26,7 @@ class Challengesjupyter extends Component {
opentitletype:true,
isopentitletype:"Less",
enlarge:false,
+ fileList:[],
}
}
@@ -247,9 +248,42 @@ class Challengesjupyter extends Component {
// 导入文件
}
+ handleChange = (info) => {
+ if(info.file.status == "done" || info.file.status == "uploading" || info.file.status === 'removed'){
+ let fileList = info.fileList;
+ this.setState({
+ fileList: appendFileSizeToUploadFileAll(fileList),
+ });
+ if(info.file.status === 'done'){
+ if(info.file.response){
+ if(info.file.response.status===-1||info.file.response.status==="-1"){
+
+ }else{
+
+ }
+ }
+ }
+
+ if(info.file.response){
+ if(info.file.response.status===-1||info.file.response.status==="-1"){
+
+ }else{
+ if(info.file.response.status===0){
+ try {
+ this.props.showNotification('上传文件成功!');
+ }catch (e) {
+
+ }
+ }
+
+ }
+ }
+
+ }
+ }
render() {
- let{ChallengesDataList,booljupyterurls,enlarge}=this.state;
+ let{ChallengesDataList,booljupyterurls,enlarge,fileList}=this.state;
let id = this.props.match.params.shixunId;
//老师
const is_teacher = this.props&&this.props.current_user&&this.props.current_user.is_teacher?this.props.current_user.is_teacher:false;
@@ -264,7 +298,35 @@ class Challengesjupyter extends Component {
}catch (e) {
}
+ const uploadProps = {
+ width: 600,
+ fileList,
+ multiple: true,
+ data:{
+ identifier:id,
+ },
+ //multiple 是否支持多选 查重的时候不能多选 不然弹许多框出来
+ // https://github.com/ant-design/ant-design/issues/15505
+ // showUploadList={false},然后外部拿到 fileList 数组自行渲染列表。
+ // showUploadList: false,
+ action: `${getUploadActionUrlthree()}`,
+ showUploadList:false,
+ onChange: this.handleChange,
+ beforeUpload: (file) => {
+ //上传前的操作
+ // console.log('beforeUpload', file.name);
+ if(file.name.indexOf('.ipynb') === -1){
+ this.props.showNotification('请上传正确格式文件!');
+ return false
+ }
+ const isLt10M = file.size / 1024 / 1024 < 10;
+ if (!isLt10M) {
+ this.props.showNotification('文件大小必须小于10MB!');
+ }
+ return isLt10M;
+ },
+ };
return (
@@ -408,10 +470,23 @@ class Challengesjupyter extends Component {
marginLeft: '30px',
}} onClick={()=>this.onclki(true)}>
}
-
this.Importingfiles()}>导入
+
+
+
+
this.Importingfiles()}>导入
+
+
From 80506b7d2da0e336fa3e800d15c459c5af6b15f8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=A8=E6=A0=91=E6=9E=97?= <904079904@qq.com>
Date: Fri, 20 Dec 2019 21:04:32 +0800
Subject: [PATCH 4/4] =?UTF-8?q?=E8=B0=83=E6=95=B4jupyter?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js
index 3a132b814..f10812080 100644
--- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js
+++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js
@@ -533,7 +533,7 @@ class Challengesjupyter extends Component {
)
:
}