dev_tpm_ui
杨树明 5 years ago
parent 72d8a630ac
commit 5c25888110

@ -399,7 +399,7 @@ label.infolabel{display: block;float: left;width: 56px;text-align: right;margin-
/*新建任务*/ /*新建任务*/
.challenge_nav{padding: 20px 20px 0px 20px;border-bottom: 1px solid #eee;} .challenge_nav{padding: 20px 20px 0px 20px;border-bottom: 1px solid #eee;}
.challenge_nav li{width: auto;float: left;margin-right: 20px;position: relative} .challenge_nav li{width: auto;float: left;margin-right: 20px;position: relative}
.challenge_nav li.active:after{position: absolute;content: '';width: 50%;background-color: #4CACFF;height: 3px;border-radius: 2px;left: 25%;bottom: 0px;} .challenge_nav li.active:after{position: absolute;content: '';width: 76%;background-color: #4CACFF;height: 3px;border-radius: 2px;left: 25%;bottom: 0px;}
.challenge_nav li a{display: block;width: 100%;padding-bottom: 20px;} .challenge_nav li a{display: block;width: 100%;padding-bottom: 20px;}
.add_choose_type{width: 60px;height: 20px;line-height: 19px;border-radius: 2px;background-color: #eaeaea;color: #999!important;display: block;float: left;text-align: center;margin-top: 4px;} .add_choose_type{width: 60px;height: 20px;line-height: 19px;border-radius: 2px;background-color: #eaeaea;color: #999!important;display: block;float: left;text-align: center;margin-top: 4px;}

@ -130,16 +130,19 @@ class TPMBanner extends Component {
if(this.props.status===0&&this.props.openknows===false){ if(this.props.status===0&&this.props.openknows===false){
if(this.props.shixunsDetails&&this.props.shixunsDetails.shixun_status === 0 && this.props.identity < 5){ if(this.props.shixunsDetails&&this.props.shixunsDetails.shixun_status === 0 && this.props.identity < 5){
if(shixunopenprocess===undefined||shixunopenprocess===false||shixunopenprocess===null){ if(this.props.user&&this.props.user.user_id){
this.setState({ if(shixunopenprocess===undefined||shixunopenprocess===false||shixunopenprocess===null){
openknow:true this.setState({
}) openknow:true
}else{ })
this.setState({ }else{
openknow:false this.setState({
}) openknow:false
})
}
} }
} }
}else{ }else{
this.setState({ this.setState({
openknow:false openknow:false
@ -150,14 +153,16 @@ class TPMBanner extends Component {
if(this.props.public===0&&this.props.status>1&&this.props.openknows===false){ if(this.props.public===0&&this.props.status>1&&this.props.openknows===false){
if(this.props.shixunsDetails&&this.props.shixunsDetails.shixun_status === 2 && this.props.shixunsDetails&&this.props.shixunsDetails.public===0 && this.props.identity < 5){ if(this.props.shixunsDetails&&this.props.shixunsDetails.shixun_status === 2 && this.props.shixunsDetails&&this.props.shixunsDetails.public===0 && this.props.identity < 5){
if(openopenpublictype===undefined||openopenpublictype===false||openopenpublictype===null){ if(this.props.user&&this.props.user.user_id) {
this.setState({ if (openopenpublictype === undefined || openopenpublictype === false || openopenpublictype === null) {
openshowpublictype:true this.setState({
}) openshowpublictype: true
}else{ })
this.setState({ } else {
openshowpublictype:false this.setState({
}) openshowpublictype: false
})
}
} }
} }
}else{ }else{

@ -389,7 +389,6 @@ class TPMIndex extends Component {
let url = window.location.href; let url = window.location.href;
let flag = url.indexOf("add_file")>-1; let flag = url.indexOf("add_file")>-1;
console.log(this.state.openknows)
return ( return (
<div className="newMain clearfix"> <div className="newMain clearfix">
{/*头部*/} {/*头部*/}

@ -35,14 +35,14 @@ if (!window['indexHOCLoaded']) {
// $('head').append($('<link rel="stylesheet" type="text/css" />') // $('head').append($('<link rel="stylesheet" type="text/css" />')
// .attr('href', `${_url_origin}/stylesheets/educoder/antd.min.css?1525440977`)); // .attr('href', `${_url_origin}/stylesheets/educoder/antd.min.css?1525440977`));
$('head').append($('<link rel="stylesheet" type="text/css" />') $('head').append($('<link rel="stylesheet" type="text/css" />')
.attr('href', `${_url_origin}/stylesheets/css/edu-common.css?8`)); .attr('href', `${_url_origin}/stylesheets/css/edu-common.css?2020`));
$('head').append($('<link rel="stylesheet" type="text/css" />') $('head').append($('<link rel="stylesheet" type="text/css" />')
.attr('href', `${_url_origin}/stylesheets/educoder/edu-main.css?8`)); .attr('href', `${_url_origin}/stylesheets/educoder/edu-main.css?2020`));
// index.html有加载 // index.html有加载
$('head').append($('<link rel="stylesheet" type="text/css" />') $('head').append($('<link rel="stylesheet" type="text/css" />')
.attr('href', `${_url_origin}/stylesheets/educoder/edu-all.css?8`)); .attr('href', `${_url_origin}/stylesheets/educoder/edu-all.css?2020`));
// $('head').append($('<link rel="stylesheet" type="text/css" />') // $('head').append($('<link rel="stylesheet" type="text/css" />')

@ -53,8 +53,7 @@ export default class TPMchallengesnew extends Component {
} }
} }
getdatas=()=>{
componentDidMount() {
let id = this.props.match.params.shixunId; let id = this.props.match.params.shixunId;
let checkpointId=this.props.match.params.checkpointId; let checkpointId=this.props.match.params.checkpointId;
@ -73,11 +72,11 @@ export default class TPMchallengesnew extends Component {
task_pass_default: response.data.task_pass_default, task_pass_default: response.data.task_pass_default,
submit_url: response.data.submit_url, submit_url: response.data.submit_url,
checkpointId:checkpointId, checkpointId:checkpointId,
exercisememoMDRefval:response.data.task_pass_default, exercisememoMDRefval:response.data.task_pass_default,
responsedata:response.data responsedata:response.data
}) })
this.exercisememoMDRef.current.setValue(response.data.task_pass_default||'') this.exercisememoMDRef.current.setValue(response.data.task_pass_default||'')
}).catch((error) => { }).catch((error) => {
console.log(error) console.log(error)
}); });
@ -124,17 +123,18 @@ export default class TPMchallengesnew extends Component {
onshixunsmarkvalue:response.data.score, onshixunsmarkvalue:response.data.score,
shixunsskillvaluelist:response.data.tags, shixunsskillvaluelist:response.data.tags,
checkpointId:checkpointId, checkpointId:checkpointId,
exec_time:response.data.exec_time,
tab2url: "/shixuns/" + id + "/challenges/"+checkpointId+"/tab=2", tab2url: "/shixuns/" + id + "/challenges/"+checkpointId+"/tab=2",
tab3url: "/shixuns/" + id + "/challenges/"+checkpointId+"/tab=3", tab3url: "/shixuns/" + id + "/challenges/"+checkpointId+"/tab=3",
exercisememoMDRefval:response.data.task_pass, exercisememoMDRefval:response.data.task_pass,
responsedata:response.data responsedata:response.data
}) })
// exec_time:response.data.exec_time,
if(response.data.power===false){ if(response.data.power===false){
this.props.showSnackbar("你没有权限修改"); this.props.showNotification("你没有权限修改");
} }
this.exercisememoMDRef.current.setValue(response.data.task_pass||'') this.exercisememoMDRef.current.setValue(response.data.task_pass||'')
}).catch((error) => { }).catch((error) => {
console.log(error) console.log(error)
}); });
@ -142,8 +142,24 @@ export default class TPMchallengesnew extends Component {
} }
} }
componentDidUpdate=(prevProps, prevState)=>{
if(prevProps!=this.props){
this.getdatas()
}
}
componentDidMount() {
this.getdatas()
}
onshixunCreatePracticeChange = (e) => { onshixunCreatePracticeChange = (e) => {
if(e.target.value===undefined||e.target.value=== ""||e.target.value=== null){
}else{
this.setState({
shixunCreatePracticeGrouptype:false,
onshixunsmarkvaluetype:false
})
}
let optionsum; let optionsum;
let onshixunsmark; let onshixunsmark;
if(e.target.value===1){ if(e.target.value===1){
@ -164,9 +180,18 @@ export default class TPMchallengesnew extends Component {
} }
shixunCreatePractice = (e) => { shixunCreatePractice = (e) => {
if (e.target.value === undefined|| e.target.value== ""){
}else{
this.setState({
shixunCreatePracticetype:false
})
}
this.setState({ this.setState({
shixunCreatePractice: e.target.value shixunCreatePractice: e.target.value
}) })
} }
CreatePracticesend = () => { CreatePracticesend = () => {
@ -177,28 +202,41 @@ export default class TPMchallengesnew extends Component {
}) })
if(this.props.status===2){ if(this.props.status===2){
this.props.showSnackbar("该实训已经发布不能新建") this.props.showNotification("该实训已经发布不能新建")
this.setState({ this.setState({
CreatePracticesendtype:false CreatePracticesendtype:false
}) })
return return
} }
let {shixunCreatePractice, shixunCreatePracticeGroup, onshixunsmarkvalue, shixunsskillvaluelist,exec_time} = this.state; let {shixunCreatePractice, shixunCreatePracticeGroup, onshixunsmarkvalue, shixunsskillvaluelist,exec_time} = this.state;
if (shixunCreatePractice === undefined||shixunCreatePractice=="") { if (shixunCreatePractice === undefined||shixunCreatePractice=="") {
this.setState({ this.setState({
shixunCreatePracticetype: true, shixunCreatePracticetype: true,
CreatePracticesendtype:false
}) })
// this.props.showSnackbar("任务名称为空")
$('html').animate({ $('html').animate({
scrollTop: 10 scrollTop: 10
}, 1000); }, 1000);
this.setState({
CreatePracticesendtype:false
})
return return
} }
if (shixunCreatePractice.match(/^[ ]*$/)) {
this.props.showNotification("任务名称为空,请勿输入空格");
this.setState({
shixunCreatePracticetype: true,
CreatePracticesendtype:false
})
$('html').animate({
scrollTop: 10
}, 1000);
return
}
if(shixunCreatePracticeGroup===undefined){ if(shixunCreatePracticeGroup===undefined){
this.setState({ this.setState({
shixunCreatePracticeGrouptype:true, shixunCreatePracticeGrouptype:true,
@ -221,24 +259,35 @@ export default class TPMchallengesnew extends Component {
shixunsskillvaluelisttype: true, shixunsskillvaluelisttype: true,
CreatePracticesendtype:false CreatePracticesendtype:false
}) })
// this.props.showSnackbar("技能标签为空") // this.props.showNotification("技能标签为空")
this.props.scrollToAnchor("input_task_tag"); this.props.scrollToAnchor("input_task_tag");
return return
} }
if(exec_time===null||exec_time===undefined||exec_time === ""){ // if(exec_time===null||exec_time===undefined||exec_time === ""){
this.setState({ // this.setState({
shixunExec_timeType:true, // shixunExec_timeType:true,
CreatePracticesendtype:false // CreatePracticesendtype:false
}) // })
return // this.props.scrollToAnchor("exec_time");
} // return
// }
// if (exec_time.match(/^[ ]*$/)) {
// this.props.showNotification("评测时限,请勿输入空格");
// this.setState({
// shixunExec_timeType:true,
// CreatePracticesendtype:false
// })
// this.props.scrollToAnchor("exec_time");
// return
// }
const exercise_editormdvalue = this.exercisememoMDRef.current.getValue().trim(); const exercise_editormdvalue = this.exercisememoMDRef.current.getValue().trim();
let id = this.props.match.params.shixunId; let id = this.props.match.params.shixunId;
let url = "/shixuns/" + id + "/challenges.json"; let url = "/shixuns/" + id + "/challenges.json";
// exec_time:exec_time
axios.post(url, { axios.post(url, {
identifier:id, identifier:id,
subject: shixunCreatePractice, subject: shixunCreatePractice,
@ -247,7 +296,6 @@ export default class TPMchallengesnew extends Component {
score: onshixunsmarkvalue, score: onshixunsmarkvalue,
challenge_tag: shixunsskillvaluelist, challenge_tag: shixunsskillvaluelist,
st: 0, st: 0,
exec_time:exec_time
}).then((response) => { }).then((response) => {
if (response.data.status === 1) { if (response.data.status === 1) {
// $("html").animate({ scrollTop: 0 }) // $("html").animate({ scrollTop: 0 })
@ -262,7 +310,7 @@ export default class TPMchallengesnew extends Component {
// }) // })
} }
// this.props.showSnackbar(response.data.messages); // this.props.showNotification(response.data.messages);
}).catch((error) => { }).catch((error) => {
console.log(error) console.log(error)
}); });
@ -299,6 +347,12 @@ export default class TPMchallengesnew extends Component {
let list = shixunsskillvaluelist; let list = shixunsskillvaluelist;
list.push(shixunsskillvalue); list.push(shixunsskillvalue);
if (list.length> 0) {
this.setState({
shixunsskillvaluelisttype: false,
})
}
this.setState({ this.setState({
shixunsskillvaluelist: list, shixunsskillvaluelist: list,
shixunsskillvalue: "" shixunsskillvalue: ""
@ -328,19 +382,32 @@ export default class TPMchallengesnew extends Component {
let url = "/shixuns/"+id+"/challenges/"+checkpointId+".json"; let url = "/shixuns/"+id+"/challenges/"+checkpointId+".json";
if (shixunCreatePractice === undefined||shixunCreatePractice=="") { if (shixunCreatePractice === undefined||shixunCreatePractice=="") {
// this.setState({ this.setState({
// shixunCreatePracticetype: true shixunCreatePracticetype: true,
// }) editPracticesendtype:false
this.props.showSnackbar("任务名称为空") })
// this.props.showNotification("任务名称为空")
$('html').animate({ $('html').animate({
scrollTop: 10 scrollTop: 10
}, 1000); }, 1000);
return
}
if (shixunCreatePractice.match(/^[ ]*$/)) {
this.props.showNotification("任务名称为空,请勿输入空格");
this.setState({ this.setState({
editPracticesendtype:false shixunCreatePracticetype: true,
editPracticesendtype:false
}) })
$('html').animate({
scrollTop: 10
}, 1000);
return return
} }
if(shixunCreatePracticeGroup===undefined){ if(shixunCreatePracticeGroup===undefined){
this.setState({ this.setState({
shixunCreatePracticeGrouptype:true, shixunCreatePracticeGrouptype:true,
@ -359,24 +426,33 @@ export default class TPMchallengesnew extends Component {
} }
if (shixunsskillvaluelist.length === 0) { if (shixunsskillvaluelist.length === 0) {
// this.setState({
// shixunsskillvaluelisttype: true
// })
// this.props.showSnackbar("技能标签为空")
this.props.scrollToAnchor("input_task_tag");
this.setState({ this.setState({
editPracticesendtype:false, shixunsskillvaluelisttype: true,
editPracticesendtype:false,
}) })
this.props.scrollToAnchor("input_task_tag");
return return
} }
if(exec_time===null||exec_time===undefined||exec_time === ""){ // if(exec_time===null||exec_time===undefined||exec_time === ""){
this.setState({ // this.setState({
shixunExec_timeType:true, // shixunExec_timeType:true,
editPracticesendtype:false // editPracticesendtype:false
}) // })
return // this.props.scrollToAnchor("exec_time");
} // return
// }
// if (exec_time.match(/^[ ]*$/)) {
// this.props.showNotification("评测时限,请勿输入空格");
// this.setState({
// shixunExec_timeType:true,
// editPracticesendtype:false
// })
// this.props.scrollToAnchor("exec_time");
// return
// }
// exec_time:exec_time
axios.put(url, { axios.put(url, {
tab:0, tab:0,
identifier:id, identifier:id,
@ -386,11 +462,10 @@ export default class TPMchallengesnew extends Component {
task_pass: exercise_editormdvalue, task_pass: exercise_editormdvalue,
difficulty: shixunCreatePracticeGroup, difficulty: shixunCreatePracticeGroup,
score: onshixunsmarkvalue, score: onshixunsmarkvalue,
exec_time:exec_time
}, },
challenge_tag:shixunsskillvaluelist challenge_tag:shixunsskillvaluelist
}).then((response) => { }).then((response) => {
this.props.showSnackbar(response.data.messages); this.props.showNotification(response.data.messages);
if (response.data.status === 1) { if (response.data.status === 1) {
// window.location.href=`/shixuns/${id}/challenges/${checkpointId}/tab=2`; // window.location.href=`/shixuns/${id}/challenges/${checkpointId}/tab=2`;
this.setState({ this.setState({
@ -428,7 +503,6 @@ export default class TPMchallengesnew extends Component {
} }
gotocheckpoint=(url)=>{ gotocheckpoint=(url)=>{
debugger
this.props.history.replace(url); this.props.history.replace(url);
} }
render() { render() {
@ -454,26 +528,21 @@ export default class TPMchallengesnew extends Component {
// console.log(this.props) // console.log(this.props)
// console.log(this.state) // console.log(this.state)
// console.log(responsedata) //a console.log(shixunCreatePractice)
return ( return (
<React.Fragment> <React.Fragment>
<div className="educontent mt30 mb30"> <div className="educontent mt30 mb30">
<div className="TPMchallengesnewtitles edu-back-white clearfix borderbottomf4"> <div className="TPMchallengesnewtitles edu-back-white clearfix borderbottomf4">
<span className="font-16 task-hide fl TPMtaskName">{position}{responsedata&&responsedata.st === 0 ?"实践题":"选择题"}</span> <span className="font-16 task-hide fl TPMtaskName">{position}{responsedata&&responsedata.st === 0 ?"实践题":"选择题"}</span>
{this.props.identity>4||this.props.identity===undefined||this.props.status===2||this.props.status===1?"":<a href={practice_url === undefined ? "" : practice_url} className="fr ml15 mt13">
{this.props.identity>4||this.props.identity===undefined||this.props.status===2||this.props.status===1?"":<Link to={practice_url === undefined ? "" : practice_url}
className="fr ml15 mt13">
<Button type="primary" className="edu-default-btn edu-greenback-btn " <Button type="primary" className="edu-default-btn edu-greenback-btn "
>新增实践任务</Button></Link>} >新增实践任务</Button></a>}
{this.props.identity>4||this.props.identity===undefined||this.props.status===2||this.props.status===1?"":<Link to={choice_url === undefined ? "" : choice_url} {this.props.identity>4||this.props.identity===undefined||this.props.status===2||this.props.status===1?"":<Link to={choice_url === undefined ? "" : choice_url}
className="fr ml15 mt13"> className="fr ml15 mt13">
<Button type="primary" <Button type="primary"
className="edu-default-btn edu-greenback-btn mr5" className="edu-default-btn edu-greenback-btn mr5"
>新增选择题任务</Button></Link>} >新增选择题任务</Button></Link>}
{next_challenge===undefined?"": {next_challenge===undefined?"":
<Button type="primary" ghost onClick={()=>this.gotocheckpoint(next_challenge)} <Button type="primary" ghost onClick={()=>this.gotocheckpoint(next_challenge)}
className="edu-default-btn edu-greenback-btn mr5 fr ml15 mt13" className="edu-default-btn edu-greenback-btn mr5 fr ml15 mt13"
@ -482,13 +551,6 @@ export default class TPMchallengesnew extends Component {
<Button type="primary" ghost onClick={()=>this.gotocheckpoint(prev_challenge)} <Button type="primary" ghost onClick={()=>this.gotocheckpoint(prev_challenge)}
className="edu-default-btn edu-greenback-btn mr5 fr ml15 mt13" className="edu-default-btn edu-greenback-btn mr5 fr ml15 mt13"
>上一关</Button>} >上一关</Button>}
{/*{ next_challenge===undefined?"":*/}
{/* <a href={next_challenge}className="fr color-blue ml15 mt4">下一关</a>*/}
{/*}*/}
{/*{ prev_challenge===undefined?"":*/}
{/* <a href={prev_challenge} className="fr color-blue ml15 mt4">上一关</a>*/}
{/*}*/}
</div> </div>
<div className="challenge_nav clearfix edu-back-white"> <div className="challenge_nav clearfix edu-back-white">
@ -503,23 +565,14 @@ export default class TPMchallengesnew extends Component {
{tab3url === "" ? "":<li> > </li>} {tab3url === "" ? "":<li> > </li>}
<li className=""> <li className="">
{tab3url === "" ? <span></span> : <Link to={tab3url}> 3</Link>} {tab3url === "" ? <span></span> : <Link to={tab3url}> 3</Link>}
</li> </li>
</div> </div>
<div className="edu-back-white clearfix"> <div className="edu-back-white clearfix">
<div className="newpadding1020"> <div className="newpadding1020">
<p className="color-grey-6 font-16 mb10"> <span className="mr5 color-orange">*</span></p> <p className="color-grey-6 font-16 mb10"> <span className="mr5 color-red">*</span></p>
<div> <div>
<div className="flex1"> <div className="flex1">
{/*<input type="text"*/}
{/* // className="input-100-45 greyInput"*/}
{/* className={shixunCreatePracticetype===true?"input-100-45 greyInpus wind100":"input-100-45 greyInput "}*/}
{/* maxLength="60"*/}
{/* name="challenge[subject]"*/}
{/* value={shixunCreatePractice}*/}
{/* onInput={this.shixunCreatePractice}*/}
{/* placeholder="请输入任务名称最大限制60个字符此信息将在实训发布后展示给学员计算学生的课程成绩绩点"/>*/}
<Input placeholder="请输入任务名称最大限制60个字符此信息将在实训发布后展示给学员计算学生的课程成绩绩点" <Input placeholder="请输入任务名称最大限制60个字符此信息将在实训发布后展示给学员计算学生的课程成绩绩点"
maxLength="60" maxLength="60"
className={shixunCreatePracticetype === true ? "bor-red":"newViewAfter"} className={shixunCreatePracticetype === true ? "bor-red":"newViewAfter"}
@ -529,9 +582,7 @@ export default class TPMchallengesnew extends Component {
/> />
</div> </div>
<div> <div>
<span <span className={shixunCreatePracticetype === true ? "color-red mt8 fl block" : "color-red mt8 fl none"} id="new_shixun_name">必填项不能为空</span>
className={shixunCreatePracticetype === true ? "color-red mt8 fl block" : "color-red mt8 fl none"}
id="new_shixun_name">必填项不能为空</span>
</div> </div>
</div> </div>
</div> </div>
@ -540,7 +591,7 @@ export default class TPMchallengesnew extends Component {
<div className="edu-back-white newpadding02020"> <div className="edu-back-white newpadding02020">
<p className="color-grey-6 font-16 mb10"><span className="mr5 color-orange">*</span></p> <p className="color-grey-6 font-16 mb10"><span className="mr5 color-red">*</span></p>
<style> <style>
{ {
` `
@ -565,7 +616,7 @@ export default class TPMchallengesnew extends Component {
<div className="edu-back-white newpadding02020"> <div className="edu-back-white newpadding02020">
<p className="color-grey-6 font-16 mb20"> <p className="color-grey-6 font-16 mb20">
<span className="fl color-orange mr5">*</span> <span className="fl color-red mr5">*</span>
难度系数 难度系数
<RadioGroup value={shixunCreatePracticeGroup} <RadioGroup value={shixunCreatePracticeGroup}
className={"ml10"} className={"ml10"}
@ -579,21 +630,8 @@ export default class TPMchallengesnew extends Component {
{this.state.shixunCreatePracticeGrouptype===true?<div className="color-red mt7 ml5 font-14" id="ex_value_notice"> {this.state.shixunCreatePracticeGrouptype===true?<div className="color-red mt7 ml5 font-14" id="ex_value_notice">
必选项不能为空</div>:""} 必选项不能为空</div>:""}
</p> </p>
{/*<div className="clearfix mb40">*/} <p className="color-grey-6 font-16 mb10"> <span className="fl mr5 color-red">*</span> <span className={"color-grey-8 font-14"}> (+100+100)</span></p>
<div className="clearfix">
{/* <RadioGroup value={shixunCreatePracticeGroup} className="fl mr40"*/}
{/* disabled={this.props.status===2?true:false}*/}
{/* onChange={this.props.status===2?"":this.onshixunCreatePracticeChange}>*/}
{/* <Radio value={1}>简单</Radio>*/}
{/* <Radio value={2}>中等</Radio>*/}
{/* <Radio value={3}>困难</Radio>*/}
{/* </RadioGroup>*/}
{/*</div>*/}
<p className="color-grey-6 font-16 mb10"> <span className="fl mr5 color-orange">*</span> <span className={"color-grey-8 font-14"}> (+100+100)</span></p>
<div className="clearfix"
// onMouseLeave={this.props.status===2?"":this.onshixunsmarkss}
>
{this.state.onshixunsmarkvaluetype===true?<style> {this.state.onshixunsmarkvaluetype===true?<style>
{ {
` `
@ -607,20 +645,12 @@ export default class TPMchallengesnew extends Component {
className={"winput-240-40 ml3"} className={"winput-240-40 ml3"}
id="challenge_score" id="challenge_score"
onChange={this.props.status===2?"":this.onshixunsmark} onChange={this.props.status===2?"":this.onshixunsmark}
// onMouseEnter={this.props.status===2?"":this.onshixunsmarks}
disabled={this.props.status===2?true:false} disabled={this.props.status===2?true:false}
// open={marktype}
value={onshixunsmarkvalue} value={onshixunsmarkvalue}
getPopupContainer={triggerNode => triggerNode.parentNode} getPopupContainer={triggerNode => triggerNode.parentNode}
> >
{options} {options}
</Select> </Select>
{/*<p className="fl color-grey-9 font-12 ml20">*/}
{/* 如果学员答题错误,则不能得到相应的经验值<br/>*/}
{/* 如果学员成功得到经验值,那么将同时获得等值的金币奖励,如:+10经验值、+10金币*/}
{/*</p>*/}
{this.state.onshixunsmarkvaluetype===true?<div className="color-red mt7 ml5" id="ex_value_notice"> {this.state.onshixunsmarkvaluetype===true?<div className="color-red mt7 ml5" id="ex_value_notice">
必选项不能为空</div>:""} 必选项不能为空</div>:""}
</div> </div>
@ -628,7 +658,7 @@ export default class TPMchallengesnew extends Component {
<div className="edu-back-white newpadding02020"> <div className="edu-back-white newpadding02020">
<p className="color-grey-6 font-16 mb10"><span className="mr5 color-orange">*</span><span className={"color-grey-8 font-14"}> ()</span></p> <p className="color-grey-6 font-16 mb10"><span className="mr5 color-red">*</span><span className={"color-grey-8 font-14"}> ()</span></p>
<div className="clearfix"> <div className="clearfix">
<div className="flex1"> <div className="flex1">
<Input type="text" <Input type="text"
@ -662,18 +692,20 @@ export default class TPMchallengesnew extends Component {
</div> </div>
</div> </div>
<div className="edu-back-white newpadding02020"> {/*<div className="edu-back-white newpadding02020">*/}
<p className="color-grey-6 font-16 mb20"> <span className="color-orange mr5 fl">*</span> (S)</p> {/* <p className="color-grey-6 font-16 mb20"> <span className="color-orange mr5 fl">*</span> 服务配置:评测时限(S)</p>*/}
<div className="clearfix mb5 ml10"> {/* <div className="clearfix mb5 ml10">*/}
<div className="pr status_con"> {/* <div className="pr status_con" id={"exec_timeid"}>*/}
{/*<label className="panel-form-label fl"></label>*/} {/* /!*<label className="panel-form-label fl"></label>*!/*/}
<input value={this.state.exec_time} className="panel-box-sizing task-form-100 task-height-40" placeholder="请输入类别名称" onInput={this.setexec_time}/> {/* <input value={this.state.exec_time}*/}
</div> {/* className={this.state.shixunExec_timeType === true ?"panel-box-sizing task-form-100 task-height-40 bor-red":"panel-box-sizing task-form-100 task-height-40" }*/}
<div {/* placeholder="请输入类别名称" onInput={this.setexec_time}/>*/}
className={this.state.shixunExec_timeType === true ? "color-red mt8 block ml5" : " none"} {/* </div>*/}
id="new_shixun_name">必填项不能为空</div> {/* <div*/}
</div> {/* className={this.state.shixunExec_timeType === true ? "color-red mt8 block ml5" : " none"}*/}
</div> {/* id="new_shixun_name">必填项:不能为空</div>*/}
{/* </div>*/}
{/*</div>*/}
</div> </div>

@ -1,97 +1,32 @@
import React, {Component} from 'react'; import React, {Component} from 'react';
import {Input, Select, Radio, Checkbox, Popconfirm, message, Modal,Button,Icon,Tooltip} from 'antd'; import {Input, Select, Radio, Checkbox, Modal,Button,Tooltip} from 'antd';
import {BrowserRouter as Router, Route, Link, Switch} from "react-router-dom"; import { Link} from "react-router-dom";
// import "antd/dist/antd.css";
import axios from 'axios'; import axios from 'axios';
import { getImageUrl, toPath } from 'educoder'; import Bottomsubmit from "../../modals/Bottomsubmit";
import './css/TPMchallengesnew.css';
import {getUrl} from 'educoder'; import { getImageUrl } from 'educoder';
let origin = getUrl(); import './css/TPMchallengesnew.css';
let path = getUrl("/editormd/lib/")
const $ = window.$; const $ = window.$;
let timeout;
let currentValue;
const Option = Select.Option; const Option = Select.Option;
const RadioGroup = Radio.Group; const RadioGroup = Radio.Group;
const { TextArea } = Input; const { TextArea } = Input;
function create_editorMD(id, width, high, placeholder, imageUrl, callback) { function isNulltpm( str ){
var editorName = window.editormd(id, { if ( str == "" ) return true;
width: width, var regu = "^[ ]+$";
height: high, var re = new RegExp(regu);
path: path, // "/editormd/lib/" return re.test(str);
syncScrolling: "single",
tex: true,
tocm: true,
emoji: true,
taskList: true,
codeFold: true,
searchReplace: true,
htmlDecode: "style,script,iframe",
sequenceDiagram: true,
autoFocus: false,
toolbarIcons: function () {
// Or return editormd.toolbarModes[name]; // full, simple, mini
// Using "||" set icons align right.
return ["bold", "italic", "|", "list-ul", "list-ol", "|", "code", "code-block", "|", "testIcon", "testIcon1", '|', "image", "table", '|', "watch", "clear"]
},
toolbarCustomIcons: {
testIcon: "<a type=\"inline\" class=\"latex\" ><div class='zbg'></div></a>",
testIcon1: "<a type=\"latex\" class=\"latex\" ><div class='zbg_latex'></div></a>"
},
//这个配置在simple.html中并没有但是为了能够提交表单使用这个配置可以让构造出来的HTML代码直接在第二个隐藏的textarea域中方便post提交表单。
saveHTMLToTextarea: true,
// 用于增加自定义工具栏的功能可以直接插入HTML标签不使用默认的元素创建图标
dialogMaskOpacity: 0.6,
placeholder: placeholder,
imageUpload: true,
imageFormats: ["jpg", "jpeg", "gif", "png", "bmp", "webp", "JPG", "JPEG", "GIF", "PNG", "BMP", "WEBP"],
imageUploadURL: imageUrl,//url
onload: function () {
// this.previewing();
$("#" + id + " [type=\"latex\"]").bind("click", function () {
editorName.cm.replaceSelection("```latex");
editorName.cm.replaceSelection("\n");
editorName.cm.replaceSelection("\n");
editorName.cm.replaceSelection("```");
var __Cursor = editorName.cm.getDoc().getCursor();
editorName.cm.setCursor(__Cursor.line - 1, 0);
});
$("#" + id + " [type=\"inline\"]").bind("click", function () {
editorName.cm.replaceSelection("`$$$$`");
var __Cursor = editorName.cm.getDoc().getCursor();
editorName.cm.setCursor(__Cursor.line, __Cursor.ch - 3);
editorName.cm.focus();
});
$("[type=\"inline\"]").attr("title", "行内公式");
$("[type=\"latex\"]").attr("title", "多行公式");
window.md_elocalStorage(editorName, `exercise__${id}`, "Memochallengesnew");
callback && callback()
}
});
return editorName;
} }
export default class TPMevaluation extends Component { export default class TPMevaluation extends Component {
constructor(props) { constructor(props) {
super(props) super(props)
@ -127,39 +62,11 @@ export default class TPMevaluation extends Component {
scorevalue:false, scorevalue:false,
markvalue:true, markvalue:true,
scoretype:undefined, scoretype:undefined,
web_route:null web_route:null,
exec_time:undefined
} }
} }
exerciseMD(initValue, id) {
this.contentChanged = false;
const placeholder = "";
// amp;
// 编辑时要传memoId
const imageUrl = `/api/attachments.json`;
// 创建editorMd
const exercise_editormd = create_editorMD(id, '100%', 400, placeholder, imageUrl, () => {
setTimeout(() => {
exercise_editormd.resize()
exercise_editormd.cm && exercise_editormd.cm.refresh()
}, 500)
if (initValue != undefined) {
exercise_editormd.setValue(initValue)
}
exercise_editormd.cm.on("change", (_cm, changeObj) => {
console.log('....contentChanged')
this.contentChanged = true;
})
});
this.exercise_editormd = exercise_editormd;
window.exercise_editormd = exercise_editormd;
}
componentDidMount() { componentDidMount() {
let id = this.props.match.params.shixunId; let id = this.props.match.params.shixunId;
let checkpointId=this.props.match.params.checkpointId; let checkpointId=this.props.match.params.checkpointId;
@ -193,8 +100,7 @@ export default class TPMevaluation extends Component {
let newevaluationlist=[] let newevaluationlist=[]
if(response.data.test_sets.length===0){ if(response.data.test_sets.length===0){
let newlist=[ let newlist=[
{hidden:0,input:"",output:"",score:50}, {hidden:0,input:"",output:"",score:100},
{hidden:0,input:"",output:"",score:50}
] ]
newevaluationlist=newlist newevaluationlist=newlist
}else{ }else{
@ -219,18 +125,16 @@ export default class TPMevaluation extends Component {
scorevalue:response.data.test_set_score, scorevalue:response.data.test_set_score,
markvalue:response.data.test_set_average, markvalue:response.data.test_set_average,
web_route:response.data.web_route, web_route:response.data.web_route,
has_web_route:response.data.has_web_route has_web_route:response.data.has_web_route,
responsedata:response.data,
exec_time:response.data.exec_time,
}) })
this.evaluationoninputvalueonload(); this.evaluationoninputvalueonload();
if(response.data.power===false){ if(response.data.power===false){
this.props.showSnackbar("你没有权限修改"); this.props.showNotification("你没有权限修改");
}
if(response.data.answer===undefined){
this.answerMD("", "answerMD");
}else{
this.answerMD(response.data.answer, "answerMD");
} }
}).catch((error) => { }).catch((error) => {
console.log(error) console.log(error)
}); });
@ -379,34 +283,6 @@ export default class TPMevaluation extends Component {
} }
// delesavegetfilepath=(value)=>{
// let {selectpatharr} = this.state
// let newarr =selectpatharr;
// let newselectpath="";
// for(var i=0; i<newarr.length;i++){
// if(newarr[i]===value){
//
// newarr.splice(i,1);
// console.log(newarr)
// console.log(value)
// }
// }
//
//
//
//
// for(var z=0; z<newarr.length;z++){
// newselectpath=newselectpath+newarr[z]+ ""
// }
// this.setState({
// selectpatharr:newarr,
// selectpath: newselectpath
// })
// }
savegetfilepath=(value)=>{ savegetfilepath=(value)=>{
let {selectpath,saveshixunfilepath,pathtype} = this.state let {selectpath,saveshixunfilepath,pathtype} = this.state
@ -438,30 +314,6 @@ export default class TPMevaluation extends Component {
}) })
} }
// let newarr =selectpatharr;
// let arrtype=false;
// let arrsum=0;
// let newselectpath="";
// newarr.push(value)
// if(newarr.length>1&&arrtype===false){
// for(var i=0; i<newarr.length;i++){
// if(newarr[i]===value){
// arrsum=arrsum+1;
// if(arrsum===2){
// newarr.splice(i,1);
// arrtype=true;
// }
// }
// }
// }
// for(var z=0; z<newarr.length;z++){
// newselectpath=newselectpath+newarr[z]+ ""
// }
} }
evaluationenter=()=>{ evaluationenter=()=>{
@ -505,12 +357,6 @@ export default class TPMevaluation extends Component {
}else{ }else{
newtype=1; newtype=1;
} }
// newevaluationlist[key].is_public=newtype;
// for(var i=0; i<newevaluationlist.length; i++){
// if(i===key){
//
// }
// }
newevaluationlist[key].hidden=newtype; newevaluationlist[key].hidden=newtype;
this.setState({ this.setState({
@ -597,7 +443,7 @@ export default class TPMevaluation extends Component {
$('textarea[autoHeight]').autoHeight(); $('textarea[autoHeight]').autoHeight();
} }
submitarbitrationevaluation=()=>{ submitarbitrationevaluation=()=>{
let{evaluationlist,shixunfilepath,shixunfilepathplay,shixunfileexpectpicturepath,shixunfilestandardpicturepath,shixunfilepicturepath,pathoptionvalue,scorevalue,markvalue,web_route}=this.state; let{exec_time,evaluationlist,shixunfilepath,shixunfilepathplay,shixunfileexpectpicturepath,shixunfilestandardpicturepath,shixunfilepicturepath,pathoptionvalue,scorevalue,markvalue,web_route}=this.state;
let newscorevalue; let newscorevalue;
@ -610,7 +456,7 @@ export default class TPMevaluation extends Component {
let sum=0; let sum=0;
for(var i=0; i<evaluationlist.length; i++){ for(var i=0; i<evaluationlist.length; i++){
if(evaluationlist[i].score>100){ if(evaluationlist[i].score>100){
this.props.showSnackbar("测试集的评分占比不能大于100"); this.props.showNotification("测试集的评分占比不能大于100");
this.setState({ this.setState({
scoretype:i scoretype:i
}) })
@ -620,36 +466,52 @@ export default class TPMevaluation extends Component {
} }
if(sum>100||sum<100){ if(sum>100||sum<100){
this.props.showSnackbar("测试集的评分占比之和必须等于100"); this.props.showNotification("测试集的评分占比之和必须等于100");
return return
} }
} }
if(exec_time===null||exec_time===undefined||exec_time === ""){
this.setState({
shixunExec_timeType:true,
})
this.props.scrollToAnchor("exec_timeid");
return
}
if (isNulltpm(exec_time)) {
this.props.showNotification("评测时长,请勿输入空格");
this.setState({
shixunExec_timeType:true,
})
this.props.scrollToAnchor("exec_timeid");
return
}
if(shixunfilepath===undefined||shixunfilepath===""||shixunfilepath===null){ if(shixunfilepath===undefined||shixunfilepath===""||shixunfilepath===null){
this.props.showSnackbar("学员任务文件路径为空"); // this.props.showSnackbar("学员任务文件路径为空");
this.setState({ this.setState({
StudentTaskPapers:true StudentTaskPapers:true
}) })
$('html').animate({ this.props.scrollToAnchor("Studenttaskfile");
scrollTop: 120
}, 1000);
return return
} }
if(shixunfilepathplay===undefined||shixunfilepathplay===""||shixunfilepathplay===null){ if(shixunfilepathplay===undefined||shixunfilepathplay===""||shixunfilepathplay===null){
this.props.showSnackbar("评测执行文件路径为空"); // this.props.showSnackbar("评测执行文件路径为空");
this.setState({ this.setState({
StudentTaskDocs:true StudentTaskDocs:true
}) })
$('html').animate({ this.props.scrollToAnchor("Benchmarkexecutable");
scrollTop: 130
}, 1000);
return return
} }
if(evaluationlist.length===0){ if(evaluationlist.length===0){
this.props.showSnackbar("测试集不能为空"); this.props.showSnackbar("测试集不能为空");
this.props.scrollToAnchor("Thetestset");
return return
} }
let id = this.props.match.params.shixunId; let id = this.props.match.params.shixunId;
@ -664,7 +526,8 @@ export default class TPMevaluation extends Component {
picture_path:pathoptionvalue===-1?undefined:shixunfilepicturepath===undefined?null:shixunfilepicturepath, picture_path:pathoptionvalue===-1?undefined:shixunfilepicturepath===undefined?null:shixunfilepicturepath,
test_set_score:newscorevalue, test_set_score:newscorevalue,
test_set_average:markvalue, test_set_average:markvalue,
web_route:web_route===null?undefined:web_route web_route:web_route===null?undefined:web_route,
exec_time:exec_time
} }
axios.put(url,{ axios.put(url,{
tab:1, tab:1,
@ -672,7 +535,7 @@ export default class TPMevaluation extends Component {
test_set:evaluationlist test_set:evaluationlist
} }
).then((response) => { ).then((response) => {
this.props.showSnackbar(response.data.messages); this.props.showNotification(response.data.messages);
window.location.href=`/shixuns/${id}/challenges/${response.data.challenge_id}/tab=3`; window.location.href=`/shixuns/${id}/challenges/${response.data.challenge_id}/tab=3`;
// if(response.data.status===1){ // if(response.data.status===1){
// window.location.href = "/shixuns/" + id + "/challenges/"+response.data.challenge_id+"/tab=3" // window.location.href = "/shixuns/" + id + "/challenges/"+response.data.challenge_id+"/tab=3"
@ -681,16 +544,7 @@ export default class TPMevaluation extends Component {
console.log(error) console.log(error)
}); });
} }
handpathoptionvalues=()=>{
this.setState({
handpathopt:true
})
}
handpathoptionvaluess=()=>{
this.setState({
handpathopt:false
})
}
saveselectpath=(e)=>{ saveselectpath=(e)=>{
this.setState({ this.setState({
@ -768,6 +622,24 @@ export default class TPMevaluation extends Component {
web_route:e.target.value web_route:e.target.value
}) })
} }
gotocheckpoint=(url)=>{
this.props.history.replace(url);
}
setexec_time=(e)=>{
if(e.target.value===null||e.target.value===undefined||e.target.value === ""||e.target.value.match(/^[ ]*$/)){
}else{
this.setState({
shixunExec_timeType:false,
})
}
this.setState({
exec_time:e.target.value
})
}
render() { render() {
let { let {
@ -799,7 +671,8 @@ export default class TPMevaluation extends Component {
scorevalue, scorevalue,
markvalue, markvalue,
scoretype, scoretype,
has_web_route has_web_route,
responsedata
} = this.state; } = this.state;
let tab1url="/shixuns/" + shixunId + "/challenges/"+checkpointId+"/editcheckpoint"; let tab1url="/shixuns/" + shixunId + "/challenges/"+checkpointId+"/editcheckpoint";
@ -812,64 +685,115 @@ export default class TPMevaluation extends Component {
lineHeight: '30px', lineHeight: '30px',
marginLeft: '20px', marginLeft: '20px',
}; };
return ( return (
<React.Fragment> <React.Fragment>
<div className="educontent mt30 mb30"> <div className="educontent mt30 mb30">
<div className="padding10-20 mb10 edu-back-white clearfix"> <div className="TPMchallengesnewtitles edu-back-white clearfix borderbottomf4">
<span className="fl ring-blue mr10 mt7"> <span className="font-16 task-hide fl TPMtaskName">{position}{responsedata&&responsedata.st === 0 ?"实践题":"选择题"}</span>
<img src={getImageUrl("images/educoder/icon/code.svg")} data-tip-down="实训任务" className="fl mt2 ml2"/> {this.props.identity>4||this.props.identity===undefined||this.props.status===2||this.props.status===1?"":<a href={practice_url === undefined ? "" : practice_url} className="fr ml15 mt13">
</span> <Button type="primary" className="edu-default-btn edu-greenback-btn "
<span className="font-16 task-hide fl TPMtaskName">{position}</span> >新增实践任务</Button></a>}
<Link to={go_back_url === undefined ? "" : go_back_url} {this.props.identity>4||this.props.identity===undefined||this.props.status===2||this.props.status===1?"":<Link to={choice_url === undefined ? "" : choice_url}
className="color-grey-6 fr font-15 mt3">返回</Link> className="fr ml15 mt13">
<Button type="primary"
{prev_challenge === undefined ? "" : className="edu-default-btn edu-greenback-btn mr5"
<a href={prev_challenge} className="fr color-blue mr15 mt4">上一关</a> >新增选择题任务</Button></Link>}
} {next_challenge===undefined?"":
<Button type="primary" ghost onClick={()=>this.gotocheckpoint(next_challenge)}
{next_challenge === undefined ? "" : className="edu-default-btn edu-greenback-btn mr5 fr ml15 mt13"
<a href={next_challenge} className="fr color-blue mr15 mt4">下一关</a> >下一关</Button> }
} {prev_challenge===undefined?"":
<Button type="primary" ghost onClick={()=>this.gotocheckpoint(prev_challenge)}
<a href={practice_url === undefined ? "" : practice_url} className="edu-default-btn edu-greenback-btn mr5 fr ml15 mt13"
className="fr color-blue mr15 mt4" >上一关</Button>}
style={{display:this.props.identity>4||this.props.identity===undefined||this.props.status===2||this.props.status===1? "none":'block'}}
data-tip-down="新增代码编辑类型的任务">+&nbsp;实践类型</a>
<a href={choice_url === undefined ? "" : choice_url}
className="fr color-blue mr15 mt4"
style={{display:this.props.identity>4||this.props.identity===undefined||this.props.status===2||this.props.status===1?"none":'block'}}
data-tip-down="新增选择题类型的任务">+&nbsp;选择题类型</a>
</div> </div>
<div className="challenge_nav clearfix edu-back-white"> <div className="challenge_nav clearfix edu-back-white">
<li> <li>
<Link to={tab1url}>本关任务</Link> <Link to={tab1url}>1本关任务 </Link>
</li> </li>
{tab2url === "" ? "":<li> > </li>}
<li className="active"> <li className="active">
<Link to={tab2url}>评测设置</Link> <Link to={tab2url} className={"color-blue"}>2评测设置</Link>
</li> </li>
{tab3url === "" ? "":<li> > </li>}
<li className=""> <li className="">
<Link to={tab3url}>参考答案</Link> <Link to={tab3url}> 3参考答案</Link>
</li> </li>
</div> </div>
<p className="color-orange-tip font-12 padding20"> <p className="color-orange-tip font-14 padding10 edu-back-white text-centers">
请先上传本关任务的所有代码文件标准图片等所有必要的文件到 <div className={"bor25510211"}>
<a href={"/shixuns/" + shixunId + "/repository"} className="color-bule-tip decoration" target="_blank">版本库</a> 请先上传本关任务的所有代码文件标准图片等所有必要的文件到
<a href={"/shixuns/" + shixunId + "/repository"} className="color-bule-tip decoration" target="_blank">版本库</a>
</div>
</p> </p>
<div className="edu-back-white newpadding02020" id={"exec_timeid"} >
<p className="color-grey-6 font-16 mb20"> <span className="color-red mr5 fl">*</span> <span className={"color-grey-8 font-14"}></span></p>
<div className="clearfix mb5">
<div className="pr status_con" style={{'width':'233px'}}>
<Input value={this.state.exec_time}
className={this.state.shixunExec_timeType === true ?"panel-box-sizing task-form-100 task-height-40 bor-red":"panel-box-sizing task-form-100 task-height-40" }
placeholder="请输入评测时长" onInput={this.setexec_time}/>
</div>
<div
className={this.state.shixunExec_timeType === true ? "color-red mt8 block ml5" : " none"}
id="new_shixun_name">必填项不能为空</div>
</div>
</div>
<div className="edu-back-white mb10 clearfix">
<div className="padding40-20"> <div className="edu-back-white clearfix">
<p className="color-grey-6 font-16 mb20">学员任务文件</p> <div className="padding1020tpms mb10">
<div className="df"> <p className="color-grey-6 font-16 mb20"><span className="color-red mr5 fl">*</span> <span className={"color-grey-8 font-14"}></span></p>
<span className="mr30 color-orange pt10">*</span> <div className="pr">
<div className="flex1 mr20"> <Select className="winput-240-40"
<input type="text" className="input-100-45 greyInput change" id="shixun_file_path" value={pathoptionvalue}
onChange={this.handpathoptionvalue}>
<Option value={-1}></Option>
<Option value={1}>图片</Option>
<Option value={2}>apk/exe</Option>
<Option value={3}>txt</Option>
<Option value={4}>html</Option>
<Option value={5}>mp3</Option>
<Option value={6}>mp4</Option>
</Select>
<a className="ml10" onClick={()=>this.showrepositoryurltip(1)}><img src={getImageUrl("images/educoder/problem.png")}/></a>
<div className="invite-tip clearfix repository_url_tippostion" style={{display:showrepositoryurltiptype===true?"block":"none"}} id="repository_url_tip"
>
<span className="top-black-trangleft"></span>
<div className="padding20 invitecontent clearfix">
<p className="font-12 edu-txt-left">
图片处理或输出图片类型的任务请选填此项<br/>
可以通过设置图片路径和学员答案文件路径展示代码对应的图片效果<br/><br/>
apk/exe写可执行文件的任务请选填此项<br/>
可以通过设置学员答案文件路径展示二维码以供扫码下载<br/><br/>
txt输出txt文档类型的任务请选填此项<br/>
可以通过学员答案文件路径设置展示txt文件内容<br/><br/>
htmlweb类型的任务请选填此项<br/>
可以通过Web路由设置展示html效果预览页<br/><br/>
mp3/mp4mp3/mp4文件类型的任务请选填此项<br/>
可以通过学员答案文件路径设置展示mp3/mp4文件内容<br/><br/>
</p></div>
<p className="inviteTipbtn with100"><a onClick={()=>this.showrepositoryurltip(2)}
>知道了</a>
</p>
</div>
</div>
</div>
</div>
<div className="edu-back-white clearfix">
<div className="padding1020tpms mb10" id={"Studenttaskfile"}>
<p className="color-grey-6 font-16 mb20"><span className="color-red mr5 fl">*</span> <span className={"color-grey-8 font-14"}></span></p>
<div>
<div className="flex1">
<input type="text"
className={StudentTaskPapers===true?"input-100-45 greyInput change bor-red":"input-100-45 greyInput change"}
id="shixun_file_path"
name="challenge[path]" autoComplete="off" name="challenge[path]" autoComplete="off"
placeholder="请选择版本库中的代码文件。例: src/step1/HelloWorld.java" placeholder="请选择版本库中的代码文件。例: src/step1/HelloWorld.java"
value={shixunfilepath} value={shixunfilepath}
@ -877,15 +801,16 @@ export default class TPMevaluation extends Component {
onInput={(e)=>this.updatepath(e,"shixunfilepath",1)} onInput={(e)=>this.updatepath(e,"shixunfilepath",1)}
onClick={(e)=>this.getfilepath(e,"shixunfilepath",1)} onClick={(e)=>this.getfilepath(e,"shixunfilepath",1)}
/> />
<p className="color-grey-9 mt15">该文件将直接显示给学生需要学生在其中填写代码</p>
</div> </div>
<div style={{width: '57px'}}> <div>
<span className={StudentTaskPapers===true?"color-orange mt8 fl":"color-orange mt8 fl none"} id="student_task_name"><i <span className={StudentTaskPapers===true?"color-red mt8 fl":" none"} id="student_task_name"> 必选项不能为空</span>
className="fa fa-exclamation-circle mr3"></i></span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<Modal <Modal
keyboard={false} keyboard={false}
title="文件路径" title="文件路径"
@ -914,9 +839,6 @@ export default class TPMevaluation extends Component {
{path+item.name}</a>:<a data-remote="true"> {path+item.name}</a>:<a data-remote="true">
<i className="iconfont icon-zuoye color-blue mr2"></i> <i className="iconfont icon-zuoye color-blue mr2"></i>
<span onClick={()=>this.savegetfilepath(path+item.name,item.type)}>{path+item.name}</span> <span onClick={()=>this.savegetfilepath(path+item.name,item.type)}>{path+item.name}</span>
{/*<Tooltip placement="bottom" title={"点击删除下方所选文件路径"}>*/}
{/*<Icon className={"fr mt4"} type="close-circle" onClick={()=>this.delesavegetfilepath(path+item.name)}/>*/}
{/*</Tooltip>*/}
</a> </a>
} }
</div> </div>
@ -942,13 +864,12 @@ export default class TPMevaluation extends Component {
</div> </div>
</Modal> </Modal>
<div className="edu-back-white mb10 clearfix"> <div className="edu-back-white clearfix">
<div className="padding40-20"> <div className="padding1020tpms mb10" id={"Benchmarkexecutable"}>
<p className="color-grey-6 font-16 mb20">评测执行文件</p> <p className="color-grey-6 font-16 mb20"><span className="color-red mr5 fl">*</span><span className={"color-grey-8 font-14"}>使</span></p>
<div className="df"> <div>
<span className="mr30 color-orange pt10">*</span> <div className="flex1">
<div className="flex1 mr20"> <input type="text" className={StudentTaskDocs===true?"bor-red input-100-45 greyInput":"input-100-45 greyInput"} id="shixun_file_path_play"
<input type="text" className="input-100-45 greyInput" id="shixun_file_path_play"
name="challenge[exec_path]" autoComplete="off" name="challenge[exec_path]" autoComplete="off"
placeholder="请选择版本库中的代码文件。例src/step1/HelloWorldTest.java" placeholder="请选择版本库中的代码文件。例src/step1/HelloWorldTest.java"
value={shixunfilepathplay} value={shixunfilepathplay}
@ -956,59 +877,19 @@ export default class TPMevaluation extends Component {
onInput={(e)=>this.updatepath(e,"shixunfilepathplay",1)} onInput={(e)=>this.updatepath(e,"shixunfilepathplay",1)}
onClick={(e)=>this.getfilepath(e,"shixunfilepathplay",1)} onClick={(e)=>this.getfilepath(e,"shixunfilepathplay",1)}
/> />
<p className="color-grey-9 mt15">该文件由平台执行用来测试平台学员代码是否正确</p>
</div>
<div style={{width: '57px'}}>
<span className={StudentTaskDocs===true?"color-orange mt8 fl":"color-orange mt8 fl none"} id="student_task_name"><i
className="fa fa-exclamation-circle mr3"></i></span>
</div> </div>
</div> <div>
</div> <span className={StudentTaskDocs===true?"color-red mt8 fl":"none"} id="student_task_name">
</div> 必选项不能为空
</span>
<div className="edu-back-white mb10 clearfix">
<div className="padding40-20">
<p className="color-grey-6 font-16 mb20">效果展现方式</p>
<div className="pr">
<Select className="winput-240-40"
value={pathoptionvalue}
onChange={this.handpathoptionvalue}>
<Option value={-1}>请选择效果展现方式</Option>
<Option value={1}>图片</Option>
<Option value={2}>apk/exe</Option>
<Option value={3}>txt</Option>
<Option value={4}>html</Option>
<Option value={5}>mp3</Option>
<Option value={6}>mp4</Option>
</Select>
<a className="ml10" onClick={()=>this.showrepositoryurltip(1)}><img src={getImageUrl("images/educoder/problem.png")}/></a>
<div className="invite-tip clearfix repository_url_tippostion" style={{display:showrepositoryurltiptype===true?"block":"none"}} id="repository_url_tip"
>
<span className="top-black-trangleft"></span>
<div className="padding20 invitecontent clearfix">
<p className="font-12 edu-txt-left">
图片处理或输出图片类型的任务请选填此项<br/>
可以通过设置图片路径和学员答案文件路径展示代码对应的图片效果<br/><br/>
apk/exe写可执行文件的任务请选填此项<br/>
可以通过设置学员答案文件路径展示二维码以供扫码下载<br/><br/>
txt输出txt文档类型的任务请选填此项<br/>
可以通过学员答案文件路径设置展示txt文件内容<br/><br/>
htmlweb类型的任务请选填此项<br/>
可以通过Web路由设置展示html效果预览页
</p></div>
<p className="inviteTipbtn with100"><a onClick={()=>this.showrepositoryurltip(2)}
>知道了</a>
</p>
</div> </div>
</div> </div>
<p className="color-grey-9 mt15">该选项用来配置学员评测本关任务时查看效果页上需要展现的文件类型</p>
</div> </div>
</div> </div>
{pathoptionvalue===4&&web_route!=null||pathoptionvalue===4&&has_web_route===true?<div className="edu-back-white mb10 clearfix"> {pathoptionvalue===4&&web_route!=null||pathoptionvalue===4&&has_web_route===true?<div className="edu-back-white clearfix">
<div className="padding40-20"> <div className="padding1020tpms mb10">
<p className="color-grey-6 font-16 mb20">Web路由</p> <p className="color-grey-6 font-16 mb20">Web路由<span className={"color-grey-8 font-14"}>请注意将服务器程序的端口号映射到8080端口</span></p>
<div className="df"> <div className="df">
<div className="flex1 mr20"> <div className="flex1 mr20">
<input type="text" className="input-100-45 change" autoComplete="off" <input type="text" className="input-100-45 change" autoComplete="off"
@ -1021,9 +902,9 @@ export default class TPMevaluation extends Component {
</div> </div>
</div>:""} </div>:""}
{pathoptionvalue===1||pathoptionvalue===5||pathoptionvalue===6?<div className="edu-back-white mb10 clearfix"> {pathoptionvalue===1||pathoptionvalue===5||pathoptionvalue===6?<div className="edu-back-white clearfix">
<div className="padding40-20"> <div className="padding1020tpms mb10">
<p className="color-grey-6 font-16 mb20">待处理文件路径</p> <p className="color-grey-6 font-16 mb20">待处理文件路径<span className={"color-grey-8 font-14"}>该路径下的文件将在学员评测本关任务时作为原始文件显示在查看效果页供学员参考请注意与程序文件所在文件夹分开</span></p>
<div className="df"> <div className="df">
<div className="flex1 mr20"> <div className="flex1 mr20">
<input type="text" className="input-100-45" autoComplete="off" <input type="text" className="input-100-45" autoComplete="off"
@ -1033,9 +914,6 @@ export default class TPMevaluation extends Component {
onInput={(e)=>this.updatepath(e,"shixunfileexpectpicturepath",2)} onInput={(e)=>this.updatepath(e,"shixunfileexpectpicturepath",2)}
onClick={(e)=>this.getfilepath(e,"shixunfileexpectpicturepath",2)} onClick={(e)=>this.getfilepath(e,"shixunfileexpectpicturepath",2)}
/> />
<p className="color-grey-9 mt15">
该路径下的文件将在学员评测本关任务时作为原始文件显示在查看效果页供学员参考任务为文件处理时请指定该路径并注意与程序文件所在文件夹分开
</p>
</div> </div>
<div></div> <div></div>
</div> </div>
@ -1043,9 +921,9 @@ export default class TPMevaluation extends Component {
</div>:""} </div>:""}
{pathoptionvalue===1||pathoptionvalue===5||pathoptionvalue===6? <div className="edu-back-white mb10 clearfix"> {pathoptionvalue===1||pathoptionvalue===5||pathoptionvalue===6? <div className="edu-back-white clearfix">
<div className="padding40-20"> <div className="padding1020tpms mb10">
<p className="color-grey-6 font-16 mb20">标准答案文件路径</p> <p className="color-grey-6 font-16 mb20">标准答案文件路径<span className={"color-grey-8 font-14"}>该路径下的文件将在学员评测本关任务时作为参考答案显示在查看效果页供学员参考请注意与程序文件所在文件夹分开</span></p>
<div className="df"> <div className="df">
<div className="flex1 mr20"> <div className="flex1 mr20">
<input type="text" className="input-100-45" autoComplete="off" <input type="text" className="input-100-45" autoComplete="off"
@ -1055,9 +933,6 @@ export default class TPMevaluation extends Component {
onInput={(e)=>this.updatepath(e,"shixunfilestandardpicturepath",2)} onInput={(e)=>this.updatepath(e,"shixunfilestandardpicturepath",2)}
onClick={(e)=>this.getfilepath(e,"shixunfilestandardpicturepath",2)} onClick={(e)=>this.getfilepath(e,"shixunfilestandardpicturepath",2)}
/> />
<p className="color-grey-9 mt15">
该路径下的文件将在学员评测本关任务时作为参考答案显示在查看效果页供学员参考任务输出结果为文件时请指定该路径并注意与程序文件所在文件夹分开
</p>
</div> </div>
<div></div> <div></div>
</div> </div>
@ -1065,9 +940,9 @@ export default class TPMevaluation extends Component {
</div>:""} </div>:""}
{pathoptionvalue===-1?"":<div className="edu-back-white mb10 clearfix"> {pathoptionvalue===-1?"":<div className="edu-back-white clearfix">
<div className="padding40-20"> <div className="padding1020tpms mb10">
<p className="color-grey-6 font-16 mb20">学员答案文件路径</p> <p className="color-grey-6 font-16 mb20">学员答案文件路径<span className={"color-grey-8 font-14"}>学员评测本关任务时生成的文件将保存在该路径下并作为实际输出显示在查看效果页供学员确认请注意与程序文件所在文件夹分开</span></p>
<div className="df"> <div className="df">
<div className="flex1 mr20"> <div className="flex1 mr20">
<input type="text" className="input-100-45 change" autoComplete="off" <input type="text" className="input-100-45 change" autoComplete="off"
@ -1076,9 +951,6 @@ export default class TPMevaluation extends Component {
onInput={(e)=>this.updatepath(e,"shixunfilepicturepath",2)} onInput={(e)=>this.updatepath(e,"shixunfilepicturepath",2)}
onClick={(e)=>this.getfilepath(e,"shixunfilepicturepath",2)} onClick={(e)=>this.getfilepath(e,"shixunfilepicturepath",2)}
placeholder="请在版本库中指定用来保存学员代码实际输出结果的路径。例src/step1/outputfiles"/> placeholder="请在版本库中指定用来保存学员代码实际输出结果的路径。例src/step1/outputfiles"/>
<p className="color-grey-9 mt15">
学员评测本关任务时生成的文件将保存在该路径下并作为实际输出显示在查看效果页供学员确认任务输出结果为文件时请指定该路径并注意与程序文件所在文件夹分开
</p>
</div> </div>
<div></div> <div></div>
</div> </div>
@ -1086,10 +958,10 @@ export default class TPMevaluation extends Component {
</div>} </div>}
<div className="edu-back-white mb10 clearfix"> <div className="edu-back-white clearfix" id={"Thetestset"}>
<div className="padding40-20"> <div className="padding1020tpms mb20">
{/*<p className="color-grey-6 font-16">测试集</p>*/} {/*<p className="color-grey-6 font-16">测试集</p>*/}
<p className="color-grey-6 font-16">测试集和系统评分规则</p> <p className="color-grey-6 font-16 height40pxtpm borbottomeeetpm">测试集和系统评分规则</p>
<p className="color-grey-9 mt20" <p className="color-grey-9 mt20"
style={{width:'100%',height:'60px'}} style={{width:'100%',height:'60px'}}
> >
@ -1132,9 +1004,9 @@ export default class TPMevaluation extends Component {
{evaluationlist===undefined?"":evaluationlist.length===0?"":evaluationlist.map((item,key)=>{ {evaluationlist===undefined?"":evaluationlist.length===0?"":evaluationlist.map((item,key)=>{
return( return(
<div className="test_array_item mt30" key={key}> <div className="test_array_item mt30 borbottomeeetpm pb20" key={key}>
<p className="clearfix pr mb20"> <p className="clearfix pr mb20">
<span className="fl mt5 mr10 color-orange">*</span> <span className="fl mr10 color-red">*</span>
<span className="color-blue font-16 fl" name="sample_inputs_label">{key+1}</span> <span className="color-blue font-16 fl" name="sample_inputs_label">{key+1}</span>
<span className="fl ml20 color-grey-6"> <span className="fl ml20 color-grey-6">
{/*checked={item.is_public===1?false:true}*/} {/*checked={item.is_public===1?false:true}*/}
@ -1143,19 +1015,19 @@ export default class TPMevaluation extends Component {
style={{width: '25%',display:scorevalue===true?'inline-block':'none'}} style={{width: '25%',display:scorevalue===true?'inline-block':'none'}}
onInput={(e)=>this.editpercentage(e,key)} onInput={(e)=>this.editpercentage(e,key)}
value={item.score} /> value={item.score} />
<span className="mr15" <span className="mr15 ml10"
style={{display:scorevalue===true?'inline-block':'none'}} style={{display:scorevalue===true?'inline-block':'none'}}
>%</span> >%</span>
<Checkbox onChange={()=>this.evaluationonChange(item.hidden,key)} checked={item.hidden===1?true:false}>隐藏</Checkbox> <Checkbox onChange={()=>this.evaluationonChange(item.hidden,key)} checked={item.hidden===1?true:false}>隐藏<span className={"color-grey-8 font-14"}>选中则对学员隐藏本测试集内容</span></Checkbox>
</span> </span>
<Tooltip placement="bottom" title={"删除"}> <Tooltip placement="bottom" title={"删除"}>
<a className="fr del_array sample_icon_remove mr30" style={{display:key===0?"none":"block"}} <div className="fr sample_icon_remove " style={{display:key===0?"none":"block"}}
onClick={()=>this.del_test_array(key)}> onClick={()=>this.del_test_array(key)}>
<i className="fa fa-times-circle color-grey-c font-16 fl"></i> <i className={"iconfont icon-shanchu_Hover font-16 fl"}></i>
</a> </div>
</Tooltip> </Tooltip>
</p> </p>
<TextArea className="textareavalue mb15" name="test_set[input][]" <TextArea className="textareavalue mb15" name="test_set[input][]"
@ -1174,11 +1046,11 @@ export default class TPMevaluation extends Component {
rows={5} rows={5}
onInput={(e)=>this.evaluationoninputvalue(e,key,"yq")} onInput={(e)=>this.evaluationoninputvalue(e,key,"yq")}
></TextArea> ></TextArea>
<div className="clearfix lineh-30"> <div className="clearfix lineh-30 mt20">
<span className="fl mr10 color-grey-6">匹配规则</span> <span className="fl mr10 color-grey-6">匹配规则</span>
<RadioGroup className="fl" value={item.match_rule} onChange={(e)=>this.changeEvaluationRule(e,key)}> <RadioGroup className="fl" value={item.match_rule} onChange={(e)=>this.changeEvaluationRule(e,key)}>
<Radio value='full'>完全匹配</Radio> <Radio value='full'>完全匹配<span className={"color-grey-8 font-14"}>实际输出与预期输出完全相同</span></Radio>
<Radio value='last'>末尾匹配</Radio> <Radio value='last'>末尾匹配<span className={"color-grey-8 font-14"}>实际输出的末尾内容与预期输出完全相同</span></Radio>
</RadioGroup> </RadioGroup>
</div> </div>
</div> </div>
@ -1189,24 +1061,25 @@ export default class TPMevaluation extends Component {
</div> </div>
<p className="clearfix" onClick={this.addevaluationon}> <p className="clearfix" onClick={this.addevaluationon}>
<a className="fl edu-default-btn edu-greyline-btn mt20 mb20 sample_icon_add"> <Button type="primary" ghost className="edu-default-btn edu-greenback-btn mt20 mb20">新增测试集</Button>
新增测试集
</a>
</p> </p>
<p className="color-grey-9">温馨提示建议公开测试集和隐藏测试集结合使用降低作弊的几率隐藏测试集提交评测时也将被自动检测</p>
<p className="color-grey-9">温馨提示公开测试集和隐藏测试集结合使用可以降低作弊的几率隐藏测试集提交评测时也将被系统自动检测</p>
</div> </div>
</div> </div>
</div> </div>
<div className="clearfix mt30" style={{display:this.props.identity>4||this.props.identity===undefined||power===false?"none":"block"}}>
<a className="defalutSubmitbtn fl mr20" onClick={this.submitarbitrationevaluation}>提交</a>
{/*<a href={"/shixuns/" + shixunId + "/challenges"} className="defalutCancelbtn fl">取消</a>*/}
<Link to={"/shixuns/" + shixunId + "/challenges"} className="defalutCancelbtn fl">取消</Link>
</div>
</div> </div>
{this.props.identity>4||this.props.identity===undefined||power===false?"":<div className="clearfix mt30">
{/*<a className="defalutSubmitbtn fl mr20" onClick={this.submitarbitrationevaluation}>提交</a>*/}
{/*/!*<a href={"/shixuns/" + shixunId + "/challenges"} className="defalutCancelbtn fl">取消</a>*!/*/}
{/*<Link to={"/shixuns/" + shixunId + "/challenges"} className="defalutCancelbtn fl">取消</Link>*/}
<Bottomsubmit url={"/shixuns/" + shixunId + "/challenges"}
bottomvalue={"提交"}
onSubmits={this.submitarbitrationevaluation}
loadings={false}/>
</div>}
</React.Fragment> </React.Fragment>
) )
} }

@ -291,4 +291,28 @@ a{
.tpmpointer{ .tpmpointer{
cursor: pointer; cursor: pointer;
}
.text-centers{text-align:center}
.bor25510211{
width: 1180px;
height: 34px;
border: 1px solid rgba(255,102,1,1);
line-height: 34px;
}
.padding1020tpms{
padding: 10px 20px;
box-sizing: border-box;
}
.bortopeeetpm{
border-top: 1px solid #eee;
}
.borbottomeeetpm {
border-bottom: 1px solid #eee;
}
.height40pxtpm{
height:40px
} }

@ -10,7 +10,7 @@ import { getImageUrl, toPath, getUrl } from 'educoder';
import axios from 'axios'; import axios from 'axios';
import './css/TPMchallengesnew.css'; import '../css/TPMchallengesnew.css';
let origin = getUrl(); let origin = getUrl();

@ -403,7 +403,7 @@ label.infolabel{display: block;float: left;width: 56px;text-align: right;margin-
/*新建任务*/ /*新建任务*/
.challenge_nav{padding: 20px 20px 0px 20px;border-bottom: 1px solid #eee;} .challenge_nav{padding: 20px 20px 0px 20px;border-bottom: 1px solid #eee;}
.challenge_nav li{width: auto;float: left;margin-right: 20px;position: relative} .challenge_nav li{width: auto;float: left;margin-right: 20px;position: relative}
.challenge_nav li.active:after{position: absolute;content: '';width: 50%;background-color: #4CACFF;height: 3px;border-radius: 2px;left: 25%;bottom: 0px;} .challenge_nav li.active:after{position: absolute;content: '';width:76%;background-color: #4CACFF;height: 3px;border-radius: 2px;left: 25%;bottom: 0px;}
.challenge_nav li a{display: block;width: 100%;padding-bottom: 20px;} .challenge_nav li a{display: block;width: 100%;padding-bottom: 20px;}
.add_choose_type{width: 60px;height: 20px;line-height: 19px;border-radius: 2px;background-color: #eaeaea;color: #999!important;display: block;float: left;text-align: center;margin-top: 4px;} .add_choose_type{width: 60px;height: 20px;line-height: 19px;border-radius: 2px;background-color: #eaeaea;color: #999!important;display: block;float: left;text-align: center;margin-top: 4px;}

Loading…
Cancel
Save