Browse Source

Optimize UI

pull/6/head
Menci 7 years ago
parent
commit
0869b31d82
  1. 16
      models/problem.js
  2. 12
      modules/problem.js
  3. 14
      views/problem.ejs
  4. 95
      views/problem_manage.ejs

16
models/problem.js

@ -455,13 +455,15 @@ class Problem extends Model {
if (this.memory_limit <= 0) return 'Invalid memory limit'; if (this.memory_limit <= 0) return 'Invalid memory limit';
if (this.memory_limit > syzoj.config.limit.memory_limit) return 'Memory limit too large'; if (this.memory_limit > syzoj.config.limit.memory_limit) return 'Memory limit too large';
let filenameRE = /^[\w \-\+\.]*$/; if (this.type === 'traditional') {
if (this.file_io_input_name && !filenameRE.test(this.file_io_input_name)) return 'Invalid input file name'; let filenameRE = /^[\w \-\+\.]*$/;
if (this.file_io_output_name && !filenameRE.test(this.file_io_output_name)) return 'Invalid output file name'; if (this.file_io_input_name && !filenameRE.test(this.file_io_input_name)) return 'Invalid input file name';
if (this.file_io_output_name && !filenameRE.test(this.file_io_output_name)) return 'Invalid output file name';
if (this.file_io) {
if (!this.file_io_input_name) return 'No input file name'; if (this.file_io) {
if (!this.file_io_output_name) return 'No output file name'; if (!this.file_io_input_name) return 'No input file name';
if (!this.file_io_output_name) return 'No output file name';
}
} }
return null; return null;

12
modules/problem.js

@ -494,14 +494,10 @@ app.post('/problem/:id/manage', app.multer.fields([{ name: 'testdata', maxCount:
problem.time_limit = req.body.time_limit; problem.time_limit = req.body.time_limit;
problem.memory_limit = req.body.memory_limit; problem.memory_limit = req.body.memory_limit;
problem.file_io = req.body.io_method === 'file-io'; if (req.body.type === 'traditional') {
problem.file_io_input_name = req.body.file_io_input_name; problem.file_io = req.body.io_method === 'file-io';
problem.file_io_output_name = req.body.file_io_output_name; problem.file_io_input_name = req.body.file_io_input_name;
problem.file_io_output_name = req.body.file_io_output_name;
if (req.body.type === 'interaction') {
if (!problem.file_io) {
throw new ErrorMessage('交互题目必须使用文件 IO。');
}
} }
if (problem.type === 'submit-answer' && req.body.type !== 'submit-answer' || problem.type !== 'submit-answer' && req.body.type === 'submit-answer') { if (problem.type === 'submit-answer' && req.body.type !== 'submit-answer' || problem.type !== 'submit-answer' && req.body.type === 'submit-answer') {

14
views/problem.ejs

@ -38,7 +38,9 @@ div[class*=ace_br] {
<div class="row" style="margin-top: -15px"> <div class="row" style="margin-top: -15px">
<span class="ui label">内存限制:<%= problem.memory_limit %> MiB</span> <span class="ui label">内存限制:<%= problem.memory_limit %> MiB</span>
<span class="ui label">时间限制:<%= problem.time_limit %> ms</span> <span class="ui label">时间限制:<%= problem.time_limit %> ms</span>
<% if (problem.file_io) { %> <% if (problem.type === 'interaction') { %>
<span class="ui label">题目类型:交互</span>
<% } else if (problem.file_io) { %>
<span class="ui label">输入文件: <%= problem.file_io_input_name %></span> <span class="ui label">输入文件: <%= problem.file_io_input_name %></span>
<span class="ui label">输出文件: <%= problem.file_io_output_name %></span> <span class="ui label">输出文件: <%= problem.file_io_output_name %></span>
<% } else { %> <% } else { %>
@ -46,10 +48,12 @@ div[class*=ace_br] {
<% } %> <% } %>
</div> </div>
<% } %> <% } %>
<div class="row" style="margin-top: -<%= problem.type === 'submit-answer' ? 15 : 23 %>px"> <% if (problem.type !== 'interaction') { %>
<span class="ui label">题目类型:<%= { 'submit-answer': '答案提交', 'interaction': '交互', 'traditional': '传统' }[problem.type] %></span> <div class="row" style="margin-top: -<%= problem.type === 'submit-answer' ? 15 : 23 %>px">
<span class="ui label">评测方式:<%= (testcases && !testcases.error) ? (testcases.spj ? 'Special Judge' : '文本比较') : '无测试数据' %></span> <span class="ui label">题目类型:<%= { 'submit-answer': '答案提交', 'interaction': '交互', 'traditional': '传统' }[problem.type] %></span>
</div> <span class="ui label">评测方式:<%= (testcases && !testcases.error) ? (testcases.spj ? 'Special Judge' : '文本比较') : '无测试数据' %></span>
</div>
<% } %>
<% if (!contest) { %> <% if (!contest) { %>
<div class="row" style="margin-top: -23px"> <div class="row" style="margin-top: -23px">
<span class="ui label">上传者: <span class="ui label">上传者:

95
views/problem_manage.ejs

@ -25,59 +25,61 @@
<input type="number" name="memory_limit" value="<%= problem.memory_limit %>"> <input type="number" name="memory_limit" value="<%= problem.memory_limit %>">
</div> </div>
</div> </div>
<% if (!problem.file_io) { %> <div id="io-type"<% if (problem.type === 'interaction') { %> style="display: none; "<% } %>>
<div class="inline fields"> <% if (!problem.file_io) { %>
<label>IO 方式</label> <div class="inline fields">
<div class="field"> <label>IO 方式</label>
<div class="ui radio checkbox"> <div class="field">
<input name="io_method" value="std-io" id="std-io" type="radio" onclick="goDisable()" checked> <div class="ui radio checkbox">
<label for="std-io">标准 IO</label> <input name="io_method" value="std-io" id="std-io" type="radio" onclick="goDisable()" checked>
<label for="std-io">标准 IO</label>
</div>
</div> </div>
</div> <div class="field">
<div class="field"> <div class="ui radio checkbox">
<div class="ui radio checkbox"> <input name="io_method" value="file-io" id="file-io" type="radio" onclick="goEnable()">
<input name="io_method" value="file-io" id="file-io" type="radio" onclick="goEnable()"> <label for="file-io">文件 IO</label>
<label for="file-io">文件 IO</label> </div>
</div> </div>
</div> </div>
</div> <div class="two fields">
<div class="two fields"> <div class="field">
<div class="field"> <label for="file_io_input_name">输入文件名</label>
<label for="file_io_input_name">输入文件名</label> <input type="text" id="file-io-input-name" name="file_io_input_name" value="<%= problem.file_io_input_name %>" disabled>
<input type="text" id="file-io-input-name" name="file_io_input_name" value="<%= problem.file_io_input_name %>" disabled>
</div>
<div class="field">
<label for="file_io_output_name">输出文件名</label>
<input type="text" id="file-io-output-name" name="file_io_output_name" value="<%= problem.file_io_output_name %>" disabled>
</div>
</div>
<% } else { %>
<div class="inline fields">
<label>IO 方式</label>
<div class="field">
<div class="ui radio checkbox" id="std-io-div">
<input name="io_method" value="std-io" id="std-io" type="radio" onclick="goDisable()">
<label for="std-io">标准 IO</label>
</div> </div>
</div> <div class="field">
<div class="field"> <label for="file_io_output_name">输出文件名</label>
<div class="ui radio checkbox"> <input type="text" id="file-io-output-name" name="file_io_output_name" value="<%= problem.file_io_output_name %>" disabled>
<input name="io_method" value="file-io" id="file-io" type="radio" onclick="goEnable()" checked>
<label for="file-io">文件 IO</label>
</div> </div>
</div> </div>
</div> <% } else { %>
<div class="two fields"> <div class="inline fields">
<div class="field"> <label>IO 方式</label>
<label for="file_io_input_name">输入文件名</label> <div class="field">
<input type="text" id="file-io-input-name" name="file_io_input_name" value="<%= problem.file_io_input_name %>"> <div class="ui radio checkbox" id="std-io-div">
<input name="io_method" value="std-io" id="std-io" type="radio" onclick="goDisable()">
<label for="std-io">标准 IO</label>
</div>
</div>
<div class="field">
<div class="ui radio checkbox">
<input name="io_method" value="file-io" id="file-io" type="radio" onclick="goEnable()" checked>
<label for="file-io">文件 IO</label>
</div>
</div>
</div> </div>
<div class="field"> <div class="two fields">
<label for="file_io_output_name">输出文件名</label> <div class="field">
<input type="text" id="file-io-output-name" name="file_io_output_name" value="<%= problem.file_io_output_name %>"> <label for="file_io_input_name">输入文件名</label>
<input type="text" id="file-io-input-name" name="file_io_input_name" value="<%= problem.file_io_input_name %>">
</div>
<div class="field">
<label for="file_io_output_name">输出文件名</label>
<input type="text" id="file-io-output-name" name="file_io_output_name" value="<%= problem.file_io_output_name %>">
</div>
</div> </div>
<% } %>
</div> </div>
<% } %>
</div> </div>
<div class="ui <%= problem.type === 'submit-answer' ? 'active ' : '' %>tab" data-tab="submit-answer" style="margin-bottom: 10px; "> <div class="ui <%= problem.type === 'submit-answer' ? 'active ' : '' %>tab" data-tab="submit-answer" style="margin-bottom: 10px; ">
<b>为了避免系统出错,已有提交的题目不允许在提交答案和非提交答案之间更改。</b><br> <b>为了避免系统出错,已有提交的题目不允许在提交答案和非提交答案之间更改。</b><br>
@ -126,15 +128,14 @@ $(function () {
$('input[name=type]').val('traditional'); $('input[name=type]').val('traditional');
if ($('div[data-tab="interaction"]').attr('data-tab', 'traditional').length) $('a[data-tab="traditional"]').click(); if ($('div[data-tab="interaction"]').attr('data-tab', 'traditional').length) $('a[data-tab="traditional"]').click();
$('#std-io')[0].disabled = false; $('#io-type').show();
}); });
$('a[data-tab="interaction"]').click(function () { $('a[data-tab="interaction"]').click(function () {
$('input[name=type]').val('interaction'); $('input[name=type]').val('interaction');
if ($('div[data-tab="traditional"]').attr('data-tab', 'interaction').length) $('a[data-tab="interaction"]').click(); if ($('div[data-tab="traditional"]').attr('data-tab', 'interaction').length) $('a[data-tab="interaction"]').click();
$('#std-io')[0].disabled = true; $('#io-type').hide();
$('#file-io').click();
}); });
$('a[data-tab="submit-answer"]').click(function () { $('a[data-tab="submit-answer"]').click(function () {

Loading…
Cancel
Save