|
@@ -11,19 +11,35 @@
|
|
|
icon="el-icon-circle-plus-outline"
|
|
icon="el-icon-circle-plus-outline"
|
|
|
style="color: #f5b86e;">Eval测试
|
|
style="color: #f5b86e;">Eval测试
|
|
|
</el-button>
|
|
</el-button>
|
|
|
|
|
+ <el-button v-if="eaiId"
|
|
|
|
|
+ @click="handleAddEaiWritingClick"
|
|
|
|
|
+ icon="el-icon-circle-plus-outline"
|
|
|
|
|
+ style="color: #50A879;">写作任务
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ <el-button v-if="eaiId"
|
|
|
|
|
+ @click="handleAddEaiSpeakingClick"
|
|
|
|
|
+ icon="el-icon-circle-plus-outline"
|
|
|
|
|
+ style="color: #50A879;">口语任务
|
|
|
|
|
+ </el-button>
|
|
|
<el-timeline>
|
|
<el-timeline>
|
|
|
<el-timeline-item
|
|
<el-timeline-item
|
|
|
v-for="task in courseTaskList"
|
|
v-for="task in courseTaskList"
|
|
|
:key="task['id']"
|
|
:key="task['id']"
|
|
|
- :timestamp="task['examId'] ? task.startTime.substring(0, 16) + ' — ' + task.endTime.substring(0, 16) : timestampToTime(task['startAt'] * 1000) + ' — ' + timestampToTime(task['endAt'] * 1000)"
|
|
|
|
|
|
|
+ :timestamp="(task['examId'] || task['eaiId']) ? task.startTime.substring(0, 16) + ' — ' + task.endTime.substring(0, 16) : timestampToTime(task['startAt'] * 1000) + ' — ' + timestampToTime(task['endAt'] * 1000)"
|
|
|
:color="courseTaskStatusColor(task)" @click="toTask(task)">
|
|
:color="courseTaskStatusColor(task)" @click="toTask(task)">
|
|
|
<el-row>
|
|
<el-row>
|
|
|
<el-tag v-if="task['examId']" class="timeline-content" size="small" color="#f5b86e" effect="dark"
|
|
<el-tag v-if="task['examId']" class="timeline-content" size="small" color="#f5b86e" effect="dark"
|
|
|
style="border: none">E
|
|
style="border: none">E
|
|
|
</el-tag>
|
|
</el-tag>
|
|
|
- <el-tag v-else class="timeline-content" size="small" color="#8dc9e2" effect="dark"
|
|
|
|
|
|
|
+ <el-tag v-if="task['coderId']" class="timeline-content" size="small" color="#8dc9e2" effect="dark"
|
|
|
style="border: none">C
|
|
style="border: none">C
|
|
|
</el-tag>
|
|
</el-tag>
|
|
|
|
|
+ <el-tag v-if="task['type'] ==='写作'" class="timeline-content" size="small" color="#50A879" effect="dark"
|
|
|
|
|
+ style="border: none">W
|
|
|
|
|
+ </el-tag>
|
|
|
|
|
+ <el-tag v-if="task['type'] ==='AI口语'" class="timeline-content" size="small" color="#50A879" effect="dark"
|
|
|
|
|
+ style="border: none">S
|
|
|
|
|
+ </el-tag>
|
|
|
<el-row v-if="task['examId']" class="timeline-content">
|
|
<el-row v-if="task['examId']" class="timeline-content">
|
|
|
<el-tag v-if="this.state(task)==='NOT_STARTED'" size="small">未开始</el-tag>
|
|
<el-tag v-if="this.state(task)==='NOT_STARTED'" size="small">未开始</el-tag>
|
|
|
<el-tag v-else-if="this.state(task)==='RUNNING'" size="small" type="success">进行中</el-tag>
|
|
<el-tag v-else-if="this.state(task)==='RUNNING'" size="small" type="success">进行中</el-tag>
|
|
@@ -39,6 +55,9 @@
|
|
|
<el-row v-if="task['examId']" class="task-title timeline-content">
|
|
<el-row v-if="task['examId']" class="task-title timeline-content">
|
|
|
{{ task["examName"] }}
|
|
{{ task["examName"] }}
|
|
|
</el-row>
|
|
</el-row>
|
|
|
|
|
+ <el-row v-if="task['eaiId']" class="task-title timeline-content">
|
|
|
|
|
+ {{ task["assignmentName"] }}
|
|
|
|
|
+ </el-row>
|
|
|
<el-row v-else class="task-title timeline-content">
|
|
<el-row v-else class="task-title timeline-content">
|
|
|
{{ task.name }}
|
|
{{ task.name }}
|
|
|
</el-row>
|
|
</el-row>
|
|
@@ -57,6 +76,12 @@
|
|
|
<el-tag v-if="task['examId']" class="timeline-content" size="small" color="#f5b86e" effect="dark"
|
|
<el-tag v-if="task['examId']" class="timeline-content" size="small" color="#f5b86e" effect="dark"
|
|
|
style="border: none">E
|
|
style="border: none">E
|
|
|
</el-tag>
|
|
</el-tag>
|
|
|
|
|
+ <el-tag v-if="task['type'] ==='写作'" class="timeline-content" size="small" color="#50A879" effect="dark"
|
|
|
|
|
+ style="border: none">W
|
|
|
|
|
+ </el-tag>
|
|
|
|
|
+ <el-tag v-if="task['type'] ==='AI口语'" class="timeline-content" size="small" color="#50A879" effect="dark"
|
|
|
|
|
+ style="border: none">S
|
|
|
|
|
+ </el-tag>
|
|
|
<el-tag v-else class="timeline-content" size="small" color="#8dc9e2" effect="dark"
|
|
<el-tag v-else class="timeline-content" size="small" color="#8dc9e2" effect="dark"
|
|
|
style="border: none">C
|
|
style="border: none">C
|
|
|
</el-tag>
|
|
</el-tag>
|
|
@@ -279,6 +304,9 @@ export default {
|
|
|
evalId: {
|
|
evalId: {
|
|
|
required: true,
|
|
required: true,
|
|
|
},
|
|
},
|
|
|
|
|
+ eaiId: {
|
|
|
|
|
+ require:true,
|
|
|
|
|
+ },
|
|
|
courseId: {
|
|
courseId: {
|
|
|
required: true,
|
|
required: true,
|
|
|
},
|
|
},
|
|
@@ -297,6 +325,7 @@ export default {
|
|
|
themeColor,
|
|
themeColor,
|
|
|
evalExamList: [],
|
|
evalExamList: [],
|
|
|
coderExamList: [],
|
|
coderExamList: [],
|
|
|
|
|
+ eaiExamList: [],
|
|
|
courseName: "",
|
|
courseName: "",
|
|
|
|
|
|
|
|
//create Coder exam
|
|
//create Coder exam
|
|
@@ -427,6 +456,7 @@ export default {
|
|
|
return []
|
|
return []
|
|
|
.concat(this.evalExamList)
|
|
.concat(this.evalExamList)
|
|
|
.concat(this.coderExamList)
|
|
.concat(this.coderExamList)
|
|
|
|
|
+ .concat(this.eaiExamList)
|
|
|
.sort((a, b) => {
|
|
.sort((a, b) => {
|
|
|
let a_time = a["startAt"] * 1000 || new Date(a.startTime).getTime();
|
|
let a_time = a["startAt"] * 1000 || new Date(a.startTime).getTime();
|
|
|
let b_time = b["startAt"] * 1000 || new Date(b.startTime).getTime();
|
|
let b_time = b["startAt"] * 1000 || new Date(b.startTime).getTime();
|
|
@@ -458,6 +488,17 @@ export default {
|
|
|
if (_this.coderId !== null) {
|
|
if (_this.coderId !== null) {
|
|
|
_this.coderExamList = (await _this.$apis.getTeacherCoderExamsByCourseId(_this.coderId)).data.data || [];
|
|
_this.coderExamList = (await _this.$apis.getTeacherCoderExamsByCourseId(_this.coderId)).data.data || [];
|
|
|
}
|
|
}
|
|
|
|
|
+ if(this.eaiId !== null) {
|
|
|
|
|
+ const result = (await _this.$apis.getTeacherEaiExamsByCourseId(_this.eaiId)).data.data || [];
|
|
|
|
|
+ _this.eaiExamList = result.map(item => ({
|
|
|
|
|
+ eaiId: item.assignmentId,
|
|
|
|
|
+ assignmentName:item.assignmentName,
|
|
|
|
|
+ startTime:item.startTime,
|
|
|
|
|
+ endTime:item.endTime,
|
|
|
|
|
+ type:item.type,
|
|
|
|
|
+ status:item.status
|
|
|
|
|
+ }));
|
|
|
|
|
+ }
|
|
|
} else if (this.isStudent) {
|
|
} else if (this.isStudent) {
|
|
|
if (_this.evalId !== null) {
|
|
if (_this.evalId !== null) {
|
|
|
_this.evalExamList = (await _this.$apis.getStudentEvalExamsByCourseId(_this.evalId)).data.data || [];
|
|
_this.evalExamList = (await _this.$apis.getStudentEvalExamsByCourseId(_this.evalId)).data.data || [];
|
|
@@ -465,6 +506,9 @@ export default {
|
|
|
if (_this.coderId !== null) {
|
|
if (_this.coderId !== null) {
|
|
|
_this.coderExamList = (await _this.$apis.getStudentCoderExamsByCourseId(_this.coderId)).data.data || [];
|
|
_this.coderExamList = (await _this.$apis.getStudentCoderExamsByCourseId(_this.coderId)).data.data || [];
|
|
|
}
|
|
}
|
|
|
|
|
+ if (_this.eaiId !== null) {
|
|
|
|
|
+ _this.eaiExamList = (await _this.$apis.getStudentEaiExamsByCourseId(_this.eaiId)).data.data || [];
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
|
|
|
|
@@ -482,7 +526,7 @@ export default {
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
state(VO) {
|
|
state(VO) {
|
|
|
- if (VO["examId"]) {
|
|
|
|
|
|
|
+ if (VO["examId"] || VO["eaiId"]) {
|
|
|
if (new Date(VO.endTime) < new Date()) {
|
|
if (new Date(VO.endTime) < new Date()) {
|
|
|
return "FINISHED";
|
|
return "FINISHED";
|
|
|
} else if (new Date(VO.startTime) > new Date()) {
|
|
} else if (new Date(VO.startTime) > new Date()) {
|
|
@@ -490,7 +534,7 @@ export default {
|
|
|
} else {
|
|
} else {
|
|
|
return "RUNNING";
|
|
return "RUNNING";
|
|
|
}
|
|
}
|
|
|
- } else {
|
|
|
|
|
|
|
+ }else {
|
|
|
if (VO.status === "CLOSED") {
|
|
if (VO.status === "CLOSED") {
|
|
|
return "CLOSED";
|
|
return "CLOSED";
|
|
|
} else if (VO["startAt"] * 1000 > new Date()) {
|
|
} else if (VO["startAt"] * 1000 > new Date()) {
|
|
@@ -654,6 +698,12 @@ export default {
|
|
|
this.evalExamDialog = true;
|
|
this.evalExamDialog = true;
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
|
|
+ handleAddEaiClick() {
|
|
|
|
|
+ this.eaiExamDialog = true;
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
handleAddCoderClick() {
|
|
handleAddCoderClick() {
|
|
|
this.coderExamDialog = true;
|
|
this.coderExamDialog = true;
|
|
|
},
|
|
},
|
|
@@ -664,6 +714,13 @@ export default {
|
|
|
this.$refs.evalExamFormRef.resetFields();
|
|
this.$refs.evalExamFormRef.resetFields();
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
|
|
+ handleEaiExamFormCancel() {
|
|
|
|
|
+ this.eaiExamDialog = false;
|
|
|
|
|
+ this.$refs.eaiExamFormRef.resetFields();
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
//格式化日期函数
|
|
//格式化日期函数
|
|
|
formatDate(date, fmt) {
|
|
formatDate(date, fmt) {
|
|
|
if (typeof date == "string") {
|
|
if (typeof date == "string") {
|
|
@@ -727,8 +784,49 @@ export default {
|
|
|
).catch(_err => {
|
|
).catch(_err => {
|
|
|
ElMessage.error("创建Eval评测失败");
|
|
ElMessage.error("创建Eval评测失败");
|
|
|
});
|
|
});
|
|
|
|
|
+ },
|
|
|
|
|
+
|
|
|
|
|
+ // 创建Eval评测
|
|
|
|
|
+ createEaiExam() {
|
|
|
|
|
+ const obj = {
|
|
|
|
|
+ creatorId: this.$store.state.user.id,
|
|
|
|
|
+ examName: this.evalExamForm.examName,
|
|
|
|
|
+ position: this.evalExamForm.position,
|
|
|
|
|
+ skills: Object.values(this.evalExamForm.skills),
|
|
|
|
|
+ difficulty: this.evalExamForm.difficulty,
|
|
|
|
|
+ startTime: this.formatDate(this.evalExamForm.range[0], "yyyy-MM-dd hh:mm:ss"),
|
|
|
|
|
+ endTime: this.formatDate(this.evalExamForm.range[1], "yyyy-MM-dd hh:mm:ss"),
|
|
|
|
|
+ comment: this.evalExamForm.comment,
|
|
|
|
|
+ antiCheating: this.evalExamForm.antiCheating,
|
|
|
|
|
+ isPublic: !this.evalExamForm.isPrivate,
|
|
|
|
|
+ isHidden: false,
|
|
|
|
|
+ courseId: this.evalId,
|
|
|
|
|
+ courseName: this.courseName
|
|
|
|
|
+ };
|
|
|
|
|
+ console.log("创建eval测试", obj);
|
|
|
|
|
+ this.$apis.createEvalExam(obj).then(
|
|
|
|
|
+ _res => {
|
|
|
|
|
+ ElMessage.success("创建Eval评测成功");
|
|
|
|
|
+ this.init();
|
|
|
|
|
+ console.log(_res);
|
|
|
|
|
+ this.evalExamDialog = false;
|
|
|
|
|
+ this.isEvalExamCreated = !!_res.data;
|
|
|
|
|
+ console.log(this.isEvalExamCreated);
|
|
|
|
|
+ const examId = _res.data.data.result.examId;
|
|
|
|
|
+ this.$router.push({
|
|
|
|
|
+ name: "edit-exams",
|
|
|
|
|
+ params: {
|
|
|
|
|
+ examId: examId
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ ).catch(_err => {
|
|
|
|
|
+ ElMessage.error("创建Eval评测失败");
|
|
|
|
|
+ });
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
};
|
|
};
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|