Merge remote-tracking branch 'origin/jupyter' into jupyter

chromesetting
杨树明 5 years ago
commit 74a6458847

@ -358,7 +358,7 @@ class App extends Component {
mydisplay:true,
})
};
disableVideoContextMenu = () => {
window.$( "body" ).on( "mousedown", "video", function(event) {
if(event.which === 3) {
@ -577,14 +577,14 @@ class App extends Component {
<Route path="/users/:username"
render={
(props) => {
return (<InfosIndex {...this.props} {...props} {...this.state} />)
}
}></Route>
<Route path="/banks"
render={
(props) => {
(props) => {
return (<BanksIndex {...this.props} {...props} {...this.state} />)
}
}></Route>
@ -615,7 +615,7 @@ class App extends Component {
<Route path="/shixuns/:shixunId" component={TPMIndexComponent}>
</Route>
{/*列表页*/}
{/*列表页 实训项目列表*/}
<Route path="/shixuns" component={TPMShixunsIndexComponent}/>
@ -637,8 +637,8 @@ class App extends Component {
<Route path="/moop_cases"render={
(props) => (<MoopCases {...this.props} {...props} {...this.state} />)
}/>
<Route path="/forums"
<Route path="/forums"
render={
(props)=>(<ForumsIndexComponent {...this.props} {...props} {...this.state}></ForumsIndexComponent>)
}
@ -671,7 +671,7 @@ class App extends Component {
(props)=>(<Ecs {...this.props} {...props} {...this.state}></Ecs>)
}/>
<Route path="/problems/new/:id?"
<Route path="/problems/new/:id?"
render={
(props) => {
return (<NewOrEditTask {...this.props} {...props} {...this.state} />)
@ -679,11 +679,11 @@ class App extends Component {
}
/>
<Route
path="/problems/:id/edit"
path="/problems/:id/edit"
render={
(props) => (<NewOrEditTask {...this.props} {...props} {...this.state} />)
} />
<Route path="/myproblems/record_detail/:id"
<Route path="/myproblems/record_detail/:id"
render={
(props) => (<RecordDetail {...this.props} {...props} {...this.state} />)
}
@ -703,7 +703,7 @@ class App extends Component {
(props)=>(<ShixunsHome {...this.props} {...props} {...this.state}></ShixunsHome>)
}
/>
<Route component={Shixunnopage}/>
<Route component={Shixunnopage}/>
</Switch>
</Router>
@ -825,4 +825,4 @@ moment.defineLocale('zh-cn', {
doy: 4 // The week that contains Jan 4th is the first week of the year.
}
});
export default SnackbarHOC()(App) ;
export default SnackbarHOC()(App) ;

@ -539,6 +539,17 @@ class NewShixunModel extends Component{
className="fl task-hide edu-txt-left mt3"
name="shixun_homework[]"
></Checkbox>
{
this.props.type==='shixuns'?
<div className="myysljupyter fl ml15 mt3 intermediatecenter">
<p className="myysljupytertest">
Jupyter
</p>
</div>
:""
}
<a target="_blank" href={this.props.type==='shixuns'?`/shixuns/${item.identifier}/challenges`:`/paths/${item.id}`} className="ml15 fl font-16 color-dark maxwidth1100"
dangerouslySetInnerHTML={{__html: item.title}}
>
@ -684,4 +695,4 @@ export default NewShixunModel;
// <span dangerouslySetInnerHTML={{__html: item}}>{}</span>
// )
// })}
// </div>}
// </div>}

@ -384,4 +384,23 @@
.newshixunmodels{
margin: 0 auto;
}
}
.myysljupyter{
width:48px;
height:22px;
background:#FF6802;
border-radius:2px 10px 10px 2px;
}
.myysljupytertest{
width:39px;
height:16px;
font-size:12px;
color:#FFFFFF;
line-height:16px;
}
.intermediatecenter{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}

@ -55,8 +55,9 @@ class TPMBanner extends Component {
isIE:false,
Forkvisibletype: false,
isSpin:false,
Senttothevcaluetype:false
}
Senttothevcaluetype:false,
jupyterbool:false,
}
}
// star_info:[0, 0, 0, 0, 0, 0],
@ -656,7 +657,7 @@ class TPMBanner extends Component {
{/*<span className="mt10">{shixunsDetails.experience}</span>*/}
{/*</li>*/}
<li>
<span>难度系数</span>
<span>难度级别</span>
<span className="shixunsdiffcult mt10">{shixunsDetails.diffcult}</span>
</li>

@ -1,54 +1,61 @@
import React, { Component } from 'react';
import { Redirect } from 'react-router';
import PropTypes from 'prop-types';
import { CircularProgress } from 'material-ui/Progress';
import './TPMShixunDiscuss.css'
import Challenges from './shixunchild/Challenges/Challenges'
import TPMRightSection from './component/TPMRightSection'
import TPMNav from './component/TPMNav'
class TPMChallenge extends Component {
constructor(props) {
super(props)
}
render() {
const { loadingContent, shixun, user, match
} = this.props;
return (
<React.Fragment>
<div className="educontent clearfix mt30 mb80">
<div className="with65 fl edu-back-white" >
<TPMNav
match={match}
user={user}
shixun={shixun}
{...this.props}
></TPMNav>
<Challenges
{...this.props}
/>
</div>
<div className="with35 fr pl20">
<TPMRightSection
{...this.props}
/>
</div>
</div>
</React.Fragment>
);
}
}
export default TPMChallenge;
import React, { Component } from 'react';
import { Redirect } from 'react-router';
import PropTypes from 'prop-types';
import { CircularProgress } from 'material-ui/Progress';
import './TPMShixunDiscuss.css'
import Challenges from './shixunchild/Challenges/Challenges'
import Challengesjupyter from './shixunchild/Challenges/Challengesjupyter'
import TPMRightSection from './component/TPMRightSection'
import TPMNav from './component/TPMNav'
class TPMChallenge extends Component {
constructor(props) {
super(props)
}
render() {
const { loadingContent, shixun, user, match,jupyterbool
} = this.props;
return (
<React.Fragment>
<div className="educontent clearfix mt30 mb80">
<div className="with65 fl edu-back-white" >
<TPMNav
match={match}
user={user}
shixun={shixun}
{...this.props}
></TPMNav>
{
jupyterbool===true?
<Challengesjupyter
{...this.props}
/>
: <Challenges
{...this.props}
/>
}
</div>
<div className="with35 fr pl20">
<TPMRightSection
{...this.props}
/>
</div>
</div>
</React.Fragment>
);
}
}
export default TPMChallenge;

@ -0,0 +1,268 @@
import React, {Component} from 'react';
import {Redirect} from 'react-router';
import {List, Typography, Tag, Modal, Radio, Checkbox, Table, Pagination} from 'antd';
import { NoneData } from 'educoder'
import TPMRightSection from './component/TPMRightSection';
import TPMNav from './component/TPMNav';
import axios from 'axios';
import './tpmmodel/tpmmodel.css'
class TPMDataset extends Component {
constructor(props) {
super(props)
this.state = {
datas: [0, 1, 2, 3, 4, 5],
value: undefined,
columns: [
{
title: '文件',
dataIndex: 'number',
key: 'number',
align: 'left',
className: " font-14 wenjiantit",
width: '300px',
render: (text, record) => (
<div>
文件名字
</div>
)
},
{
title: '最后修改时间',
dataIndex: 'number',
key: 'number',
align: 'center',
className: "edu-txt-center font-14 zuihoushijian",
width: '125px',
render: (text, record) => (
<div>
2019-08-12 12:30
</div>
)
},
{
title: '最后修改人',
dataIndex: 'number',
key: 'number',
align: 'center',
className: "edu-txt-center font-14 ",
render: (text, record) => (
<div>
张大大
</div>
)
},
{
title: '文件大小',
dataIndex: 'number',
key: 'number',
align: 'center',
className: "edu-txt-center font-14 ",
render: (text, record) => (
<div>
1.88kb
</div>
)
},
],
page: 1,
limit: 5,
selectedRowKeys: [],
mylistansum:30,
}
}
componentDidMount() {
this.getdatas()
}
mysonChange = (e) => {
console.log(`全选checked = ${e.target.checked}`);
if (e.target.checked === true) {
this.setState({
selectedRowKeys: this.state.datas,
})
} else {
this.setState({
selectedRowKeys: [],
})
}
}
getdatas = () => {
}
showModal = (id, status) => {
};
handleOk = (id, editid) => {
};
handleCancel = (e) => {
};
paginationonChanges = (pageNumber) => {
// //console.log('Page: ');
this.setState({
page: pageNumber,
})
}
onSelectChange = (selectedRowKeys, selectedRows) => {
console.log(`selectedRowKeys: ${selectedRowKeys}`, 'selectedRows: ', selectedRows);
this.setState(
{
selectedRowKeys
}
);
}
rowClassName = (record, index) => {
let className = 'light-row';
if (index % 2 === 1) className = 'dark-row';
return className;
}
render() {
const {tpmLoading, shixun, user, match} = this.props;
const {columns, datas, page, limit, selectedRowKeys,mylistansum} = this.state;
const rowSelection = {
selectedRowKeys,
onChange: this.onSelectChange,
};
// getCheckboxProps: record => ({
// disabled: record.name === 'Disabled User', // Column configuration not to be checked
// name: record.name,
// }),
return (
<React.Fragment>
<div className="tpmComment educontent clearfix mt30 mb80">
<div className="with65 fl edu-back-white commentsDelegateParent">
<TPMNav
match={match}
user={user}
shixun={shixun}
{...this.props}
></TPMNav>
<div className="padding20 edu-back-white mt20 " style={{minHeight: '463px'}}>
<div className="sortinxdirection">
<div className="tpmwidth"><Checkbox onChange={this.mysonChange}>全选</Checkbox></div>
<div className="tpmwidth xaxisreverseorder">
<div className="deletebuttom intermediatecenter "><p className="deletebuttomtest">上传文件</p></div>
{
mylistansum>0?
<div
className={selectedRowKeys.length > 0 ? "deletebutomtextcode intermediatecenter mr21" : "deletebutom intermediatecenter mr21"}>
<p className="deletebutomtext">删除</p></div>
:""
}
</div>
</div>
<div className="mt24">
<style>{`
.ant-spin-nested-loading > div > .ant-spin .ant-spin-dot {
top: 72%;}
}
.edu-table .ant-table-tbody > tr > td {
height: 42px;
}
.edu-table .ant-table-thead > tr > th{
height: 42px;
}
.ysltableowss .ant-table-thead > tr > th{
height: 42px;
}
.ysltableowss .ant-table-tbody > tr > td{
height: 42px;
}
.ysltableowss .ant-table-thead > tr > th, .ant-table-tbody > tr > td {
padding: 9px;
}
.mysjysltable4 .ant-table-thead > tr > th, .ant-table-tbody > tr > td {
padding: 0px;
}
.ant-table-thead .ant-table-selection-column span{
visibility:hidden;
}
.ant-table-thead > tr > th {
background:#FFFFFF !important;
}
.ant-table table {
width: 100%;
text-align: left;
border-radius: 4px 4px 0 0;
border-collapse: separate;
border-spacing: 0;
border-left: 1px solid #eeeeee;
border-top: 1px solid #eeeeee;
border-right: 1px solid #eeeeee;
}
`}</style>
{mylistansum===0?
<style>
{
`
.ant-table-tbody{
display:none;
}
.ant-table table {
border-bottom: 1px solid #eeeeee !important;
}
`
}
</style>
:""
}
<div className="edu-table edu-back-white ysltableowss">
<Table
dataSource={datas}
columns={columns}
pagination={false}
className="mysjysltable4"
rowSelection={rowSelection}
rowClassName={this.rowClassName}
/>
</div>
{
mylistansum>5?
<div className="edu-txt-center mt40 mb20">
<Pagination showQuickJumper current={page}
onChange={this.paginationonChanges} pageSize={limit}
total={mylistansum}
></Pagination>
</div>
:""
}
{ mylistansum===0?
<NoneData style={{width: '100%'}}></NoneData>:""
}
</div>
</div>
</div>
<div className="with35 fr pl20">
<TPMRightSection
{...this.props}
/>
</div>
</div>
</React.Fragment>
);
}
}
export default TPMDataset;

@ -27,7 +27,7 @@ import TPMPropaedeuticsComponent from './TPMPropaedeuticsComponent';
import TPMRanking_listComponent from './TPMRanking_listContainer';
import TPMCollaboratorsComponent from './TPMCollaboratorsContainer';
import Audit_situationComponent from './Audit_situationComponent';
import TPMDataset from './TPMDataset';
import '../page/tpiPage.css'
const $ = window.$
@ -142,6 +142,7 @@ class TPMIndex extends Component {
identity:undefined,
TPMRightSectionData:undefined,
PropaedeuticsList: undefined,
tpmindexjupyterbool:false,
}
}
@ -192,7 +193,7 @@ class TPMIndex extends Component {
propaedeutics:response.data.propaedeutics,
status: response.data.shixun_status,
secret_repository: response.data.secret_repository,
});
}
}).catch((error) => {
@ -259,8 +260,8 @@ class TPMIndex extends Component {
axios.interceptors.request.eject(this.tpmContentResponseInterceptor);
this.tpmContentResponseInterceptor = null;
}
setLoadingContent = (isLoadingContent) => {
this.setState({ loadingContent: isLoadingContent })
}
@ -270,20 +271,29 @@ class TPMIndex extends Component {
// }
render() {
let url = window.location.href;
let flag = url.indexOf("add_file")>-1;
return (
<div className="newMain clearfix">
{/*头部*/}
{
!flag &&
!flag &&
<TPMBanner
{...this.props}
{...this.state}
></TPMBanner>
}
{/*筛选*/}
{/*{*/}
{/* tpmindexjupyterbool===false?*/}
{/* :""*/}
{/*}*/}
{/* */}
<Switch {...this.props}>
<Route path="/shixuns/:shixunId/repository/:repoId/commits" render={
(props) => (<TPMRepositoryCommits {...this.props} {...this.state} {...props}
/>)
@ -294,7 +304,7 @@ class TPMIndex extends Component {
}></Route>
<Route exact path="/shixuns/:shixunId/challenges" render={
(props) => (<TPMChallengeComponent {...this.props} {...this.state} {...props}
(props) => (<TPMChallengeComponent {...this.props} jupyterbool={true} {...this.state} {...props}
/>)
}></Route>
@ -311,7 +321,7 @@ class TPMIndex extends Component {
(props) => (<TPMRepositoryComponent {...this.props} {...this.state} {...props} secret_repository_tab={true}
/>)
}></Route>
{/* <Route exact path="/shixuns/:shixunId/propaedeutics" component={TPMPropaedeuticsComponent}></Route> */}
<Route exact path="/shixuns/:shixunId/propaedeutics" render={
@ -325,7 +335,7 @@ class TPMIndex extends Component {
/>)
}></Route>
{/* <Route exact path="/shixuns/:shixunId/repository/:shixunId/" component={TPMRepositoryComponent}></Route> */}
@ -342,12 +352,17 @@ class TPMIndex extends Component {
(props) => (<TPMsettings {...this.props} {...this.state} {...props} />)
}></Route>
{/*实训项目条目塞选*/}
<Route exact path="/shixuns/:shixunId/ranking_list" render={
(props) => (<TPMRanking_listComponent {...this.props} {...this.state} {...props}
/>)
}></Route>
<Route exact path="/shixuns/:shixunId/dataset" render={
(props) => (<TPMDataset {...this.props} {...this.state} {...props}
/>)
}></Route>
<Route exact path="/shixuns/:shixunId/audit_situation" render={
(props) => (<Audit_situationComponent {...this.props} {...this.state} {...props}
/>)

@ -36,6 +36,10 @@ class TPMNav extends Component {
<Link to={`/shixuns/${shixunId}/collaborators`}
className={`${match.url.indexOf('collaborators') != -1 ? 'active' : ''} fl mr40`}>合作者</Link>
{/*jupyter*/}
<Link to={`/shixuns/${shixunId}/dataset`}
className={`${match.url.indexOf('dataset') != -1 ? 'active' : ''} fl mr40`}>数据集</Link>
<Link to={`/shixuns/${shixunId}/shixun_discuss`}
className={`${match.url.indexOf('shixun_discuss') != -1 ? 'active' : ''} fl mr40`}>评论</Link>

@ -0,0 +1,354 @@
import React, { Component } from 'react';
import { Redirect } from 'react-router';
import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom";
import PropTypes from 'prop-types';
import classNames from 'classnames';
import { getImageUrl ,markdownToHTML, configShareForCustom} from 'educoder'
import { CircularProgress } from 'material-ui/Progress';
import { Modal, Spin, Tooltip ,message,Icon} from 'antd';
import 'antd/lib/pagination/style/index.css';
import '../shixunchildCss/Challenges.css'
import ReactDOM from 'react-dom';
import axios from 'axios';
import AccountProfile from"../../../user/AccountProfile";
const $ = window.$;
class Challengesjupyter extends Component {
constructor(props) {
super(props)
this.state = {
ChallengesDataList: undefined,
operate: true,
startbtns: false,
iFrameHeight: '0px'
}
}
ChallengesList = () => {
let id = this.props.match.params.shixunId;
let ChallengesURL = `/shixuns/` + id + `/challenges.json`;
axios.get(ChallengesURL).then((response) => {
if (response.status === 200) {
if (response.data.status === 403||response.data.status === 401||response.data.status === 500) {
}else{
configShareForCustom(this.props.shixunsDetails.name, response.data.description)
this.setState({
ChallengesDataList: response.data,
sumidtype: false,
});
}
}
}).catch((error) => {
console.log(error)
});
}
componentDidMount() {
setTimeout(this.ChallengesList(), 1000);
// var iframe =
// document.getElementById('ifr1');
// console.log("iframe||||||||");
// console.log(iframe);
// if(iframe){
// // var headertest=test.contentWindow.document.getElementById('header');
// // console.log(headertest);
// var iwindow = iframe.contentWindow;
// var idoc = iwindow.document;
// console.log("window",iwindow);//获取iframe的window对象
// console.log("windowwindow",iwindow.document.getElementById('header'));//获取iwindow.document对象
// console.log("document",idoc); //获取iframe的document
// console.log("documentdocument",idoc.getElementById('header'));
// console.log("html",idoc.documentElement);//获取iframe的html
// console.log("head",idoc.head); //获取head
// console.log("body",idoc.body); //获取body
// }
}
updatamakedown = (id) => {
}
// 关卡的上移下移操作
operations = (sumid, type) => {
}
delOperations = (sumid) => {
}
clonedelOperationss = () => {
}
delOperationss = () => {
}
startgameid=(id)=>{
}
hidestartshixunsreplace=(url)=>{
}
//编辑实训题目选择题
EditTraining=(type, ids, path)=>{
}
//开始实战按钮
startshixunCombat = (type, ids, id) => {
}
hidestartshixunCombattype=()=>{
}
hideAccountProfile=()=>{
};
modifyjupyter=()=>{
// var ifr =window.parent.frames["frame"].document;
// console.log(ifr);
var ifr = window.document.getElementById("ifr1");
console.log("modifyjupyter");
console.log(ifr);
const iframe = window.document.getElementById('ifr1');
console.log("modifyjupyter");
const frameWindow = iframe.contentWindow;
console.log(frameWindow);
const frameDocument = frameWindow.document;
console.log(frameDocument);
// window.addEventListener('load', () => {
// console.log('12313页面加载好了');
// const iframe = document.getElementById('ifr1');
// if (iframe && iframe.contentWindow && this.props.iframe_src) {
// console.log('32131231yes mounted');
// console.log(iframe.contentWindow);
// } else {
// console.log('3242242not mounted')
// }
// });
// var editor;
// editor = document.getElementById("ifr1").contentWindow;
// console.log(editor);
// window.onload = () => {
// var testwindow =
// document.getElementById('ifr1').contentWindow;
//
// }
// var iframe=window.frames["ifr1"];
// // var title =${'ifr1'}
// console.log("iframe");
// console.log(iframe);
// var frames = window.frames; // 或 // var frames = window.parent.frames;
// for (var i = 0; i < frames.length; i++) {
// // 在这对frames的一个frame做点什么
// // frames[i].document.body.style.background = "red";
// console.log(frames[i]);
//
// }
// var idoc = iframe.document;
// console.log(idoc);
// var iwindow = title.contentWindow;
// console.log("iwindow");
// console.log(iwindow);
// var idoc = iwindow.document;
// console.log(idoc);
// window.addEventListener('message', receiveMessageFromParent, false);
//
// let messageButton = document.getElementById('message_button');
// /* console.log('msg button', messageButton); annoataion cannot use \/\/ */
// messageButton.addEventListener('click', function (e) {
// console.log('iframe send msg');
// console.log('parent', window.parent);
// console.log('top container', window.top);
// window.parent.postMessage('This is child', '*');
// }, false);
// var iframe = $('#ifr1');
// console.log(iframe.context.find('#save-notbook'));
// console.log("iframe");
// console.log(iframe)
// title.window.say(); //myFrame.say();也可
//
// title.window.document.getElementById("button").value="保存并检查";
//find button inside iframe
// let button = iframe.contents().find('#save-notbook');
// //trigger button click
// button.trigger("click");
// console.log("iframe||||||||");
// if(iframe){
// var iwindow = iframe.contentWindow;
// var idoc = iwindow.document;
// console.log("window",iwindow);//获取iframe的window对象
// console.log("document",idoc); //获取iframe的document
// console.log("html",idoc.documentElement);//获取iframe的html
// console.log("head",idoc.head); //获取head
// console.log("body",idoc.body); //获取body
// }
// var test =
// document.getElementById('ifr1').contentWindow.document.getElementById('header');
// test.style.background = "#333";
}
render() {
let{ChallengesDataList}=this.state;
let id = this.props.match.params.shixunId;
// var deptObjs=document.getElementById("IFRAMEID").contentWindow.document.getElementById("TAGID");
// //判断此元素是否存在
// if(deptObjs!=null){
// //设置该元素的样式或其他属性
// deptObjs.setAttribute('style',' height: 20px !important;'); //!important用来提升指定样式条目的应用优先权
// }
// var submitObj = document.getElementById('submit');
// if(submitObj){
// submitObj.style.color = 'green';
// }
// const dom = document.getElementById('shutdown');
// ReactDOM.unmountComponentAtNode(dom)
// // window.$('#picture_display').hide();
// window.$('.data-tip-right').hide()
// window.onload=()=>{
// debugger
// var _iframe = document.getElementById('header');
// console.log(_iframe);
// // .contentWindow.document.getElementById('shutdown_widget') //get iframe下的id
// // _iframe.style.display= "none"; //修改样式
// }
return (
<React.Fragment>
<div className="mt30 pl20 pr20" >
<p className="clearfix mb20">
<span className="font-16 fl">简介</span>
<Tooltip placement="bottom" title={"编辑"}>
<a style={{ display: this.props.identity < 5 && ChallengesDataList&&ChallengesDataList.shixun_status < 3 ? "block" : 'none' }}
href={"/shixuns/" + id + "/settings?edit=1"} className="ring-green fr">
<img src={getImageUrl("images/educoder/icon/edit.svg")} className="fl mt3 ml2" />
</a>
</Tooltip>
</p>
<div className="justify break_full_word new_li "
id="challenge_editorMd_description">
<p id="ReactMarkdown" style={{overflow:'hidden'}}>
{ChallengesDataList === undefined ? "" :ChallengesDataList&&ChallengesDataList.description===null?"":
<div className={"markdown-body"} dangerouslySetInnerHTML={{__html: markdownToHTML(ChallengesDataList.description).replace(/▁/g,"▁▁▁")}}></div>
}
</p>
<style>
{
`
.intermediatecenter{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.sortinxdirection{
display: flex;
flex-direction:row;
}
.xaxisreverseorder{
display: flex;
flex-direction:row-reverse;
}
`
}
</style>
<div className="sortinxdirection mt60">
<div className="renwuxiangssi sortinxdirection">
<div><p className="renwuxiangqdiv">任务详情</p></div> <div><p className="renwuxiangqdivtest ml24"></p></div>
</div>
<div className="renwuxiangssit xaxisreverseorder"><div className="challenbaocun" onClick={()=>this.modifyjupyter()}><p className="challenbaocuntest">保存</p></div></div>
</div>
<style>
{
`
iframe {
border-width: 0px;
border-style: inset;
border-color: initial;
border-image: initial;
}
iframe {
border-left: 1px solid #eeeeee;
border-top: 1px solid #eeeeee;
border-right: 1px solid #eeeeee;
border-bottom: 1px solid #eeeeee;
}
#header{
visibility:hidden;
}
`
}
</style>
<div className="mt35">
{/*https://48888.jupyter.educoder.net/tree?*/}
<div className="pb47">
<iframe src="http://121.41.4.83:48888/tree?" scrolling="no" id="ifr1" name="frame" width="100%" height="700" frameborder="0"
></iframe>
</div>
</div>
</div>
</div>
</React.Fragment>
)
}
}
export default Challengesjupyter;

@ -6,4 +6,126 @@
.line27{
line-height: 27px;
vertical-align: 1px;
}
}
/* 中间居中 */
.intermediatecenter{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
/* 简单居中 */
.intermediatecenterysls{
display: flex;
align-items: center;
}
.spacearound{
display: flex;
justify-content: space-around;
}
.spacebetween{
display: flex;
justify-content: space-between;
}
/* 头顶部居中 */
.topcenter{
display: -webkit-flex;
flex-direction: column;
align-items: center;
}
/* x轴正方向排序 */
/* 一 二 三 四 五 六 七 八 */
.sortinxdirection{
display: flex;
flex-direction:row;
}
/* x轴反方向排序 */
/* 八 七 六 五 四 三 二 一 */
.xaxisreverseorder{
display: flex;
flex-direction:row-reverse;
}
/* 垂直布局 正方向*/
/*
*/
.verticallayout{
display: flex;
flex-direction:column;
}
/* 垂直布局 反方向*/
.reversedirection{
display: flex;
flex-direction:column-reverse;
}
.yslwushiwidth{
width: 50%;
}
.yslwushiwidth90{
width: 90%;
}
.yslwushiwidth10{
width: 10%;
}
.yslwushiwidthbuton{
width: 110px;
}
.yslwushiwidthcolortest{
color: #A8A8A8;
font-size:16px;
}
.yslusername{
color: #000000;
font-size: 18px;
}
.yslusercjz{
width:60px;
height:28px;
border-radius:3px;
border:1px solid #F38B03;
}
.yslusercjztest{
width:60px;
height:28px;
font-size:16px;
color:#F38B03;
line-height:28px;
text-align: center;
}
.w18{
width: 18px;
}
.maxnamewidth150{
width: 150px;
max-width: 150px;
overflow:hidden;
text-overflow:ellipsis;
white-space:nowrap;
cursor: default;
}
.fabushixunwidth{
color: #000000;
font-size: 16px;
}
.fabushixunwidthcolor{
color: #4CACFF;
font-size: 16px;
}
.divfontexdivs{
border-left: 1px solid #eeeeee;
border-top: 1px solid #eeeeee;
border-right: 1px solid #eeeeee;
border-bottom: 1px solid #eeeeee;
}

@ -2,7 +2,7 @@ import React, { Component } from 'react';
import { Redirect } from 'react-router';
import {Modal, Button, Radio, Input, Checkbox,message,Spin, Icon} from 'antd';
import {Modal, Button, Radio, Input, Checkbox,message,Spin, Icon,Pagination} from 'antd';
import { BrowserRouter as Router, Route, Link, Switch } from "react-router-dom";
@ -48,7 +48,9 @@ class Collaborators extends Component {
user_name:undefined,
school_name:undefined,
spinnings:false,
useristrue:false
useristrue:false,
mylistansum:6,
limit:20,
}
}
componentDidMount() {
@ -434,7 +436,10 @@ class Collaborators extends Component {
collaboratorListsumtype,
user_name,
school_name,
useristrue
useristrue,
mylistansum,
page,
limit
} = this.state;
let {loadingContent} = this.props;
const radioStyle = {
@ -448,18 +453,26 @@ class Collaborators extends Component {
console.log(Searchadmin)
return (
<React.Fragment>
<p className="clearfix mt30"
style={{display:this.props.identity<5?"block":"none"}}
<p className=" mt30 sortinxdirection"
style={{display:this.props.identity<5?"flex":"none"}}
>
<a onClick={() => this.showCollaboratorsvisible("cooperation")}
className="edu-default-btn edu-greenback-btn fr mr20 height40"
data-remote="true">
<span className={"line27"}>+ </span>
</a>
<a onClick={() => this.showCollaboratorsvisible("admin")}
style={{display:this.props.identity===1?"block":"none"}}
data-remote="true"
className="edu-default-btn edu-greenback-btn fr mr20 height40">更换管理员</a>
<div className="yslwushiwidth">
<p className="edu-default-btn edu-greenback-btn ml20 height40 yslwushiwidthcolortest">共12人</p>
</div>
<div className="yslwushiwidth xaxisreverseorder">
<a onClick={() => this.showCollaboratorsvisible("cooperation")}
className="edu-default-btn edu-greenback-btn mr20 height40 yslwushiwidthbuton"
data-remote="true">
<span className={"line27"}>+ </span>
</a>
<a onClick={() => this.showCollaboratorsvisible("admin")}
style={{display:this.props.identity===1?"flex":"none"}}
data-remote="true"
className="edu-default-btn edu-greenback-btn mr20 height40 yslwushiwidthbuton">更换管理员</a>
</div>
</p>
<Modal
@ -537,6 +550,8 @@ class Collaborators extends Component {
<span className="fl edu-txt-w100 task-hide font-bd">职业</span>
<span className="fl edu-txt-w180 task-hide font-bd ml80">单位</span>
</p>
<div className="mt5" style={{background: '#f7f9fd'}}>
<Spin indicator={antIcon} spinning={this.state.spinnings}>
<div className="clearfix">
@ -584,39 +599,58 @@ class Collaborators extends Component {
onClick={() => this.submit_add_collaborators_form()}>确定</a>
</div>
</Modal>:""}
<style>
{
`
.collaborators-item-middles{width: 100% !important; margin-left: 20px;}
.ysltithead{
padding-bottom: 20px;
}
`
}
</style>
<div className="pl20" id="collaborators_list_info">
{
collaboratorList===undefined?"":collaboratorList.map((item,key)=>{
if(key<collaboratorListsum){
return(
<div className="collaborators-item clearfix" key={key}>
<a href={item.user.user_url} target="_blank" className="mr20 fl">
<img alt="用户头像" className="radius" height="80" src={getImageUrl("images/"+item.user.image_url)} width="80"/></a>
<div className="fl collaborators-item-middle">
<p className="mb10">
<a href={item.user.user_url} target="_blank">{item.user.name}</a>
<span className="ml20" style={{display:this.props.power===false?"none":"inline-block"}}>{item.user.shixun_manager === true ? "(管理员)" : ""}</span>
</p>
<div className="collaborators-item clearfix sortinxdirection ysltithead" key={key}>
<a href={item.user.user_url} target="_blank" className="mr20 fl">
<img alt="用户头像" className="radius" height="80" src={getImageUrl("images/"+item.user.image_url)} width="80"/></a>
<p className="color-grey-B2 font-12 mb10"><span className="mr20">{item.user.identity}</span><span>{item.user.school_name}</span></p>
<p className="mb10">
<span className="mr20">发布&nbsp;&nbsp;{item.user.user_shixuns_count}</span>
{/*<span>粉丝&nbsp;&nbsp;*/}
{/*<span id="user_h_fan_count">{item.user.fans_count}</span>*/}
{/*</span>*/}
</p>
<div className="fl collaborators-item-middles">
<p className="mb10 ">
<a href={item.user.user_url} target="_blank" className="yslusername">{item.user.name}</a>
{/* <p className="color-grey-B2 task-hide">{item.user.brief_introduction}</p> */}
<span className={item&&item.user&&item.user.shixun_manager === true?"ml20 yslusercjz ":"ml20"} style={{display:this.props.power===false?"none":"inline-block"}}><p className="yslusercjztest">{item.user.shixun_manager === true ? "创建者" : ""}</p></span>
</p>
<p className="color-grey-B2 font-12 mb10 sortinxdirection mt14">
<p className="yslwushiwidth90 sortinxdirection">
<p className="mr20 font-16 w70">{item.user.identity}</p>
<p className={item.user.school_name===null||item.user.school_name===""?"":"mr40 font-16 maxnamewidth150"}>{item.user.school_name}</p>
<p className="fabushixunwidth">发布实训项目&nbsp;&nbsp;<span className="fabushixunwidthcolor ml2">{item.user.user_shixuns_count}</span></p>
</p>
<div className="xaxisreverseorder yslwushiwidth10">
{item.user.shixun_manager === true ? "" :
<i className="iconfont icon-shanchu newbianji1 color-grey-c font-16 w40"
style={{display: this.props.power === false ? "none" : "block"}}
onClick={() => this.collaborators_delete(item.user.user_id)}>
</i>
}
</div>
</p>
{/*<p className="mb10">*/}
{/* */}
{/* /!*<span>粉丝&nbsp;&nbsp;*!/*/}
{/* /!*<span id="user_h_fan_count">{item.user.fans_count}</span>*!/*/}
{/* /!*</span>*!/*/}
{/*</p>*/}
{/* <p className="color-grey-B2 task-hide">{item.user.brief_introduction}</p> */}
</div>
{item.user.shixun_manager === true ? "" : <a className="fr color-grey-c mr40 mt35 font-16"
style={{display: this.props.power === false ? "none" : "block"}}
onClick={() => this.collaborators_delete(item.user.user_id)}>删除</a>}
{/*<a href="/watchers/unwatch?object_id=3039&amp;object_type=user&amp;shixun_id=61&amp;target_id=3039" className="fr user_default_btn user_private_btn mt30 font-16 mr20" data-method="post" data-remote="true" rel="nofollow">取消关注</a>*/}
</div>
@ -646,8 +680,19 @@ class Collaborators extends Component {
<div
className={collaboratorList.length>10&&collaboratorListsumtype===true?"":"none"}
style={{textAlign:'center',borderTop:'1px solid #eee'}}>
<a className="loadMore" onClick={this.loadMore}>加载更多</a>
</div>
{/*<a className="loadMore" onClick={this.loadMore}>加载更多</a>*/}
{
mylistansum>5?
<div className="edu-txt-center mt40 mb40">
<Pagination showQuickJumper current={page}
onChange={this.paginationonChanges} pageSize={limit}
total={mylistansum}
></Pagination>
</div>
:""
}
</div>
</React.Fragment>

@ -25,4 +25,44 @@
.addshixuns{
height: 27px;
line-height: 25px;
}
}
.challenbaocun{
width:80px;
height:30px;
background:#29BD8B;
border-radius:3px;
}
.challenbaocuntest{
width:80px;
height:30px;
font-size:16px;
color:#FFFFFF;
text-align: center;
line-height:30px;
}
.renwuxiangqdiv{
width:72px;
height:30px;
font-size:18px;
color:#000000;
line-height:30px;
}
.renwuxiangqdivtest{
width:32px;
height:30px;
font-size:16px;
font-family:MicrosoftYaHei;
color:#4CACFF;
line-height:30px;
}
.renwuxiangssi{
width: 30%;
}
.renwuxiangssit{
width: 70%;
}
.pb47{
padding-bottom: 47px;
}

@ -95,6 +95,33 @@ class ShixunCard extends Component {
left: 10px;
bottom: 125px;
}
.tag-org{
position: absolute;
left: 0px;
top: 20px;
}
.tag-org-name{
width:66px;
height:28px;
background:#FF6802;
width:66px;
height:28px;
border-radius:0px 20px 20px 0px;
}
.tag-org-name-test{
width:45px;
height:23px;
font-size:14px;
color:#FFFFFF;
line-height:19px;
margin-right: 6px;
}
.intermediatecenter{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
`
}
</style>
@ -105,6 +132,10 @@ class ShixunCard extends Component {
{/*<img style={{display:'block',height: '28px'}} src={require(`./shixunCss/tag2.png`)}/>*/}
</div>
}
<div className="tag-org">
<p className="tag-org-name intermediatecenter"> <span className="tag-org-name-test">Jupyter</span></p>
{/*<img style={{display:'block',height: '28px'}} src={require(`./shixunCss/tag2.png`)}/>*/}
</div>
<div className={item.power === false ? "closeSquare" : "none"}>
<img src={getImageUrl("images/educoder/icon/lockclose.svg")}
className="mt80 mb25"/>

@ -404,7 +404,7 @@ class ShixunsIndex extends Component {
{...this.state}
OnSearchInput={this.OnSearchInput.bind(this)}
/>
{/*下方图片*/}
<ShixunCard
typepvisible={typepvisible}
middleshixundata={middleshixundata.shixuns}

@ -0,0 +1,121 @@
.tpmborder{
border: 1px solid;
}
/* 中间居中 */
.intermediatecenter{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
/* 简单居中 */
.intermediatecenterysls{
display: flex;
align-items: center;
}
.spacearound{
display: flex;
justify-content: space-around;
}
.spacebetween{
display: flex;
justify-content: space-between;
}
/* 头顶部居中 */
.topcenter{
display: -webkit-flex;
flex-direction: column;
align-items: center;
}
/* x轴正方向排序 */
/* 一 二 三 四 五 六 七 八 */
.sortinxdirection{
display: flex;
flex-direction:row;
}
/* x轴反方向排序 */
/* 八 七 六 五 四 三 二 一 */
.xaxisreverseorder{
display: flex;
flex-direction:row-reverse;
}
/* 垂直布局 正方向*/
/*
*/
.verticallayout{
display: flex;
flex-direction:column;
}
/* 垂直布局 反方向*/
.reversedirection{
display: flex;
flex-direction:column-reverse;
}
.deletebutom{
width:85px;
height:30px;
background:#C4C4C4;
border-radius:3px;
}
.deletebutomtext{
width:28px;
height:19px;
font-size:14px;
color:#FFFFFF;
line-height:19px;
}
.deletebuttom{
width:85px;
height:30px;
background:#29BD8B;
border-radius:3px;
}
.deletebuttomtest{
width:56px;
height:19px;
font-size:14px;
color:#FFFFFF;
line-height:19px;
}
.tpmwidth{
width: 50%;
}
.mr21{
margin-right: 21px;
}
.wenjiantit{
width: 300px;
}
.zuihoushijian{
width: 125px;
}
.zuihouxiugairen{
width: 70px;
}
.wenjiandaxiao{
width: 56px;
}
.deletebutomtextcode{
width:85px;
height:30px;
background:#FF5555;
border-radius:3px;
}
.light-row{
background: #F7F7F8;
}
.dark-row{
background: #FFFFFF;
}

@ -20,12 +20,13 @@ class SearchPage extends Component{
page:1,
perpages:20,
data:[],
jupyterbool:false,
}
}
//切换tab
changeTab=(e)=>{
// course 课堂, shixun 开发社区 subject 实践课程 memo 交流问答
// course 2 课堂, shixun 0 实训项目 subject 1 实践课程 memo 3交流问答
let types ="";
if(parseInt(e.key)===0){
@ -106,7 +107,7 @@ class SearchPage extends Component{
}
}).then((response) => {
this.setState({ loading: false })
if(response === undefined){
return
@ -193,10 +194,23 @@ class SearchPage extends Component{
<div className={"font-16 color-dark fl "} style={{width:"100%"}} >
{/*标题*/}
<span className={"markdown-body fonttext"}
dangerouslySetInnerHTML={{__html:item.title}}/>
<div className="sortinxdirection jupytertextheig" style={{width:"100%"}}>
{
type==="shixun"?
<div className="jupytertext intermediatecenter "><p className="jupytertextp">Jupyter</p></div>
:""
}
<span className={"markdown-body fonttext ml9"}
dangerouslySetInnerHTML={{__html:item.title}}/>
</div>
{/*描述*/}
<div>
{item.content.content === undefined || item.content.content===0?"": item.content.content.map((item4, key4) => {
return (
<span className={"markdown-body magr11 fontextcolor"}
@ -221,8 +235,8 @@ class SearchPage extends Component{
<div>
{/*挑战名字*/}
{item.content.challenge_names === undefined || item.content.challenge_names===0?"": item.content.challenge_names.map((item5, key5) => {
return (
<div className={"df"}>
@ -269,13 +283,13 @@ class SearchPage extends Component{
{/* <span className="ziticor">
<i className="fa fa-user ziticor"></i><span className="ml10">{item.author_name}</span>
</span>
<span className="ml10 ziticor "><span>{item.author_school_name}</span></span>
<span className="ml10 ziticor "><span>{item.author_school_name}</span></span>
<span className="ml20 ziticor">
<i className="iconfont icon-shixunguanqia ziticor"></i>
<span>任务:
<span className="ml10 ziticor">{item.challenges_count===undefined?0:item.challenges_count}</span>
</span>
</span>
</span>
<span className="ml20 ziticor">
<i className="iconfont icon-chengyuan ziticor"></i>
<span>学习人数:
@ -287,7 +301,7 @@ class SearchPage extends Component{
{/* <i className="fa fa-user ziticor"></i> */}
<span className="">{item.author_name}</span></span>
<span className="ml10 ziticor "><span>{item.author_school_name}</span>
</span>
</span>
{!!item.challenges_count && <span className="ml20 ziticor">
{/* <i className="iconfont icon-shixunguanqia ziticor"></i> */}
<span>任务:
@ -325,7 +339,7 @@ class SearchPage extends Component{
{/* <i className="iconfont icon-huifu1 ziticor"></i> */}
<span>回复数:<span className="ml10 ziticor">{item.all_replies_count}</span></span>
</span> }
{/* <span className="ml20 ziticor">
<i className="iconfont icon-chengyuan ziticor"></i>
<span>
@ -368,4 +382,4 @@ class SearchPage extends Component{
}
}
export default SnackbarHOC() (TPMIndexHOC ( SearchPage ));
export default SnackbarHOC() (TPMIndexHOC ( SearchPage ));

@ -131,4 +131,45 @@
margin-top: 20px;
display: flex;
flex-direction:row;
}
}
.jupytertext{
width:54px;
height:24px;
background:#FF6802;
border-radius:2px 10px 10px 2px;
margin-top: 2px;
text-align: center;
}
.jupytertextp{
width:39px;
height:16px;
font-size:12px;
color:#FFFFFF;
line-height:16px;
}
/* x轴正方向排序 */
/* 一 二 三 四 五 六 七 八 */
.sortinxdirection{
display: flex;
flex-direction:row;
}
/* x轴反方向排序 */
/* 八 七 六 五 四 三 二 一 */
.xaxisreverseorder{
display: flex;
flex-direction:row-reverse;
}
.intermediatecenter{
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
}
.jupytertextheig{
height: 32px;
line-height: 32px;
}
.ml9{
margin-left: 9px;
}

Loading…
Cancel
Save