|  |  |  | @ -4,7 +4,7 @@ | 
			
		
	
		
			
				
					|  |  |  |  |  * @Github:  | 
			
		
	
		
			
				
					|  |  |  |  |  * @Date: 2019-11-27 13:42:11 | 
			
		
	
		
			
				
					|  |  |  |  |  * @LastEditors: tangjiang | 
			
		
	
		
			
				
					|  |  |  |  |  * @LastEditTime: 2019-12-19 15:11:56 | 
			
		
	
		
			
				
					|  |  |  |  |  * @LastEditTime: 2019-12-20 10:25:42 | 
			
		
	
		
			
				
					|  |  |  |  |  */ | 
			
		
	
		
			
				
					|  |  |  |  | import types from "./actionTypes"; | 
			
		
	
		
			
				
					|  |  |  |  | import { Base64 } from 'js-base64'; | 
			
		
	
	
		
			
				
					|  |  |  | @ -171,6 +171,94 @@ export const updateCode = (identifier, inputValue, type) => { | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | // 代码评测
 | 
			
		
	
		
			
				
					|  |  |  |  | export const codeEvaluate = (dispatch, identifier, type, time_limit) => { | 
			
		
	
		
			
				
					|  |  |  |  |   // 调试代码成功后,调用轮循接口, 注意: 代码执行的时间要小于设置的时间限制
 | 
			
		
	
		
			
				
					|  |  |  |  |   const intervalTime = 500; | 
			
		
	
		
			
				
					|  |  |  |  |   let count = 1; | 
			
		
	
		
			
				
					|  |  |  |  |   /** | 
			
		
	
		
			
				
					|  |  |  |  |    * @param {*} excuteTime 执行时间 | 
			
		
	
		
			
				
					|  |  |  |  |    * @param {*} finalTime  总时间  | 
			
		
	
		
			
				
					|  |  |  |  |    * @param {*} count  执行次数 | 
			
		
	
		
			
				
					|  |  |  |  |    * @param {*} timer  定时器 | 
			
		
	
		
			
				
					|  |  |  |  |    */ | 
			
		
	
		
			
				
					|  |  |  |  |   function getCodeSubmit (intervalTime, finalTime, count, timer){ | 
			
		
	
		
			
				
					|  |  |  |  |     const excuteTime = (count++) * intervalTime; // 当前执行时间
 | 
			
		
	
		
			
				
					|  |  |  |  |     fetchCodeSubmit(identifier, { mode: type }).then(res => { | 
			
		
	
		
			
				
					|  |  |  |  |       const { status } = res.data; // 评测返回结果
 | 
			
		
	
		
			
				
					|  |  |  |  |       // 清除定时器条件: 评测通过或者评测时间大于指定时间
 | 
			
		
	
		
			
				
					|  |  |  |  |       if (+status === 0 || (excuteTime / 1000) > (finalTime + 1)) { | 
			
		
	
		
			
				
					|  |  |  |  |         clearInterval(timer); // 清除定时器
 | 
			
		
	
		
			
				
					|  |  |  |  |         timer = null; | 
			
		
	
		
			
				
					|  |  |  |  |         let returnData = null;       | 
			
		
	
		
			
				
					|  |  |  |  |         if (status === 1) { // 结果没有返回
 | 
			
		
	
		
			
				
					|  |  |  |  |           returnData = { | 
			
		
	
		
			
				
					|  |  |  |  |             error_line: -1, | 
			
		
	
		
			
				
					|  |  |  |  |             error_msg: '', | 
			
		
	
		
			
				
					|  |  |  |  |             execute_memory: '', | 
			
		
	
		
			
				
					|  |  |  |  |             execute_time: finalTime, | 
			
		
	
		
			
				
					|  |  |  |  |             input: '', | 
			
		
	
		
			
				
					|  |  |  |  |             output: '', | 
			
		
	
		
			
				
					|  |  |  |  |             status: 2, | 
			
		
	
		
			
				
					|  |  |  |  |             expected_output: '' | 
			
		
	
		
			
				
					|  |  |  |  |           }; | 
			
		
	
		
			
				
					|  |  |  |  |         } else { // 成功返回结果
 | 
			
		
	
		
			
				
					|  |  |  |  |           returnData = res.data.data; | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         // 返回评测结果
 | 
			
		
	
		
			
				
					|  |  |  |  |         dispatch({ | 
			
		
	
		
			
				
					|  |  |  |  |           type: types.COMMIT_RECORD_DETAIL, | 
			
		
	
		
			
				
					|  |  |  |  |           payload: returnData  | 
			
		
	
		
			
				
					|  |  |  |  |         });    | 
			
		
	
		
			
				
					|  |  |  |  |         if (!type || type === 'debug') { | 
			
		
	
		
			
				
					|  |  |  |  |           dispatch({ // 改变 loading 值
 | 
			
		
	
		
			
				
					|  |  |  |  |             type: types.LOADING_STATUS, | 
			
		
	
		
			
				
					|  |  |  |  |             payload: false | 
			
		
	
		
			
				
					|  |  |  |  |           }); | 
			
		
	
		
			
				
					|  |  |  |  |           // 保存执行状态
 | 
			
		
	
		
			
				
					|  |  |  |  |           dispatch({ | 
			
		
	
		
			
				
					|  |  |  |  |             type: types.TEST_CODE_STATUS, | 
			
		
	
		
			
				
					|  |  |  |  |             payload: 'finish' | 
			
		
	
		
			
				
					|  |  |  |  |           }); | 
			
		
	
		
			
				
					|  |  |  |  |         } else { | 
			
		
	
		
			
				
					|  |  |  |  |           // 回滚提交按钮状态
 | 
			
		
	
		
			
				
					|  |  |  |  |           dispatch({ | 
			
		
	
		
			
				
					|  |  |  |  |             type: types.SUBMIT_LOADING_STATUS, | 
			
		
	
		
			
				
					|  |  |  |  |             payload: false | 
			
		
	
		
			
				
					|  |  |  |  |           }); | 
			
		
	
		
			
				
					|  |  |  |  |           // 改变tab值至提交记录(只在提交时才跳转,测评时,切换到代码执行结果就可以了)
 | 
			
		
	
		
			
				
					|  |  |  |  |           dispatch({ | 
			
		
	
		
			
				
					|  |  |  |  |             type: types.CHANGE_USER_CODE_TAB, | 
			
		
	
		
			
				
					|  |  |  |  |             payload: 'record' | 
			
		
	
		
			
				
					|  |  |  |  |           }); | 
			
		
	
		
			
				
					|  |  |  |  |           // 重新调用一下提交记录接口
 | 
			
		
	
		
			
				
					|  |  |  |  |           dispatch(getUserCommitRecord(identifier)); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |  |     }).catch(err => { // 评测异常时
 | 
			
		
	
		
			
				
					|  |  |  |  |       // 清除定时器
 | 
			
		
	
		
			
				
					|  |  |  |  |       clearInterval(timer); | 
			
		
	
		
			
				
					|  |  |  |  |       timer = null; | 
			
		
	
		
			
				
					|  |  |  |  |       // 回滚按钮状态
 | 
			
		
	
		
			
				
					|  |  |  |  |       if (!type || type === 'debug') { | 
			
		
	
		
			
				
					|  |  |  |  |         dispatch({ // 改变 loading 值
 | 
			
		
	
		
			
				
					|  |  |  |  |           type: types.LOADING_STATUS, | 
			
		
	
		
			
				
					|  |  |  |  |           payload: false | 
			
		
	
		
			
				
					|  |  |  |  |         }); | 
			
		
	
		
			
				
					|  |  |  |  |       } else { // 回滚提交按钮状态
 | 
			
		
	
		
			
				
					|  |  |  |  |         dispatch({ | 
			
		
	
		
			
				
					|  |  |  |  |           type: types.SUBMIT_LOADING_STATUS, | 
			
		
	
		
			
				
					|  |  |  |  |           payload: false | 
			
		
	
		
			
				
					|  |  |  |  |         }); | 
			
		
	
		
			
				
					|  |  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |  |     }); | 
			
		
	
		
			
				
					|  |  |  |  |   } | 
			
		
	
		
			
				
					|  |  |  |  |   // 开启定时器,调用监听接口
 | 
			
		
	
		
			
				
					|  |  |  |  |   let timer = setInterval(() => { | 
			
		
	
		
			
				
					|  |  |  |  |     getCodeSubmit(intervalTime, time_limit, count++, timer); | 
			
		
	
		
			
				
					|  |  |  |  |   }, intervalTime); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /** | 
			
		
	
		
			
				
					|  |  |  |  |  * @description 调试代码 | 
			
		
	
		
			
				
					|  |  |  |  |  * @param {*} identifier  | 
			
		
	
	
		
			
				
					|  |  |  | @ -194,15 +282,6 @@ export const debuggerCode = (identifier,value, type) => { | 
			
		
	
		
			
				
					|  |  |  |  |       // console.log('调用调试代码成功并返回结果: ', res);
 | 
			
		
	
		
			
				
					|  |  |  |  |       const { status } = res; | 
			
		
	
		
			
				
					|  |  |  |  |       if (status === 200) { | 
			
		
	
		
			
				
					|  |  |  |  |         // 调试代码成功后,调用轮循接口, 注意: 代码执行的时间要小于设置的时间限制
 | 
			
		
	
		
			
				
					|  |  |  |  |         const intervalTime = 500; | 
			
		
	
		
			
				
					|  |  |  |  |         let count = 1; | 
			
		
	
		
			
				
					|  |  |  |  |         /** | 
			
		
	
		
			
				
					|  |  |  |  |          * @param {*} excuteTime 执行时间 | 
			
		
	
		
			
				
					|  |  |  |  |          * @param {*} finalTime  总时间  | 
			
		
	
		
			
				
					|  |  |  |  |          * @param {*} count  执行次数 | 
			
		
	
		
			
				
					|  |  |  |  |          * @param {*} timer  定时器 | 
			
		
	
		
			
				
					|  |  |  |  |          */ | 
			
		
	
		
			
				
					|  |  |  |  |         if (res.data.status === 401) { | 
			
		
	
		
			
				
					|  |  |  |  |           dispatch({ // 改变 loading 值
 | 
			
		
	
		
			
				
					|  |  |  |  |             type: types.LOADING_STATUS, | 
			
		
	
	
		
			
				
					|  |  |  | @ -210,81 +289,8 @@ export const debuggerCode = (identifier,value, type) => { | 
			
		
	
		
			
				
					|  |  |  |  |           }); | 
			
		
	
		
			
				
					|  |  |  |  |           return; | 
			
		
	
		
			
				
					|  |  |  |  |         }; | 
			
		
	
		
			
				
					|  |  |  |  |         function getCodeSubmit (intervalTime, finalTime, count, timer){ | 
			
		
	
		
			
				
					|  |  |  |  |           const excuteTime = (count++) * intervalTime; // 当前执行时间
 | 
			
		
	
		
			
				
					|  |  |  |  |           fetchCodeSubmit(identifier, { mode: type }).then(res => { | 
			
		
	
		
			
				
					|  |  |  |  |             const { status } = res.data; // 评测返回结果
 | 
			
		
	
		
			
				
					|  |  |  |  |             // 清除定时器条件: 评测通过或者评测时间大于指定时间
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (+status === 0 || (excuteTime / 1000) > (finalTime + 1)) { | 
			
		
	
		
			
				
					|  |  |  |  |               clearInterval(timer); // 清除定时器
 | 
			
		
	
		
			
				
					|  |  |  |  |               timer = null; | 
			
		
	
		
			
				
					|  |  |  |  |               let returnData = null;       | 
			
		
	
		
			
				
					|  |  |  |  |               if (status === 1) { // 结果没有返回
 | 
			
		
	
		
			
				
					|  |  |  |  |                 returnData = { | 
			
		
	
		
			
				
					|  |  |  |  |                   error_line: -1, | 
			
		
	
		
			
				
					|  |  |  |  |                   error_msg: '', | 
			
		
	
		
			
				
					|  |  |  |  |                   execute_memory: '', | 
			
		
	
		
			
				
					|  |  |  |  |                   execute_time: finalTime, | 
			
		
	
		
			
				
					|  |  |  |  |                   input: '', | 
			
		
	
		
			
				
					|  |  |  |  |                   output: '', | 
			
		
	
		
			
				
					|  |  |  |  |                   status: 2, | 
			
		
	
		
			
				
					|  |  |  |  |                   expected_output: '' | 
			
		
	
		
			
				
					|  |  |  |  |                 }; | 
			
		
	
		
			
				
					|  |  |  |  |               } else { // 成功返回结果
 | 
			
		
	
		
			
				
					|  |  |  |  |                 returnData = res.data.data; | 
			
		
	
		
			
				
					|  |  |  |  |               } | 
			
		
	
		
			
				
					|  |  |  |  |               // 返回评测结果
 | 
			
		
	
		
			
				
					|  |  |  |  |               dispatch({ | 
			
		
	
		
			
				
					|  |  |  |  |                 type: types.COMMIT_RECORD_DETAIL, | 
			
		
	
		
			
				
					|  |  |  |  |                 payload: returnData  | 
			
		
	
		
			
				
					|  |  |  |  |               });    | 
			
		
	
		
			
				
					|  |  |  |  |               if (!type || type === 'debug') { | 
			
		
	
		
			
				
					|  |  |  |  |                 dispatch({ // 改变 loading 值
 | 
			
		
	
		
			
				
					|  |  |  |  |                   type: types.LOADING_STATUS, | 
			
		
	
		
			
				
					|  |  |  |  |                   payload: false | 
			
		
	
		
			
				
					|  |  |  |  |                 }); | 
			
		
	
		
			
				
					|  |  |  |  |                 // 保存执行状态
 | 
			
		
	
		
			
				
					|  |  |  |  |                 dispatch({ | 
			
		
	
		
			
				
					|  |  |  |  |                   type: types.TEST_CODE_STATUS, | 
			
		
	
		
			
				
					|  |  |  |  |                   payload: 'finish' | 
			
		
	
		
			
				
					|  |  |  |  |                 }); | 
			
		
	
		
			
				
					|  |  |  |  |               } else { | 
			
		
	
		
			
				
					|  |  |  |  |                 // 回滚提交按钮状态
 | 
			
		
	
		
			
				
					|  |  |  |  |                 dispatch({ | 
			
		
	
		
			
				
					|  |  |  |  |                   type: types.SUBMIT_LOADING_STATUS, | 
			
		
	
		
			
				
					|  |  |  |  |                   payload: false | 
			
		
	
		
			
				
					|  |  |  |  |                 }); | 
			
		
	
		
			
				
					|  |  |  |  |                 // 改变tab值至提交记录(只在提交时才跳转,测评时,切换到代码执行结果就可以了)
 | 
			
		
	
		
			
				
					|  |  |  |  |                 dispatch({ | 
			
		
	
		
			
				
					|  |  |  |  |                   type: types.CHANGE_USER_CODE_TAB, | 
			
		
	
		
			
				
					|  |  |  |  |                   payload: 'record' | 
			
		
	
		
			
				
					|  |  |  |  |                 }); | 
			
		
	
		
			
				
					|  |  |  |  |                 // 重新调用一下提交记录接口
 | 
			
		
	
		
			
				
					|  |  |  |  |                 dispatch(getUserCommitRecord(identifier)); | 
			
		
	
		
			
				
					|  |  |  |  |               } | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |           }).catch(err => { // 评测异常时
 | 
			
		
	
		
			
				
					|  |  |  |  |             // 清除定时器
 | 
			
		
	
		
			
				
					|  |  |  |  |             clearInterval(timer); | 
			
		
	
		
			
				
					|  |  |  |  |             timer = null; | 
			
		
	
		
			
				
					|  |  |  |  |             // 回滚按钮状态
 | 
			
		
	
		
			
				
					|  |  |  |  |             if (!type || type === 'debug') { | 
			
		
	
		
			
				
					|  |  |  |  |               dispatch({ // 改变 loading 值
 | 
			
		
	
		
			
				
					|  |  |  |  |                 type: types.LOADING_STATUS, | 
			
		
	
		
			
				
					|  |  |  |  |                 payload: false | 
			
		
	
		
			
				
					|  |  |  |  |               }); | 
			
		
	
		
			
				
					|  |  |  |  |             } else { // 回滚提交按钮状态
 | 
			
		
	
		
			
				
					|  |  |  |  |               dispatch({ | 
			
		
	
		
			
				
					|  |  |  |  |                 type: types.SUBMIT_LOADING_STATUS, | 
			
		
	
		
			
				
					|  |  |  |  |                 payload: false | 
			
		
	
		
			
				
					|  |  |  |  |               }); | 
			
		
	
		
			
				
					|  |  |  |  |             } | 
			
		
	
		
			
				
					|  |  |  |  |           }); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |         // 开启定时器,调用监听接口
 | 
			
		
	
		
			
				
					|  |  |  |  |         let timer = setInterval(() => { | 
			
		
	
		
			
				
					|  |  |  |  |           getCodeSubmit(intervalTime, time_limit, count++, timer); | 
			
		
	
		
			
				
					|  |  |  |  |         }, intervalTime); | 
			
		
	
		
			
				
					|  |  |  |  |         // 测评
 | 
			
		
	
		
			
				
					|  |  |  |  |         codeEvaluate(dispatch, identifier, type, time_limit); | 
			
		
	
		
			
				
					|  |  |  |  |       } | 
			
		
	
		
			
				
					|  |  |  |  |     }).catch(() => { | 
			
		
	
		
			
				
					|  |  |  |  |       dispatch({ | 
			
		
	
	
		
			
				
					|  |  |  | @ -362,7 +368,8 @@ export const changeUserCodeTab = (key) => { | 
			
		
	
		
			
				
					|  |  |  |  |  */ | 
			
		
	
		
			
				
					|  |  |  |  | export const submitUserCode = (identifier, inputValue, type) => { | 
			
		
	
		
			
				
					|  |  |  |  |   return (dispatch, getState) => { | 
			
		
	
		
			
				
					|  |  |  |  |     const { userCode, isUpdateCode } = getState().ojForUserReducer; | 
			
		
	
		
			
				
					|  |  |  |  |     const { userCode, isUpdateCode, hack: {time_limit = 0} } = getState().ojForUserReducer; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  |     function userCodeSubmit () { | 
			
		
	
		
			
				
					|  |  |  |  |       fetchUserCodeSubmit(identifier).then(res => { | 
			
		
	
		
			
				
					|  |  |  |  |         // console.log('用户提交代码成功======》》》》》', res);
 | 
			
		
	
	
		
			
				
					|  |  |  | @ -374,12 +381,8 @@ export const submitUserCode = (identifier, inputValue, type) => { | 
			
		
	
		
			
				
					|  |  |  |  |             }); | 
			
		
	
		
			
				
					|  |  |  |  |             return; | 
			
		
	
		
			
				
					|  |  |  |  |           }; | 
			
		
	
		
			
				
					|  |  |  |  |           // 将编辑代码清空
 | 
			
		
	
		
			
				
					|  |  |  |  |           dispatch({ | 
			
		
	
		
			
				
					|  |  |  |  |             type: types.SAVE_EDITOR_CODE, | 
			
		
	
		
			
				
					|  |  |  |  |             payload: '' | 
			
		
	
		
			
				
					|  |  |  |  |           }); | 
			
		
	
		
			
				
					|  |  |  |  |           dispatch(debuggerCode(identifier, inputValue, type || 'submit')); | 
			
		
	
		
			
				
					|  |  |  |  |           // 测评
 | 
			
		
	
		
			
				
					|  |  |  |  |           codeEvaluate(dispatch, identifier, type, time_limit); | 
			
		
	
		
			
				
					|  |  |  |  |         } | 
			
		
	
		
			
				
					|  |  |  |  |       }).catch(() => { | 
			
		
	
		
			
				
					|  |  |  |  |         dispatch({ | 
			
		
	
	
		
			
				
					|  |  |  | 
 |