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) - }}>复制地址 - +
+ + {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 { ) : }