|
|
|
|
<template>
|
|
|
|
|
<div>
|
|
|
|
|
<div class="flex header">
|
|
|
|
|
<p>{{$config.title}}</p>
|
|
|
|
|
<div class="bt">
|
|
|
|
|
<el-button type="primary" @click="back()">退出实验</el-button>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="flex center">
|
|
|
|
|
<p>编程语言</p>
|
|
|
|
|
<el-input placeholder="请输入内容" v-model="value" :disabled="true"></el-input>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="tab">
|
|
|
|
|
<el-tabs v-model="workbench1" type="card">
|
|
|
|
|
<el-tab-pane
|
|
|
|
|
v-for="item in workbench"
|
|
|
|
|
:key="item.judgmentPointsId"
|
|
|
|
|
:label="item.judgmentPointsName"
|
|
|
|
|
:value="item.judgmentPointsId"
|
|
|
|
|
>
|
|
|
|
|
<codemirror
|
|
|
|
|
:key="codeKey"
|
|
|
|
|
:projectId.sync="projectId"
|
|
|
|
|
:code.sync="item.code.code"
|
|
|
|
|
:workbench1="item.judgmentPointsId"
|
|
|
|
|
:codeid.sync="item.code.codeId"
|
|
|
|
|
></codemirror>
|
|
|
|
|
</el-tab-pane>
|
|
|
|
|
</el-tabs>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div class="menu">
|
|
|
|
|
<testPanel
|
|
|
|
|
@tell="getQueryIndex"
|
|
|
|
|
@recoveryCode="recoveryCode"
|
|
|
|
|
ref="mainindex"
|
|
|
|
|
:autoStart="autoStart"
|
|
|
|
|
:sendSync="sendSync"
|
|
|
|
|
:defaultVal="defaultVal"
|
|
|
|
|
@getDataFromChild="getDataFromChild"
|
|
|
|
|
:codeId="codeId"
|
|
|
|
|
:workbench.sync="workbench"
|
|
|
|
|
:key="codeId"
|
|
|
|
|
></testPanel>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
import testPanel from "../components/TestPanel";
|
|
|
|
|
import codemirror from "../components/codemirror";
|
|
|
|
|
import { log } from "util";
|
|
|
|
|
//返回格式化时间,传参例如:"yyyy-MM-dd hh:mm:ss"
|
|
|
|
|
function formatDate(fmt,date) {
|
|
|
|
|
var date = date ? date : new Date()
|
|
|
|
|
var o = {
|
|
|
|
|
"M+" : date.getMonth()+1, //月份
|
|
|
|
|
"d+" : date.getDate(), //日
|
|
|
|
|
"h+" : date.getHours(), //小时
|
|
|
|
|
"m+" : date.getMinutes(), //分
|
|
|
|
|
"s+" : date.getSeconds(), //秒
|
|
|
|
|
"q+" : Math.floor((date.getMonth()+3)/3), //季度
|
|
|
|
|
"S" : date.getMilliseconds() //毫秒
|
|
|
|
|
};
|
|
|
|
|
if(/(y+)/.test(fmt)) {
|
|
|
|
|
fmt=fmt.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length));
|
|
|
|
|
}
|
|
|
|
|
for(var k in o) {
|
|
|
|
|
if(new RegExp("("+ k +")").test(fmt)){
|
|
|
|
|
fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return fmt;
|
|
|
|
|
}
|
|
|
|
|
export default {
|
|
|
|
|
data() {
|
|
|
|
|
return {
|
|
|
|
|
// 编译器
|
|
|
|
|
isShow: false,
|
|
|
|
|
projectPermissions: 0, //项目权限(0、练习 1、考核 2、竞赛)
|
|
|
|
|
ops: {
|
|
|
|
|
vuescroll: {},
|
|
|
|
|
scrollPanel: {},
|
|
|
|
|
rail: {
|
|
|
|
|
keepShow: true
|
|
|
|
|
},
|
|
|
|
|
bar: {
|
|
|
|
|
hoverStyle: true,
|
|
|
|
|
onlyShowBarOnScroll: false, //是否只有滚动的时候才显示滚动条
|
|
|
|
|
background: "red", //滚动条颜色
|
|
|
|
|
opacity: 0.5, //滚动条透明度
|
|
|
|
|
"overflow-x": "hidden"
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
judgmentPointsId: "",
|
|
|
|
|
codeId: 0,
|
|
|
|
|
value: "Python",
|
|
|
|
|
workbench1: "", //选中后绑定的对象
|
|
|
|
|
workbench: [],
|
|
|
|
|
editableTabs: [],
|
|
|
|
|
tabIndex: 2,
|
|
|
|
|
name: "",
|
|
|
|
|
judgmentPointsIds: [],
|
|
|
|
|
autoStart: true,
|
|
|
|
|
sendSync: true,
|
|
|
|
|
entryTime: formatDate('yyyy-MM-dd hh:mm:ss'),
|
|
|
|
|
assessmentId: '',
|
|
|
|
|
defaultVal: sessionStorage.getItem("timer")
|
|
|
|
|
? parseInt(sessionStorage.getItem("timer"))
|
|
|
|
|
: 0,
|
|
|
|
|
codeKey: 1,
|
|
|
|
|
host: location.host.includes('liuwanr.cn') ? 'http://www.liuwanr.cn/' : 'http://www.occupationlab.com/'
|
|
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
components: {
|
|
|
|
|
codemirror,
|
|
|
|
|
testPanel
|
|
|
|
|
},
|
|
|
|
|
beforeDestroy(){
|
|
|
|
|
let data = {
|
|
|
|
|
studentId: this.studentId,
|
|
|
|
|
startTime: this.entryTime,
|
|
|
|
|
endTime: formatDate('yyyy-MM-dd hh:mm:ss'),
|
|
|
|
|
projectId: this.projectId
|
|
|
|
|
}
|
|
|
|
|
this.$post(this.api.saveEvaluation,data).then(res => {})
|
|
|
|
|
this.leavePage()
|
|
|
|
|
},
|
|
|
|
|
mounted() {
|
|
|
|
|
this.assessmentId = this.getCookie("assessmentId");
|
|
|
|
|
if (window.history && window.history.pushState) {
|
|
|
|
|
// 向历史记录中插入了当前页
|
|
|
|
|
history.pushState(null, null, document.URL);
|
|
|
|
|
window.addEventListener("popstate", this.goBack, false);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
destroyed() {
|
|
|
|
|
window.removeEventListener("popstate", this.goBack, false);
|
|
|
|
|
},
|
|
|
|
|
methods: {
|
|
|
|
|
leavePage(){
|
|
|
|
|
if(!this.$refs.mainindex.isSubmit && !this.assessmentId && this.workbench.length){
|
|
|
|
|
let workbench = this.workbench
|
|
|
|
|
if(workbench.some(n => n.code.code)){
|
|
|
|
|
let codeCache = {
|
|
|
|
|
systemId: this.$config.systemId,
|
|
|
|
|
projectId: this.projectId,
|
|
|
|
|
workbench1: this.workbench1,
|
|
|
|
|
workbench
|
|
|
|
|
}
|
|
|
|
|
localStorage.setItem('codeCache',JSON.stringify(codeCache))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
goBack() {
|
|
|
|
|
this.leavePage()
|
|
|
|
|
history.back()
|
|
|
|
|
},
|
|
|
|
|
getDataFromChild(data) {
|
|
|
|
|
sessionStorage.setItem("timer", parseInt(data));
|
|
|
|
|
},
|
|
|
|
|
recoveryCode(workbench){
|
|
|
|
|
this.workbench = workbench
|
|
|
|
|
this.codeKey++
|
|
|
|
|
this.workbench1 = '0'
|
|
|
|
|
},
|
|
|
|
|
reload(){
|
|
|
|
|
this.$refs.mainindex.reload()
|
|
|
|
|
},
|
|
|
|
|
back() {
|
|
|
|
|
this.leavePage()
|
|
|
|
|
if(this.projectPermissions){
|
|
|
|
|
location.href = `${this.host}hrClient/#/dashboard#2`
|
|
|
|
|
}else{
|
|
|
|
|
location.href = `${this.host}hrClient/#/dashboard#1`
|
|
|
|
|
}
|
|
|
|
|
this.$refs.mainindex.getClearTime();
|
|
|
|
|
},
|
|
|
|
|
//工作台展示
|
|
|
|
|
getQueryIndex(value1, projectPermissions,workBench) {
|
|
|
|
|
//父子组件传值
|
|
|
|
|
this.projectId = value1;
|
|
|
|
|
this.projectPermissions = projectPermissions;
|
|
|
|
|
this.studentId = this.getCookie("studentId");
|
|
|
|
|
this.$get(this.api.ProjectId, {
|
|
|
|
|
projectId: this.projectId,
|
|
|
|
|
// studentId: this.studentId
|
|
|
|
|
studentId: 54
|
|
|
|
|
})
|
|
|
|
|
.then(res => {
|
|
|
|
|
if(workBench.length){
|
|
|
|
|
this.workbench = workBench
|
|
|
|
|
}else{
|
|
|
|
|
this.workbench = res.message;
|
|
|
|
|
this.workbench.map(item => {
|
|
|
|
|
if (item.code.codeId == 0) {
|
|
|
|
|
item.code.codeId = "";
|
|
|
|
|
}
|
|
|
|
|
if (this.projectPermissions == "0") {
|
|
|
|
|
item.code.codeId = "";
|
|
|
|
|
item.code.code = "";
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
this.assessmentId && (this.codeId = this.workbench[0].code.codeId)
|
|
|
|
|
})
|
|
|
|
|
.catch(err => {
|
|
|
|
|
console.log(err);
|
|
|
|
|
});
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
getCookie(cookie_name) {
|
|
|
|
|
//获取cookie中指定key的value
|
|
|
|
|
var allcookies = document.cookie; //索引长度,开始索引的位置
|
|
|
|
|
var cookie_pos = allcookies.indexOf(cookie_name); // 如果找到了索引,就代表cookie存在,否则不存在
|
|
|
|
|
|
|
|
|
|
if (cookie_pos != -1) {
|
|
|
|
|
// 把cookie_pos放在值的开始,只要给值加1即可
|
|
|
|
|
//计算取cookie值得开始索引,加的1为“=”
|
|
|
|
|
cookie_pos = cookie_pos + cookie_name.length + 1; //计算取cookie值得结束索引
|
|
|
|
|
var cookie_end = allcookies.indexOf(";", cookie_pos);
|
|
|
|
|
|
|
|
|
|
if (cookie_end == -1) {
|
|
|
|
|
cookie_end = allcookies.length;
|
|
|
|
|
} //得到想要的cookie的值
|
|
|
|
|
var value = unescape(allcookies.substring(cookie_pos, cookie_end));
|
|
|
|
|
}
|
|
|
|
|
return value;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
|
|
|
.menu {
|
|
|
|
|
position: relative;
|
|
|
|
|
z-index: 1000;
|
|
|
|
|
}
|
|
|
|
|
.code-right {
|
|
|
|
|
/* height: 800px; */
|
|
|
|
|
width: 230px;
|
|
|
|
|
background: #1b1b1b;
|
|
|
|
|
display: inline-block;
|
|
|
|
|
}
|
|
|
|
|
//创建工作台
|
|
|
|
|
::v-deep .el-form-item {
|
|
|
|
|
margin-bottom: 0px;
|
|
|
|
|
}
|
|
|
|
|
::v-deep .el-dialog--center {
|
|
|
|
|
width: 400px;
|
|
|
|
|
}
|
|
|
|
|
::v-deep .el-dialog__headerbtn .el-icon-close:before {
|
|
|
|
|
padding: 3px;
|
|
|
|
|
background-color: #fdca17;
|
|
|
|
|
border-radius: 50%;
|
|
|
|
|
color: #ffffff;
|
|
|
|
|
}
|
|
|
|
|
.select1 ::v-deep .el-input__icon {
|
|
|
|
|
line-height: 40px;
|
|
|
|
|
}
|
|
|
|
|
.select1 {
|
|
|
|
|
margin: 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//tabs
|
|
|
|
|
.tab ::v-deep .el-tabs__header {
|
|
|
|
|
margin-bottom: 0;
|
|
|
|
|
}
|
|
|
|
|
.tab ::v-deep .el-tabs__item.is-active {
|
|
|
|
|
color: #333;
|
|
|
|
|
background-color: #fdca17;
|
|
|
|
|
}
|
|
|
|
|
.tab ::v-deep .el-icon-circle-plus-outline:before {
|
|
|
|
|
font-size: 16px;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.tab {
|
|
|
|
|
height: 50px;
|
|
|
|
|
line-height: 50px;
|
|
|
|
|
}
|
|
|
|
|
// tabs边框样式
|
|
|
|
|
::v-deep .el-tabs--card > .el-tabs__header {
|
|
|
|
|
border-bottom: none;
|
|
|
|
|
}
|
|
|
|
|
::v-deep .el-tabs--card > .el-tabs__header .el-tabs__nav {
|
|
|
|
|
border: none;
|
|
|
|
|
}
|
|
|
|
|
::v-deep .el-tabs--card > .el-tabs__header .el-tabs__item {
|
|
|
|
|
border-left: none;
|
|
|
|
|
border-bottom: none;
|
|
|
|
|
}
|
|
|
|
|
// 编程语言
|
|
|
|
|
|
|
|
|
|
.center p {
|
|
|
|
|
font-size: 16px;
|
|
|
|
|
margin-left: 15px;
|
|
|
|
|
margin-right: 15px;
|
|
|
|
|
}
|
|
|
|
|
.center {
|
|
|
|
|
height: 60px;
|
|
|
|
|
line-height: 60px;
|
|
|
|
|
}
|
|
|
|
|
.center ::v-deep .el-input {
|
|
|
|
|
width: 10%;
|
|
|
|
|
}
|
|
|
|
|
.center ::v-deep .el-input.is-disabled .el-input__inner {
|
|
|
|
|
// border-color: #fdca17;
|
|
|
|
|
border-radius: 30px;
|
|
|
|
|
}
|
|
|
|
|
//头部
|
|
|
|
|
.bt ::v-deep .el-button + .el-button {
|
|
|
|
|
margin-left: 0;
|
|
|
|
|
}
|
|
|
|
|
.bt ::v-deep .el-button--primary,
|
|
|
|
|
.el-button--primary:focus,
|
|
|
|
|
.el-button--primary:hover,
|
|
|
|
|
.el-button--primary:active {
|
|
|
|
|
color: #202020;
|
|
|
|
|
border: none;
|
|
|
|
|
background-color: #fdca17;
|
|
|
|
|
}
|
|
|
|
|
.bt ::v-deep .el-button {
|
|
|
|
|
border-radius: 0;
|
|
|
|
|
border: none;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.header p {
|
|
|
|
|
font-size: 16px;
|
|
|
|
|
font-weight: 700;
|
|
|
|
|
color: rgba(51, 51, 51, 1);
|
|
|
|
|
margin-left: 18px;
|
|
|
|
|
}
|
|
|
|
|
.header {
|
|
|
|
|
background-color: #f8f8f8;
|
|
|
|
|
justify-content: space-between;
|
|
|
|
|
height: 40px;
|
|
|
|
|
line-height: 40px;
|
|
|
|
|
}
|
|
|
|
|
//公共类
|
|
|
|
|
p {
|
|
|
|
|
margin: 0;
|
|
|
|
|
}
|
|
|
|
|
.flex {
|
|
|
|
|
display: flex;
|
|
|
|
|
}
|
|
|
|
|
// 滚动条的宽度
|
|
|
|
|
::v-deep ::-webkit-scrollbar {
|
|
|
|
|
width: 6px; // 横向滚动条
|
|
|
|
|
height: 6px; // 纵向滚动条 必写
|
|
|
|
|
}
|
|
|
|
|
// 滚动条的滑块
|
|
|
|
|
::v-deep ::-webkit-scrollbar-thumb {
|
|
|
|
|
background-color: #fdca17;
|
|
|
|
|
border-radius: 3px;
|
|
|
|
|
-webkit-box-shadow: inset 0 0 5px #dddddd;
|
|
|
|
|
}
|
|
|
|
|
::v-deep ::-webkit-scrollbar-track {
|
|
|
|
|
/*滚动条里面轨道*/
|
|
|
|
|
-webkit-box-shadow: inset 0 0 5px #dddddd;
|
|
|
|
|
border-radius: 0;
|
|
|
|
|
background: #dddddd;
|
|
|
|
|
}
|
|
|
|
|
//改变placeholder的样式
|
|
|
|
|
::v-deep input::-webkit-input-placeholder {
|
|
|
|
|
color: #333;
|
|
|
|
|
}
|
|
|
|
|
::v-deep input::-moz-input-placeholder {
|
|
|
|
|
color: #333;
|
|
|
|
|
}
|
|
|
|
|
::v-deep input::-ms-input-placeholder {
|
|
|
|
|
color: #333;
|
|
|
|
|
}
|
|
|
|
|
//下拉框的icon
|
|
|
|
|
::v-deep .el-input__icon {
|
|
|
|
|
line-height: 60px;
|
|
|
|
|
}
|
|
|
|
|
//下拉框
|
|
|
|
|
::v-deep .el-select__caret:before {
|
|
|
|
|
content: "\e78f";
|
|
|
|
|
font-size: 16px;
|
|
|
|
|
padding: 3px;
|
|
|
|
|
background-color: #fdca17;
|
|
|
|
|
border-radius: 50%;
|
|
|
|
|
color: #ffffff;
|
|
|
|
|
}
|
|
|
|
|
::v-deep .el-input--suffix .el-input__inner {
|
|
|
|
|
color: #333;
|
|
|
|
|
font-size: 14px;
|
|
|
|
|
border-radius: 30px;
|
|
|
|
|
border: none;
|
|
|
|
|
background-color: #f5f5f5;
|
|
|
|
|
margin-left: 10px;
|
|
|
|
|
}
|
|
|
|
|
</style>
|