diff --git a/public/javascripts/jupyter.js b/public/javascripts/jupyter.js
index 47fa61b80..021d46a2e 100644
--- a/public/javascripts/jupyter.js
+++ b/public/javascripts/jupyter.js
@@ -3,12 +3,14 @@
 
 
 $(function(){
-  console.log("educoder jupyter js init");
+	console.log("开始发送消息了");
+	runEvery10Sec();
 })
 
-
-$(function(){
-	console.log("开始发送消息了");
+function runEvery10Sec() {
+	// 1000 * 10 = 10 秒钟
+	console.log("每隔10秒中一次runEvery10Sec");
 	window.parent.postMessage('jupytermessage','*');
-})
+	setTimeout( runEvery10Sec, 1000 * 10 );
 
+}
diff --git a/public/react/src/modules/developer/components/controlSetting/index.js b/public/react/src/modules/developer/components/controlSetting/index.js
index 1d4d7834c..502f3ae09 100644
--- a/public/react/src/modules/developer/components/controlSetting/index.js
+++ b/public/react/src/modules/developer/components/controlSetting/index.js
@@ -4,7 +4,7 @@
  * @Github: 
  * @Date: 2019-11-27 16:02:36
  * @LastEditors: tangjiang
- * @LastEditTime: 2019-12-19 19:47:32
+ * @LastEditTime: 2019-12-20 14:37:39
  */
 import './index.scss';
 import React, { useState, useRef, useEffect } from 'react';
@@ -24,7 +24,7 @@ const ControlSetting = (props) => {
     identifier,
     excuteState,
     showOrHideControl,
-    commitRecordDetail,
+    commitTestRecordDetail,
     changeLoadingState,
     changeSubmitLoadingStatus,
     changeShowOrHideControl,
@@ -102,7 +102,7 @@ const ControlSetting = (props) => {
         <TabPane tab={'代码执行结果'} key={'2'} style={{ height: '280px', overflowY: 'auto' }}>
           <ExecResult 
             excuteState={excuteState}
-            excuteDetail={commitRecordDetail}
+            excuteDetail={commitTestRecordDetail}
           />
         </TabPane>
       </Tabs>
@@ -137,14 +137,14 @@ const ControlSetting = (props) => {
 const mapStateToProps = (state) => {
   const {commonReducer, ojForUserReducer} = state;
   const {loading, excuteState, submitLoading, showOrHideControl } = commonReducer;
-  const { commitRecordDetail } = ojForUserReducer; 
+  const { commitTestRecordDetail } = ojForUserReducer; 
   return {
     loading,
     submitLoading,
     excuteState,
     showOrHideControl,
     // identifier: user_program_identifier,
-    commitRecordDetail // 提交详情
+    commitTestRecordDetail // 提交详情
   };
 };
 // changeSubmitLoadingStatus
diff --git a/public/react/src/modules/developer/components/controlSetting/index.scss b/public/react/src/modules/developer/components/controlSetting/index.scss
index 31beda8a5..231358ea0 100644
--- a/public/react/src/modules/developer/components/controlSetting/index.scss
+++ b/public/react/src/modules/developer/components/controlSetting/index.scss
@@ -51,7 +51,7 @@
   align-items: center;
   z-index: 20;
   height: 56px;
-  padding-right: 30px;
+  padding-right: 20px;
   padding-left: 10px;
   background: rgba(18,28,36,1);
   // background:rgba(48,48,48,1);
diff --git a/public/react/src/modules/developer/components/userInfo/index.scss b/public/react/src/modules/developer/components/userInfo/index.scss
index f9ea713f8..25c85d0e3 100644
--- a/public/react/src/modules/developer/components/userInfo/index.scss
+++ b/public/react/src/modules/developer/components/userInfo/index.scss
@@ -3,6 +3,7 @@
   position: absolute;
   color: #fff;
   line-height: 65px;
+  left: 20px;
   // height: 65px;
   .student_img,
   .student_nicker{
diff --git a/public/react/src/modules/developer/newOrEditTask/index.js b/public/react/src/modules/developer/newOrEditTask/index.js
index 1c451c669..b498abe0d 100644
--- a/public/react/src/modules/developer/newOrEditTask/index.js
+++ b/public/react/src/modules/developer/newOrEditTask/index.js
@@ -70,13 +70,13 @@ const NewOrEditTask = (props) => {
   // 模拟挑战
   const imitationChallenge = () => {
     // 调用 start 接口, 成功后跳转到模拟页面
-    startProgramQuestion(identifier, props);
+    identifier && startProgramQuestion(identifier, props);
   }
   // 开始挑战
   const startChallenge = () => {
     // 调用 start 接口, 成功后跳转到开启实战
     // TODO
-    startProgramQuestion(identifier, props);
+    identifier && startProgramQuestion(identifier, props);
   }
 
   // 取消
diff --git a/public/react/src/modules/developer/recordDetail/index.js b/public/react/src/modules/developer/recordDetail/index.js
index 7a3fc13e1..e4002004a 100644
--- a/public/react/src/modules/developer/recordDetail/index.js
+++ b/public/react/src/modules/developer/recordDetail/index.js
@@ -4,7 +4,7 @@
  * @Github: 
  * @Date: 2019-12-04 08:36:21
  * @LastEditors: tangjiang
- * @LastEditTime: 2019-12-20 10:38:00
+ * @LastEditTime: 2019-12-20 10:52:36
  */
 import './index.scss';
 import React, { useState, useEffect } from 'react';
@@ -87,9 +87,11 @@ function RecordDetail (props) {
             </span>
           </span>
           <span className="status_label">
-            语言: <span className="status_label_sub">C</span>
+            语言: <span className="status_label_sub">{detail.language}</span>
+          </span>
+          <span className="status_label" style={{ visibility: detail.status === 0 ? 'visible' : 'hidden'}}>
+            执行用时: <span className="status_label_sub">{`${detail.execute_time && (+detail.execute_time * 1000)}ms`}</span>
           </span>
-          {/* <span className> */}
         </div>
         <div className="result_error_area">
           <ErrorResult detail={detail}/>
diff --git a/public/react/src/modules/developer/studentStudy/index.js b/public/react/src/modules/developer/studentStudy/index.js
index 15c87e64c..9039bf3ac 100644
--- a/public/react/src/modules/developer/studentStudy/index.js
+++ b/public/react/src/modules/developer/studentStudy/index.js
@@ -4,7 +4,7 @@
  * @Github: 
  * @Date: 2019-11-23 10:53:19
  * @LastEditors: tangjiang
- * @LastEditTime: 2019-12-19 19:48:20
+ * @LastEditTime: 2019-12-20 14:54:39
  */
 import './index.scss';
 import React, { useEffect, useState } from 'react';
@@ -92,9 +92,12 @@ function StudentStudy (props) {
     changeShowOrHideControl(false);
     props.saveEditorCodeForDetail();
     props.history.push(`/problems/${_hack_id}/edit`);
+    props.clearOjForUserReducer();
   }
   // 处理退出 
   const handleClickQuit = () => {
+    // 退出时,清空内容
+    props.clearOjForUserReducer();
     // 将控制台关闭
     changeShowOrHideControl(false);
     props.saveEditorCodeForDetail();
@@ -116,7 +119,11 @@ function StudentStudy (props) {
         </div>
         <div className={'study_quit'}>
           {/* to={`/problems/${_hack_id}/edit`} */}
-          <span onClick={handleClickEditor} className={`quit-btn`}>
+          <span 
+            style={{ display: userInfo.hack_manager ? 'inline-block' : 'none' }}
+            onClick={handleClickEditor} 
+            className={`quit-btn`}
+          >
             <Icon type="form" className="quit-icon"/> 编辑
           </span>
           {/* to="/problems" */}
@@ -168,7 +175,8 @@ const mapDispatchToProps = (dispatch) => ({
   saveEditorCodeForDetail: (code) => dispatch(actions.saveEditorCodeForDetail(code)),
   // 恢复初始代码
   restoreInitialCode: (identifier, msg) => dispatch(actions.restoreInitialCode(identifier, msg)),
-  changeShowOrHideControl: (flag) => dispatch(actions.changeShowOrHideControl(flag))
+  changeShowOrHideControl: (flag) => dispatch(actions.changeShowOrHideControl(flag)),
+  clearOjForUserReducer: () => dispatch(actions.clearOjForUserReducer())
 });
 
 export default withRouter(connect(
diff --git a/public/react/src/modules/developer/studentStudy/leftpane/commitRecord/index.js b/public/react/src/modules/developer/studentStudy/leftpane/commitRecord/index.js
index 7fc061765..90c486cca 100644
--- a/public/react/src/modules/developer/studentStudy/leftpane/commitRecord/index.js
+++ b/public/react/src/modules/developer/studentStudy/leftpane/commitRecord/index.js
@@ -4,7 +4,7 @@
  * @Github: 
  * @Date: 2019-11-27 09:49:33
  * @LastEditors: tangjiang
- * @LastEditTime: 2019-12-20 09:35:00
+ * @LastEditTime: 2019-12-20 13:55:07
  */
 import './index.scss';
 import React, { useState, useEffect } from 'react';
@@ -73,6 +73,7 @@ const CommitRecord = (props) => {
     commitRecord,
     // excuteState,
     language,
+    operateType,
     commitRecordDetail,
     getUserCommitRecord
   } = props;
@@ -146,22 +147,32 @@ const CommitRecord = (props) => {
   // 提交详情变化时,显示当前提交信息
   useEffect(() => {
     // setRecordDetail(commitRecordDetail);
-    setRenderCtx(() => (renderRecordDetail))
-  }, [commitRecordDetail]);
+    if (operateType === 'submit') {
+      setRenderCtx(() => (renderRecordDetail))
+    }
+  }, [commitRecordDetail, operateType]);
   // 复制功能
-
+  let count = 0;
   useEffect(() => {
-    if (!clipboard) {
-      clipboard = new ClipboardJS('.copy_error');
-    }
-    if (commitRecordDetail.status !== 0) {
-      clipboard.on('success', (e) => {
-        message.success('复制成功');
-        e.clearSelection();
-      });
-    }
-  }, [commitRecordDetail.status]);
+    clipboard = new ClipboardJS('.copy_error');
+    clipboard.on('success', (e) => {
+      e.clearSelection();
+      if (count > 0) return;
+      count++;
+      message.success('复制成功');
+      setTimeout(() => {
+        message.destroy();
+      }, 300);
+    });
+  }, []);
 
+  // if (commitRecordDetail.status !== 0) {
+  //   clipboard.on('success', (e) => {
+  //     console.log('成功=====》》》》》');
+  //     message.success('复制成功');
+  //     e.clearSelection();
+  //   });
+  // }
   // 
   const handleTableChange = (pagination) => {
     setPagination(Object.assign({}, pagination));
@@ -190,7 +201,8 @@ const mapStateToProps = (state) => {
     user_program_identifier,
     commitRecordDetail,
     commitRecord,
-    hack
+    hack,
+    operateType
   } = ojForUserReducer;
   const { excuteState } = commonReducer;
   return {
@@ -198,7 +210,8 @@ const mapStateToProps = (state) => {
     commitRecordDetail,
     commitRecord, // 提交记录
     excuteState, // 代码执行状态
-    language: hack.language
+    language: hack.language,
+    operateType
   }
 }
 const mapDispatchToProps = (dispatch) => ({
diff --git a/public/react/src/modules/developer/studentStudy/leftpane/commitRecord/index.scss b/public/react/src/modules/developer/studentStudy/leftpane/commitRecord/index.scss
index 283617445..fb099445e 100644
--- a/public/react/src/modules/developer/studentStudy/leftpane/commitRecord/index.scss
+++ b/public/react/src/modules/developer/studentStudy/leftpane/commitRecord/index.scss
@@ -1,6 +1,8 @@
 .commit_record_area{
   // padding: 20px 30px;
   padding: 0 20px;
+  overflow-y: auto;
+  height: calc(100vh - 177px);
   .record_header{
     display: flex;
     // justify-content: space-between;
diff --git a/public/react/src/modules/developer/studentStudy/leftpane/index.scss b/public/react/src/modules/developer/studentStudy/leftpane/index.scss
index a48d021f9..b5362429f 100644
--- a/public/react/src/modules/developer/studentStudy/leftpane/index.scss
+++ b/public/react/src/modules/developer/studentStudy/leftpane/index.scss
@@ -65,7 +65,7 @@
 .student_study_header{
   .study_quit{
     position: absolute;
-    right: 30px;
+    right: 20px;
   }
   .quit-btn{
     cursor: pointer;
diff --git a/public/react/src/modules/developer/studentStudy/rightpane/index.js b/public/react/src/modules/developer/studentStudy/rightpane/index.js
index af46d0aef..054997359 100644
--- a/public/react/src/modules/developer/studentStudy/rightpane/index.js
+++ b/public/react/src/modules/developer/studentStudy/rightpane/index.js
@@ -4,7 +4,7 @@
  * @Github: 
  * @Date: 2019-11-27 14:59:51
  * @LastEditors: tangjiang
- * @LastEditTime: 2019-12-19 19:13:05
+ * @LastEditTime: 2019-12-20 14:01:57
  */
 import React, { useState, useEffect } from 'react';
 import {connect} from 'react-redux';
@@ -27,6 +27,7 @@ const RightPane = (props) => {
     updateNotice,
     saveUserInputCode,
     restoreInitialCode,
+    saveOpacityType,
     saveUserCodeForInterval
   } = props;
 
@@ -43,6 +44,7 @@ const RightPane = (props) => {
   
   const handleSubmitForm = () => {
     // 提交时, 先调用提交接口,提交成功后,循环调用测评接口
+    // saveOpacityType('submit');
     submitUserCode(identifier, submitInput, 'submit');
     // // 提交时,先调用评测接口, 评测通过后才调用保存接口
     // updateCode(identifier, submitInput, 'submit');
@@ -71,6 +73,7 @@ const RightPane = (props) => {
   // 代码调试
   const handleDebuggerCode = (value) => {
     // 调用保存代码块接口,成功后,调用调试接口
+    // saveOpacityType('debug');
     updateCode(identifier, value, 'debug');
   }
   // 恢复初始代码
@@ -137,6 +140,7 @@ const mapDispatchToProps = (dispatch) => ({
   saveUserCodeForInterval: (identifier, code) => dispatch(actions.saveUserCodeForInterval(identifier, code)),
   // 恢复初始代码
   restoreInitialCode: (identifier, msg) => dispatch(actions.restoreInitialCode(identifier, msg)),
+  // saveOpacityType: (type) => dispatch(actions.saveOpacityType(type))
 });
 
 export default connect(
diff --git a/public/react/src/modules/tpm/TPMBanner.js b/public/react/src/modules/tpm/TPMBanner.js
index c122289bb..0a123e73a 100644
--- a/public/react/src/modules/tpm/TPMBanner.js
+++ b/public/react/src/modules/tpm/TPMBanner.js
@@ -868,8 +868,8 @@ class TPMBanner extends Component {
 
                   </li>
                 </ul>
-								{
-									this.props.is_jupyter===true?"":
+								{/*{*/}
+								{/*	this.props.is_jupyter===true?"":*/}
 
                       <Popover placement="right" content={
                         <div style={{"width": "530px"}} >
@@ -934,7 +934,7 @@ class TPMBanner extends Component {
                         </div>
                       </Popover>
 
-								}
+								{/*// }*/}
 
 
                 {
diff --git a/public/react/src/modules/tpm/jupyter/rightPane/index.scss b/public/react/src/modules/tpm/jupyter/rightPane/index.scss
index 4facded6b..fe2d52456 100644
--- a/public/react/src/modules/tpm/jupyter/rightPane/index.scss
+++ b/public/react/src/modules/tpm/jupyter/rightPane/index.scss
@@ -68,7 +68,7 @@
       align-items: center;
       height: 56px;
       justify-content: flex-end;
-      padding-right: 30px;
+      padding-right: 20px;
     }
   }
 }
\ No newline at end of file
diff --git a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js
index 995753dff..9eb82c7d4 100644
--- a/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js
+++ b/public/react/src/modules/tpm/shixunchild/Challenges/Challengesjupyter.js
@@ -105,9 +105,9 @@ class Challengesjupyter extends Component {
 		setTimeout(this.ChallengesList(), 1000);
 		let id = this.props.match.params.shixunId;
 		let ChallengesURL = `/jupyters/get_info_with_tpm.json`;
-     let datas={
-			 identifier:id,
-		 }
+		let datas={
+			identifier:id,
+		}
 		axios.get(ChallengesURL, {params: datas}).then((response) => {
 			if (response.data.status === 403||response.data.status === 401||response.data.status === 500) {
 				setTimeout(() => {
@@ -115,26 +115,29 @@ class Challengesjupyter extends Component {
 						booljupyterurls:true,
 					})
 				}, 600)
-				}else{
-				  if(response.data.status===0){
+			}else{
+				if(response.data.status===0){
 
-						setTimeout(() => {
-							this.setState({
-								jupyter_url:response.data.url,
-								jupyter_port:response.data.port,
-								booljupyterurls:true,
-							})
-						}, 800)
+					setTimeout(() => {
 
-					}else{
-						setTimeout(() => {
-							this.setState({
-								booljupyterurls:true,
-							})
-						}, 600)
+						var url=response.data.url;
+						var url2=url.replace("http://","https://");
+						this.setState({
+							jupyter_url:url2,
+							jupyter_port:response.data.port,
+							booljupyterurls:true,
+						})
+					}, 800)
+
+				}else{
+					setTimeout(() => {
+						this.setState({
+							booljupyterurls:true,
+						})
+					}, 600)
 
-					}
 				}
+			}
 
 
 		}).catch((error) => {
@@ -148,15 +151,19 @@ class Challengesjupyter extends Component {
 		setTimeout(this.getjianjiesize(), 1000);
 
 
+		window.addEventListener('message', (e) => {
+			console.log("触发了jupytermessage");
+			console.log(e);
+			if(e){
+				if(e.data){
+					if(e.data==="jupytermessage"){
+						that.modifyjupyter();
+					}
+				}
 
+			}
 
-		window.addEventListener('jupytermessage', (e) => {
-			console.log("触发了jupytermessage");
-			console.log("触发了jupytermessage");
-			that.modifyjupyter();
 		});
-		setTimeout(this.getjianjiesize(), 1000);
-
 	}
 
 	updatamakedowns = () => {
@@ -210,13 +217,13 @@ class Challengesjupyter extends Component {
 
 	modifyjupyter=()=>{
 		let id=this.props.match.params.shixunId;
-     var jupyter_port="";
-			 try{
-				 jupyter_port= parseInt(this.state.jupyter_port);
-			 }catch (e) {
-				 jupyter_port=this.state.jupyter_port;
+		var jupyter_port="";
+		try{
+			jupyter_port= parseInt(this.state.jupyter_port);
+		}catch (e) {
+			jupyter_port=this.state.jupyter_port;
 
-			 }
+		}
 		const url=`/jupyters/save_with_tpm.json`;
 		const data={
 			identifier:id,
@@ -225,8 +232,8 @@ class Challengesjupyter extends Component {
 		axios.get(url,  {params: data})
 			.then((result) => {
 				if (result.data.status === 0) {
-					this.props.showNotification(`应用成功`);
-					console.log("触发了jupytermessage调用了应用成功");
+					// this.props.showNotification(`应用成功`);
+					console.log("应用成功了");
 				}
 			}).catch((error) => {
 		})
@@ -237,15 +244,12 @@ class Challengesjupyter extends Component {
 			opentitletype:!this.state.opentitletype
 		})
 	}
-
 	onclki=(bool)=>{
 		this.setState({
 			enlarge:bool
 		})
 	}
 
-
-
 	render() {
 		let{ChallengesDataList,booljupyterurls,enlarge}=this.state;
 		let id = this.props.match.params.shixunId;
@@ -255,8 +259,6 @@ class Challengesjupyter extends Component {
 		const  business  = this.props&&this.props.current_user&&this.props.current_user.business?this.props.current_user.business:false;
 		//管理员
 		const  admin = this.props&&this.props.current_user&&this.props.current_user.admin?this.props.current_user.admin:false;
-    //用户
-		const  login = this.props&&this.props.current_user&&this.props.current_user.login?this.props.current_user.login:"";
 
 		let  mysidentity =false;
 		try {
@@ -377,9 +379,8 @@ class Challengesjupyter extends Component {
 									display: flex;
 									flex-direction:row-reverse;
 									}
-									
 								;						
-							}
+																}
 								`
 							}
 						</style>
@@ -388,29 +389,35 @@ class Challengesjupyter extends Component {
 								""
 								:
 								(
-								admin===true||business===true||mysidentity===true?
-									<div className={"shixunjianjiecballenges edu-back-white sortinxdirection mt20"}>
-											<div className="renwuxiangssi sortinxdirection">
-												<div><p className="renwuxiangqdiv">任务详情</p></div>
-												<div><p className="renwuxiangqdivtest ml1 shixunbingbaocun">(请将实训题目写在下方并保存)</p></div>
-											</div>
-											<div className="renwuxiangssit xaxisreverseorder">
-												{
-													enlarge===true?
-														<i className="iconfont icon-suoxiao2 font-20 ml2 ysliconfont" style={{
-															marginLeft: '30px',
-														}}  onClick={()=>this.onclki(false)}></i>
-														:
-														<i className="iconfont icon-fangda font-20 ml2 ysliconfont" style={{
-															marginLeft: '30px',
-														}}  onClick={()=>this.onclki(true)}></i>
-												}
-												<div className="challenbaocun" ><p
-													className="challenbaocuntest">导入</p>
+									admin===true||business===true||mysidentity===true?
+										<div style={{
+											height: '63px',
+										}} className={enlarge?"shixunjianjiecballenges edu-back-white intermediatecenter  fangdaone":"shixunjianjiecballenges edu-back-white  mt20"}>
+
+											<div className={enlarge?"sortinxdirection jupyterswidth":"sortinxdirection"}  >
+												<div className="renwuxiangssi sortinxdirection">
+													<div><p className="renwuxiangqdiv">任务详情</p></div>
+													<div><p className="renwuxiangqdivtest ml1 shixunbingbaocun">(请将实训题目写在下方并保存)</p></div>
+												</div>
+												<div className="renwuxiangssit xaxisreverseorder">
+													{
+														enlarge===true?
+															<i className="iconfont icon-suoxiao2 font-18 ml2 ysliconfont" style={{
+																marginLeft: '30px',
+															}}  onClick={()=>this.onclki(false)}></i>
+															:
+															<i className="iconfont icon-fangda font-18 ml2 ysliconfont" style={{
+																marginLeft: '30px',
+															}}  onClick={()=>this.onclki(true)}></i>
+													}
+													{/*<div className="challenbaocun" ><p*/}
+													{/*	className="challenbaocuntest">导入</p>*/}
+													{/*</div>*/}
 												</div>
 											</div>
 										</div>
-							    :
+
+										:
 										""
 								)
 
@@ -442,34 +449,25 @@ class Challengesjupyter extends Component {
 							}
 						</style>
 						{
-						admin===true||business===true||mysidentity===true?
-									<div>
-										<div className="pb47">
-											{
-												this.state.jupyter_url===null || this.state.jupyter_url===undefined?
-													(
-														booljupyterurls===false?
-															<LoadingSpin></LoadingSpin>
-															:""
-													)
-													:
-													(
-														login==="innov"?
-															<iframe src={"http://121.41.4.83:46666/notebooks/root/work/01.ipynb"} className={enlarge?"fangdatwo":""}
-																			sandbox="allow-same-origin allow-scripts allow-top-navigation " scrolling="no" id="frame"
-																			name="framename" width="100%" height="700" frameBorder="0"
-															></iframe>
-												    :
+							admin===true||business===true||mysidentity===true?
+								<div>
+									<div className="pb47">
+										{
+											this.state.jupyter_url===null || this.state.jupyter_url===undefined?
+												(
+													booljupyterurls===false?
+														<LoadingSpin></LoadingSpin>
+														:""
+												)
+												:
 												<iframe src={this.state.jupyter_url} className={enlarge?"fangdatwo":""}
-												sandbox="allow-same-origin allow-scripts allow-top-navigation " scrolling="no" id="frame"
-												name="framename" width="100%" height="700" frameBorder="0"
+																sandbox="allow-same-origin allow-scripts allow-top-navigation " scrolling="no" id="frame"
+																name="framename" width="100%" height="700" frameBorder="0"
 												></iframe>
-													)
-
-											}
-										</div>
+										}
 									</div>
-									:""
+								</div>
+								:""
 						}
 					</div>
 				</div>
diff --git a/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css b/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css
index d18370a51..1e1945f89 100644
--- a/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css
+++ b/public/react/src/modules/tpm/shixunchild/shixunchildCss/Challenges.css
@@ -187,7 +187,7 @@
 }
 .ysliconfont{
     text-align: center;
-    line-height: 30px;
+    line-height: 29px;
 }
 
 .fangdaone{
diff --git a/public/react/src/redux/actions/actionTypes.js b/public/react/src/redux/actions/actionTypes.js
index 1962d7a3e..2ef96941f 100644
--- a/public/react/src/redux/actions/actionTypes.js
+++ b/public/react/src/redux/actions/actionTypes.js
@@ -51,6 +51,8 @@ const types = {
   SAVE_USER_INFO: 'SAVE_USER_INFO', // 只在用户信息
   SAVE_HACK_IDENTIFIER: 'SAVE_HACK_IDENTIFIER', // 用户界面跑到编辑界面需要用的id值
   SAVE_EDITOR_CODE: 'SAVE_EDITOR_CODE', // 保存详情页面中编辑时的代码
+  CLICK_OPERATE_TYPE: 'CLICK_OPERATE_TYPE', // 点击类型
+  CLEAR_OJ_FOR_USER_REDUCER: 'CLEAR_OJ_FOR_USER_REDUCER', // 退出时清空 ojForUserReducer保存内容
   /*** jupyter  */
   GET_JUPYTER_DATA_SETS: 'GET_JUPYTER_DATA_SETS', // jupyter 数据集
   GET_JUPYTER_TPI_URL: 'GET_JUPYTER_TPI_URL', // 获取 jupyter url
diff --git a/public/react/src/redux/actions/index.js b/public/react/src/redux/actions/index.js
index 93fe53c24..23647ec4a 100644
--- a/public/react/src/redux/actions/index.js
+++ b/public/react/src/redux/actions/index.js
@@ -48,6 +48,8 @@ import {
   restoreInitialCode,
   saveUserCodeForInterval,
   saveEditorCodeForDetail,
+  saveOpacityType,
+  clearOjForUserReducer
   // isUpdateCodeCtx
 } from './ojForUser';
 
@@ -117,6 +119,8 @@ export default {
   getUserInfoForNew,
   saveUserCodeForInterval,
   saveEditorCodeForDetail,
+  saveOpacityType,
+  clearOjForUserReducer,
   // jupyter
   getJupyterTpiDataSet,
   getJupyterTpiUrl,
diff --git a/public/react/src/redux/actions/ojForUser.js b/public/react/src/redux/actions/ojForUser.js
index 994830280..89d826e69 100644
--- a/public/react/src/redux/actions/ojForUser.js
+++ b/public/react/src/redux/actions/ojForUser.js
@@ -4,7 +4,7 @@
  * @Github: 
  * @Date: 2019-11-27 13:42:11
  * @LastEditors: tangjiang
- * @LastEditTime: 2019-12-20 10:25:42
+ * @LastEditTime: 2019-12-20 14:47:26
  */
 import types from "./actionTypes";
 import { Base64 } from 'js-base64';
@@ -208,7 +208,10 @@ export const codeEvaluate = (dispatch, identifier, type, time_limit) => {
         // 返回评测结果
         dispatch({
           type: types.COMMIT_RECORD_DETAIL,
-          payload: returnData 
+          payload: {
+            type,
+            data: returnData
+          } 
         });   
         if (!type || type === 'debug') {
           dispatch({ // 改变 loading 值
@@ -233,6 +236,7 @@ export const codeEvaluate = (dispatch, identifier, type, time_limit) => {
           });
           // 重新调用一下提交记录接口
           dispatch(getUserCommitRecord(identifier));
+          dispatch(saveOpacityType(type));
         }
       }
     }).catch(err => { // 评测异常时
@@ -454,5 +458,20 @@ export const saveEditorCodeForDetail = (code) => {
   }
 }
 
+// 保存操作类型: 提交或调试
+export const saveOpacityType = (type) => {
+  return {
+    type: types.CLICK_OPERATE_TYPE,
+    payload: type
+  }
+} 
+
+
+export const clearOjForUserReducer = () => {
+  return {
+    type: types.CLEAR_OJ_FOR_USER_REDUCER
+  };
+}
+
 // 更新通知状态
 
diff --git a/public/react/src/redux/reducers/ojForUserReducer.js b/public/react/src/redux/reducers/ojForUserReducer.js
index 0c7594dd2..7e3740c19 100644
--- a/public/react/src/redux/reducers/ojForUserReducer.js
+++ b/public/react/src/redux/reducers/ojForUserReducer.js
@@ -4,7 +4,7 @@
  * @Github: 
  * @Date: 2019-11-27 13:41:48
  * @LastEditors: tangjiang
- * @LastEditTime: 2019-12-19 20:10:39
+ * @LastEditTime: 2019-12-20 14:46:07
  */
 import types from "../actions/actionTypes";
 import { Base64 } from 'js-base64';
@@ -13,6 +13,7 @@ const initialState = {
   user_program_identifier: '', // 开启OJ题的唯一标题
   hack: {}, // 编程题主要内容
   test_case: {}, // 测试用例
+  commitTestRecordDetail: {}, // 调试代码执行结果
   commitRecordDetail: {}, // 提交成功后记录提交的详情
   commitRecord: [], // 提交记录
   userCode: '', // 保存当前用户输入的代码
@@ -24,6 +25,7 @@ const initialState = {
   editor_code: '', // 保存编辑代码
   notice: false, // 通知
   hadCodeUpdate: false, // 更新代码
+  operateType: '', // 点击类型: 调度或提交
 };
 
 const ojForUserReducer = (state = initialState, action) => {
@@ -51,7 +53,7 @@ const ojForUserReducer = (state = initialState, action) => {
         test_case: Object.assign({}, test_case)
       }
     case types.COMMIT_RECORD_DETAIL:
-      let result = action.payload;
+      let result = action.payload.data;
       if (result['expected_output']) {
         result['expected_output'] = Base64.decode(result['expected_output'])
       }
@@ -63,10 +65,18 @@ const ojForUserReducer = (state = initialState, action) => {
       } catch (e) {
         console.log('错误信息:', e);
       } 
-      return { 
-        ...state,
-        commitRecordDetail: Object.assign({}, result)
+      if (action.payload.type === 'submit') {
+        return { 
+          ...state,
+          commitRecordDetail: Object.assign({}, result)
+        }
+      } else {
+        return { 
+          ...state,
+          commitTestRecordDetail: Object.assign({}, result)
+        }
       }
+      
     case types.COMMIT_RECORD:
       return {
         ...state,
@@ -144,6 +154,31 @@ const ojForUserReducer = (state = initialState, action) => {
         ...state,
         hadCodeUpdate: action.payload
       };
+    case types.CLICK_OPERATE_TYPE: 
+      return {
+        ...state, 
+        operateType: action.payload
+      }
+    case types.CLEAR_OJ_FOR_USER_REDUCER:
+      return {
+        ...state,
+        user_program_identifier: '', // 开启OJ题的唯一标题
+        hack: {}, // 编程题主要内容
+        test_case: {}, // 测试用例
+        commitTestRecordDetail: {}, // 调试代码执行结果
+        commitRecordDetail: {}, // 提交成功后记录提交的详情
+        commitRecord: [], // 提交记录
+        userCode: '', // 保存当前用户输入的代码
+        isUpdateCode: false, // 是否更新了代码内容
+        userCodeTab: 'task', // 学员测评tab位置: task | record | comment 
+        userTestInput: '', // 用户自定义输入值 
+        recordDetail: {}, // 根据id号获取的记录详情
+        hack_identifier: '', // 用户界面编辑时
+        editor_code: '', // 保存编辑代码
+        notice: false, // 通知
+        hadCodeUpdate: false, // 更新代码
+        operateType: '', // 点击类型: 调度或提交 
+      };
     default:
       return state;
   }