|
|
|
@ -3,40 +3,39 @@
|
|
|
|
|
<% include header %> |
|
|
|
|
<script src="<%- lib('textfit/2.3.1/textFit.min.js') %>"></script> |
|
|
|
|
<style> |
|
|
|
|
.single-subtask { |
|
|
|
|
box-shadow: none !important; |
|
|
|
|
} |
|
|
|
|
.single-subtask { |
|
|
|
|
box-shadow: none !important; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.single-subtask > .title { |
|
|
|
|
display: none; |
|
|
|
|
} |
|
|
|
|
.single-subtask > .title { |
|
|
|
|
display: none; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.single-subtask > .content { |
|
|
|
|
padding: 0 !important; |
|
|
|
|
} |
|
|
|
|
.single-subtask > .content { |
|
|
|
|
padding: 0 !important; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.accordion > .content > .accordion { |
|
|
|
|
margin-top: 0; |
|
|
|
|
margin-bottom: 0; |
|
|
|
|
} |
|
|
|
|
.accordion > .content > .accordion { |
|
|
|
|
margin-top: 0; |
|
|
|
|
margin-bottom: 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.accordion > .content > .accordion > .content { |
|
|
|
|
margin-top: 0; |
|
|
|
|
margin-bottom: 14px; |
|
|
|
|
} |
|
|
|
|
.accordion > .content > .accordion > .content { |
|
|
|
|
margin-top: 0; |
|
|
|
|
margin-bottom: 14px; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
.accordion > .content > .accordion > .content > :last-child { |
|
|
|
|
margin-bottom: -10px !important; |
|
|
|
|
} |
|
|
|
|
.disabled{ |
|
|
|
|
display: none; |
|
|
|
|
} |
|
|
|
|
.accordion > .content > .accordion > .content > :last-child { |
|
|
|
|
margin-bottom: -10px !important; |
|
|
|
|
} |
|
|
|
|
</style> |
|
|
|
|
<span id="submission_content"> |
|
|
|
|
<div class="padding" id="vueAppFuckSafari"> |
|
|
|
|
<a href="<%= syzoj.utils.makeUrl(['contest', contest_id]) %>">返回比赛</a> |
|
|
|
|
<table class="ui very basic center aligned table" id="status_table"> |
|
|
|
|
<thead> |
|
|
|
|
<tr> |
|
|
|
|
<th>已分享</th> |
|
|
|
|
<th>编号</th> |
|
|
|
|
<th>题目</th> |
|
|
|
|
<th>状态</th> |
|
|
|
@ -55,12 +54,9 @@
|
|
|
|
|
<tr is="submission-item" v-bind:data="roughData" :config="displayConfig" :show-rejudge="showRejudge" :show-share="showShare" :progress="getProgress()" :compiling="detailResult && !detailResult.compile"></tr> |
|
|
|
|
</tbody> |
|
|
|
|
</table> |
|
|
|
|
<div id="cid" class="disabled"><%= cid %></div> |
|
|
|
|
<div id="pid" class="disabled"><%= pid %></div> |
|
|
|
|
<div id="sid" class="disabled"><%= sid %></div> |
|
|
|
|
<code-box no-escape v-bind:content="code"> |
|
|
|
|
<% if (formattedCode !== null) { %> |
|
|
|
|
<a onclick="toggleFormattedCode()" class="ui button" style="position: absolute; top: 0px; right: -4px; border-top-left-radius: 0; border-bottom-right-radius: 0; "> |
|
|
|
|
<% if (formattedCode !== null) { %> |
|
|
|
|
<a onclick="toggleFormattedCode()" class="ui button" style="position: absolute; top: 0px; right: -4px; border-top-left-radius: 0; border-bottom-right-radius: 0; "> |
|
|
|
|
<template v-if="currentFormatted"> |
|
|
|
|
显示原始代码 |
|
|
|
|
</template> |
|
|
|
@ -68,7 +64,7 @@
|
|
|
|
|
格式化代码 |
|
|
|
|
</template> |
|
|
|
|
</a> |
|
|
|
|
<% } %> |
|
|
|
|
<% } %> |
|
|
|
|
</code-box> |
|
|
|
|
<code-box v-if="detailResult && detailResult.compile" no-escape title="编译信息" v-bind:content="detailResult.compile.message"></code-box> |
|
|
|
|
<code-box v-if="detailResult" title="系统信息" v-bind:content="detailResult.systemMessage"></code-box> |
|
|
|
@ -135,9 +131,9 @@
|
|
|
|
|
<script src="<%- lib('socket.io/2.2.0/socket.io.js') %>"></script> |
|
|
|
|
<script src="<%- lib('jsondiffpatch/0.2.5/jsondiffpatch.min.js') %>"></script> |
|
|
|
|
|
|
|
|
|
<% include submissions_item %> |
|
|
|
|
<% include submissions_item %> |
|
|
|
|
|
|
|
|
|
<script type="text/x-template" id="codeBoxTemplate"> |
|
|
|
|
<script type="text/x-template" id="codeBoxTemplate"> |
|
|
|
|
<div style="margin-top: 0px; margin-bottom: 14px; " v-if="content != null && content !== ''"> |
|
|
|
|
<p v-if="title" class="transition visible"> |
|
|
|
|
<strong v-html="title"></strong> |
|
|
|
@ -153,16 +149,16 @@
|
|
|
|
|
|
|
|
|
|
<script> |
|
|
|
|
Vue.component("code-box", { |
|
|
|
|
template: "#codeBoxTemplate", |
|
|
|
|
props: { |
|
|
|
|
title: String, |
|
|
|
|
content: String, |
|
|
|
|
noEscape: { |
|
|
|
|
type: Boolean, |
|
|
|
|
default: false |
|
|
|
|
}, |
|
|
|
|
download: String |
|
|
|
|
} |
|
|
|
|
template: "#codeBoxTemplate", |
|
|
|
|
props: { |
|
|
|
|
title: String, |
|
|
|
|
content: String, |
|
|
|
|
noEscape: { |
|
|
|
|
type: Boolean, |
|
|
|
|
default: false |
|
|
|
|
}, |
|
|
|
|
download: String |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
const socketUrl = "/detail"; |
|
|
|
|
const displayConfig = <%- serializejs(displayConfig) %>; |
|
|
|
@ -170,16 +166,16 @@ const token = <%- serializejs(socketToken) %>;
|
|
|
|
|
|
|
|
|
|
const TestcaseResultType = {}; |
|
|
|
|
(function (TestcaseResultType) { |
|
|
|
|
TestcaseResultType[TestcaseResultType["Accepted"] = 1] = "Accepted"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["WrongAnswer"] = 2] = "WrongAnswer"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["PartiallyCorrect"] = 3] = "PartiallyCorrect"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["MemoryLimitExceeded"] = 4] = "MemoryLimitExceeded"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["TimeLimitExceeded"] = 5] = "TimeLimitExceeded"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["OutputLimitExceeded"] = 6] = "OutputLimitExceeded"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["FileError"] = 7] = "FileError"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["RuntimeError"] = 8] = "RuntimeError"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["JudgementFailed"] = 9] = "JudgementFailed"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["InvalidInteraction"] = 10] = "InvalidInteraction"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["Accepted"] = 1] = "Accepted"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["WrongAnswer"] = 2] = "WrongAnswer"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["PartiallyCorrect"] = 3] = "PartiallyCorrect"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["MemoryLimitExceeded"] = 4] = "MemoryLimitExceeded"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["TimeLimitExceeded"] = 5] = "TimeLimitExceeded"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["OutputLimitExceeded"] = 6] = "OutputLimitExceeded"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["FileError"] = 7] = "FileError"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["RuntimeError"] = 8] = "RuntimeError"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["JudgementFailed"] = 9] = "JudgementFailed"; |
|
|
|
|
TestcaseResultType[TestcaseResultType["InvalidInteraction"] = 10] = "InvalidInteraction"; |
|
|
|
|
})(TestcaseResultType); |
|
|
|
|
|
|
|
|
|
const statusToString = {}; |
|
|
|
@ -196,11 +192,11 @@ statusToString[TestcaseResultType.InvalidInteraction] = "Invalid Interaction";
|
|
|
|
|
|
|
|
|
|
const TaskStatus = {}; |
|
|
|
|
(function (TaskStatus) { |
|
|
|
|
TaskStatus[TaskStatus["Waiting"] = 0] = "Waiting"; |
|
|
|
|
TaskStatus[TaskStatus["Running"] = 1] = "Running"; |
|
|
|
|
TaskStatus[TaskStatus["Done"] = 2] = "Done"; |
|
|
|
|
TaskStatus[TaskStatus["Failed"] = 3] = "Failed"; |
|
|
|
|
TaskStatus[TaskStatus["Skipped"] = 4] = "Skipped"; |
|
|
|
|
TaskStatus[TaskStatus["Waiting"] = 0] = "Waiting"; |
|
|
|
|
TaskStatus[TaskStatus["Running"] = 1] = "Running"; |
|
|
|
|
TaskStatus[TaskStatus["Done"] = 2] = "Done"; |
|
|
|
|
TaskStatus[TaskStatus["Failed"] = 3] = "Failed"; |
|
|
|
|
TaskStatus[TaskStatus["Skipped"] = 4] = "Skipped"; |
|
|
|
|
})(TaskStatus); |
|
|
|
|
|
|
|
|
|
const unformattedCode = <%- serializejs(code) %>; |
|
|
|
@ -318,10 +314,6 @@ const vueApp = new Vue({
|
|
|
|
|
}); |
|
|
|
|
if (token != null) { |
|
|
|
|
const loadSocketIO = function () { |
|
|
|
|
const cid = parseInt(document.getElementById('cid').innerHTML); |
|
|
|
|
const pid = parseInt(document.getElementById('pid').innerHTML); |
|
|
|
|
const sid = parseInt(document.getElementById('sid').innerHTML); |
|
|
|
|
console.log(sid); |
|
|
|
|
let currentVersion = 0; |
|
|
|
|
const socket = io(socketUrl); |
|
|
|
|
socket.on('connect', function () { |
|
|
|
@ -346,68 +338,17 @@ if (token != null) {
|
|
|
|
|
console.log("Judge finished"); |
|
|
|
|
vueApp.roughData.running = false; |
|
|
|
|
vueApp.roughData.result = p.roughResult; |
|
|
|
|
if (p.roughResult.result === 'Accepted') { |
|
|
|
|
$.ajax({ |
|
|
|
|
url: `/api/pass/${cid}/${pid}/${sid}`, |
|
|
|
|
type: 'GET', |
|
|
|
|
success: function (data) { |
|
|
|
|
}, |
|
|
|
|
error: function (XMLHttpRequest, textStatus, errorThrown) { |
|
|
|
|
alert('练习功能发生故障'); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} else { |
|
|
|
|
$.ajax({ |
|
|
|
|
url: `/api/nopass/${cid}/${pid}/${sid}`, |
|
|
|
|
type: 'GET', |
|
|
|
|
success: function (data) { |
|
|
|
|
}, |
|
|
|
|
error: function (XMLHttpRequest, textStatus, errorThrown) { |
|
|
|
|
alert('练习功能发生故障'); |
|
|
|
|
} |
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
vueApp.detailResult = p.result; |
|
|
|
|
socket.close(); |
|
|
|
|
}); |
|
|
|
|
socket.emit('join', token, function (data) { |
|
|
|
|
console.log("join! ", data); |
|
|
|
|
// data.ok=true; |
|
|
|
|
// data.finished=true; |
|
|
|
|
// data.roughResult = { |
|
|
|
|
// memory: 7128, |
|
|
|
|
// result: "Accepted", |
|
|
|
|
// score: 100, |
|
|
|
|
// time: 272, |
|
|
|
|
// } |
|
|
|
|
// data.running=false; |
|
|
|
|
if (data && data.ok) { |
|
|
|
|
if (data.finished) { |
|
|
|
|
vueApp.roughData.result = data.roughResult; |
|
|
|
|
// if (!data.result) location.reload(true); |
|
|
|
|
vueApp.detailResult = data.result; |
|
|
|
|
vueApp.roughData.running = false; |
|
|
|
|
// if (data.roughResult.result === 'Accepted') { |
|
|
|
|
// $.ajax({ |
|
|
|
|
// url: `/api/pass/${cid}/${pid}/${sid}`, |
|
|
|
|
// type: 'GET', |
|
|
|
|
// success: function (data) { |
|
|
|
|
// }, |
|
|
|
|
// error: function (XMLHttpRequest, textStatus, errorThrown) { |
|
|
|
|
// alert('练习功能发生故障'); |
|
|
|
|
// } |
|
|
|
|
// }); |
|
|
|
|
// } else { |
|
|
|
|
// $.ajax({ |
|
|
|
|
// url: `/api/nopass/${cid}/${pid}/${sid}`, |
|
|
|
|
// type: 'GET', |
|
|
|
|
// success: function (data) { |
|
|
|
|
// }, |
|
|
|
|
// error: function (XMLHttpRequest, textStatus, errorThrown) { |
|
|
|
|
// alert('练习功能发生故障'); |
|
|
|
|
// } |
|
|
|
|
// }); |
|
|
|
|
// } |
|
|
|
|
socket.close(); |
|
|
|
|
} else { |
|
|
|
|
if (data.running) { |
|
|
|
|