add problem extra file tab

This commit is contained in:
Himit_ZH 2022-01-05 23:10:20 +08:00
parent 4879ccc755
commit 6cf91067cf
6 changed files with 89 additions and 5 deletions

View File

@ -237,7 +237,6 @@ public class ProblemController {
public CommonResult getProblemInfo(@RequestParam(value = "problemId", required = true) String problemId) { public CommonResult getProblemInfo(@RequestParam(value = "problemId", required = true) String problemId) {
QueryWrapper<Problem> wrapper = new QueryWrapper<Problem>().eq("problem_id", problemId); QueryWrapper<Problem> wrapper = new QueryWrapper<Problem>().eq("problem_id", problemId);
//查询题目详情题目标签题目语言题目做题情况 //查询题目详情题目标签题目语言题目做题情况
Problem problem = problemService.getOne(wrapper, false); Problem problem = problemService.getOne(wrapper, false);
if (problem == null) { if (problem == null) {
@ -284,6 +283,11 @@ public class ProblemController {
LangNameAndCode.put(tmpMap.get(codeTemplate.getLid()), codeTemplate.getCode()); LangNameAndCode.put(tmpMap.get(codeTemplate.getLid()), codeTemplate.getCode());
} }
} }
// 屏蔽一些题目参数
problem.setJudgeExtraFile(null)
.setSpjCode(null)
.setSpjLanguage(null);
// 将数据统一写入到一个Vo返回数据实体类中 // 将数据统一写入到一个Vo返回数据实体类中
ProblemInfoVo problemInfoVo = new ProblemInfoVo(problem, tags, languagesStr, problemCount, LangNameAndCode); ProblemInfoVo problemInfoVo = new ProblemInfoVo(problem, tags, languagesStr, problemCount, LangNameAndCode);
return CommonResult.successResponse(problemInfoVo, "获取成功"); return CommonResult.successResponse(problemInfoVo, "获取成功");

View File

@ -92,6 +92,19 @@ function downloadFile (url) {
}) })
} }
function downloadFileByText (fileName,fileContent) {
return new Promise((resolve, reject) => {
let link = document.createElement('a')
link.href = window.URL.createObjectURL(new window.Blob([fileContent], {type:'text/plain;charset=utf-8'}))
link.download = fileName
document.body.appendChild(link)
link.click()
link.remove()
myMessage.success("Download Successfully!")
resolve()
})
}
function getLanguages (all=true) { function getLanguages (all=true) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let languages = storage.get(STORAGE_KEY.languages) let languages = storage.get(STORAGE_KEY.languages)
@ -138,6 +151,7 @@ export default {
filterEmptyValue: filterEmptyValue, filterEmptyValue: filterEmptyValue,
breakLongWords: breakLongWords, breakLongWords: breakLongWords,
downloadFile: downloadFile, downloadFile: downloadFile,
downloadFileByText:downloadFileByText,
getLanguages:getLanguages, getLanguages:getLanguages,
stringToExamples:stringToExamples, stringToExamples:stringToExamples,
examplesToString:examplesToString examplesToString:examplesToString

View File

@ -9,7 +9,7 @@
@close="deleteFile(key)" @close="deleteFile(key)"
@click="openFileDialog(key, value)" @click="openFileDialog(key, value)"
> >
{{ key }} <i class="fa fa-file-code-o"> {{ key }}</i>
</el-tag> </el-tag>
<el-button <el-button

View File

@ -171,6 +171,7 @@ export const m = {
// /views/oj/problem/Problem.vue // /views/oj/problem/Problem.vue
Problem_Description:'Problem Description', Problem_Description:'Problem Description',
My_Submission:'My Submission', My_Submission:'My Submission',
Problem_Annex:'Problem Annex',
Login_to_view_your_submission_history:'Login to view your submission history', Login_to_view_your_submission_history:'Login to view your submission history',
Shrink_Sidebar:'Shrink Sidebar', Shrink_Sidebar:'Shrink Sidebar',
View_Problem_Content:'View Problem Content', View_Problem_Content:'View Problem Content',

View File

@ -172,6 +172,7 @@ export const m = {
// /views/oj/problem/Problem.vue // /views/oj/problem/Problem.vue
Problem_Description:'题目描述', Problem_Description:'题目描述',
My_Submission:'我的提交', My_Submission:'我的提交',
Problem_Annex:'题目附件',
Login_to_view_your_submission_history:'登录以查看您的提交记录', Login_to_view_your_submission_history:'登录以查看您的提交记录',
Shrink_Sidebar:'收缩侧边栏', Shrink_Sidebar:'收缩侧边栏',
View_Problem_Content:'查看题目内容', View_Problem_Content:'查看题目内容',

View File

@ -11,9 +11,10 @@
> >
<el-tab-pane name="problemDetail" v-loading="loading"> <el-tab-pane name="problemDetail" v-loading="loading">
<span slot="label" <span slot="label"
><i class="fa fa-list-alt"></i> ><i class="fa fa-list-alt">
{{ $t('m.Problem_Description') }}</span {{ $t('m.Problem_Description') }}</i
> >
</span>
<div :padding="10" shadow class="problem-detail"> <div :padding="10" shadow class="problem-detail">
<div slot="header" class="panel-title"> <div slot="header" class="panel-title">
<span>{{ problemData.problem.title }}</span <span>{{ problemData.problem.title }}</span
@ -395,6 +396,42 @@
</div> </div>
</template> </template>
</el-tab-pane> </el-tab-pane>
<el-tab-pane name="extraFile" v-if="userExtraFile">
<span slot="label"
><i class="fa fa-file-code-o"> {{ $t('m.Problem_Annex') }}</i>
</span>
<div class="problem-detail">
<el-divider></el-divider>
<div>
<el-tag
:key="index"
v-for="(value, key, index) in userExtraFile"
class="extra-file"
:disable-transitions="false"
@click="showExtraFileContent(key, value)"
>
<i class="fa fa-file-code-o"> {{ key }}</i>
</el-tag>
</div>
<el-divider></el-divider>
<div class="markdown-body" v-if="fileContent">
<h3>
{{ fileName }}
<el-button
type="primary"
icon="el-icon-download"
size="small"
circle
@click="downloadExtraFile"
class="file-download"
></el-button>
</h3>
<pre v-highlight="fileContent"><code class="c++"></code></pre>
</div>
</div>
</el-tab-pane>
</el-tabs> </el-tabs>
</el-col> </el-col>
<div <div
@ -707,6 +744,9 @@ export default {
mySubmissions: [], mySubmissions: [],
loading: false, loading: false,
bodyClass: '', bodyClass: '',
userExtraFile: null,
fileContent: '',
fileName: '',
}; };
}, },
// //
@ -946,6 +986,9 @@ export default {
result.problem.hint.toString() result.problem.hint.toString()
); );
} }
if (result.problem.userExtraFile) {
this.userExtraFile = JSON.parse(result.problem.userExtraFile);
}
this.problemData = result; this.problemData = result;
@ -1273,6 +1316,17 @@ export default {
); );
}, },
showExtraFileContent(name, content) {
this.fileName = name;
this.fileContent = content;
this.$nextTick((_) => {
addCodeBtn();
});
},
downloadExtraFile() {
utils.downloadFileByText(this.fileName, this.fileContent);
},
calcOIRankScore(score, difficulty) { calcOIRankScore(score, difficulty) {
return 0.1 * score + 2 * difficulty; return 0.1 * score + 2 * difficulty;
}, },
@ -1404,6 +1458,16 @@ a {
font-size: 14px; font-size: 14px;
} }
.extra-file {
margin: 10px;
cursor: pointer;
}
.file-download {
vertical-align: bottom;
float: right;
margin-right: 5px;
}
.submit-detail { .submit-detail {
height: 100%; height: 100%;
} }