|
|
|
@ -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({
|
|
|
|
|